Hi, Ajay Thank you for the patch. On Fri, Aug 29, 2025 at 2:16 PM <[email protected]> wrote:
> Date: Mon, 11 Aug 2025 05:56:22 +0000 > From: Ajay Kaher <[email protected]> > Subject: [Crash-utility] [PATCH 1/2] vmware_vmss: support segment > registers > To: [email protected] > Cc: [email protected], > [email protected], [email protected] > , > [email protected] > Message-ID: <[email protected]> > > adding support for segment registers for vmware vmss dumps. > > Signed-off-by: Ajay Kaher <[email protected]> > > --- > vmware_guestdump.c | 2 +- > vmware_vmss.c | 114 +++++++++++++++++++++++++++++++++++---------- > vmware_vmss.h | 92 +++++++++++++++++++++++++----------- > 3 files changed, 154 insertions(+), 54 deletions(-) > > The code looks good, but I saw a warning: gcc -c -g -DX86_64 -DLZO -DGDB_16_2 vmware_vmss.c -Wall -O2 -Wstrict-prototypes -Wmissing-prototypes -fstack-protector -Wformat-security vmware_vmss.c: In function ‘dump_registers_for_vmss_dump’: vmware_vmss.c:895:73: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 3 has type ‘uint64_t’ {aka ‘long unsigned int’} [-Wformat=] 895 | fprintf(fp, "Missing registers for this CPU: 0x%x\n", vmss.vcpu_regs[i]); | ~^ ~~~~~~~~~~~~~~~~~ | | | | unsigned int uint64_t {aka long unsigned int} | %lx BTW: I can not test the patch, and it relies on your testing. Thanks Lianbo diff --git a/vmware_guestdump.c b/vmware_guestdump.c > index 78f37fb..d515df5 100644 > --- a/vmware_guestdump.c > +++ b/vmware_guestdump.c > @@ -320,7 +320,7 @@ vmware_guestdump_init(char *filename, FILE *ofp) > goto exit; > } > > - vmss.vcpu_regs = malloc(vmss.num_vcpus * sizeof(uint32_t)); > + vmss.vcpu_regs = malloc(vmss.num_vcpus * sizeof(uint64_t)); > vmss.regs64 = calloc(vmss.num_vcpus, sizeof(void *)); > if (!vmss.vcpu_regs || !vmss.regs64) { > error(INFO, LOGPRX"Failed to allocate memory\n"); > diff --git a/vmware_vmss.c b/vmware_vmss.c > index 8121ab6..1a71d02 100644 > --- a/vmware_vmss.c > +++ b/vmware_vmss.c > @@ -317,7 +317,7 @@ vmware_vmss_init(char *filename, FILE *ofp) > > vmss.num_vcpus = u.val32; > vmss.regs64 = > malloc(vmss.num_vcpus * sizeof(void *)); > - vmss.vcpu_regs = > malloc(vmss.num_vcpus * sizeof(uint32_t)); > + vmss.vcpu_regs = > malloc(vmss.num_vcpus * sizeof(uint64_t)); > > for (k = 0; k < > vmss.num_vcpus; k++) { > vmss.regs64[k] = > malloc(sizeof(vmssregs64)); > @@ -432,15 +432,65 @@ vmware_vmss_init(char *filename, FILE *ofp) > int cpu = idx[0]; > vmss.regs64[cpu]->rflags > |= u.val32; > vmss.vcpu_regs[cpu] |= > REGS_PRESENT_RFLAGS; > + } else if (strcmp(name, > "S.base64") == 0) { > + int cpu = idx[0]; > + int seg_index = idx[1]; > + switch (seg_index) { > + case SEG_FS: > + > vmss.regs64[cpu]->fs_base = u.val64; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_FS_BASE; > + break; > + case SEG_GS: > + > vmss.regs64[cpu]->gs_base = u.val64; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_GS_BASE; > + break; > + } > + } else if (strcmp(name, "S") == 0) > { > + int cpu = idx[0]; > + int seg_index = idx[1]; > + switch (seg_index) { > + case SEG_ES: > + > vmss.regs64[cpu]->es = u.val32; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_ES; > + break; > + case SEG_CS: > + > vmss.regs64[cpu]->cs = u.val32; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_CS; > + break; > + case SEG_SS: > + > vmss.regs64[cpu]->ss = u.val32; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_SS; > + break; > + case SEG_DS: > + > vmss.regs64[cpu]->ds = u.val32; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_DS; > + break; > + case SEG_FS: > + > vmss.regs64[cpu]->fs = u.val32; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_FS; > + break; > + case SEG_GS: > + > vmss.regs64[cpu]->gs = u.val32; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_GS; > + break; > + case SEG_LDTR: > + > vmss.regs64[cpu]->ldtr = u.val32; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_LDTR; > + break; > + case SEG_TR: > + > vmss.regs64[cpu]->tr = u.val32; > + > vmss.vcpu_regs[cpu] |= REGS_PRESENT_TR; > + break; > + default: > + > error(INFO, "Unknown VMSS Segment [%d][%d]\n", cpu, seg_index); > + } > } > } > - > DEBUG_PARSE_PRINT((ofp, "\n")); > } > } > } > > - > if (vmss.memsize == 0) { > char *vmem_filename, *p; > > @@ -902,36 +952,50 @@ vmware_vmss_get_cpu_reg(int cpu, int regno, const > char *name, int size, > if (cpu >= vmss.num_vcpus) > return FALSE; > > - /* All supported registers are 8 bytes long. */ > - if (size != 8) > - return FALSE; > - > -#define CASE(R,r) \ > +#define CASE_32(R,r) \ > case R##_REGNUM: \ > + if (size != 4) \ > + return FALSE; \ > if (!(vmss.vcpu_regs[cpu] & REGS_PRESENT_##R)) \ > return FALSE; \ > memcpy(value, &vmss.regs64[cpu]->r, size); \ > break > > +#define CASE_64(R,r) \ > + case R##_REGNUM: \ > + if (size != 8) \ > + return FALSE; \ > + if (!(vmss.vcpu_regs[cpu] & REGS_PRESENT_##R)) \ > + return FALSE; \ > + memcpy(value, &vmss.regs64[cpu]->r, size); \ > + break > > switch (regno) { > - CASE (RAX, rax); > - CASE (RBX, rbx); > - CASE (RCX, rcx); > - CASE (RDX, rdx); > - CASE (RSI, rsi); > - CASE (RDI, rdi); > - CASE (RBP, rbp); > - CASE (RSP, rsp); > - CASE (R8, r8); > - CASE (R9, r9); > - CASE (R10, r10); > - CASE (R11, r11); > - CASE (R12, r12); > - CASE (R13, r13); > - CASE (R14, r14); > - CASE (R15, r15); > - CASE (RIP, rip); > + CASE_64 (RAX, rax); > + CASE_64 (RBX, rbx); > + CASE_64 (RCX, rcx); > + CASE_64 (RDX, rdx); > + CASE_64 (RSI, rsi); > + CASE_64 (RDI, rdi); > + CASE_64 (RBP, rbp); > + CASE_64 (RSP, rsp); > + CASE_64 (R8, r8); > + CASE_64 (R9, r9); > + CASE_64 (R10, r10); > + CASE_64 (R11, r11); > + CASE_64 (R12, r12); > + CASE_64 (R13, r13); > + CASE_64 (R14, r14); > + CASE_64 (R15, r15); > + CASE_64 (RIP, rip); > + CASE_32 (ES, es); > + CASE_32 (CS, cs); > + CASE_32 (SS, ss); > + CASE_32 (DS, ds); > + CASE_32 (FS, fs); > + CASE_32 (GS, gs); > + CASE_64 (FS_BASE, fs_base); > + CASE_64 (GS_BASE, gs_base); > case EFLAGS_REGNUM: > if (!(vmss.vcpu_regs[cpu] & REGS_PRESENT_RFLAGS)) > return FALSE; > diff --git a/vmware_vmss.h b/vmware_vmss.h > index 01d9446..5bc0370 100644 > --- a/vmware_vmss.h > +++ b/vmware_vmss.h > @@ -110,41 +110,77 @@ struct vmssregs64 { > uint64_t r13; > uint64_t r14; > uint64_t r15; > + uint64_t es; > + uint64_t cs; > + uint64_t ss; > + uint64_t ds; > + uint64_t fs; > + uint64_t gs; > + uint64_t ldtr; > + uint64_t tr; > + > /* manually managed */ > uint64_t idtr; > uint64_t cr[VMW_CR64_SIZE / 8]; > uint64_t rip; > uint64_t rflags; > + uint64_t fs_base; > + uint64_t gs_base; > }; > typedef struct vmssregs64 vmssregs64; > > -#define REGS_PRESENT_RAX 1<<0 > -#define REGS_PRESENT_RCX 1<<1 > -#define REGS_PRESENT_RDX 1<<2 > -#define REGS_PRESENT_RBX 1<<3 > -#define REGS_PRESENT_RBP 1<<4 > -#define REGS_PRESENT_RSP 1<<5 > -#define REGS_PRESENT_RSI 1<<6 > -#define REGS_PRESENT_RDI 1<<7 > -#define REGS_PRESENT_R8 1<<8 > -#define REGS_PRESENT_R9 1<<9 > -#define REGS_PRESENT_R10 1<<10 > -#define REGS_PRESENT_R11 1<<11 > -#define REGS_PRESENT_R12 1<<12 > -#define REGS_PRESENT_R13 1<<13 > -#define REGS_PRESENT_R14 1<<14 > -#define REGS_PRESENT_R15 1<<15 > -#define REGS_PRESENT_IDTR 1<<16 > -#define REGS_PRESENT_CR0 1<<17 > -#define REGS_PRESENT_CR1 1<<18 > -#define REGS_PRESENT_CR2 1<<19 > -#define REGS_PRESENT_CR3 1<<20 > -#define REGS_PRESENT_CR4 1<<21 > -#define REGS_PRESENT_RIP 1<<22 > -#define REGS_PRESENT_RFLAGS 1<<23 > -#define REGS_PRESENT_GPREGS 65535 > -#define REGS_PRESENT_CRS 4063232 > -#define REGS_PRESENT_ALL 16777215 > +typedef enum SegmentName { > + SEG_ES, > + SEG_CS, > + SEG_SS, > + SEG_DS, > + SEG_FS, > + SEG_GS, > + SEG_LDTR, > + SEG_TR, > + NUM_SEGS > +} SegmentName; > + > +#define REGS_PRESENT_RAX 1L<<0 > +#define REGS_PRESENT_RCX 1L<<1 > +#define REGS_PRESENT_RDX 1L<<2 > +#define REGS_PRESENT_RBX 1L<<3 > +#define REGS_PRESENT_RBP 1L<<4 > +#define REGS_PRESENT_RSP 1L<<5 > +#define REGS_PRESENT_RSI 1L<<6 > +#define REGS_PRESENT_RDI 1L<<7 > +#define REGS_PRESENT_R8 1L<<8 > +#define REGS_PRESENT_R9 1L<<9 > +#define REGS_PRESENT_R10 1L<<10 > +#define REGS_PRESENT_R11 1L<<11 > +#define REGS_PRESENT_R12 1L<<12 > +#define REGS_PRESENT_R13 1L<<13 > +#define REGS_PRESENT_R14 1L<<14 > +#define REGS_PRESENT_R15 1L<<15 > +#define REGS_PRESENT_IDTR 1L<<16 > +#define REGS_PRESENT_CR0 1L<<17 > +#define REGS_PRESENT_CR1 1L<<18 > +#define REGS_PRESENT_CR2 1L<<19 > +#define REGS_PRESENT_CR3 1L<<20 > +#define REGS_PRESENT_CR4 1L<<21 > +#define REGS_PRESENT_RIP 1L<<22 > +#define REGS_PRESENT_RFLAGS 1L<<23 > + > +#define REGS_PRESENT_ES 1L<<24 > +#define REGS_PRESENT_CS 1L<<25 > +#define REGS_PRESENT_SS 1L<<26 > +#define REGS_PRESENT_DS 1L<<27 > +#define REGS_PRESENT_FS 1L<<28 > +#define REGS_PRESENT_GS 1L<<29 > +#define REGS_PRESENT_LDTR 1L<<30 > +#define REGS_PRESENT_TR 1L<<31 > +#define REGS_PRESENT_FS_BASE 1L<<32 > +#define REGS_PRESENT_GS_BASE 1L<<33 > + > +#define REGS_PRESENT_GPREGS 0x000000000000FFFF > +#define REGS_PRESENT_CRS 0x00000000003E0000 > +#define REGS_PRESENT_SEG 0x00000003FF000000 > +#define REGS_PRESENT_ALL 0x00000003FFFFFFFF > > #define MAX_REGIONS 3 > struct vmssdata { > @@ -159,7 +195,7 @@ struct vmssdata { > uint64_t memsize; > ulong phys_base; > int separate_vmem; > - uint32_t *vcpu_regs; > + uint64_t *vcpu_regs; > uint64_t num_vcpus; > vmssregs64 **regs64; > }; > -- > 2.40.4 >
-- Crash-utility mailing list -- [email protected] To unsubscribe send an email to [email protected] https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/ Contribution Guidelines: https://github.com/crash-utility/crash/wiki
