diff options
author | John Levon <john.levon@joyent.com> | 2018-02-22 18:05:13 -0800 |
---|---|---|
committer | John Levon <john.levon@joyent.com> | 2018-03-13 20:33:26 +0000 |
commit | 60f89b42cd13d6888f948d7ffe4edcfa535e02a6 (patch) | |
tree | c60e2fa99bc8572c457a0908105f8570c56b834c /usr/src/uts/intel/asm/mmu.h | |
parent | 0e957fcabecc0abb13226b12f474359f4ea711ea (diff) | |
download | illumos-joyent-60f89b42cd13d6888f948d7ffe4edcfa535e02a6.tar.gz |
OS-6546 Use PCID if KPTI is enabled
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Alex Wilson <alex.wilson@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Approved by: Alex Wilson <alex.wilson@joyent.com>
Diffstat (limited to 'usr/src/uts/intel/asm/mmu.h')
-rw-r--r-- | usr/src/uts/intel/asm/mmu.h | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/usr/src/uts/intel/asm/mmu.h b/usr/src/uts/intel/asm/mmu.h index 1be654759d..bd3e69a9a8 100644 --- a/usr/src/uts/intel/asm/mmu.h +++ b/usr/src/uts/intel/asm/mmu.h @@ -21,6 +21,8 @@ /* * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * + * Copyright 2018 Joyent, Inc. */ #ifndef _ASM_MMU_H @@ -33,9 +35,9 @@ extern "C" { #endif -#if defined(__GNUC__) && !defined(__xpv) +#if defined(__GNUC__) -#if defined(__amd64) +#if !defined(__xpv) extern __GNU_INLINE ulong_t getcr3(void) @@ -57,30 +59,22 @@ setcr3(ulong_t value) : "r" (value)); } -extern __GNU_INLINE void -reload_cr3(void) -{ - setcr3(getcr3()); -} - -#elif defined(__i386) - extern __GNU_INLINE ulong_t -getcr3(void) +getcr4(void) { - uint32_t value; + uint64_t value; __asm__ __volatile__( - "movl %%cr3, %0" + "movq %%cr4, %0" : "=r" (value)); return (value); } extern __GNU_INLINE void -setcr3(ulong_t value) +setcr4(ulong_t value) { __asm__ __volatile__( - "movl %0, %%cr3" + "movq %0, %%cr4" : /* no output */ : "r" (value)); } @@ -91,9 +85,33 @@ reload_cr3(void) setcr3(getcr3()); } -#endif +/* + * We clobber memory: we're not writing anything, but we don't want to + * potentially get re-ordered beyond the TLB flush. + */ +extern __GNU_INLINE void +invpcid_insn(uint64_t type, uint64_t pcid, uintptr_t addr) +{ + uint64_t pcid_desc[2] = { pcid, addr }; + __asm__ __volatile__( + "invpcid %0, %1" + : /* no output */ + : "m" (*pcid_desc), "r" (type) + : "memory"); +} + +#endif /* !__xpv */ + +extern __GNU_INLINE void +mmu_invlpg(caddr_t addr) +{ + __asm__ __volatile__( + "invlpg %0" + : "=m" (*addr) + : "m" (*addr)); +} -#endif /* __GNUC__ && !__xpv */ +#endif /* __GNUC__ */ #ifdef __cplusplus } |