Hi,
New PAE patchset (#13) has been uploaded to
http://dl.bytesex.org/patches/
The hypercall interface has been updated to pass around
64bit-wide page table entries now.
The xen patch is here:
==============================[ cut here ]==============================
--- xen.orig/include/public/xen.h 2005-06-08 11:39:05.000000000 +0200
+++ xen/include/public/xen.h 2005-06-08 12:08:24.000000000 +0200
@@ -270,8 +270,8 @@ typedef u16 domid_t;
*/
typedef struct
{
- memory_t ptr; /* Machine address of PTE. */
- memory_t val; /* New contents of PTE. */
+ u64 ptr; /* Machine address of PTE. */
+ u64 val; /* New contents of PTE. */
} mmu_update_t;
/*
--- xen.orig/arch/x86/mm.c 2005-06-08 11:42:11.000000000 +0200
+++ xen/arch/x86/mm.c 2005-06-08 12:12:13.000000000 +0200
@@ -2023,7 +2023,8 @@ int do_mmu_update(
}
va = map_domain_page_with_cache(mfn, &mapcache);
- va = (void *)((unsigned long)va + (req.ptr & ~PAGE_MASK));
+ va = (void *)((unsigned long)va +
+ (unsigned long)(req.ptr & ~PAGE_MASK));
page = &frame_table[mfn];
switch ( (type_info = page->u.inuse.type_info) & PGT_type_mask )
@@ -2167,7 +2168,7 @@ int do_mmu_update(
break;
default:
- MEM_LOG("Invalid page update command %lx", req.ptr);
+ MEM_LOG("Invalid page update command %x", cmd);
break;
}
@@ -2254,11 +2255,10 @@ int update_grant_va_mapping(unsigned lon
}
-int do_update_va_mapping(unsigned long va,
- unsigned long val32,
+int do_update_va_mapping(unsigned long va, u64 val64,
unsigned long flags)
{
- l1_pgentry_t val = l1e_from_intpte(val32);
+ l1_pgentry_t val = l1e_from_intpte(val64);
struct vcpu *v = current;
struct domain *d = v->domain;
unsigned int cpu = v->processor;
@@ -2352,8 +2352,7 @@ int do_update_va_mapping(unsigned long v
return rc;
}
-int do_update_va_mapping_otherdomain(unsigned long va,
- unsigned long val32,
+int do_update_va_mapping_otherdomain(unsigned long va, u64 val64,
unsigned long flags,
domid_t domid)
{
@@ -2371,7 +2370,7 @@ int do_update_va_mapping_otherdomain(uns
return -ESRCH;
}
- rc = do_update_va_mapping(va, val32, flags);
+ rc = do_update_va_mapping(va, val64, flags);
return rc;
}
==============================[ cut here ]==============================
xenlinux 2.6.x needs these changes (also take care that xenlinux
uses the updated xen/include/public/xen.h from the patch above).
==============================[ cut here ]==============================
--- linux-2.6.11.orig/include/asm-xen/asm-i386/hypercall.h 2005-06-08
12:39:16.000000000 +0200
+++ linux-2.6.11/include/asm-xen/asm-i386/hypercall.h 2005-06-08
13:01:04.000000000 +0200
@@ -371,13 +371,19 @@ HYPERVISOR_update_va_mapping(
unsigned long va, pte_t new_val, unsigned long flags)
{
int ret;
- unsigned long ign1, ign2, ign3;
+ unsigned long ign1, ign2, ign3, ign4;
__asm__ __volatile__ (
TRAP_INSTR
- : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)
+ : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)
: "0" (__HYPERVISOR_update_va_mapping),
- "1" (va), "2" ((new_val).pte_low), "3" (flags)
+ "1" (va), "2" ((new_val).pte_low),
+#ifdef CONFIG_X86_PAE
+ "3" ((new_val).pte_high),
+#else
+ "3" (0),
+#endif
+ "4" (flags)
: "memory" );
if ( unlikely(ret < 0) )
@@ -473,13 +479,20 @@ HYPERVISOR_update_va_mapping_otherdomain
unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
{
int ret;
- unsigned long ign1, ign2, ign3, ign4;
+ unsigned long ign1, ign2, ign3, ign4, ign5;
__asm__ __volatile__ (
TRAP_INSTR
- : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4)
+ : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3),
+ "=S" (ign4), "=D" (ign5)
: "0" (__HYPERVISOR_update_va_mapping_otherdomain),
- "1" (va), "2" ((new_val).pte_low), "3" (flags), "4" (domid) :
+ "1" (va), "2" ((new_val).pte_low),
+#ifdef CONFIG_X86_PAE
+ "3" ((new_val).pte_high),
+#else
+ "3" (0),
+#endif
+ "4" (flags), "5" (domid) :
"memory" );
return ret;
==============================[ cut here ]==============================
Comments? Domain0 boots fine. Other guest OS'es are not
updated yet, tools also not updated yet.
The recent PAE cleanups by Keir which added a new sanity check
prevent the current xenlinux kernel from booting in PAE mode.
I've disabled that for now to make it boot again:
==============================[ cut here ]==============================
--- xen.orig/arch/x86/mm.c 2005-06-08 16:25:03.000000000 +0200
+++ xen/arch/x86/mm.c 2005-06-08 16:25:44.000000000 +0200
@@ -716,8 +716,8 @@ static int create_pae_xen_mappings(l3_pg
BUG_ON((page->u.inuse.type_info & PGT_count_mask) == 0);
if ( (page->u.inuse.type_info & PGT_count_mask) != 1 )
{
- MEM_LOG("PAE L3 3rd slot is shared");
- return 0;
+ MEM_LOG("WARNING: PAE L3 3rd slot is shared");
+// return 0;
}
/* Xen private mappings. */
==============================[ cut here ]==============================
The xenlinux kernel does that exactly once at boot time, when
initializing swapper_pg_dir. Happens in arch/xen/i386/mm/init.c:
static void __init pagetable_init (void)
{
unsigned long vaddr;
pgd_t *pgd_base = swapper_pg_dir;
pgd_t *old_pgd = (pgd_t *)xen_start_info.pt_base;
[ ... ]
memcpy(pgd_base, old_pgd, PTRS_PER_PGD_NO_HV*sizeof(pgd_t));
make_page_readonly(pgd_base);
xen_pgd_pin(__pa(pgd_base)); <= here it blows up
load_cr3(pgd_base);
xen_pgd_unpin(__pa(old_pgd));
make_page_writable(old_pgd);
[ ... ]
}
What this check is needed for? Is there some reason why xen
must do that? Or is this just to catch bugs in the guest OS
kernel?
Gerd
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|