Module Name: src Committed By: maxv Date: Sun Jan 7 16:10:16 UTC 2018
Modified Files: src/sys/arch/amd64/amd64: amd64_trap.S genassym.cf locore.S machdep.c src/sys/arch/amd64/conf: GENERIC files.amd64 src/sys/arch/amd64/include: frameasm.h pmap.h src/sys/arch/i386/conf: files.i386 src/sys/arch/x86/include: cpu.h src/sys/arch/x86/x86: cpu.c pmap.c Log Message: Add a new option, SVS (for Separate Virtual Space), that unmaps kernel pages when running in userland. For now, only the PTE area is unmapped. Sent on tech-kern@. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/arch/amd64/amd64/amd64_trap.S cvs rdiff -u -r1.64 -r1.65 src/sys/arch/amd64/amd64/genassym.cf cvs rdiff -u -r1.144 -r1.145 src/sys/arch/amd64/amd64/locore.S cvs rdiff -u -r1.284 -r1.285 src/sys/arch/amd64/amd64/machdep.c cvs rdiff -u -r1.476 -r1.477 src/sys/arch/amd64/conf/GENERIC cvs rdiff -u -r1.97 -r1.98 src/sys/arch/amd64/conf/files.amd64 cvs rdiff -u -r1.26 -r1.27 src/sys/arch/amd64/include/frameasm.h cvs rdiff -u -r1.40 -r1.41 src/sys/arch/amd64/include/pmap.h cvs rdiff -u -r1.388 -r1.389 src/sys/arch/i386/conf/files.i386 cvs rdiff -u -r1.87 -r1.88 src/sys/arch/x86/include/cpu.h cvs rdiff -u -r1.143 -r1.144 src/sys/arch/x86/x86/cpu.c cvs rdiff -u -r1.277 -r1.278 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/amd64/amd64/amd64_trap.S diff -u src/sys/arch/amd64/amd64/amd64_trap.S:1.16 src/sys/arch/amd64/amd64/amd64_trap.S:1.17 --- src/sys/arch/amd64/amd64/amd64_trap.S:1.16 Sun Jan 7 12:42:46 2018 +++ src/sys/arch/amd64/amd64/amd64_trap.S Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: amd64_trap.S,v 1.16 2018/01/07 12:42:46 maxv Exp $ */ +/* $NetBSD: amd64_trap.S,v 1.17 2018/01/07 16:10:16 maxv Exp $ */ /* * Copyright (c) 1998, 2007, 2008, 2017 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ #if 0 #include <machine/asm.h> -__KERNEL_RCSID(0, "$NetBSD: amd64_trap.S,v 1.16 2018/01/07 12:42:46 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amd64_trap.S,v 1.17 2018/01/07 16:10:16 maxv Exp $"); #endif /* @@ -120,6 +120,7 @@ IDTVEC(trap02) #else ZTRAP_NJ(T_NMI) subq $TF_REGSIZE,%rsp + SVS_ENTER INTR_SAVE_GPRS cld SMAP_ENABLE @@ -137,6 +138,7 @@ IDTVEC(trap02) movq %rsp,%rdi incq CPUVAR(NTRAP) call _C_LABEL(nmitrap) + SVS_LEAVE swapgs jmp .Lnmileave @@ -144,6 +146,7 @@ IDTVEC(trap02) movq %rsp,%rdi incq CPUVAR(NTRAP) call _C_LABEL(nmitrap) + SVS_LEAVE .Lnmileave: movw TF_ES(%rsp),%es Index: src/sys/arch/amd64/amd64/genassym.cf diff -u src/sys/arch/amd64/amd64/genassym.cf:1.64 src/sys/arch/amd64/amd64/genassym.cf:1.65 --- src/sys/arch/amd64/amd64/genassym.cf:1.64 Thu Jan 4 13:36:30 2018 +++ src/sys/arch/amd64/amd64/genassym.cf Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.64 2018/01/04 13:36:30 maxv Exp $ +# $NetBSD: genassym.cf,v 1.65 2018/01/07 16:10:16 maxv Exp $ # # Copyright (c) 1998, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -236,6 +236,8 @@ define CPU_INFO_CURLDT offsetof(struct define CPU_INFO_IDLELWP offsetof(struct cpu_info, ci_data.cpu_idlelwp) define CPU_INFO_PMAP offsetof(struct cpu_info, ci_pmap) define CPU_INFO_TSS offsetof(struct cpu_info, ci_tss) +define CPU_INFO_UPDIRPA offsetof(struct cpu_info, ci_svs_updirpa) +define CPU_INFO_KPDIRPA offsetof(struct cpu_info, ci_svs_kpdirpa) define CPU_INFO_NSYSCALL offsetof(struct cpu_info, ci_data.cpu_nsyscall) define CPU_INFO_NTRAP offsetof(struct cpu_info, ci_data.cpu_ntrap) define CPU_INFO_NINTR offsetof(struct cpu_info, ci_data.cpu_nintr) Index: src/sys/arch/amd64/amd64/locore.S diff -u src/sys/arch/amd64/amd64/locore.S:1.144 src/sys/arch/amd64/amd64/locore.S:1.145 --- src/sys/arch/amd64/amd64/locore.S:1.144 Thu Jan 4 13:36:30 2018 +++ src/sys/arch/amd64/amd64/locore.S Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.144 2018/01/04 13:36:30 maxv Exp $ */ +/* $NetBSD: locore.S,v 1.145 2018/01/07 16:10:16 maxv Exp $ */ /* * Copyright-o-rama! @@ -159,6 +159,7 @@ #include "opt_compat_netbsd.h" #include "opt_compat_netbsd32.h" #include "opt_xen.h" +#include "opt_svs.h" #include "assym.h" #include "lapic.h" @@ -1088,6 +1089,12 @@ ENTRY(cpu_switchto) movq %rbp,PCB_RBP(%rax) .Lskip_save: +#ifdef SVS + pushq %rdx + callq _C_LABEL(svs_lwp_switch) + popq %rdx +#endif + /* Switch to newlwp's stack. */ movq L_PCB(%r12),%r14 movq PCB_RSP(%r14),%rsp @@ -1288,6 +1295,7 @@ IDTVEC(syscall) subq $TF_REGSIZE,%rsp cld #endif + SVS_ENTER INTR_SAVE_GPRS movw $GSEL(GUDATA_SEL, SEL_UPL),TF_DS(%rsp) movw $GSEL(GUDATA_SEL, SEL_UPL),TF_ES(%rsp) @@ -1332,6 +1340,7 @@ IDTVEC(syscall) jnz intrfastexit INTR_RESTORE_GPRS + SVS_LEAVE SWAPGS #ifndef XEN movq TF_RIP(%rsp),%rcx /* %rip for sysret */ @@ -1494,6 +1503,7 @@ do_mov_ds: movw TF_DS(%rsp),%ds do_mov_fs: movw TF_FS(%rsp),%fs + SVS_LEAVE SWAPGS #ifndef XEN do_mov_gs: @@ -1503,6 +1513,7 @@ do_mov_gs: .Luexit64: NOT_XEN(cli;) + SVS_LEAVE SWAPGS .Lkexit: Index: src/sys/arch/amd64/amd64/machdep.c diff -u src/sys/arch/amd64/amd64/machdep.c:1.284 src/sys/arch/amd64/amd64/machdep.c:1.285 --- src/sys/arch/amd64/amd64/machdep.c:1.284 Fri Jan 5 08:04:20 2018 +++ src/sys/arch/amd64/amd64/machdep.c Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.284 2018/01/05 08:04:20 maxv Exp $ */ +/* $NetBSD: machdep.c,v 1.285 2018/01/07 16:10:16 maxv Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011 @@ -110,7 +110,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.284 2018/01/05 08:04:20 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.285 2018/01/07 16:10:16 maxv Exp $"); /* #define XENDEBUG_LOW */ @@ -123,6 +123,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v #include "opt_realmem.h" #include "opt_xen.h" #include "opt_kaslr.h" +#include "opt_svs.h" #ifndef XEN #include "opt_physmem.h" #endif @@ -2228,3 +2229,138 @@ mm_md_direct_mapped_phys(paddr_t paddr, return true; } #endif + +/* -------------------------------------------------------------------------- */ + +#ifdef SVS +/* + * Separate Virtual Space + * + * A per-cpu L4 page is maintained in ci_svs_updirpa. During each context + * switch to a user pmap, updirpa is populated with the entries of the new + * pmap, minus what we don't want to have mapped in userland. + * + * Note on locking/synchronization here: + * + * (a) Touching ci_svs_updir without holding ci_svs_mtx first is *not* + * allowed. + * + * (b) pm_kernel_cpus contains the set of CPUs that have the pmap loaded + * in their CR3 register. It must *not* be replaced by pm_cpus. + * + * (c) When a context switch on the current CPU is made from a user LWP + * towards a kernel LWP, CR3 is not updated. Therefore, the pmap's + * pm_kernel_cpus still contains the current CPU. It implies that the + * remote CPUs that execute other threads of the user process we just + * left will keep synchronizing us against their changes. + * + * TODO: for now, only PMAP_SLOT_PTE is unmapped. + */ + +void +cpu_svs_init(struct cpu_info *ci) +{ + struct vm_page *pg; + + KASSERT(ci != NULL); + + pg = uvm_pagealloc(NULL, 0, NULL, UVM_PGA_ZERO); + if (pg == 0) + panic("%s: failed to allocate L4 PA for CPU %d\n", + __func__, cpu_index(ci)); + ci->ci_svs_updirpa = VM_PAGE_TO_PHYS(pg); + + ci->ci_svs_updir = (pt_entry_t *)uvm_km_alloc(kernel_map, PAGE_SIZE, 0, + UVM_KMF_VAONLY | UVM_KMF_NOWAIT); + if (ci->ci_svs_updir == NULL) + panic("%s: failed to allocate L4 VA for CPU %d\n", + __func__, cpu_index(ci)); + + pmap_kenter_pa((vaddr_t)ci->ci_svs_updir, ci->ci_svs_updirpa, + VM_PROT_READ | VM_PROT_WRITE, 0); + + pmap_update(pmap_kernel()); + + ci->ci_svs_kpdirpa = pmap_pdirpa(pmap_kernel(), 0); + + mutex_init(&ci->ci_svs_mtx, MUTEX_DEFAULT, IPL_VM); +} + +void +svs_pmap_sync(struct pmap *pmap, int index) +{ + CPU_INFO_ITERATOR cii; + struct cpu_info *ci; + cpuid_t cid; + + KASSERT(pmap != NULL); + KASSERT(pmap != pmap_kernel()); + KASSERT(mutex_owned(pmap->pm_lock)); + KASSERT(kpreempt_disabled()); + KASSERT(index <= 255); + + for (CPU_INFO_FOREACH(cii, ci)) { + cid = cpu_index(ci); + + if (!kcpuset_isset(pmap->pm_kernel_cpus, cid)) { + continue; + } + + /* take the lock and check again */ + mutex_enter(&ci->ci_svs_mtx); + if (kcpuset_isset(pmap->pm_kernel_cpus, cid)) { + ci->ci_svs_updir[index] = pmap->pm_pdir[index]; + } + mutex_exit(&ci->ci_svs_mtx); + } +} + +void +svs_lwp_switch(struct lwp *oldlwp, struct lwp *newlwp) +{ + /* Switch rsp0 */ +} + +static inline pt_entry_t +svs_pte_atomic_read(struct pmap *pmap, size_t idx) +{ + /* + * XXX: We don't have a basic atomic_fetch_64 function? + */ + return atomic_cas_64(&pmap->pm_pdir[idx], 666, 666); +} + +/* + * We may come here with the pmap unlocked. So read its PTEs atomically. If + * a remote CPU is updating them at the same time, it's not that bad: the + * remote CPU will call svs_pmap_sync afterwards, and our updirpa will be + * synchronized properly. + */ +void +svs_pdir_switch(struct pmap *pmap) +{ + struct cpu_info *ci = curcpu(); + pt_entry_t pte; + size_t i; + + KASSERT(kpreempt_disabled()); + KASSERT(pmap != pmap_kernel()); + + ci->ci_svs_kpdirpa = pmap_pdirpa(pmap, 0); + + mutex_enter(&ci->ci_svs_mtx); + + for (i = 0; i < 512; i++) { + if (i == PDIR_SLOT_PTE) { + /* We don't want to have this mapped. */ + ci->ci_svs_updir[i] = 0; + } else { + pte = svs_pte_atomic_read(pmap, i); + ci->ci_svs_updir[i] = pte; + } + } + + mutex_exit(&ci->ci_svs_mtx); +} +#endif + Index: src/sys/arch/amd64/conf/GENERIC diff -u src/sys/arch/amd64/conf/GENERIC:1.476 src/sys/arch/amd64/conf/GENERIC:1.477 --- src/sys/arch/amd64/conf/GENERIC:1.476 Sun Dec 31 03:38:06 2017 +++ src/sys/arch/amd64/conf/GENERIC Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.476 2017/12/31 03:38:06 christos Exp $ +# $NetBSD: GENERIC,v 1.477 2018/01/07 16:10:16 maxv Exp $ # # GENERIC machine description file # @@ -22,7 +22,7 @@ include "arch/amd64/conf/std.amd64" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.476 $" +#ident "GENERIC-$Revision: 1.477 $" maxusers 64 # estimated number of users @@ -75,6 +75,7 @@ options SYSCTL_INCLUDE_DESCR # Include # CPU-related options #options USER_LDT # user-settable LDT; used by WINE +options SVS # Separate Virtual Space # CPU features acpicpu* at cpu? # ACPI CPU (including frequency scaling) Index: src/sys/arch/amd64/conf/files.amd64 diff -u src/sys/arch/amd64/conf/files.amd64:1.97 src/sys/arch/amd64/conf/files.amd64:1.98 --- src/sys/arch/amd64/conf/files.amd64:1.97 Mon Jan 1 08:14:13 2018 +++ src/sys/arch/amd64/conf/files.amd64 Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -# $NetBSD: files.amd64,v 1.97 2018/01/01 08:14:13 maxv Exp $ +# $NetBSD: files.amd64,v 1.98 2018/01/07 16:10:16 maxv Exp $ # # new style config file for amd64 architecture # @@ -27,6 +27,7 @@ defparam opt_physmem.h PHYSMEM_MAX_ADDR defflag PMC defflag USER_LDT defflag KASLR +defflag SVS defflag eisa.h EISA # Start code Index: src/sys/arch/amd64/include/frameasm.h diff -u src/sys/arch/amd64/include/frameasm.h:1.26 src/sys/arch/amd64/include/frameasm.h:1.27 --- src/sys/arch/amd64/include/frameasm.h:1.26 Sun Jan 7 13:43:23 2018 +++ src/sys/arch/amd64/include/frameasm.h Sun Jan 7 16:10:16 2018 @@ -1,10 +1,11 @@ -/* $NetBSD: frameasm.h,v 1.26 2018/01/07 13:43:23 maxv Exp $ */ +/* $NetBSD: frameasm.h,v 1.27 2018/01/07 16:10:16 maxv Exp $ */ #ifndef _AMD64_MACHINE_FRAMEASM_H #define _AMD64_MACHINE_FRAMEASM_H #ifdef _KERNEL_OPT #include "opt_xen.h" +#include "opt_svs.h" #endif /* @@ -95,6 +96,22 @@ movq TF_RBX(%rsp),%rbx ; \ movq TF_RAX(%rsp),%rax +#ifdef SVS +#define SVS_ENTER \ + pushq %rax ; \ + movq CPUVAR(KPDIRPA),%rax ; \ + movq %rax,%cr3 ; \ + popq %rax +#define SVS_LEAVE \ + pushq %rax ; \ + movq CPUVAR(UPDIRPA),%rax ; \ + movq %rax,%cr3 ; \ + popq %rax +#else +#define SVS_ENTER /* nothing */ +#define SVS_LEAVE /* nothing */ +#endif + #define INTRENTRY_L(kernel_trap, usertrap) \ subq $TF_REGSIZE,%rsp ; \ INTR_SAVE_GPRS ; \ @@ -104,6 +121,7 @@ je kernel_trap ; \ usertrap ; \ SWAPGS ; \ + SVS_ENTER ; \ movw %gs,TF_GS(%rsp) ; \ movw %fs,TF_FS(%rsp) ; \ movw %es,TF_ES(%rsp) ; \ Index: src/sys/arch/amd64/include/pmap.h diff -u src/sys/arch/amd64/include/pmap.h:1.40 src/sys/arch/amd64/include/pmap.h:1.41 --- src/sys/arch/amd64/include/pmap.h:1.40 Sat Jun 17 08:40:46 2017 +++ src/sys/arch/amd64/include/pmap.h Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.40 2017/06/17 08:40:46 maxv Exp $ */ +/* $NetBSD: pmap.h,v 1.41 2018/01/07 16:10:16 maxv Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -218,6 +218,10 @@ */ #define NPTECL 8 +void svs_pmap_sync(struct pmap *, int); +void svs_lwp_switch(struct lwp *, struct lwp *); +void svs_pdir_switch(struct pmap *); + #include <x86/pmap.h> #ifndef XEN Index: src/sys/arch/i386/conf/files.i386 diff -u src/sys/arch/i386/conf/files.i386:1.388 src/sys/arch/i386/conf/files.i386:1.389 --- src/sys/arch/i386/conf/files.i386:1.388 Sun Oct 8 09:06:50 2017 +++ src/sys/arch/i386/conf/files.i386 Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -# $NetBSD: files.i386,v 1.388 2017/10/08 09:06:50 maxv Exp $ +# $NetBSD: files.i386,v 1.389 2018/01/07 16:10:16 maxv Exp $ # # new style config file for i386 architecture # @@ -20,6 +20,7 @@ obsolete defflag XBOX defflag PMC defflag KASLR +defflag SVS # User-settable LDT (used by WINE) defflag USER_LDT Index: src/sys/arch/x86/include/cpu.h diff -u src/sys/arch/x86/include/cpu.h:1.87 src/sys/arch/x86/include/cpu.h:1.88 --- src/sys/arch/x86/include/cpu.h:1.87 Fri Jan 5 08:04:21 2018 +++ src/sys/arch/x86/include/cpu.h Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.87 2018/01/05 08:04:21 maxv Exp $ */ +/* $NetBSD: cpu.h,v 1.88 2018/01/07 16:10:16 maxv Exp $ */ /* * Copyright (c) 1990 The Regents of the University of California. @@ -47,6 +47,7 @@ #if defined(_KERNEL) || defined(_KMEMUSER) #if defined(_KERNEL_OPT) #include "opt_xen.h" +#include "opt_svs.h" #ifdef i386 #include "opt_user_ldt.h" #endif @@ -187,6 +188,13 @@ struct cpu_info { pd_entry_t * ci_pae_l3_pdir; /* VA pointer to L3 PD */ #endif +#ifdef SVS + pd_entry_t * ci_svs_updir; + paddr_t ci_svs_updirpa; + paddr_t ci_svs_kpdirpa; + kmutex_t ci_svs_mtx; +#endif + #if defined(XEN) && (defined(PAE) || defined(__x86_64__)) /* Currently active user PGD (can't use rcr3() with Xen) */ pd_entry_t * ci_kpm_pdir; /* per-cpu PMD (va) */ @@ -333,6 +341,7 @@ void cpu_broadcast_halt(void); void cpu_kick(struct cpu_info *); void cpu_pcpuarea_init(struct cpu_info *); +void cpu_svs_init(struct cpu_info *); #define curcpu() x86_curcpu() #define curlwp x86_curlwp() Index: src/sys/arch/x86/x86/cpu.c diff -u src/sys/arch/x86/x86/cpu.c:1.143 src/sys/arch/x86/x86/cpu.c:1.144 --- src/sys/arch/x86/x86/cpu.c:1.143 Sun Jan 7 10:16:13 2018 +++ src/sys/arch/x86/x86/cpu.c Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.143 2018/01/07 10:16:13 maxv Exp $ */ +/* $NetBSD: cpu.c,v 1.144 2018/01/07 16:10:16 maxv Exp $ */ /* * Copyright (c) 2000-2012 NetBSD Foundation, Inc. @@ -62,12 +62,13 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.143 2018/01/07 10:16:13 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.144 2018/01/07 16:10:16 maxv Exp $"); #include "opt_ddb.h" #include "opt_mpbios.h" /* for MPDEBUG */ #include "opt_mtrr.h" #include "opt_multiprocessor.h" +#include "opt_svs.h" #include "lapic.h" #include "ioapic.h" @@ -379,6 +380,10 @@ cpu_attach(device_t parent, device_t sel /* Must be before mi_cpu_attach(). */ cpu_vm_init(ci); +#ifdef SVS + cpu_svs_init(ci); +#endif + if (caa->cpu_role == CPU_ROLE_AP) { int error; @@ -1248,6 +1253,10 @@ x86_cpu_idle_halt(void) void cpu_load_pmap(struct pmap *pmap, struct pmap *oldpmap) { +#ifdef SVS + svs_pdir_switch(pmap); +#endif + #ifdef PAE struct cpu_info *ci = curcpu(); bool interrupts_enabled; Index: src/sys/arch/x86/x86/pmap.c diff -u src/sys/arch/x86/x86/pmap.c:1.277 src/sys/arch/x86/x86/pmap.c:1.278 --- src/sys/arch/x86/x86/pmap.c:1.277 Fri Jan 5 09:13:48 2018 +++ src/sys/arch/x86/x86/pmap.c Sun Jan 7 16:10:16 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.277 2018/01/05 09:13:48 martin Exp $ */ +/* $NetBSD: pmap.c,v 1.278 2018/01/07 16:10:16 maxv Exp $ */ /* * Copyright (c) 2008, 2010, 2016, 2017 The NetBSD Foundation, Inc. @@ -170,12 +170,13 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.277 2018/01/05 09:13:48 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.278 2018/01/07 16:10:16 maxv Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" #include "opt_multiprocessor.h" #include "opt_xen.h" +#include "opt_svs.h" #include <sys/param.h> #include <sys/systm.h> @@ -558,9 +559,11 @@ static void pmap_init_pcpu(void); #ifdef __HAVE_DIRECT_MAP static void pmap_init_directmap(struct pmap *); #endif +#if !defined(XEN) && !defined(SVS) +static void pmap_remap_global(void); +#endif #ifndef XEN static void pmap_init_lapic(void); -static void pmap_remap_global(void); static void pmap_remap_largepages(void); #endif @@ -1286,7 +1289,7 @@ pmap_bootstrap(vaddr_t kva_start) * operation of the system. */ -#ifndef XEN +#if !defined(XEN) && !defined(SVS) /* * Begin to enable global TLB entries if they are supported. * The G bit has no effect until the CR4_PGE bit is set in CR4, @@ -1299,7 +1302,9 @@ pmap_bootstrap(vaddr_t kva_start) /* add PG_G attribute to already mapped kernel pages */ pmap_remap_global(); } +#endif +#ifndef XEN /* * Enable large pages if they are supported. */ @@ -1648,7 +1653,7 @@ pmap_init_directmap(struct pmap *kpm) } #endif /* __HAVE_DIRECT_MAP */ -#ifndef XEN +#if !defined(XEN) && !defined(SVS) /* * Remap all of the virtual pages created so far with the PG_G bit. */ @@ -1691,7 +1696,9 @@ pmap_remap_global(void) PTE_BASE[p1i] |= PG_G; } } +#endif +#ifndef XEN /* * Remap several kernel segments with large pages. We cover as many pages as we * can. Called only once at boot time, if the CPU supports large pages. @@ -2113,13 +2120,17 @@ pmap_free_ptp(struct pmap *pmap, struct opde = pmap_pte_testset(&pdes[level - 1][index], 0); /* - * On Xen-amd64, we need to sync the top level page + * On Xen-amd64 or SVS, we need to sync the top level page * directory on each CPU. */ #if defined(XEN) && defined(__x86_64__) if (level == PTP_LEVELS - 1) { xen_kpm_sync(pmap, index); } +#elif defined(SVS) + if (level == PTP_LEVELS - 1) { + svs_pmap_sync(pmap, index); + } #endif invaladdr = level == 1 ? (vaddr_t)ptes : @@ -2214,13 +2225,17 @@ pmap_get_ptp(struct pmap *pmap, vaddr_t (pmap_pa2pte(pa) | PG_u | PG_RW | PG_V)); /* - * On Xen-amd64, we need to sync the top level page + * On Xen-amd64 or SVS, we need to sync the top level page * directory on each CPU. */ #if defined(XEN) && defined(__x86_64__) if (i == PTP_LEVELS) { xen_kpm_sync(pmap, index); } +#elif defined(SVS) + if (i == PTP_LEVELS) { + svs_pmap_sync(pmap, index); + } #endif pmap_pte_flush();