Print this page
8956 Implement KPTI
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
@@ -1,10 +1,10 @@
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2016 Joyent, Inc.
+ * Copyright 2018 Joyent, Inc.
*/
#ifndef _SYS_SEGMENTS_H
#define _SYS_SEGMENTS_H
@@ -96,33 +96,34 @@
* with a DPL below user (ring 3) the int $n will generate a #gp fault
* which the hypervisor catches and forwards to the guest.
*/
#if defined(__xpv)
-#if defined(__amd64)
-
#define SEL_XPL 0 /* hypervisor privilege level */
#define SEL_KPL 3 /* both kernel and user in ring 3 */
#define TRP_KPL 1 /* system gate priv (user blocked) */
-
-#elif defined(__i386)
-
-#define SEL_XPL 0 /* hypervisor privilege level */
-#define SEL_KPL 1 /* kernel privilege level */
-#define TRP_KPL SEL_KPL /* system gate priv (user blocked) */
-
-#endif /* __i386 */
-
#define TRP_XPL 0 /* system gate priv (hypervisor) */
+#define IST_DBG 0
+
#else /* __xpv */
#define SEL_KPL 0 /* kernel privilege level on metal */
#define TRP_KPL SEL_KPL /* system gate priv (user blocked) */
+
+#define IST_DF 1
+#define IST_NMI 2
+#define IST_MCE 3
+#define IST_DBG 4
+#define IST_NESTABLE 5
+#define IST_DEFAULT 6
+
#endif /* __xpv */
+#define IST_NONE 0
+
#define SEL_UPL 3 /* user priority level */
#define TRP_UPL 3 /* system gate priv (user allowed) */
#define SEL_TI_LDT 4 /* local descriptor table */
#define SEL_LDT(s) (IDXTOSEL(s) | SEL_TI_LDT | SEL_UPL) /* local sel */
#define CPL_MASK 3 /* RPL mask for selector */
@@ -399,10 +400,12 @@
extern void set_usegd(user_desc_t *, void *, size_t, uint_t, uint_t,
uint_t, uint_t);
#endif /* __i386 */
+extern uint_t idt_vector_to_ist(uint_t);
+
extern void set_gatesegd(gate_desc_t *, void (*)(void), selector_t,
uint_t, uint_t, uint_t);
extern void set_syssegd(system_desc_t *, void *, size_t, uint_t, uint_t);
@@ -644,10 +647,14 @@
#define LDT_ALTSIGCALL 5 /* EOL me, alternate call gate for sigreturn */
#define LDT_UDBASE 6 /* user descriptor base index */
#define MINNLDT 512 /* Current min solaris ldt size (1 4K page) */
#define MAXNLDT 8192 /* max solaris ldt size (16 4K pages) */
+#ifdef _KERNEL
+#define LDT_CPU_SIZE (16 * 4096) /* Size of kernel per-CPU allocation */
+#endif
+
#ifndef _ASM
extern gate_desc_t *idt0;
extern desctbr_t idt0_default_reg;
extern user_desc_t *gdt0;
@@ -684,14 +691,31 @@
extern void achktrap(), mcetrap();
extern void xmtrap();
extern void fasttrap();
extern void dtrace_ret();
+/* KPTI trampolines */
+extern void tr_invaltrap();
+extern void tr_div0trap(), tr_dbgtrap(), tr_nmiint(), tr_brktrap();
+extern void tr_ovflotrap(), tr_boundstrap(), tr_invoptrap(), tr_ndptrap();
+#if !defined(__xpv)
+extern void tr_syserrtrap();
+#endif
+extern void tr_invaltrap(), tr_invtsstrap(), tr_segnptrap(), tr_stktrap();
+extern void tr_gptrap(), tr_pftrap(), tr_ndperr();
+extern void tr_overrun(), tr_resvtrap();
+extern void tr_achktrap(), tr_mcetrap();
+extern void tr_xmtrap();
+extern void tr_fasttrap();
+extern void tr_dtrace_ret();
+
#if !defined(__amd64)
extern void pentium_pftrap();
#endif
+extern uint64_t kpti_enable;
+
#endif /* _ASM */
#ifdef __cplusplus
}
#endif