* [patch] load 64-bit files with 32-bit tools
@ 2006-06-20 0:55 Jimi Xenidis
2006-06-20 1:22 ` Anthony Liguori
0 siblings, 1 reply; 3+ messages in thread
From: Jimi Xenidis @ 2006-06-20 0:55 UTC (permalink / raw)
To: xen-devel
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch] load 64-bit files with 32-bit tools
2006-06-20 0:55 [patch] load 64-bit files with 32-bit tools Jimi Xenidis
@ 2006-06-20 1:22 ` Anthony Liguori
2006-06-20 7:30 ` Keir Fraser
0 siblings, 1 reply; 3+ messages in thread
From: Anthony Liguori @ 2006-06-20 1:22 UTC (permalink / raw)
To: Jimi Xenidis; +Cc: xen-devel
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
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch] load 64-bit files with 32-bit tools
2006-06-20 1:22 ` Anthony Liguori
@ 2006-06-20 7:30 ` Keir Fraser
0 siblings, 0 replies; 3+ messages in thread
From: Keir Fraser @ 2006-06-20 7:30 UTC (permalink / raw)
To: Anthony Liguori; +Cc: Jimi Xenidis, xen-devel
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
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2006-06-20 7:30 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-20 0:55 [patch] load 64-bit files with 32-bit tools Jimi Xenidis
2006-06-20 1:22 ` Anthony Liguori
2006-06-20 7:30 ` Keir Fraser
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.