Print this page
8956 Implement KPTI
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
*** 19,28 ****
--- 19,30 ----
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Joyent, Inc.
*/
#ifndef _ASM_MMU_H
#define _ASM_MMU_H
*** 31,43 ****
#ifdef __cplusplus
extern "C" {
#endif
! #if defined(__GNUC__) && !defined(__xpv)
! #if defined(__amd64)
extern __GNU_INLINE ulong_t
getcr3(void)
{
uint64_t value;
--- 33,45 ----
#ifdef __cplusplus
extern "C" {
#endif
! #if defined(__GNUC__)
! #if !defined(__xpv)
extern __GNU_INLINE ulong_t
getcr3(void)
{
uint64_t value;
*** 55,88 ****
"movq %0, %%cr3"
: /* no output */
: "r" (value));
}
- extern __GNU_INLINE void
- reload_cr3(void)
- {
- setcr3(getcr3());
- }
-
- #elif defined(__i386)
-
extern __GNU_INLINE ulong_t
! getcr3(void)
{
! uint32_t value;
__asm__ __volatile__(
! "movl %%cr3, %0"
: "=r" (value));
return (value);
}
extern __GNU_INLINE void
! setcr3(ulong_t value)
{
__asm__ __volatile__(
! "movl %0, %%cr3"
: /* no output */
: "r" (value));
}
extern __GNU_INLINE void
--- 57,82 ----
"movq %0, %%cr3"
: /* no output */
: "r" (value));
}
extern __GNU_INLINE ulong_t
! getcr4(void)
{
! uint64_t value;
__asm__ __volatile__(
! "movq %%cr4, %0"
: "=r" (value));
return (value);
}
extern __GNU_INLINE void
! setcr4(ulong_t value)
{
__asm__ __volatile__(
! "movq %0, %%cr4"
: /* no output */
: "r" (value));
}
extern __GNU_INLINE void
*** 89,102 ****
reload_cr3(void)
{
setcr3(getcr3());
}
! #endif
! #endif /* __GNUC__ && !__xpv */
#ifdef __cplusplus
}
#endif
#endif /* _ASM_MMU_H */
--- 83,120 ----
reload_cr3(void)
{
setcr3(getcr3());
}
! /*
! * 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__ */
+
#ifdef __cplusplus
}
#endif
#endif /* _ASM_MMU_H */