In Linux, when EFI_DEBUG in xen/arch/ia64/linux-xen/efi.c is set to
a non-zero value the EFI memory regions, as supplied by the
boot parameter are displayed. Unfortunately this doesn't work
on Xen as the console is not available at this time.
* Allow the memory region printing code (print_md()) used
to show the virtualised EFI regions used by by domains to also
be used to show the physical regions.
* Allow print_md() to print a region using a single call to printk -
previously 2 were used, which seems dubious.
* Enhance print_md() to show TB and GB as well as MB and KB.
On the rx2620 box I use there us a (reserved) region
of 8TB in size. 8TB seems much more readable than
8388608MB to me.
* Pad the size displayed by print_md() with whitespace for readability.
* Wrap the current EFI range dumping code inherited from Linux
with #ifdef XEN. As mentioned above it doesn't work.
* Add a new efi_dump_mem() call which does nothing unless
EFI_DEBUG is non-zero. Call this function from within
start_kernel().
Although its just debugging code, I have found this very useful and
I believe others may too.
Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
---
The output for the hypervisor memory will look like:
(XEN) mem00: type= 4, attr=0x0000000000000008,
range=[0x0000000000000000-0x0000000000001000) ( 4KB)
(XEN) mem01: type= 7, attr=0x0000000000000008,
range=[0x0000000000001000-0x00000000000a0000) ( 636KB)
(XEN) mem02: type=11, attr=0x0000000000000003,
range=[0x00000000000a0000-0x00000000000c0000) ( 128KB)
(XEN) mem03: type= 5, attr=0x8000000000000001,
range=[0x00000000000c0000-0x0000000000100000) ( 256KB)
(XEN) mem04: type= 7, attr=0x0000000000000008,
range=[0x0000000000100000-0x0000000004000000) ( 63MB)
(XEN) mem05: type= 2, attr=0x0000000000000008,
range=[0x0000000004000000-0x00000000041f0000) ( 1MB)
(XEN) mem06: type= 7, attr=0x0000000000000008,
range=[0x00000000041f0000-0x000000003e695000) ( 932MB)
The output for domain memory will look like:
(XEN) dom mem00: type=13, attr=0x8000000000000008,
range=[0x0000000000000000-0x0000000000001000) ( 4KB)
(XEN) dom mem01: type=10, attr=0x8000000000000008,
range=[0x0000000000001000-0x0000000000002000) ( 4KB)
(XEN) dom mem02: type= 6, attr=0x8000000000000008,
range=[0x0000000000002000-0x0000000000003000) ( 4KB)
(XEN) dom mem03: type= 7, attr=0x0000000000000008,
range=[0x0000000000003000-0x00000000000a0000) ( 628KB)
(XEN) dom mem04: type=11, attr=0x0000000000000003,
range=[0x00000000000a0000-0x00000000000c0000) ( 128KB)
(XEN) dom mem05: type= 5, attr=0x8000000000000001,
range=[0x00000000000c0000-0x0000000000100000) ( 256KB)
(XEN) dom mem06: type= 7, attr=0x0000000000000008,
range=[0x0000000000100000-0x0000000004000000) ( 63MB)
(XEN) dom mem07: type= 7, attr=0x0000000000000008,
range=[0x0000000004000000-0x00000000041f0000) ( 1MB)
(XEN) dom mem08: type= 7, attr=0x0000000000000008,
range=[0x00000000041f0000-0x000000003e4a5000) ( 930MB)
Index: xen-unstable.hg/xen/arch/ia64/linux-xen/efi.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/efi.c 2008-02-26
12:31:51.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/linux-xen/efi.c 2008-02-26
13:29:44.000000000 +0900
@@ -577,6 +577,7 @@ efi_init (void)
efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
efi_desc_size = ia64_boot_param->efi_memdesc_size;
+#ifndef XEN
#if EFI_DEBUG
/* print EFI memory map: */
{
@@ -592,11 +593,67 @@ efi_init (void)
}
}
#endif
+#endif
efi_map_pal_code();
efi_enter_virtual_mode();
}
+#ifdef XEN
+/* print EFI memory map: */
+void __init
+efi_dump_mem (void)
+{
+#if EFI_DEBUG
+ void *efi_map_start;
+ void *efi_map_end;
+ u64 efi_desc_size;
+ void *p;
+ int i;
+
+ efi_map_start = __va(ia64_boot_param->efi_memmap);
+ efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
+ efi_desc_size = ia64_boot_param->efi_memdesc_size;
+
+ for (i = 0, p = efi_map_start; p < efi_map_end;
+ ++i, p += efi_desc_size)
+ print_md("mem", i, p);
+#endif
+}
+
+void
+print_md(const char *prefix, int index, efi_memory_desc_t *md)
+{
+ uint64_t size = md->num_pages << EFI_PAGE_SHIFT;
+ const char *unit;
+
+ size = md->num_pages << EFI_PAGE_SHIFT;
+
+ if ((size >> 40) > 0) {
+ size >>= 40;
+ unit ="TB";
+ }
+ else if ((size >> 30) > 0) {
+ size >>= 30;
+ unit ="GB";
+ }
+ else if ((size >> 20) > 0) {
+ size >>= 20;
+ unit ="MB";
+ }
+ else {
+ size >>= 10;
+ unit ="KB";
+ }
+
+ printk(KERN_INFO "%s%02d: type=%2u, attr=0x%016lx, "
+ "range=[0x%016lx-0x%016lx) (%4lu%s)\n", prefix, index,
+ md->type, md->attribute, md->phys_addr,
+ md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT), size, unit);
+
+}
+#endif
+
void
efi_enter_virtual_mode (void)
{
Index: xen-unstable.hg/xen/arch/ia64/xen/dom_fw_common.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/dom_fw_common.c 2008-02-26
12:31:51.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/dom_fw_common.c 2008-02-26
13:29:44.000000000 +0900
@@ -190,23 +190,6 @@ dom_fw_pal_hypercall_patch(uint64_t brki
brkimm, FW_HYPERCALL_PAL_CALL);
}
-static inline void
-print_md(efi_memory_desc_t *md)
-{
- uint64_t size;
-
- printk(XENLOG_INFO "dom mem: type=%2u, attr=0x%016lx, "
- "range=[0x%016lx-0x%016lx) ",
- md->type, md->attribute, md->phys_addr,
- md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT));
-
- size = md->num_pages << EFI_PAGE_SHIFT;
- if (size > ONE_MB)
- printk("(%luMB)\n", size >> 20);
- else
- printk("(%luKB)\n", size >> 10);
-}
-
struct fake_acpi_tables {
struct acpi20_table_rsdp rsdp;
struct xsdt_descriptor_rev2 xsdt;
@@ -543,7 +526,7 @@ dom_fw_init(domain_t *d,
/* Display memmap. */
for (i = 0 ; i < tables->num_mds; i++)
- print_md(&tables->efi_memmap[i]);
+ print_md("dom mem", i, &tables->efi_memmap[i]);
/* Fill boot_param */
bp->efi_systab = FW_FIELD_MPA(efi_systab);
Index: xen-unstable.hg/xen/include/asm-ia64/linux-xen/linux/efi.h
===================================================================
--- xen-unstable.hg.orig/xen/include/asm-ia64/linux-xen/linux/efi.h
2008-02-26 12:31:51.000000000 +0900
+++ xen-unstable.hg/xen/include/asm-ia64/linux-xen/linux/efi.h 2008-02-26
13:29:44.000000000 +0900
@@ -309,6 +309,10 @@ efi_guid_unparse(efi_guid_t *guid, char
}
extern void efi_init (void);
+#if XEN
+extern void efi_dump_mem (void);
+extern void print_md(const char *prefix, int index, efi_memory_desc_t *md);
+#endif
extern void *efi_get_pal_addr (void);
extern void efi_map_pal_code (void);
extern void efi_map_memmap(void);
Index: xen-unstable.hg/xen/arch/ia64/xen/xensetup.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/xensetup.c 2008-02-26
12:31:51.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/xensetup.c 2008-02-26
13:29:44.000000000 +0900
@@ -403,6 +403,8 @@ void __init start_kernel(void)
printk("xen image pstart: 0x%lx, xenheap pend: 0x%lx\n",
xen_pstart, xenheap_phys_end);
+ efi_dump_mem();
+
xen_patch_kernel();
kern_md = md = efi_get_md(xen_pstart);
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|