summaryrefslogtreecommitdiff
path: root/usr/src/uts/intel
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2019-11-08 14:16:48 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2019-11-08 14:16:48 +0000
commit4351df24a18fd73b1e6cc2591e622883e502167c (patch)
tree055eea240497456740e6f737bef63765ed7a6574 /usr/src/uts/intel
parentfaabb223a29c66e258a2c067cb14888c51ba6f47 (diff)
parent42cd19316c818c8b8283fc48263a1b4ce99cf049 (diff)
downloadillumos-joyent-4351df24a18fd73b1e6cc2591e622883e502167c.tar.gz
[illumos-gate merge]
commit 42cd19316c818c8b8283fc48263a1b4ce99cf049 11859 need swapgs mitigation commit ad3e6d4dd82f2e18743399134a4b99cf303478f6 11880 changing encryption key on dataset with unencrypted children triggers VERIFY commit 249622b3e0d46f0016d00e3f87b314635d11065a 11929 mac_minor_hold() gets id_alloc_nosleep() wrong commit 1c085a54d061bc17f8b209d1ea6161fcdf66d971 3334 zonestat missing man page commit 327c8d1665439dd2540c1b460773bd9f0c1c0fa9 11792 ibtl: cast between incompatible function types commit 22f89f96cd7b45b9686231ed7d98e610077df6c6 11922 ipmi_open looks for wrong return value
Diffstat (limited to 'usr/src/uts/intel')
-rw-r--r--usr/src/uts/intel/amd64/ml/amd64.il20
-rw-r--r--usr/src/uts/intel/amd64/sys/privregs.h14
-rw-r--r--usr/src/uts/intel/asm/cpu.h11
-rw-r--r--usr/src/uts/intel/ia32/ml/exception.s5
-rw-r--r--usr/src/uts/intel/ia32/os/sundep.c11
-rw-r--r--usr/src/uts/intel/io/ipmi/ipmi_main.c6
-rw-r--r--usr/src/uts/intel/kdi/kdi_asm.s5
-rw-r--r--usr/src/uts/intel/sys/archsystm.h4
-rw-r--r--usr/src/uts/intel/sys/segments.h3
9 files changed, 40 insertions, 39 deletions
diff --git a/usr/src/uts/intel/amd64/ml/amd64.il b/usr/src/uts/intel/amd64/ml/amd64.il
index fc78c95a95..3e2a790729 100644
--- a/usr/src/uts/intel/amd64/ml/amd64.il
+++ b/usr/src/uts/intel/amd64/ml/amd64.il
@@ -23,6 +23,10 @@
* Use is subject to license terms.
*/
+/*
+ * Copyright 2019 Joyent, Inc.
+ */
+
/
/ In-line functions for amd64 kernels.
/
@@ -189,34 +193,26 @@
movw %di, %gs
.end
- /*
- * OPTERON_ERRATUM_88 requires mfence
- */
- .inline __swapgs, 0
- mfence
- swapgs
- .end
-
/*
* prefetch 64 bytes
*/
- .inline prefetch_read_many,8
+ .inline prefetch_read_many,8
prefetcht0 (%rdi)
prefetcht0 32(%rdi)
.end
- .inline prefetch_read_once,8
+ .inline prefetch_read_once,8
prefetchnta (%rdi)
prefetchnta 32(%rdi)
.end
- .inline prefetch_write_many,8
+ .inline prefetch_write_many,8
prefetcht0 (%rdi)
prefetcht0 32(%rdi)
.end
- .inline prefetch_write_once,8
+ .inline prefetch_write_once,8
prefetcht0 (%rdi)
prefetcht0 32(%rdi)
.end
diff --git a/usr/src/uts/intel/amd64/sys/privregs.h b/usr/src/uts/intel/amd64/sys/privregs.h
index 83782c4b37..7e5f7cd392 100644
--- a/usr/src/uts/intel/amd64/sys/privregs.h
+++ b/usr/src/uts/intel/amd64/sys/privregs.h
@@ -24,6 +24,10 @@
* Use is subject to license terms.
*/
+/*
+ * Copyright 2019 Joyent, Inc.
+ */
+
#ifndef _AMD64_SYS_PRIVREGS_H
#define _AMD64_SYS_PRIVREGS_H
@@ -206,7 +210,8 @@ struct regs {
je 6f; \
movq $0, REGOFF_SAVFP(%rsp); \
SWAPGS; \
-6: CLEAN_CS
+6: lfence; /* swapgs mitigation */ \
+ CLEAN_CS
#define INTR_POP \
leaq sys_lcall32(%rip), %r11;\
@@ -216,8 +221,13 @@ struct regs {
cmpw $KCS_SEL, REGOFF_CS(%rsp);\
je 8f; \
5: SWAPGS; \
-8: addq $REGOFF_RIP, %rsp
+8: lfence; /* swapgs mitigation */ \
+ addq $REGOFF_RIP, %rsp
+/*
+ * No need for swapgs mitigation: it's unconditional, and we're heading
+ * back to userspace.
+ */
#define USER_POP \
__RESTORE_REGS; \
SWAPGS; \
diff --git a/usr/src/uts/intel/asm/cpu.h b/usr/src/uts/intel/asm/cpu.h
index faaaea7c8e..95e882601a 100644
--- a/usr/src/uts/intel/asm/cpu.h
+++ b/usr/src/uts/intel/asm/cpu.h
@@ -172,17 +172,6 @@ __set_gs(selector_t value)
: "r" (value));
}
-#if !defined(__xpv)
-
-extern __GNU_INLINE void
-__swapgs(void)
-{
- __asm__ __volatile__(
- "mfence; swapgs");
-}
-
-#endif /* !__xpv */
-
#endif /* __amd64 */
#endif /* !__lint && __GNUC__ */
diff --git a/usr/src/uts/intel/ia32/ml/exception.s b/usr/src/uts/intel/ia32/ml/exception.s
index 5806087ca1..b35eab3220 100644
--- a/usr/src/uts/intel/ia32/ml/exception.s
+++ b/usr/src/uts/intel/ia32/ml/exception.s
@@ -174,8 +174,9 @@
leaq tr_brand_sys_sysenter(%rip), %r11
cmpq %r11, 24(%rsp)
jne 2f
-1: SWAPGS
-2: popq %r11
+1: swapgs
+2: lfence /* swapgs mitigation */
+ popq %r11
#endif /* !__xpv */
INTR_PUSH
diff --git a/usr/src/uts/intel/ia32/os/sundep.c b/usr/src/uts/intel/ia32/os/sundep.c
index cfb4552287..34e0a03d68 100644
--- a/usr/src/uts/intel/ia32/os/sundep.c
+++ b/usr/src/uts/intel/ia32/os/sundep.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2018 Joyent, Inc.
+ * Copyright 2019 Joyent, Inc.
*/
/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
@@ -551,16 +551,19 @@ update_sregs(struct regs *rp, klwp_t *lwp)
*
* We've just mucked up the kernel's gsbase. Oops. In
* particular we can't take any traps at all. Make the newly
- * computed gsbase be the hidden gs via __swapgs, and fix
+ * computed gsbase be the hidden gs via swapgs, and fix
* the kernel's gsbase back again. Later, when we return to
* userland we'll swapgs again restoring gsbase just loaded
* above.
*/
- __swapgs();
+ __asm__ __volatile__("mfence; swapgs");
+
rp->r_gs = pcb->pcb_gs;
/*
- * restore kernel's gsbase
+ * Restore kernel's gsbase. Note that this also serializes any
+ * attempted speculation from loading the user-controlled
+ * %gsbase.
*/
wrmsr(MSR_AMD_GSBASE, kgsbase);
diff --git a/usr/src/uts/intel/io/ipmi/ipmi_main.c b/usr/src/uts/intel/io/ipmi/ipmi_main.c
index 8b25829d2b..e7671ce734 100644
--- a/usr/src/uts/intel/io/ipmi/ipmi_main.c
+++ b/usr/src/uts/intel/io/ipmi/ipmi_main.c
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2017 Joyent, Inc.
+ * Copyright 2019 Joyent, Inc.
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
*/
@@ -151,6 +151,7 @@ ipmi_open(dev_t *devp, int flag, int otyp, cred_t *cred)
{
minor_t minor;
ipmi_device_t *dev;
+ id_t mid;
if (ipmi_attached == B_FALSE)
return (ENXIO);
@@ -162,8 +163,9 @@ ipmi_open(dev_t *devp, int flag, int otyp, cred_t *cred)
if (flag & FEXCL)
return (ENOTSUP);
- if ((minor = (minor_t)id_alloc_nosleep(minor_ids)) == 0)
+ if ((mid = id_alloc_nosleep(minor_ids)) == -1)
return (ENODEV);
+ minor = (minor_t)mid;
/* Initialize the per file descriptor data. */
dev = kmem_zalloc(sizeof (ipmi_device_t), KM_SLEEP);
diff --git a/usr/src/uts/intel/kdi/kdi_asm.s b/usr/src/uts/intel/kdi/kdi_asm.s
index f106d643f7..3dd6db5952 100644
--- a/usr/src/uts/intel/kdi/kdi_asm.s
+++ b/usr/src/uts/intel/kdi/kdi_asm.s
@@ -23,7 +23,7 @@
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
- * Copyright 2018 Joyent, Inc.
+ * Copyright 2019 Joyent, Inc.
*/
/*
@@ -271,6 +271,9 @@
* KDI_SAVE_REGS macro to prevent a usermode process's GSBASE from being
* blown away. On the hypervisor, we don't need to do this, since it's
* ensured we're on our requested kernel GSBASE already.
+ *
+ * No need to worry about swapgs speculation here as it's unconditional
+ * and via wrmsr anyway.
*/
subq $10, %rsp
sgdt (%rsp)
diff --git a/usr/src/uts/intel/sys/archsystm.h b/usr/src/uts/intel/sys/archsystm.h
index 0c9ceac7be..55c387f9b1 100644
--- a/usr/src/uts/intel/sys/archsystm.h
+++ b/usr/src/uts/intel/sys/archsystm.h
@@ -21,7 +21,7 @@
/*
* Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2018 Joyent, Inc.
+ * Copyright 2019 Joyent, Inc.
*/
#ifndef _SYS_ARCHSYSTM_H
@@ -94,10 +94,8 @@ extern void brand_sys_call();
#endif
extern void sys_sysenter();
extern void tr_sys_sysenter();
-extern void _sys_sysenter_post_swapgs();
extern void brand_sys_sysenter();
extern void tr_brand_sys_sysenter();
-extern void _brand_sys_sysenter_post_swapgs();
extern void dosyscall(void);
diff --git a/usr/src/uts/intel/sys/segments.h b/usr/src/uts/intel/sys/segments.h
index 6bf18b3082..52831c9d87 100644
--- a/usr/src/uts/intel/sys/segments.h
+++ b/usr/src/uts/intel/sys/segments.h
@@ -2,7 +2,7 @@
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2018 Joyent, Inc.
+ * Copyright 2019 Joyent, Inc.
*/
#ifndef _SYS_SEGMENTS_H
@@ -179,7 +179,6 @@ extern void __set_ds(selector_t);
extern void __set_es(selector_t);
extern void __set_fs(selector_t);
extern void __set_gs(selector_t);
-extern void __swapgs(void);
#endif /* __amd64 */
#if defined(__amd64)