Jimi Xenidis
2006-Jun-20 00:55 UTC
[Xen-devel] [patch] load 64-bit files with 32-bit tools
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@watson.ibm.com> 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@lists.xensource.com http://lists.xensource.com/xen-devel
Anthony Liguori
2006-Jun-20 01:22 UTC
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@watson.ibm.com> > > > > 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@lists.xensource.com > http://lists.xensource.com/xen-devel >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2006-Jun-20 07:30 UTC
Re: [Xen-devel] [patch] load 64-bit files with 32-bit tools
On 20 Jun 2006, at 02:22, Anthony Liguori wrote:> 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.Or change the _p() macro to cast to void* via long. Then we continue to print in the same format we always have for 32-bit x86 guests. Makes the patch a bunch smaller too. My main concern with this patch is whether, by using a wider type, it breaks any of the address-wrapping validation checks we added. On first glance it looks okay though. -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel