diff options
author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2019-11-08 14:16:48 +0000 |
---|---|---|
committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2019-11-08 14:16:48 +0000 |
commit | 4351df24a18fd73b1e6cc2591e622883e502167c (patch) | |
tree | 055eea240497456740e6f737bef63765ed7a6574 /usr/src/uts/intel | |
parent | faabb223a29c66e258a2c067cb14888c51ba6f47 (diff) | |
parent | 42cd19316c818c8b8283fc48263a1b4ce99cf049 (diff) | |
download | illumos-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.il | 20 | ||||
-rw-r--r-- | usr/src/uts/intel/amd64/sys/privregs.h | 14 | ||||
-rw-r--r-- | usr/src/uts/intel/asm/cpu.h | 11 | ||||
-rw-r--r-- | usr/src/uts/intel/ia32/ml/exception.s | 5 | ||||
-rw-r--r-- | usr/src/uts/intel/ia32/os/sundep.c | 11 | ||||
-rw-r--r-- | usr/src/uts/intel/io/ipmi/ipmi_main.c | 6 | ||||
-rw-r--r-- | usr/src/uts/intel/kdi/kdi_asm.s | 5 | ||||
-rw-r--r-- | usr/src/uts/intel/sys/archsystm.h | 4 | ||||
-rw-r--r-- | usr/src/uts/intel/sys/segments.h | 3 |
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) |