[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [patch] load 64-bit files with 32-bit tools



I believe that on x86-64 uint64_t is defined to be unsigned long.

I think the proper (albeit ugly) thing to do here is use PRIu64.

Regards,

Anthony Liguori

Jimi Xenidis wrote:
This patch allows 32bit libxc to grok 64bit files by:
  - using 64bit types for addresses in struct domain_start_info
  - uses stroull() so it can parse 64bit values

xc_hvm_build.c and xc_linux_build.c are effected because these
data-types are printed.


Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>



diff -r 05ab081f3c67 tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c        Fri Jun 16 18:08:27 2006 +0100
+++ b/tools/libxc/xc_hvm_build.c        Mon Jun 19 17:03:51 2006 -0400
@@ -208,11 +208,11 @@ static int setup_guest(int xc_handle,
     v_end = (unsigned long long)memsize << 20;
IPRINTF("VIRTUAL MEMORY ARRANGEMENT:\n"
-           "  Loaded HVM loader:    %08lx->%08lx\n"
-           "  TOTAL:                %08lx->%016llx\n",
+           "  Loaded HVM loader:    %016llx->%016llx\n"
+           "  TOTAL:                %016llx->%016llx\n",
            dsi.v_kernstart, dsi.v_kernend,
            dsi.v_start, v_end);
-    IPRINTF("  ENTRY ADDRESS:        %08lx\n", dsi.v_kernentry);
+    IPRINTF("  ENTRY ADDRESS:        %016llx\n", dsi.v_kernentry);
if ( (v_end - dsi.v_start) > ((unsigned long long)nr_pages << PAGE_SHIFT) )
     {
diff -r 05ab081f3c67 tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c      Fri Jun 16 18:08:27 2006 +0100
+++ b/tools/libxc/xc_linux_build.c      Mon Jun 19 17:03:51 2006 -0400
@@ -508,16 +508,14 @@ static int setup_guest(int xc_handle,
         goto error_out;
     }
-#define _p(a) ((void *) (a))
-
     IPRINTF("VIRTUAL MEMORY ARRANGEMENT:\n"
-           " Loaded kernel: %p->%p\n"
-           " Init. ramdisk: %p->%p\n"
-           " TOTAL:         %p->%p\n",
-           _p(dsi.v_kernstart), _p(dsi.v_kernend),
-           _p(vinitrd_start),   _p(vinitrd_end),
-           _p(dsi.v_start),     _p(v_end));
-    IPRINTF(" ENTRY ADDRESS: %p\n", _p(dsi.v_kernentry));
+           " Loaded kernel: %016llx->%016llx\n"
+           " Init. ramdisk: %016llx->%016llx\n"
+           " TOTAL:         %016llx->%016llx\n",
+           dsi.v_kernstart, dsi.v_kernend,
+           vinitrd_start,   vinitrd_end,
+           dsi.v_start,     v_end);
+    IPRINTF(" ENTRY ADDRESS: %016llx\n", dsi.v_kernentry);
(load_funcs.loadimage)(image, image_size, xc_handle, dom, page_array,
                            &dsi);
@@ -803,29 +801,27 @@ static int setup_guest(int xc_handle,
 #endif
     }
-#define _p(a) ((void *) (a))
-
     IPRINTF("VIRTUAL MEMORY ARRANGEMENT:\n");
-    IPRINTF(" Loaded kernel:    %p->%p\n", _p(dsi.v_kernstart),
-           _p(dsi.v_kernend));
+    IPRINTF(" Loaded kernel:    %016llx->%016llx\n", dsi.v_kernstart,
+           dsi.v_kernend);
     if ( initrd->len )
-        IPRINTF(" Initial ramdisk:  %p->%p\n", _p(vinitrd_start),
-               _p(vinitrd_start + initrd->len));
-    IPRINTF(" Phys-Mach map:    %p\n", _p(vphysmap_start));
-    IPRINTF(" Start info:       %p\n", _p(vstartinfo_start));
-    IPRINTF(" Store page:       %p\n", _p(vstoreinfo_start));
-    IPRINTF(" Console page:     %p\n", _p(vconsole_start));
+        IPRINTF(" Initial ramdisk:  %lx->%lx\n", vinitrd_start,
+               vinitrd_start + initrd->len);
+    IPRINTF(" Phys-Mach map:    %016lx\n", vphysmap_start);
+    IPRINTF(" Start info:       %016lx\n", vstartinfo_start);
+    IPRINTF(" Store page:       %016lx\n", vstoreinfo_start);
+    IPRINTF(" Console page:     %016lx\n", vconsole_start);
     if ( shadow_mode_enabled )
-        IPRINTF(" Shared Info page: %p\n", _p(vsharedinfo_start));
-    IPRINTF(" Page tables:      %p\n", _p(vpt_start));
-    IPRINTF(" Boot stack:       %p\n", _p(vstack_start));
-    IPRINTF(" TOTAL:            %p->%p\n", _p(dsi.v_start), _p(v_end));
-    IPRINTF(" ENTRY ADDRESS:    %p\n", _p(dsi.v_kernentry));
+        IPRINTF(" Shared Info page: %016lx\n", vsharedinfo_start);
+    IPRINTF(" Page tables:      %016lx\n", vpt_start);
+    IPRINTF(" Boot stack:       %016lx\n", vstack_start);
+    IPRINTF(" TOTAL:            %016llx->%016lx\n", dsi.v_start, v_end);
+    IPRINTF(" ENTRY ADDRESS:    %016llx\n", dsi.v_kernentry);
if ( ((v_end - dsi.v_start)>>PAGE_SHIFT) > nr_pages )
     {
         PERROR("Initial guest OS requires too much space\n"
-               "(%luMB is greater than %luMB limit)\n",
+               "(%lluMB is greater than %luMB limit)\n",
                (v_end-dsi.v_start)>>20, nr_pages>>(20-PAGE_SHIFT));
         goto error_out;
     }
diff -r 05ab081f3c67 tools/libxc/xc_load_elf.c
--- a/tools/libxc/xc_load_elf.c Fri Jun 16 18:08:27 2006 +0100
+++ b/tools/libxc/xc_load_elf.c Mon Jun 19 17:03:51 2006 -0400
@@ -68,7 +68,7 @@ static int parseelfimage(const char *ima
     Elf_Ehdr *ehdr = (Elf_Ehdr *)image;
     Elf_Phdr *phdr;
     Elf_Shdr *shdr;
-    unsigned long kernstart = ~0UL, kernend=0UL, vaddr, virt_base, elf_pa_off;
+    Elf_Addr kernstart = -1, kernend = 0, vaddr, virt_base, elf_pa_off;
     const char *shstrtab;
     char *guestinfo=NULL, *p;
     int h, virt_base_defined, elf_pa_off_defined;
@@ -162,12 +162,12 @@ static int parseelfimage(const char *ima
     /* Initial guess for virt_base is 0 if it is not explicitly defined. */
     p = strstr(guestinfo, "VIRT_BASE=");
     virt_base_defined = (p != NULL);
-    virt_base = virt_base_defined ? strtoul(p+10, &p, 0) : 0;
+    virt_base = virt_base_defined ? strtoull(p+10, &p, 0) : 0;
/* Initial guess for elf_pa_off is virt_base if not explicitly defined. */
     p = strstr(guestinfo, "ELF_PADDR_OFFSET=");
     elf_pa_off_defined = (p != NULL);
-    elf_pa_off = elf_pa_off_defined ? strtoul(p+17, &p, 0) : virt_base;
+    elf_pa_off = elf_pa_off_defined ? strtoull(p+17, &p, 0) : virt_base;
if ( elf_pa_off_defined && !virt_base_defined )
         goto bad_image;
@@ -196,7 +196,7 @@ static int parseelfimage(const char *ima
dsi->v_kernentry = ehdr->e_entry;
     if ( (p = strstr(guestinfo, "VIRT_ENTRY=")) != NULL )
-        dsi->v_kernentry = strtoul(p+11, &p, 0);
+        dsi->v_kernentry = strtoull(p+11, &p, 0);
if ( (kernstart > kernend) ||
          (dsi->v_kernentry < kernstart) ||
diff -r 05ab081f3c67 tools/libxc/xg_private.h
--- a/tools/libxc/xg_private.h  Fri Jun 16 18:08:27 2006 +0100
+++ b/tools/libxc/xg_private.h  Mon Jun 19 17:03:51 2006 -0400
@@ -132,13 +132,13 @@ typedef unsigned long l4_pgentry_t;
struct domain_setup_info
 {
-    unsigned long v_start;
-    unsigned long v_end;
-    unsigned long v_kernstart;
-    unsigned long v_kernend;
-    unsigned long v_kernentry;
-
-    unsigned long elf_paddr_offset;
+    uint64_t v_start;
+    uint64_t v_end;
+    uint64_t v_kernstart;
+    uint64_t v_kernend;
+    uint64_t v_kernentry;
+
+    uint64_t elf_paddr_offset;
#define PAEKERN_no 0
 #define PAEKERN_yes          1

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.