# HG changeset patch
# User iap10@xxxxxxxxxxxxxxxxxxxxx
# Node ID f0d728001aaad4eb6c716cbdbb5d1f8a8a5f1620
# Parent a9a78ca76cd20ab40a161b8257a68257b7044f01
More tools PAE fixes to avoid loosing high-order pte bits.
Signed-off-by: ian@xxxxxxxxxxxxx
diff -r a9a78ca76cd2 -r f0d728001aaa tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c Wed Sep 7 23:10:49 2005
+++ b/tools/libxc/xc_linux_build.c Wed Sep 7 23:11:44 2005
@@ -57,7 +57,7 @@
}
#define alloc_pt(ltab, vltab) \
- ltab = page_array[ppt_alloc++] << PAGE_SHIFT; \
+ ltab = (unsigned long long)(page_array[ppt_alloc++]) << PAGE_SHIFT; \
if (vltab != NULL) { \
munmap(vltab, PAGE_SIZE); \
} \
@@ -128,9 +128,9 @@
l1_pgentry_64_t *vl1tab=NULL, *vl1e=NULL;
l2_pgentry_64_t *vl2tab=NULL, *vl2e=NULL;
l3_pgentry_64_t *vl3tab=NULL, *vl3e=NULL;
- unsigned long l1tab = 0;
- unsigned long l2tab = 0;
- unsigned long l3tab = 0;
+ unsigned long long l1tab = 0;
+ unsigned long long l2tab = 0;
+ unsigned long long l3tab = 0;
unsigned long ppt_alloc;
unsigned long count;
@@ -139,7 +139,13 @@
alloc_pt(l3tab, vl3tab);
vl3e = &vl3tab[l3_table_offset_pae(dsi_v_start)];
ctxt->ctrlreg[3] = l3tab;
-
+
+ if(l3tab>0xfffff000)
+ {
+ fprintf(stderr,"L3TAB = %llx above 4GB!\n",l3tab);
+ goto error_out;
+ }
+
for ( count = 0; count < ((v_end-dsi_v_start)>>PAGE_SHIFT); count++)
{
if ( !((unsigned long)vl1e & (PAGE_SIZE-1)) )
@@ -525,12 +531,14 @@
physmap = physmap_e = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
page_array[physmap_pfn++]);
+
for ( count = 0; count < nr_pages; count++ )
{
if ( xc_add_mmu_update(xc_handle, mmu,
- (page_array[count] << PAGE_SHIFT) |
+ ((unsigned long long)page_array[count] <<
PAGE_SHIFT) |
MMU_MACHPHYS_UPDATE, count) )
{
+ fprintf(stderr,"m2p update failure p=%lx
m=%lx\n",count,page_array[count] );
munmap(physmap, PAGE_SIZE);
goto error_out;
}
diff -r a9a78ca76cd2 -r f0d728001aaa tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c Wed Sep 7 23:10:49 2005
+++ b/tools/libxc/xc_private.c Wed Sep 7 23:11:44 2005
@@ -116,7 +116,7 @@
if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
{
- fprintf(stderr, "Dom_mem operation failed (rc=%ld errno=%d)-- need to"
+ fprintf(stderr, "Dom_mmuext operation failed (rc=%ld errno=%d)-- need
to"
" rebuild the user-space tool set?\n",ret,errno);
}
@@ -172,7 +172,7 @@
}
int xc_add_mmu_update(int xc_handle, xc_mmu_t *mmu,
- unsigned long ptr, unsigned long val)
+ unsigned long long ptr, unsigned long long val)
{
mmu->updates[mmu->idx].ptr = ptr;
mmu->updates[mmu->idx].val = val;
@@ -229,7 +229,7 @@
if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
{
- fprintf(stderr, "Dom_mem operation failed (rc=%ld errno=%d)-- need to"
+ fprintf(stderr, "hypercall failed (rc=%ld errno=%d)-- need to"
" rebuild the user-space tool set?\n",ret,errno);
}
diff -r a9a78ca76cd2 -r f0d728001aaa tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Wed Sep 7 23:10:49 2005
+++ b/tools/libxc/xenctrl.h Wed Sep 7 23:11:44 2005
@@ -521,7 +521,7 @@
typedef struct xc_mmu xc_mmu_t;
xc_mmu_t *xc_init_mmu_updates(int xc_handle, domid_t dom);
int xc_add_mmu_update(int xc_handle, xc_mmu_t *mmu,
- unsigned long ptr, unsigned long val);
+ unsigned long long ptr, unsigned long long val);
int xc_finish_mmu_updates(int xc_handle, xc_mmu_t *mmu);
#endif
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|