Module Name: src Committed By: bouyer Date: Tue Aug 23 11:03:52 UTC 2016
Modified Files: src/sys/arch/xen/x86: x86_xpmap.c Log Message: Stopgap measure: revert to rev 1.56. starting with 1.57 an i386PAE Xen kernel doesn't boot: (XEN) mm.c:2394:d139v0 Bad type (saw 5400000000000001 != exp 7000000000000000) for mfn 1136f5 (pfn 621) (XEN) mm.c:887:d139v0 Could not get page type PGT_writable_page (XEN) mm.c:939:d139v0 Error getting mfn 1136f5 (pfn 621) from L1 entry 00000001136f5003 for l1e_owner=139, pg_owner=139 (XEN) mm.c:1254:d139v0 Failure in alloc_l1_table: entry 33 (XEN) mm.c:2141:d139v0 Error while validating mfn 112f57 (pfn dbf) for type 1000000000000000: caf=8000000000000003 taf=1000000000000001 (XEN) mm.c:947:d139v0 Attempt to create linear p.t. with write perms (XEN) mm.c:1330:d139v0 Failure in alloc_l2_table: entry 3 (XEN) mm.c:2141:d139v0 Error while validating mfn 112f5b (pfn dbb) for type 2200000000000000: caf=8000000000000003 taf=2200000000000001 (XEN) mm.c:1412:d139v0 Failure in alloc_l3_table: entry 3 (XEN) mm.c:2141:d139v0 Error while validating mfn 112f60 (pfn db6) for type 3000000000000000: caf=8000000000000003 taf=3000000000000001 (XEN) mm.c:3044:d139v0 Error while pinning mfn 112f60 (XEN) traps.c:459:d139v0 Unhandled bkpt fault/trap [#3] on VCPU 0 [ec=0000] (XEN) domain_crash_sync called from entry.S: fault at ffff82d080231894 compat_create_bounce_frame+0xda/0xf2 To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 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/xen/x86/x86_xpmap.c diff -u src/sys/arch/xen/x86/x86_xpmap.c:1.59 src/sys/arch/xen/x86/x86_xpmap.c:1.60 --- src/sys/arch/xen/x86/x86_xpmap.c:1.59 Thu Aug 11 15:35:10 2016 +++ src/sys/arch/xen/x86/x86_xpmap.c Tue Aug 23 11:03:52 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: x86_xpmap.c,v 1.59 2016/08/11 15:35:10 maxv Exp $ */ +/* $NetBSD: x86_xpmap.c,v 1.60 2016/08/23 11:03:52 bouyer 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.59 2016/08/11 15:35:10 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.60 2016/08/23 11:03:52 bouyer Exp $"); #include "opt_xen.h" #include "opt_ddb.h" @@ -730,24 +730,15 @@ xen_bootstrap_tables(vaddr_t old_pgd, va pd_entry_t *pdtpe, *pde, *pte; pd_entry_t *bt_pgd; paddr_t addr; - vaddr_t page, avail, map_end; + vaddr_t page, avail, text_end, map_end; int i; - extern char __rodata_start; extern char __data_start; - extern char __kernel_end; extern char *early_zerop; /* from pmap.c */ - pt_entry_t pg_nx; - u_int descs[4]; __PRINTK(("xen_bootstrap_tables(%#" PRIxVADDR ", %#" PRIxVADDR "," " %d, %d)\n", old_pgd, new_pgd, old_count, new_count)); - - /* - * Set the NX/XD bit, if available. descs[3] = %edx. - */ - x86_cpuid(0x80000001, descs); - pg_nx = (descs[3] & CPUID_NOX) ? PG_NX : 0; + text_end = ((vaddr_t)&__data_start) & ~PAGE_MASK; /* * size of R/W area after kernel text: @@ -785,7 +776,8 @@ xen_bootstrap_tables(vaddr_t old_pgd, va } #endif /* DOM0OPS */ - __PRINTK(("xen_bootstrap_tables map_end 0x%lx\n", map_end)); + __PRINTK(("xen_bootstrap_tables text_end 0x%lx map_end 0x%lx\n", + text_end, map_end)); __PRINTK(("console %#lx ", xen_start_info.console_mfn)); __PRINTK(("xenstore %#" PRIx32 "\n", xen_start_info.store_mfn)); @@ -913,30 +905,20 @@ xen_bootstrap_tables(vaddr_t old_pgd, va page < (vaddr_t)atdevbase + IOM_SIZE) { pte[pl1_pi(page)] = IOM_BEGIN + (page - (vaddr_t)atdevbase); - pte[pl1_pi(page)] |= pg_nx; } #endif - pte[pl1_pi(page)] |= PG_k | PG_V; - if (page < (vaddr_t)&__rodata_start) { - /* Map the kernel text RX. */ + if (page < text_end) { + /* map kernel text RO */ pte[pl1_pi(page)] |= PG_RO; - } else if (page >= (vaddr_t)&__rodata_start && - page < (vaddr_t)&__data_start) { - /* Map the kernel rodata R. */ - pte[pl1_pi(page)] |= PG_RO | pg_nx; - } else if (page >= (vaddr_t)&__data_start && - page < (vaddr_t)&__kernel_end) { - /* Map the kernel data+bss RW. */ - pte[pl1_pi(page)] |= PG_RW | pg_nx; } else if (page >= old_pgd && page < old_pgd + (old_count * PAGE_SIZE)) { - /* Map the old page tables R. */ - pte[pl1_pi(page)] |= PG_RO | pg_nx; + /* map old page tables RO */ + pte[pl1_pi(page)] |= PG_RO; } else if (page >= new_pgd && page < new_pgd + ((new_count + l2_4_count) * PAGE_SIZE)) { - /* Map the new page tables R. */ - pte[pl1_pi(page)] |= PG_RO | pg_nx; + /* map new page tables RO */ + pte[pl1_pi(page)] |= PG_RO; #ifdef i386 } else if (page == (vaddr_t)tmpgdt) { /* @@ -1029,19 +1011,15 @@ xen_bootstrap_tables(vaddr_t old_pgd, va xpq_queue_pin_l2_table(xpmap_ptom_masked(addr)); #endif #else /* PAE */ - - /* Recursive entry in pmap_kernel(). */ - bt_pgd[PDIR_SLOT_PTE] = xpmap_ptom_masked((paddr_t)bt_pgd - KERNBASE) - | PG_k | PG_RO | PG_V | pg_nx; + /* recursive entry in higher-level per-cpu PD and pmap_kernel() */ + bt_pgd[PDIR_SLOT_PTE] = xpmap_ptom_masked((paddr_t)bt_pgd - KERNBASE) | PG_k | PG_V; #ifdef __x86_64__ - /* Recursive entry in higher-level per-cpu PD. */ - bt_cpu_pgd[PDIR_SLOT_PTE] = xpmap_ptom_masked((paddr_t)bt_cpu_pgd - KERNBASE) - | PG_k | PG_RO | PG_V | pg_nx; -#endif + bt_cpu_pgd[PDIR_SLOT_PTE] = + xpmap_ptom_masked((paddr_t)bt_cpu_pgd - KERNBASE) | PG_k | PG_V; +#endif /* __x86_64__ */ __PRINTK(("bt_pgd[PDIR_SLOT_PTE] va %#" PRIxVADDR " pa %#" PRIxPADDR " entry %#" PRIxPADDR "\n", new_pgd, (paddr_t)new_pgd - KERNBASE, bt_pgd[PDIR_SLOT_PTE])); - /* Mark tables RO */ xen_bt_set_readonly((vaddr_t) pde); #endif @@ -1051,7 +1029,6 @@ xen_bootstrap_tables(vaddr_t old_pgd, va #if PTP_LEVELS > 3 xen_bt_set_readonly(new_pgd); #endif - /* Pin the PGD */ __PRINTK(("pin PGD: %"PRIxVADDR"\n", new_pgd - KERNBASE)); #ifdef __x86_64__