Module Name: src Committed By: jym Date: Thu Feb 10 00:23:15 UTC 2011
Modified Files: src/sys/arch/x86/x86: pmap.c src/sys/arch/xen/include: xenpmap.h src/sys/arch/xen/x86: x86_xpmap.c Log Message: Use only one function to pin pages with Xen, and provide macros to call it for different levels (L1 => L4). Replace all calls to xpq_queue_pin_table(...) in MD code with these new functions, with proper #ifdef'ing depending on $MACHINE. Rationale: - only one function to modify for logging - pushes responsibility to caller for chosing the proper pin level, rather than Xen internal functions; this makes the pin level explicit rather than implicit. Boot tested for dom0 i386/amd64, PAE included. No functional change intended. To generate a diff of this commit: cvs rdiff -u -r1.116 -r1.117 src/sys/arch/x86/x86/pmap.c cvs rdiff -u -r1.24 -r1.25 src/sys/arch/xen/include/xenpmap.h cvs rdiff -u -r1.23 -r1.24 src/sys/arch/xen/x86/x86_xpmap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x86/x86/pmap.c diff -u src/sys/arch/x86/x86/pmap.c:1.116 src/sys/arch/x86/x86/pmap.c:1.117 --- src/sys/arch/x86/x86/pmap.c:1.116 Sat Feb 5 13:50:08 2011 +++ src/sys/arch/x86/x86/pmap.c Thu Feb 10 00:23:14 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.116 2011/02/05 13:50:08 yamt Exp $ */ +/* $NetBSD: pmap.c,v 1.117 2011/02/10 00:23:14 jym Exp $ */ /* * Copyright (c) 2007 Manuel Bouyer. @@ -142,7 +142,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.116 2011/02/05 13:50:08 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.117 2011/02/10 00:23:14 jym Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" @@ -1497,7 +1497,7 @@ HYPERVISOR_update_va_mapping(xen_dummy_user_pgd + KERNBASE, pmap_pa2pte(xen_dummy_user_pgd) | PG_u | PG_V, UVMF_INVLPG); /* Pin as L4 */ - xpq_queue_pin_table(xpmap_ptom_masked(xen_dummy_user_pgd)); + xpq_queue_pin_l4_table(xpmap_ptom_masked(xen_dummy_user_pgd)); #endif /* __x86_64__ */ idt_vaddr = virtual_avail; /* don't need pte */ idt_paddr = avail_start; /* steal a page */ @@ -2182,12 +2182,17 @@ if (i == l2tol3(PDIR_SLOT_PTE)) continue; #endif - xpq_queue_pin_table(xpmap_ptom_masked(pdirpa)); + +#ifdef __x86_64__ + xpq_queue_pin_l4_table(xpmap_ptom_masked(pdirpa)); +#else + xpq_queue_pin_l2_table(xpmap_ptom_masked(pdirpa)); +#endif } #ifdef PAE object = ((vaddr_t)pdir) + PAGE_SIZE * l2tol3(PDIR_SLOT_PTE); (void)pmap_extract(pmap_kernel(), object, &pdirpa); - xpq_queue_pin_table(xpmap_ptom_masked(pdirpa)); + xpq_queue_pin_l2_table(xpmap_ptom_masked(pdirpa)); #endif splx(s); #endif /* XEN */ Index: src/sys/arch/xen/include/xenpmap.h diff -u src/sys/arch/xen/include/xenpmap.h:1.24 src/sys/arch/xen/include/xenpmap.h:1.25 --- src/sys/arch/xen/include/xenpmap.h:1.24 Fri Oct 23 02:32:33 2009 +++ src/sys/arch/xen/include/xenpmap.h Thu Feb 10 00:23:14 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: xenpmap.h,v 1.24 2009/10/23 02:32:33 snj Exp $ */ +/* $NetBSD: xenpmap.h,v 1.25 2011/02/10 00:23:14 jym Exp $ */ /* * @@ -40,10 +40,19 @@ void xpq_flush_queue(void); void xpq_queue_set_ldt(vaddr_t, uint32_t); void xpq_queue_tlb_flush(void); -void xpq_queue_pin_table(paddr_t); +void xpq_queue_pin_table(paddr_t, int); void xpq_queue_unpin_table(paddr_t); int xpq_update_foreign(paddr_t, pt_entry_t, int); +#define xpq_queue_pin_l1_table(pa) \ + xpq_queue_pin_table(pa, MMUEXT_PIN_L1_TABLE) +#define xpq_queue_pin_l2_table(pa) \ + xpq_queue_pin_table(pa, MMUEXT_PIN_L2_TABLE) +#define xpq_queue_pin_l3_table(pa) \ + xpq_queue_pin_table(pa, MMUEXT_PIN_L3_TABLE) +#define xpq_queue_pin_l4_table(pa) \ + xpq_queue_pin_table(pa, MMUEXT_PIN_L4_TABLE) + extern unsigned long *xpmap_phys_to_machine_mapping; /* Index: src/sys/arch/xen/x86/x86_xpmap.c diff -u src/sys/arch/xen/x86/x86_xpmap.c:1.23 src/sys/arch/xen/x86/x86_xpmap.c:1.24 --- src/sys/arch/xen/x86/x86_xpmap.c:1.23 Mon Dec 20 21:18:45 2010 +++ src/sys/arch/xen/x86/x86_xpmap.c Thu Feb 10 00:23:14 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: x86_xpmap.c,v 1.23 2010/12/20 21:18:45 jym Exp $ */ +/* $NetBSD: x86_xpmap.c,v 1.24 2011/02/10 00:23:14 jym Exp $ */ /* * Copyright (c) 2006 Mathieu Ropert <m...@adviseo.fr> @@ -69,7 +69,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.23 2010/12/20 21:18:45 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.24 2011/02/10 00:23:14 jym Exp $"); #include "opt_xen.h" #include "opt_ddb.h" @@ -237,40 +237,20 @@ } void -xpq_queue_pin_table(paddr_t pa) +xpq_queue_pin_table(paddr_t pa, int lvl) { struct mmuext_op op; xpq_flush_queue(); - XENPRINTK2(("xpq_queue_pin_table: 0x%" PRIx64 " 0x%" PRIx64 "\n", - (int64_t)pa, (int64_t)pa)); - op.arg1.mfn = pa >> PAGE_SHIFT; - -#if defined(__x86_64__) - op.cmd = MMUEXT_PIN_L4_TABLE; -#else - op.cmd = MMUEXT_PIN_L2_TABLE; -#endif - if (HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0) - panic("xpq_queue_pin_table"); -} + XENPRINTK2(("xpq_queue_pin_l%d_table: %#" PRIxPADDR "\n", + lvl + 1, pa)); -#ifdef PAE -static void -xpq_queue_pin_l3_table(paddr_t pa) -{ - struct mmuext_op op; - xpq_flush_queue(); - - XENPRINTK2(("xpq_queue_pin_l2_table: 0x%" PRIx64 " 0x%" PRIx64 "\n", - (int64_t)pa, (int64_t)pa)); op.arg1.mfn = pa >> PAGE_SHIFT; + op.cmd = lvl; - op.cmd = MMUEXT_PIN_L3_TABLE; if (HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0) panic("xpq_queue_pin_table"); } -#endif void xpq_queue_unpin_table(paddr_t pa) @@ -278,8 +258,7 @@ struct mmuext_op op; xpq_flush_queue(); - XENPRINTK2(("xpq_queue_unpin_table: 0x%" PRIx64 " 0x%" PRIx64 "\n", - (int64_t)pa, (int64_t)pa)); + XENPRINTK2(("xpq_queue_unpin_table: %#" PRIxPADDR "\n", pa)); op.arg1.mfn = pa >> PAGE_SHIFT; op.cmd = MMUEXT_UNPIN_TABLE; if (HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0) @@ -781,18 +760,18 @@ continue; #if 0 __PRINTK(("pin L2 %d addr 0x%" PRIx64 "\n", i, (int64_t)addr)); - xpq_queue_pin_table(xpmap_ptom_masked(addr)); + xpq_queue_pin_l2_table(xpmap_ptom_masked(addr)); #endif } if (final) { addr = (u_long)pde - KERNBASE + 3 * PAGE_SIZE; __PRINTK(("pin L2 %d addr %#" PRIxPADDR "\n", 2, addr)); - xpq_queue_pin_table(xpmap_ptom_masked(addr)); + xpq_queue_pin_l2_table(xpmap_ptom_masked(addr)); } #if 0 addr = (u_long)pde - KERNBASE + 2 * PAGE_SIZE; __PRINTK(("pin L2 %d addr 0x%" PRIx64 "\n", 2, (int64_t)addr)); - xpq_queue_pin_table(xpmap_ptom_masked(addr)); + xpq_queue_pin_l2_table(xpmap_ptom_masked(addr)); #endif #else /* PAE */ /* recursive entry in higher-level PD */ @@ -812,10 +791,12 @@ #endif /* Pin the PGD */ __PRINTK(("pin PGD\n")); -#ifdef PAE +#ifdef __x86_64__ + xpq_queue_pin_l4_table(xpmap_ptom_masked(new_pgd - KERNBASE)); +#elif PAE xpq_queue_pin_l3_table(xpmap_ptom_masked(new_pgd - KERNBASE)); #else - xpq_queue_pin_table(xpmap_ptom_masked(new_pgd - KERNBASE)); + xpq_queue_pin_l2_table(xpmap_ptom_masked(new_pgd - KERNBASE)); #endif /* Save phys. addr of PDP, for libkvm. */