Module Name: src Committed By: maxv Date: Fri Jul 1 12:36:43 UTC 2016
Modified Files: src/sys/arch/x86/x86: pmap.c Log Message: There is no direct map on i386, and therefore we always need to use temporary VAs and PTEs when mapping an area. These temporary VAs don't need to be executable. Put the NOX bit on them. To generate a diff of this commit: cvs rdiff -u -r1.205 -r1.206 src/sys/arch/x86/x86/pmap.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.205 src/sys/arch/x86/x86/pmap.c:1.206 --- src/sys/arch/x86/x86/pmap.c:1.205 Fri Jul 1 12:18:34 2016 +++ src/sys/arch/x86/x86/pmap.c Fri Jul 1 12:36:43 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.205 2016/07/01 12:18:34 maxv Exp $ */ +/* $NetBSD: pmap.c,v 1.206 2016/07/01 12:36:43 maxv Exp $ */ /*- * Copyright (c) 2008, 2010, 2016 The NetBSD Foundation, Inc. @@ -171,7 +171,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.205 2016/07/01 12:18:34 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.206 2016/07/01 12:36:43 maxv Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" @@ -1642,7 +1642,8 @@ pmap_prealloc_lowmem_ptps(void) #ifdef __HAVE_DIRECT_MAP memset((void *)PMAP_DIRECT_MAP(newp), 0, PAGE_SIZE); #else - pmap_pte_set(early_zero_pte, pmap_pa2pte(newp) | pteflags); + pmap_pte_set(early_zero_pte, pmap_pa2pte(newp) | pteflags | + pmap_pg_nx); pmap_pte_flush(); pmap_update_pg((vaddr_t)early_zerop); memset(early_zerop, 0, PAGE_SIZE); @@ -1671,8 +1672,8 @@ pmap_prealloc_lowmem_ptps(void) pmap_pte_set(&kpm_pdir[pl_i(0, PTP_LEVELS)], pmap_pa2pte(newp) | pteflags); } - #endif /* XEN */ + pmap_pte_set(&pdes[pl_i(0, level)], pmap_pa2pte(newp) | pteflags); @@ -3081,6 +3082,9 @@ pmap_zero_page(paddr_t pa) void *zerova; int id; + const pd_entry_t pteflags = PG_V | PG_RW | pmap_pg_nx | PG_M | PG_U | + PG_k; + kpreempt_disable(); id = cpu_number(); zpte = PTESLEW(zero_pte, id); @@ -3091,7 +3095,7 @@ pmap_zero_page(paddr_t pa) panic("pmap_zero_page: lock botch"); #endif - pmap_pte_set(zpte, pmap_pa2pte(pa) | PG_V | PG_RW | PG_M | PG_U | PG_k); + pmap_pte_set(zpte, pmap_pa2pte(pa) | pteflags); pmap_pte_flush(); pmap_update_pg((vaddr_t)zerova); /* flush TLB */ @@ -3101,6 +3105,7 @@ pmap_zero_page(paddr_t pa) pmap_pte_set(zpte, 0); /* zap ! */ pmap_pte_flush(); #endif + kpreempt_enable(); #endif /* defined(__HAVE_DIRECT_MAP) */ } @@ -3123,6 +3128,9 @@ pmap_pageidlezero(paddr_t pa) bool rv; int id; + const pd_entry_t pteflags = PG_V | PG_RW | pmap_pg_nx | PG_M | PG_U | + PG_k; + id = cpu_number(); zpte = PTESLEW(zero_pte, id); zerova = VASLEW(zerop, id); @@ -3130,7 +3138,7 @@ pmap_pageidlezero(paddr_t pa) KASSERT(cpu_feature[0] & CPUID_SSE2); KASSERT(*zpte == 0); - pmap_pte_set(zpte, pmap_pa2pte(pa) | PG_V | PG_RW | PG_M | PG_U | PG_k); + pmap_pte_set(zpte, pmap_pa2pte(pa) | pteflags); pmap_pte_flush(); pmap_update_pg((vaddr_t)zerova); /* flush TLB */ @@ -3170,6 +3178,8 @@ pmap_copy_page(paddr_t srcpa, paddr_t ds void *cdstva; int id; + const pd_entry_t pteflags = PG_V | PG_RW | pmap_pg_nx | PG_U | PG_k; + kpreempt_disable(); id = cpu_number(); spte = PTESLEW(csrc_pte,id); @@ -3179,9 +3189,8 @@ pmap_copy_page(paddr_t srcpa, paddr_t ds KASSERT(*spte == 0 && *dpte == 0); - pmap_pte_set(spte, pmap_pa2pte(srcpa) | PG_V | PG_RW | PG_U | PG_k); - pmap_pte_set(dpte, - pmap_pa2pte(dstpa) | PG_V | PG_RW | PG_M | PG_U | PG_k); + pmap_pte_set(spte, pmap_pa2pte(srcpa) | pteflags); + pmap_pte_set(dpte, pmap_pa2pte(dstpa) | pteflags | PG_M); pmap_pte_flush(); pmap_update_2pg((vaddr_t)csrcva, (vaddr_t)cdstva); @@ -3192,6 +3201,7 @@ pmap_copy_page(paddr_t srcpa, paddr_t ds pmap_pte_set(dpte, 0); pmap_pte_flush(); #endif + kpreempt_enable(); #endif /* defined(__HAVE_DIRECT_MAP) */ } @@ -3208,16 +3218,18 @@ pmap_map_ptp(struct vm_page *ptp) KASSERT(kpreempt_disabled()); +#ifndef XEN + const pd_entry_t pteflags = PG_V | PG_RW | pmap_pg_nx | PG_U | PG_M | + PG_k; +#else + const pd_entry_t pteflags = PG_V | pmap_pg_nx | PG_U | PG_M | PG_k; +#endif + id = cpu_number(); ptppte = PTESLEW(ptp_pte, id); ptpva = VASLEW(ptpp, id); -#if !defined(XEN) - pmap_pte_set(ptppte, pmap_pa2pte(VM_PAGE_TO_PHYS(ptp)) | PG_V | PG_M | - PG_RW | PG_U | PG_k); -#else - pmap_pte_set(ptppte, pmap_pa2pte(VM_PAGE_TO_PHYS(ptp)) | PG_V | PG_M | - PG_U | PG_k); -#endif + pmap_pte_set(ptppte, pmap_pa2pte(VM_PAGE_TO_PHYS(ptp)) | pteflags); + pmap_pte_flush(); pmap_update_pg((vaddr_t)ptpva); @@ -4252,8 +4264,8 @@ pmap_get_physpage(vaddr_t va, int level, } #endif kpreempt_disable(); - pmap_pte_set(early_zero_pte, - pmap_pa2pte(*paddrp) | PG_V | PG_RW | PG_k); + pmap_pte_set(early_zero_pte, pmap_pa2pte(*paddrp) | PG_V | + PG_RW | pmap_pg_nx | PG_k); pmap_pte_flush(); pmap_update_pg((vaddr_t)early_zerop); memset(early_zerop, 0, PAGE_SIZE);