On Tue, Sep 27, 2022 at 4:27 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio...@nec.com>
wrote:

> cc Alexey, reverting this affects VMware folks.
>
> On 2022/09/27 15:27, Lianbo Jiang wrote:
> > This reverts commit 2f967fb5ebd737ce5eadba462df35935122e8865. John
> > Pittman reports that it causes a regression issue on the old Vmware
> > vmcore as below:
> >
> >    crash> set scope dm_table_create
> >    set: attempting to find/load "dm_mod" module debuginfo
> >         MODULE       NAME                      BASE           SIZE
> OBJECT FILE
> >    ffffffffa0012dc0  dm_mod             ffffffffa0000000   102823
> /home/2.6.32-754.35.1.el6.x86_64/kernel/drivers/md/dm-mod.ko.debug
> >    scope: ffffffffa0006cf0 (dm_table_create)
> >    crash> whatis struct dm_table
> >    struct dm_table {
> >        uint64_t features;
> >        struct mapped_device *md;
> >        unsigned int type;
> >        unsigned int depth;
> >        unsigned int counts[16];
> >        sector_t *index[16];
> >        unsigned int num_targets;
> >        unsigned int num_allocated;
> >        sector_t *highs;
> >        struct dm_target *targets;
> >        struct target_type *immutable_target_type;
> >        unsigned int integrity_supported : 1;
> >        unsigned int singleton : 1;
> >        fmode_t mode;
> >        struct list_head devices;
> >        void (*event_fn)(void *);
> >        void *event_context;
> >        struct dm_md_mempools *mempools;
> >        struct list_head target_callbacks;
> >    }
> >    SIZE: 312
> >    crash> whatis _name_buckets        --->| After using the whatis
> _name_buckets command,
> >    struct list_head _name_buckets[64];    |
> >    crash> whatis struct dm_table      <---| it won't show the contents
> of the dm_table struct.
> >    struct dm_table {
> >        int undefined__;
> >    }
> >    SIZE: 312
> >    crash>
> >
> > With the patch, this issue disappeared.
> At first glance, I did not find any part of the patch that can cause
> the issue.  Do you have any detailed information?
>
>
This issue is observed on an old Vmware vmcore, and looks like a regression
issue.
I tried to dig into the detail, the raw_supply() operation may affect the
gdb behavior, it
will store the register values to a cache in the gdb.

So far I haven't got a good solution, let's see if Alex has a better way to
fix it, that would be welcome. Any thoughts?

Thanks.
Lianbo


> Thanks,
> Kazu
>
> >
> > Signed-off-by: Lianbo Jiang <liji...@redhat.com>
> > ---
> >   crash_target.c  | 33 +-------------------------------
> >   defs.h          | 51 -------------------------------------------------
> >   gdb_interface.c | 19 +++++-------------
> >   vmware_vmss.c   | 51 +------------------------------------------------
> >   x86_64.c        | 16 ----------------
> >   5 files changed, 7 insertions(+), 163 deletions(-)
> >
> > diff --git a/crash_target.c b/crash_target.c
> > index 455480679741..a123329019f5 100644
> > --- a/crash_target.c
> > +++ b/crash_target.c
> > @@ -27,8 +27,6 @@ void crash_target_init (void);
> >
> >   extern "C" int gdb_readmem_callback(unsigned long, void *, int, int);
> >   extern "C" int crash_get_nr_cpus(void);
> > -extern "C" int crash_get_cpu_reg (int cpu, int regno, const char
> *regname,
> > -                                  int regsize, void *val);
> >
> >
> >   /* The crash target.  */
> > @@ -46,7 +44,6 @@ public:
> >     const target_info &info () const override
> >     { return crash_target_info; }
> >
> > -  void fetch_registers (struct regcache *, int) override;
> >     enum target_xfer_status xfer_partial (enum target_object object,
> >                                           const char *annex,
> >                                           gdb_byte *readbuf,
> > @@ -57,35 +54,13 @@ public:
> >     bool has_all_memory () override { return true; }
> >     bool has_memory () override { return true; }
> >     bool has_stack () override { return true; }
> > -  bool has_registers () override { return true; }
> > +  bool has_registers () override { return false; }
> >     bool thread_alive (ptid_t ptid) override { return true; }
> >     std::string pid_to_str (ptid_t ptid) override
> >     { return string_printf ("CPU %ld", ptid.tid ()); }
> >
> >   };
> >
> > -/* We just get all the registers, so we don't use regno.  */
> > -void
> > -crash_target::fetch_registers (struct regcache *regcache, int regno)
> > -{
> > -  gdb_byte regval[16];
> > -  int cpu = inferior_ptid.tid();
> > -  struct gdbarch *arch = regcache->arch ();
> > -
> > -  for (int r = 0; r < gdbarch_num_regs (arch); r++)
> > -    {
> > -      const char *regname = gdbarch_register_name(arch, r);
> > -      int regsize = register_size (arch, r);
> > -      if (regsize > sizeof (regval))
> > -        error (_("fatal error: buffer size is not enough to fit
> register value"));
> > -
> > -      if (crash_get_cpu_reg (cpu, r, regname, regsize, (void *)&regval))
> > -        regcache->raw_supply (r, regval);
> > -      else
> > -        regcache->raw_supply (r, NULL);
> > -    }
> > -}
> > -
> >
> >   enum target_xfer_status
> >   crash_target::xfer_partial (enum target_object object, const char
> *annex,
> > @@ -126,10 +101,4 @@ crash_target_init (void)
> >         if (!i)
> >           switch_to_thread (thread);
> >       }
> > -
> > -  /* Fetch all registers from core file.  */
> > -  target_fetch_registers (get_current_regcache (), -1);
> > -
> > -  /* Now, set up the frame cache. */
> > -  reinit_frame_cache ();
> >   }
> > diff --git a/defs.h b/defs.h
> > index e0ccf2ddc9c2..e8acf49894b8 100644
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -1015,7 +1015,6 @@ struct machdep_table {
> >           ulong (*processor_speed)(void);
> >           int (*uvtop)(struct task_context *, ulong, physaddr_t *, int);
> >           int (*kvtop)(struct task_context *, ulong, physaddr_t *, int);
> > -     int (*get_cpu_reg)(int, int, const char *, int, void *);
> >           ulong (*get_task_pgd)(ulong);
> >       void (*dump_irq)(int);
> >       void (*get_stack_frame)(struct bt_info *, ulong *, ulong *);
> > @@ -6977,7 +6976,6 @@ int vmware_vmss_get_nr_cpus(void);
> >   int vmware_vmss_get_cr3_cr4_idtr(int, ulong *, ulong *, ulong *);
> >   int vmware_vmss_phys_base(ulong *phys_base);
> >   int vmware_vmss_set_phys_base(ulong);
> > -int vmware_vmss_get_cpu_reg(int, int, const char *, int, void *);
> >
> >   /*
> >    * vmware_guestdump.c
> > @@ -7403,53 +7401,4 @@ extern int have_full_symbols(void);
> >   #define XEN_HYPERVISOR_ARCH
> >   #endif
> >
> > -/*
> > - * Register numbers must be in sync with gdb/features/i386/64bit-core.c
> > - * to make crash_target->fetch_registers() ---> machdep->get_cpu_reg()
> > - * working properly.
> > - */
> > -enum x86_64_regnum {
> > -        RAX_REGNUM,
> > -        RBX_REGNUM,
> > -        RCX_REGNUM,
> > -        RDX_REGNUM,
> > -        RSI_REGNUM,
> > -        RDI_REGNUM,
> > -        RBP_REGNUM,
> > -        RSP_REGNUM,
> > -        R8_REGNUM,
> > -        R9_REGNUM,
> > -        R10_REGNUM,
> > -        R11_REGNUM,
> > -        R12_REGNUM,
> > -        R13_REGNUM,
> > -        R14_REGNUM,
> > -        R15_REGNUM,
> > -        RIP_REGNUM,
> > -        EFLAGS_REGNUM,
> > -        CS_REGNUM,
> > -        SS_REGNUM,
> > -        DS_REGNUM,
> > -        ES_REGNUM,
> > -        FS_REGNUM,
> > -        GS_REGNUM,
> > -        ST0_REGNUM,
> > -        ST1_REGNUM,
> > -        ST2_REGNUM,
> > -        ST3_REGNUM,
> > -        ST4_REGNUM,
> > -        ST5_REGNUM,
> > -        ST6_REGNUM,
> > -        ST7_REGNUM,
> > -        FCTRL_REGNUM,
> > -        FSTAT_REGNUM,
> > -        FTAG_REGNUM,
> > -        FISEG_REGNUM,
> > -        FIOFF_REGNUM,
> > -        FOSEG_REGNUM,
> > -        FOOFF_REGNUM,
> > -        FOP_REGNUM,
> > -        LAST_REGNUM
> > -};
> > -
> >   #endif /* !GDB_COMMON */
> > diff --git a/gdb_interface.c b/gdb_interface.c
> > index b14319c66147..574447fd82b7 100644
> > --- a/gdb_interface.c
> > +++ b/gdb_interface.c
> > @@ -710,10 +710,11 @@ static char *prohibited_list[] = {
> >       "run", "r", "break", "b", "tbreak", "hbreak", "thbreak", "rbreak",
> >       "watch", "rwatch", "awatch", "attach", "continue", "c", "fg",
> "detach",
> >       "finish", "handle", "interrupt", "jump", "kill", "next", "nexti",
> > -     "signal", "step", "s", "stepi", "target", "until", "delete",
> > -     "clear", "disable", "enable", "condition", "ignore", "frame",
> "catch",
> > -     "tcatch", "return", "file", "exec-file", "core-file",
> "symbol-file",
> > -     "load", "si", "ni", "shell", "sy",
> > +     "signal", "step", "s", "stepi", "target", "thread", "until",
> "delete",
> > +     "clear", "disable", "enable", "condition", "ignore", "frame",
> > +     "select-frame", "f", "up", "down", "catch", "tcatch", "return",
> > +     "file", "exec-file", "core-file", "symbol-file", "load", "si",
> "ni",
> > +     "shell", "sy",
> >       NULL  /* must be last */
> >   };
> >
> > @@ -1068,8 +1069,6 @@ unsigned long crash_get_kaslr_offset(void)
> >
> >   /* Callbacks for crash_target */
> >   int crash_get_nr_cpus(void);
> > -int crash_get_cpu_reg (int cpu, int regno, const char *regname,
> > -                       int regsize, void *val);
> >
> >   int crash_get_nr_cpus(void)
> >   {
> > @@ -1086,11 +1085,3 @@ int crash_get_nr_cpus(void)
> >           return 1;
> >   }
> >
> > -int crash_get_cpu_reg (int cpu, int regno, const char *regname,
> > -                       int regsize, void *value)
> > -{
> > -        if (!machdep->get_cpu_reg)
> > -                return FALSE;
> > -        return machdep->get_cpu_reg(cpu, regno, regname, regsize,
> value);
> > -}
> > -
> > diff --git a/vmware_vmss.c b/vmware_vmss.c
> > index f6c5f32ea4c0..151cfdbca5e5 100644
> > --- a/vmware_vmss.c
> > +++ b/vmware_vmss.c
> > @@ -1,7 +1,7 @@
> >   /*
> >    * vmware_vmss.c
> >    *
> > - * Copyright (c) 2015, 2020 VMware, Inc.
> > + * Copyright (c) 2015 VMware, Inc.
> >    * Copyright (c) 2018 Red Hat Inc.
> >    *
> >    * This program is free software; you can redistribute it and/or modify
> > @@ -16,7 +16,6 @@
> >    *
> >    * Authors: Dyno Hongjun Fu <h...@vmware.com>
> >    *          Sergio Lopez <s...@redhat.com>
> > - *          Alexey Makhalov <amakha...@vmware.com>
> >    */
> >
> >   #include "defs.h"
> > @@ -895,54 +894,6 @@ vmware_vmss_get_cr3_cr4_idtr(int cpu, ulong *cr3,
> ulong *cr4, ulong *idtr)
> >       return TRUE;
> >   }
> >
> > -int
> > -vmware_vmss_get_cpu_reg(int cpu, int regno, const char *name, int size,
> > -                        void *value)
> > -{
> > -        if (cpu >= vmss.num_vcpus)
> > -                return FALSE;
> > -
> > -        /* All supported registers are 8 bytes long. */
> > -        if (size != 8)
> > -                return FALSE;
> > -
> > -#define CASE(R,r) \
> > -                case R##_REGNUM: \
> > -                        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 EFLAGS_REGNUM:
> > -                        if (!(vmss.vcpu_regs[cpu] &
> REGS_PRESENT_RFLAGS))
> > -                                return FALSE;
> > -                        memcpy(value, &vmss.regs64[cpu]->rflags, size);
> > -                        break;
> > -                default:
> > -                        return FALSE;
> > -        }
> > -        return TRUE;
> > -}
> > -
> >   int
> >   vmware_vmss_phys_base(ulong *phys_base)
> >   {
> > diff --git a/x86_64.c b/x86_64.c
> > index 74bd1bbde41c..da94b1c0e917 100644
> > --- a/x86_64.c
> > +++ b/x86_64.c
> > @@ -126,7 +126,6 @@ static int x86_64_get_framesize(struct bt_info *,
> ulong, ulong);
> >   static void x86_64_framesize_debug(struct bt_info *);
> >   static void x86_64_get_active_set(void);
> >   static int x86_64_get_kvaddr_ranges(struct vaddr_range *);
> > -static int x86_64_get_cpu_reg(int, int, const char *, int, void *);
> >   static int x86_64_verify_paddr(uint64_t);
> >   static void GART_init(void);
> >   static void x86_64_exception_stacks_init(void);
> > @@ -195,7 +194,6 @@ x86_64_init(int when)
> >               machdep->machspec->irq_eframe_link = UNINITIALIZED;
> >               machdep->machspec->irq_stack_gap = UNINITIALIZED;
> >               machdep->get_kvaddr_ranges = x86_64_get_kvaddr_ranges;
> > -             machdep->get_cpu_reg = x86_64_get_cpu_reg;
> >                   if (machdep->cmdline_args[0])
> >                           parse_cmdline_args();
> >               if ((string = pc->read_vmcoreinfo("relocate"))) {
> > @@ -889,7 +887,6 @@ x86_64_dump_machdep_table(ulong arg)
> >           fprintf(fp, "        is_page_ptr: x86_64_is_page_ptr()\n");
> >           fprintf(fp, "       verify_paddr: x86_64_verify_paddr()\n");
> >           fprintf(fp, "  get_kvaddr_ranges:
> x86_64_get_kvaddr_ranges()\n");
> > -     fprintf(fp, "        get_cpu_reg: x86_64_get_cpu_reg()\n");
> >           fprintf(fp, "    init_kernel_pgd: x86_64_init_kernel_pgd()\n");
> >           fprintf(fp, "clear_machdep_cache:
> x86_64_clear_machdep_cache()\n");
> >       fprintf(fp, " xendump_p2m_create: %s\n", PVOPS_XEN() ?
> > @@ -8957,19 +8954,6 @@ x86_64_get_kvaddr_ranges(struct vaddr_range *vrp)
> >       return cnt;
> >   }
> >
> > -static int
> > -x86_64_get_cpu_reg(int cpu, int regno, const char *name,
> > -                   int size, void *value)
> > -{
> > -        if (regno >= LAST_REGNUM)
> > -                return FALSE;
> > -
> > -        if (VMSS_DUMPFILE())
> > -                return vmware_vmss_get_cpu_reg(cpu, regno, name, size,
> value);
> > -
> > -        return FALSE;
> > -}
> > -
> >   /*
> >    *  Determine the physical memory range reserved for GART.
> >    */
--
Crash-utility mailing list
Crash-utility@redhat.com
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to