On Fri, Oct 05, 2018 at 09:13:28AM -0400, Dave Anderson wrote:
>
>
> ----- Original Message -----
> > On Thu, Oct 04, 2018 at 05:03:25PM -0400, Dave Anderson wrote:
> > > ----- Original Message -----
> > ...
> > > Actually I was too quick to check the patch in -- it fails to build on
> > > most
> > > of the other architectures, like here on ppc64:
> > >
> > > $ make
> > > ... [ cut ] ...
> > > cc -c -g -DPPC64 -DLZO -DSNAPPY -DGDB_7_6 memory.c -Wall -O2
> > > -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
> > > -Wformat-security
> > > memory.c: In function ‘pfn_to_phys’:
> > > memory.c:17315:16: error: ‘PAGE_SHIFT’ undeclared (first use in this
> > > function)
> > > return pfn << PAGE_SHIFT;
> > > ^
> > > memory.c:17315:16: note: each undeclared identifier is reported only
> > > once
> > > for each function it appears in
> > > memory.c:17316:1: warning: control reaches end of non-void function
> > > [-Wreturn-type]
> > > }
> > > ^
> > > make[4]: *** [memory.o] Error 1
> > > make[3]: *** [gdb] Error 2
> > > make[2]: *** [rebuild] Error 2
> > > make[1]: *** [gdb_merge] Error 2
> > > make: *** [warn] Error 2
> > > $
> > >
> > > It looks like PAGE_SHIFT is only #define'd for x86_64, 32-bit PPC,
and
> > > SPARC64.
> > > Can you work on a architecture-neutral solution?
> >
> > Could you try the following additional fix?
> >
> > ---
> > diff --git a/memory.c b/memory.c
> > index 9657c28..ac94345 100644
> > --- a/memory.c
> > +++ b/memory.c
> > @@ -17312,7 +17312,7 @@ fill_memory_block_state(ulong memblock, char
> > *buf)
> > static ulong
> > pfn_to_phys(ulong pfn)
> > {
> > - return pfn << PAGE_SHIFT;
> > + return pfn * sysconf(_SC_PAGESIZE);
> > }
>
> That wouldn't work, for example, when running a binary created
> with "make target=ARM64" on an x86_64 if the ARM64 kernel was
> using 64K pages. You could use PAGESHIFT() or PAGESIZE().
It is nice macro! The macro returns machdep->pageshift and
it is stored at crash initialization in all arch, right?
So, does the following make sense?
Yeah, that should be OK. It depends upon the architecture, but it looks
like latest point in time where machdep->pageshift gets initialized is
when machdep_init(PRE_GDB) is called (ppc64, arm64, mips). And your code
should never be called prior to that.
Dave
---
diff --git a/memory.c b/memory.c
index 9657c28..de93af0 100644
--- a/memory.c
+++ b/memory.c
@@ -17312,7 +17312,7 @@ fill_memory_block_state(ulong memblock, char *buf)
static ulong
pfn_to_phys(ulong pfn)
{
- return pfn << PAGE_SHIFT;
+ return pfn << PAGESHIFT();
}
static void
---
Thanks,
Masa
>
> Dave
>
> >
> > static void
> > ---
> >
> > Thanks,
> > Masa
> >
> >
> > >
> > > Thanks,
> > > Dave
> > >
> > >
> > >
> > > >
> > > > >
> > > > > Signed-off-by: Masayoshi Mizuma <m.mizuma(a)jp.fujitsu.com>
> > > > > ---
> > > > > defs.h | 9 ++
> > > > > memory.c | 286
> > > > > +++++++++++++++++++++++++++++++++++++++++++++++++++---
> > > > > symbols.c | 18 ++++
> > > > > 3 files changed, 299 insertions(+), 14 deletions(-)
> > > > >
> > > > > diff --git a/defs.h b/defs.h
> > > > > index 5b64bb7..20dd6a7 100644
> > > > > --- a/defs.h
> > > > > +++ b/defs.h
> > > > > @@ -2049,6 +2049,15 @@ struct offset_table {
/*
> > > > > stash of
> > > > > commonly-used offsets */
> > > > > long pci_bus_self;
> > > > > long device_kobj;
> > > > > long kobject_name;
> > > > > + long memory_block_dev;
> > > > > + long memory_block_start_section_nr;
> > > > > + long memory_block_end_section_nr;
> > > > > + long memory_block_state;
> > > > > + long memory_block_nid;
> > > > > + long mem_section_pageblock_flags;
> > > > > + long bus_type_p;
> > > > > + long device_private_device;
> > > > > + long device_private_knode_bus;
> > > > > };
> > > > >
> > > > > struct size_table { /* stash of commonly-used sizes */
> > > > > diff --git a/memory.c b/memory.c
> > > > > index ea25047..9657c28 100644
> > > > > --- a/memory.c
> > > > > +++ b/memory.c
> > > > > @@ -255,13 +255,14 @@ static void PG_slab_flag_init(void);
> > > > > static ulong nr_blockdev_pages(void);
> > > > > void sparse_mem_init(void);
> > > > > void dump_mem_sections(int);
> > > > > +void dump_memory_blocks(int);
> > > > > void list_mem_sections(void);
> > > > > ulong sparse_decode_mem_map(ulong, ulong);
> > > > > char *read_mem_section(ulong);
> > > > > ulong nr_to_section(ulong);
> > > > > int valid_section(ulong);
> > > > > int section_has_mem_map(ulong);
> > > > > -ulong section_mem_map_addr(ulong);
> > > > > +ulong section_mem_map_addr(ulong, int);
> > > > > ulong valid_section_nr(ulong);
> > > > > ulong pfn_to_map(ulong);
> > > > > static int get_nodes_online(void);
> > > > > @@ -5528,7 +5529,7 @@ dump_mem_map_SPARSEMEM(struct meminfo
*mi)
> > > > > pc->curcmd_flags |= HEADER_PRINTED;
> > > > > }
> > > > >
> > > > > - pp = section_mem_map_addr(section);
> > > > > + pp = section_mem_map_addr(section, 0);
> > > > > pp = sparse_decode_mem_map(pp, section_nr);
> > > > > phys = (physaddr_t) section_nr * PAGES_PER_SECTION() *
> > > > > PAGESIZE();
> > > > > section_size = PAGES_PER_SECTION();
> > > > > @@ -13389,7 +13390,7 @@ is_page_ptr(ulong addr, physaddr_t
*phys)
> > > > > nr_mem_sections = vt->max_mem_section_nr+1;
> > > > > for (nr = 0; nr < nr_mem_sections ; nr++) {
> > > > > if ((sec_addr = valid_section_nr(nr))) {
> > > > > - coded_mem_map =
> > > > > section_mem_map_addr(sec_addr);
> > > > > + coded_mem_map =
> > > > > section_mem_map_addr(sec_addr,
> > > > > 0);
> > > > > mem_map =
> > > > > sparse_decode_mem_map(coded_mem_map,
> > > > > nr);
> > > > > end_mem_map = mem_map + (PAGES_PER_SECTION() *
SIZE(page));
> > > > >
> > > > > @@ -16354,8 +16355,10 @@ dump_memory_nodes(int initialize)
> > > > > vt->numnodes = n;
> > > > > }
> > > > >
> > > > > - if (IS_SPARSEMEM())
> > > > > + if (IS_SPARSEMEM()) {
> > > > > dump_mem_sections(initialize);
> > > > > + dump_memory_blocks(initialize);
> > > > > + }
> > > > > }
> > > > >
> > > > > /*
> > > > > @@ -17140,7 +17143,7 @@ section_has_mem_map(ulong addr)
> > > > > }
> > > > >
> > > > > ulong
> > > > > -section_mem_map_addr(ulong addr)
> > > > > +section_mem_map_addr(ulong addr, int raw)
> > > > > {
> > > > > char *mem_section;
> > > > > ulong map;
> > > > > @@ -17148,7 +17151,8 @@ section_mem_map_addr(ulong addr)
> > > > > if ((mem_section = read_mem_section(addr))) {
> > > > > map = ULONG(mem_section +
> > > > > OFFSET(mem_section_section_mem_map));
> > > > > - map &= SECTION_MAP_MASK;
> > > > > + if (!raw)
> > > > > + map &= SECTION_MAP_MASK;
> > > > > return map;
> > > > > }
> > > > > return 0;
> > > > > @@ -17179,7 +17183,7 @@ pfn_to_map(ulong pfn)
> > > > >
> > > > > if (section_has_mem_map(section)) {
> > > > > page_offset = pfn - section_nr_to_pfn(section_nr);
> > > > > - coded_mem_map = section_mem_map_addr(section);
> > > > > + coded_mem_map = section_mem_map_addr(section, 0);
> > > > > mem_map = sparse_decode_mem_map(coded_mem_map, section_nr) +
> > > > > (page_offset * SIZE(page));
> > > > > return mem_map;
> > > > > @@ -17188,16 +17192,33 @@ pfn_to_map(ulong pfn)
> > > > > return 0;
> > > > > }
> > > > >
> > > > > +static void
> > > > > +fill_mem_section_state(ulong state, char *buf)
> > > > > +{
> > > > > + int bufidx = 0;
> > > > > +
> > > > > + memset(buf, 0, sizeof(*buf) * BUFSIZE);
> > > > > +
> > > > > + if (state & SECTION_MARKED_PRESENT)
> > > > > + bufidx += sprintf(buf + bufidx, "%s",
"P");
> > > > > + if (state & SECTION_HAS_MEM_MAP)
> > > > > + bufidx += sprintf(buf + bufidx, "%s",
"M");
> > > > > + if (state & SECTION_IS_ONLINE)
> > > > > + bufidx += sprintf(buf + bufidx, "%s",
"O");
> > > > > +}
> > > > > +
> > > > > void
> > > > > dump_mem_sections(int initialize)
> > > > > {
> > > > > ulong nr, max, addr;
> > > > > ulong nr_mem_sections;
> > > > > ulong coded_mem_map, mem_map, pfn;
> > > > > + char statebuf[BUFSIZE];
> > > > > char buf1[BUFSIZE];
> > > > > char buf2[BUFSIZE];
> > > > > char buf3[BUFSIZE];
> > > > > char buf4[BUFSIZE];
> > > > > + char buf5[BUFSIZE];
> > > > >
> > > > > nr_mem_sections = NR_MEM_SECTIONS();
> > > > >
> > > > > @@ -17212,19 +17233,23 @@ dump_mem_sections(int initialize)
> > > > >
> > > > > fprintf(fp, "\n");
> > > > > pad_line(fp, BITS32() ? 59 : 67, '-');
> > > > > - fprintf(fp, "\n\nNR %s %s %s PFN\n",
> > > > > + fprintf(fp, "\n\nNR %s %s %s %s PFN\n",
> > > > > mkstring(buf1, VADDR_PRLEN, CENTER|LJUST,
> > > > > "SECTION"),
> > > > > mkstring(buf2,
> > > > >
MAX(VADDR_PRLEN,strlen("CODED_MEM_MAP")),
> > > > > CENTER|LJUST, "CODED_MEM_MAP"),
> > > > > - mkstring(buf3, VADDR_PRLEN, CENTER|LJUST,
> > > > > "MEM_MAP"));
> > > > > + mkstring(buf3, VADDR_PRLEN, CENTER|LJUST,
"MEM_MAP"),
> > > > > + mkstring(buf4, strlen("STATE"), CENTER,
"STATE"));
> > > > >
> > > > > for (nr = 0; nr < nr_mem_sections ; nr++) {
> > > > > if ((addr = valid_section_nr(nr))) {
> > > > > - coded_mem_map = section_mem_map_addr(addr);
> > > > > + coded_mem_map = section_mem_map_addr(addr, 0);
> > > > > mem_map = sparse_decode_mem_map(coded_mem_map,nr);
> > > > > pfn = section_nr_to_pfn(nr);
> > > > > + fill_mem_section_state(section_mem_map_addr(addr, 1),
> > > > > + statebuf);
> > > > >
> > > > > - fprintf(fp, "%2ld %s %s %s %s\n",
> > > > > +
> > > > > + fprintf(fp, "%2ld %s %s %s %s %s\n",
> > > > > nr,
> > > > > mkstring(buf1, VADDR_PRLEN,
> > > > > CENTER|LONG_HEX, MKSTR(addr)),
> > > > > @@ -17233,15 +17258,248 @@ dump_mem_sections(int initialize)
> > > > > CENTER|LONG_HEX|RJUST,
> > > > > MKSTR(coded_mem_map)),
> > > > > mkstring(buf3, VADDR_PRLEN,
> > > > > CENTER|LONG_HEX|RJUST,
MKSTR(mem_map)),
> > > > > + mkstring(buf4, strlen("STATE"), CENTER,
statebuf),
> > > > > pc->output_radix == 10 ?
> > > > > - mkstring(buf4, VADDR_PRLEN,
> > > > > + mkstring(buf5, VADDR_PRLEN,
> > > > > LONG_DEC|LJUST, MKSTR(pfn)) :
> > > > > - mkstring(buf4, VADDR_PRLEN,
> > > > > + mkstring(buf5, VADDR_PRLEN,
> > > > > LONG_HEX|LJUST, MKSTR(pfn)));
> > > > > }
> > > > > }
> > > > > }
> > > > >
> > > > > +#define MEM_ONLINE (1<<0)
> > > > > +#define MEM_GOING_OFFLINE (1<<1)
> > > > > +#define MEM_OFFLINE (1<<2)
> > > > > +#define MEM_GOING_ONLINE (1<<3)
> > > > > +#define MEM_CANCEL_ONLINE (1<<4)
> > > > > +#define MEM_CANCEL_OFFLINE (1<<5)
> > > > > +
> > > > > +static void
> > > > > +fill_memory_block_state(ulong memblock, char *buf)
> > > > > +{
> > > > > + ulong state;
> > > > > +
> > > > > + memset(buf, 0, sizeof(*buf) * BUFSIZE);
> > > > > +
> > > > > + readmem(memblock + OFFSET(memory_block_state), KVADDR,
&state,
> > > > > + sizeof(void *), "memory_block state",
FAULT_ON_ERROR);
> > > > > +
> > > > > + switch (state) {
> > > > > + case MEM_ONLINE:
> > > > > + sprintf(buf, "%s", "ONLINE");
> > > > > + break;
> > > > > + case MEM_GOING_OFFLINE:
> > > > > + sprintf(buf, "%s", "GOING_OFFLINE");
> > > > > + break;
> > > > > + case MEM_OFFLINE:
> > > > > + sprintf(buf, "%s", "OFFLINE");
> > > > > + break;
> > > > > + case MEM_GOING_ONLINE:
> > > > > + sprintf(buf, "%s", "GOING_ONLINE");
> > > > > + break;
> > > > > + case MEM_CANCEL_ONLINE:
> > > > > + sprintf(buf, "%s", "CANCEL_ONLINE");
> > > > > + break;
> > > > > + case MEM_CANCEL_OFFLINE:
> > > > > + sprintf(buf, "%s", "CANCEL_OFFLINE");
> > > > > + break;
> > > > > + default:
> > > > > + sprintf(buf, "%s", "UNKNOWN");
> > > > > + }
> > > > > +}
> > > > > +
> > > > > +static ulong
> > > > > +pfn_to_phys(ulong pfn)
> > > > > +{
> > > > > + return pfn << PAGE_SHIFT;
> > > > > +}
> > > > > +
> > > > > +static void
> > > > > +fill_memory_block_name(ulong memblock, char *name)
> > > > > +{
> > > > > + ulong kobj, value;
> > > > > +
> > > > > + memset(name, 0, sizeof(*name) * BUFSIZE);
> > > > > +
> > > > > + kobj = memblock + OFFSET(memory_block_dev) +
OFFSET(device_kobj);
> > > > > +
> > > > > + readmem(kobj + OFFSET(kobject_name),
> > > > > + KVADDR, &value, sizeof(void *), "kobject
name",
> > > > > + FAULT_ON_ERROR);
> > > > > +
> > > > > + read_string(value, name, BUFSIZE-1);
> > > > > +}
> > > > > +
> > > > > +static void
> > > > > +fill_memory_block_srange(ulong start_sec, ulong end_sec, char
> > > > > *srange)
> > > > > +{
> > > > > + memset(srange, 0, sizeof(*srange) * BUFSIZE);
> > > > > +
> > > > > + if (start_sec == end_sec)
> > > > > + sprintf(srange, "%lu", start_sec);
> > > > > + else
> > > > > + sprintf(srange, "%lu-%lu", start_sec, end_sec);
> > > > > +}
> > > > > +
> > > > > +static void
> > > > > +print_memory_block(ulong memory_block)
> > > > > +{
> > > > > + ulong start_sec, end_sec, start_pfn, end_pfn, nid;
> > > > > + char statebuf[BUFSIZE];
> > > > > + char srangebuf[BUFSIZE];
> > > > > + char name[BUFSIZE];
> > > > > + char buf1[BUFSIZE];
> > > > > + char buf2[BUFSIZE];
> > > > > + char buf3[BUFSIZE];
> > > > > + char buf4[BUFSIZE];
> > > > > + char buf5[BUFSIZE];
> > > > > + char buf6[BUFSIZE];
> > > > > + char buf7[BUFSIZE];
> > > > > +
> > > > > + readmem(memory_block + OFFSET(memory_block_start_section_nr),
> > > > > KVADDR,
> > > > > + &start_sec, sizeof(void *), "memory_block
start_section_nr",
> > > > > + FAULT_ON_ERROR);
> > > > > + readmem(memory_block + OFFSET(memory_block_end_section_nr),
> > > > > KVADDR,
> > > > > + &end_sec, sizeof(void *), "memory_block
end_section_nr",
> > > > > + FAULT_ON_ERROR);
> > > > > +
> > > > > + start_pfn = section_nr_to_pfn(start_sec);
> > > > > + end_pfn = section_nr_to_pfn(end_sec + 1);
> > > > > + fill_memory_block_state(memory_block, statebuf);
> > > > > + fill_memory_block_name(memory_block, name);
> > > > > + fill_memory_block_srange(start_sec, end_sec, srangebuf);
> > > > > +
> > > > > + if (MEMBER_EXISTS("memory_block", "nid"))
{
> > > > > + readmem(memory_block + OFFSET(memory_block_nid), KVADDR,
&nid,
> > > > > + sizeof(void *), "memory_block nid",
FAULT_ON_ERROR);
> > > > > + fprintf(fp, " %s %s %s - %s %s %s %s\n",
> > > > > + mkstring(buf1, VADDR_PRLEN, LJUST|LONG_HEX,
> > > > > + MKSTR(memory_block)),
> > > > > + mkstring(buf2, 12, CENTER, name),
> > > > > + mkstring(buf3, PADDR_PRLEN, RJUST|LONG_HEX,
> > > > > + MKSTR(pfn_to_phys(start_pfn))),
> > > > > + mkstring(buf4, PADDR_PRLEN, LJUST|LONG_HEX,
> > > > > + MKSTR(pfn_to_phys(end_pfn) - 1)),
> > > > > + mkstring(buf5, strlen("NODE"), CENTER|LONG_DEC,
> > > > > + MKSTR(nid)),
> > > > > + mkstring(buf6, strlen("CANCEL_OFFLINE"), LJUST,
> > > > > + statebuf),
> > > > > + mkstring(buf7, 12, LJUST, srangebuf));
> > > > > + } else
> > > > > + fprintf(fp, " %s %s %s - %s %s %s\n",
> > > > > + mkstring(buf1, VADDR_PRLEN, LJUST|LONG_HEX,
> > > > > + MKSTR(memory_block)),
> > > > > + mkstring(buf2, 10, CENTER, name),
> > > > > + mkstring(buf3, PADDR_PRLEN, RJUST|LONG_HEX,
> > > > > + MKSTR(pfn_to_phys(start_pfn))),
> > > > > + mkstring(buf4, PADDR_PRLEN, LJUST|LONG_HEX,
> > > > > + MKSTR(pfn_to_phys(end_pfn) - 1)),
> > > > > + mkstring(buf5, strlen("CANCEL_OFFLINE"), LJUST,
> > > > > + statebuf),
> > > > > + mkstring(buf6, 12, LJUST, srangebuf));
> > > > > +}
> > > > > +
> > > > > +static void
> > > > > +init_memory_block_offset(void)
> > > > > +{
> > > > > + MEMBER_OFFSET_INIT(bus_type_p, "bus_type",
"p");
> > > > > + MEMBER_OFFSET_INIT(subsys_private_klist_devices,
> > > > > + "subsys_private", "klist_devices");
> > > > > + MEMBER_OFFSET_INIT(klist_k_list, "klist",
"k_list");
> > > > > + MEMBER_OFFSET_INIT(klist_node_n_node, "klist_node",
"n_node");
> > > > > + MEMBER_OFFSET_INIT(device_private_knode_bus,
> > > > > + "device_private", "knode_bus");
> > > > > + MEMBER_OFFSET_INIT(device_private_device,
"device_private",
> > > > > "device");
> > > > > + MEMBER_OFFSET_INIT(memory_block_dev, "memory_block",
"dev");
> > > > > + MEMBER_OFFSET_INIT(memory_block_start_section_nr,
> > > > > + "memory_block", "start_section_nr");
> > > > > + MEMBER_OFFSET_INIT(memory_block_end_section_nr,
> > > > > + "memory_block", "end_section_nr");
> > > > > + MEMBER_OFFSET_INIT(memory_block_state,
"memory_block", "state");
> > > > > + if (MEMBER_EXISTS("memory_block", "nid"))
> > > > > + MEMBER_OFFSET_INIT(memory_block_nid,
"memory_block", "nid");
> > > > > +}
> > > > > +
> > > > > +static void
> > > > > +init_memory_block(struct list_data *ld, int *klistcnt, ulong
> > > > > **klistbuf)
> > > > > +{
> > > > > + ulong memory_subsys =
symbol_value("memory_subsys");
> > > > > + ulong private, klist, start;
> > > > > +
> > > > > + init_memory_block_offset();
> > > > > +
> > > > > + readmem(memory_subsys + OFFSET(bus_type_p), KVADDR,
&private,
> > > > > + sizeof(void *), "memory_subsys.private",
FAULT_ON_ERROR);
> > > > > + klist = private + OFFSET(subsys_private_klist_devices) +
> > > > > + OFFSET(klist_k_list);
> > > > > + BZERO(ld, sizeof(struct list_data));
> > > > > +
> > > > > + readmem(klist, KVADDR, &start,
> > > > > + sizeof(void *), "klist klist", FAULT_ON_ERROR);
> > > > > +
> > > > > + ld->start = start;
> > > > > + ld->end = klist;
> > > > > + ld->list_head_offset = OFFSET(klist_node_n_node) +
> > > > > + OFFSET(device_private_knode_bus);
> > > > > + hq_open();
> > > > > + *klistcnt = do_list(ld);
> > > > > + *klistbuf = (ulong *)GETBUF(*klistcnt * sizeof(ulong));
> > > > > + *klistcnt = retrieve_list(*klistbuf, *klistcnt);
> > > > > + hq_close();
> > > > > +}
> > > > > +
> > > > > +void
> > > > > +dump_memory_blocks(int initialize)
> > > > > +{
> > > > > + ulong memory_block, device;
> > > > > + ulong *klistbuf;
> > > > > + int klistcnt, i;
> > > > > + struct list_data list_data;
> > > > > + char mb_hdr[BUFSIZE];
> > > > > + char buf1[BUFSIZE];
> > > > > + char buf2[BUFSIZE];
> > > > > + char buf3[BUFSIZE];
> > > > > + char buf4[BUFSIZE];
> > > > > + char buf5[BUFSIZE];
> > > > > + char buf6[BUFSIZE];
> > > > > +
> > > > > + if ((!STRUCT_EXISTS("memory_block")) ||
> > > > > + (!symbol_exists("memory_subsys")))
> > > > > + return;
> > > > > +
> > > > > + if (initialize)
> > > > > + return;
> > > > > +
> > > > > + init_memory_block(&list_data, &klistcnt,
&klistbuf);
> > > > > +
> > > > > + if (MEMBER_EXISTS("memory_block", "nid"))
> > > > > + sprintf(mb_hdr, "\n%s %s %s %s %s %s\n",
> > > > > + mkstring(buf1, VADDR_PRLEN, CENTER|LJUST,
"MEM_BLOCK"),
> > > > > + mkstring(buf2, 10, CENTER, "NAME"),
> > > > > + mkstring(buf3, PADDR_PRLEN*2 + 2, CENTER, "PHYSICAL
RANGE"),
> > > > > + mkstring(buf4, strlen("NODE"), CENTER,
"NODE"),
> > > > > + mkstring(buf5, strlen("CANCEL_OFFLINE"), LJUST,
"STATE"),
> > > > > + mkstring(buf6, 12, LJUST, "SECTIONS"));
> > > > > + else
> > > > > + sprintf(mb_hdr, "\n%s %s %s %s %s\n",
> > > > > + mkstring(buf1, VADDR_PRLEN, CENTER|LJUST,
"MEM_BLOCK"),
> > > > > + mkstring(buf2, 10, CENTER, "NAME"),
> > > > > + mkstring(buf3, PADDR_PRLEN*2, CENTER, "PHYSICAL
RANGE"),
> > > > > + mkstring(buf4, strlen("CANCEL_OFFLINE"), LJUST,
"STATE"),
> > > > > + mkstring(buf5, 12, LJUST, "SECTIONS"));
> > > > > + fprintf(fp, "%s", mb_hdr);
> > > > > +
> > > > > + for (i = 0; i < klistcnt; i++) {
> > > > > + readmem(klistbuf[i] + OFFSET(device_private_device), KVADDR,
> > > > > + &device, sizeof(void *), "device_private
device",
> > > > > + FAULT_ON_ERROR);
> > > > > + memory_block = device - OFFSET(memory_block_dev);
> > > > > + print_memory_block(memory_block);
> > > > > + }
> > > > > + FREEBUF(klistbuf);
> > > > > +}
> > > > > +
> > > > > void
> > > > > list_mem_sections(void)
> > > > > {
> > > > > @@ -17251,7 +17509,7 @@ list_mem_sections(void)
> > > > >
> > > > > for (nr = 0; nr <= nr_mem_sections ; nr++) {
> > > > > if ((addr = valid_section_nr(nr))) {
> > > > > - coded_mem_map = section_mem_map_addr(addr);
> > > > > + coded_mem_map = section_mem_map_addr(addr, 0);
> > > > > fprintf(fp,
> > > > > "nr=%ld section = %lx coded_mem_map=%lx pfn=%ld
> > > > > mem_map=%lx\n",
> > > > > nr,
> > > > > diff --git a/symbols.c b/symbols.c
> > > > > index cb2174b..c5aab14 100644
> > > > > --- a/symbols.c
> > > > > +++ b/symbols.c
> > > > > @@ -9938,6 +9938,18 @@ dump_offset_table(char *spec, ulong
> > > > > makestruct)
> > > > > OFFSET(tss_struct_ist));
> > > > > fprintf(fp, " mem_section_section_mem_map:
%ld\n",
> > > > > OFFSET(mem_section_section_mem_map));
> > > > > + fprintf(fp, " mem_section_pageblock_flags:
%ld\n",
> > > > > + OFFSET(mem_section_pageblock_flags));
> > > > > + fprintf(fp, " memory_block_dev:
%ld\n",
> > > > > + OFFSET(memory_block_dev));
> > > > > + fprintf(fp, " memory_block_nid:
%ld\n",
> > > > > + OFFSET(memory_block_nid));
> > > > > + fprintf(fp, " memory_block_start_section_nr:
%ld\n",
> > > > > + OFFSET(memory_block_start_section_nr));
> > > > > + fprintf(fp, " memory_block_end_section_nr:
%ld\n",
> > > > > + OFFSET(memory_block_end_section_nr));
> > > > > + fprintf(fp, " memory_block_state:
%ld\n",
> > > > > + OFFSET(memory_block_state));
> > > > >
> > > > > fprintf(fp, " vcpu_guest_context_user_regs:
%ld\n",
> > > > > OFFSET(vcpu_guest_context_user_regs));
> > > > > @@ -10031,6 +10043,8 @@ dump_offset_table(char *spec, ulong
> > > > > makestruct)
> > > > > OFFSET(unwind_idx_addr));
> > > > > fprintf(fp, " unwind_idx_insn:
%ld\n",
> > > > > OFFSET(unwind_idx_insn));
> > > > > + fprintf(fp, " bus_type_p:
%ld\n",
> > > > > + OFFSET(bus_type_p));
> > > > > fprintf(fp, " class_devices:
%ld\n",
> > > > > OFFSET(class_devices));
> > > > > fprintf(fp, " class_p:
%ld\n",
> > > > > @@ -10041,6 +10055,10 @@ dump_offset_table(char *spec, ulong
> > > > > makestruct)
> > > > > OFFSET(device_knode_class));
> > > > > fprintf(fp, " device_node:
%ld\n",
> > > > > OFFSET(device_node));
> > > > > + fprintf(fp, " device_private_device:
%ld\n",
> > > > > + OFFSET(device_private_device));
> > > > > + fprintf(fp, " device_private_knode_bus:
%ld\n",
> > > > > + OFFSET(device_private_knode_bus));
> > > > > fprintf(fp, " gendisk_dev:
%ld\n",
> > > > > OFFSET(gendisk_dev));
> > > > > fprintf(fp, " gendisk_kobj:
%ld\n",
> > > > > --
> > > > > 2.19.0
> > > > >
> > > > > --
> > > > > Crash-utility mailing list
> > > > > Crash-utility(a)redhat.com
> > > > >
https://www.redhat.com/mailman/listinfo/crash-utility
> > > > >
> > > >
> > > > --
> > > > Crash-utility mailing list
> > > > Crash-utility(a)redhat.com
> > > >
https://www.redhat.com/mailman/listinfo/crash-utility
> > > >
> > >
> > > --
> > > Crash-utility mailing list
> > > Crash-utility(a)redhat.com
> > >
https://www.redhat.com/mailman/listinfo/crash-utility
> >