sync with OpenBSD -current

This commit is contained in:
purplerain 2024-02-12 06:55:15 +00:00
parent 3a25e8ae30
commit e51bf6e676
Signed by: purplerain
GPG Key ID: F42C07F07E2E35B7
7 changed files with 87 additions and 14 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: cpu.c,v 1.178 2024/02/03 16:21:22 deraadt Exp $ */
/* $OpenBSD: cpu.c,v 1.180 2024/02/12 02:57:14 jsg Exp $ */
/* $NetBSD: cpu.c,v 1.1 2003/04/26 18:39:26 fvdl Exp $ */
/*-
@ -188,7 +188,7 @@ replacemeltdown(void)
{
static int replacedone = 0;
struct cpu_info *ci = &cpu_info_primary;
int swapgs_vuln = 0, ibrs = 0, s;
int swapgs_vuln = 0, ibrs = 0, s, ibpb = 0;
if (strcmp(cpu_vendor, "GenuineIntel") == 0) {
int family = ci->ci_family;
@ -211,6 +211,8 @@ replacemeltdown(void)
} else if (ci->ci_feature_sefflags_edx & SEFF0EDX_IBRS) {
ibrs = 1;
}
if (ci->ci_feature_sefflags_edx & SEFF0EDX_IBRS)
ibpb = 1;
} else if (strcmp(cpu_vendor, "AuthenticAMD") == 0 &&
ci->ci_pnfeatset >= 0x80000008) {
if (ci->ci_feature_amdspec_ebx & CPUIDEBX_IBRS_ALWAYSON) {
@ -219,6 +221,8 @@ replacemeltdown(void)
(ci->ci_feature_amdspec_ebx & CPUIDEBX_IBRS_PREF)) {
ibrs = 1;
}
if (ci->ci_feature_amdspec_ebx & CPUIDEBX_IBPB)
ibpb = 1;
}
/* Enhanced IBRS: turn it on once on each CPU and don't touch again */
@ -230,6 +234,11 @@ replacemeltdown(void)
replacedone = 1;
s = splhigh();
/* If we don't have IBRS/IBPB, then don't use IBPB */
if (ibpb == 0)
codepatch_nop(CPTAG_IBPB_NOP);
if (ibrs == 2 || (ci->ci_feature_sefflags_edx & SEFF0EDX_IBT)) {
extern const char _jmprax, _jmpr11, _jmpr13;
extern const short _jmprax_len, _jmpr11_len, _jmpr13_len;

View File

@ -1,4 +1,4 @@
# $OpenBSD: genassym.cf,v 1.44 2023/01/16 00:05:18 deraadt Exp $
# $OpenBSD: genassym.cf,v 1.45 2024/02/12 01:18:17 guenther Exp $
# Written by Artur Grabowski art@openbsd.org, Public Domain
include <sys/param.h>
@ -108,6 +108,7 @@ member CPU_INFO_APICID ci_apicid
member CPU_INFO_RESCHED ci_want_resched
member CPU_INFO_CURPROC ci_curproc
member CPU_INFO_PROC_PMAP ci_proc_pmap
member CPU_INFO_USER_PMAP ci_user_pmap
member CPU_INFO_CURPCB ci_curpcb
member CPU_INFO_IDLE_PCB ci_idle_pcb
member CPU_INFO_ILEVEL ci_ilevel

View File

@ -1,4 +1,4 @@
/* $OpenBSD: locore.S,v 1.144 2023/12/12 15:30:55 deraadt Exp $ */
/* $OpenBSD: locore.S,v 1.145 2024/02/12 01:18:17 guenther Exp $ */
/* $NetBSD: locore.S,v 1.13 2004/03/25 18:33:17 drochner Exp $ */
/*
@ -595,6 +595,22 @@ GENTRY(Xsyscall)
jz .Lsyscall_restore_fsbase
.Lsyscall_restore_registers:
/*
* If the pmap we're now on isn't the same as the one we
* were on last time we were in userspace, then use IBPB
* to prevent cross-process branch-target injection.
*/
CODEPATCH_START
movq CPUVAR(PROC_PMAP),%rbx
cmpq CPUVAR(USER_PMAP),%rbx
je 1f
xorl %edx,%edx
movl $PRED_CMD_IBPB,%eax
movl $MSR_PRED_CMD,%ecx
wrmsr
movq %rbx,CPUVAR(USER_PMAP)
1:
CODEPATCH_END(CPTAG_IBPB_NOP)
call pku_xonly
RET_STACK_REFILL_WITH_RCX
@ -758,17 +774,33 @@ intr_user_exit_post_ast:
testl $CPUPF_USERXSTATE,CPUVAR(PFLAGS)
jz .Lintr_restore_xstate
/* Restore FS.base if it's not already in the CPU */
testl $CPUPF_USERSEGS,CPUVAR(PFLAGS)
jz .Lintr_restore_fsbase
.Lintr_restore_registers:
#ifdef DIAGNOSTIC
/* no more C calls after this, so check the SPL */
cmpl $0,CPUVAR(ILEVEL)
jne .Luser_spl_not_lowered
#endif /* DIAGNOSTIC */
/* Restore FS.base if it's not already in the CPU */
testl $CPUPF_USERSEGS,CPUVAR(PFLAGS)
jz .Lintr_restore_fsbase
.Lintr_restore_registers:
/*
* If the pmap we're now on isn't the same as the one we
* were on last time we were in userspace, then use IBPB
* to prevent cross-process branch-target injection.
*/
CODEPATCH_START
movq CPUVAR(PROC_PMAP),%rbx
cmpq CPUVAR(USER_PMAP),%rbx
je 1f
xorl %edx,%edx
movl $PRED_CMD_IBPB,%eax
movl $MSR_PRED_CMD,%ecx
wrmsr
movq %rbx,CPUVAR(USER_PMAP)
1:
CODEPATCH_END(CPTAG_IBPB_NOP)
call pku_xonly
RET_STACK_REFILL_WITH_RCX

View File

@ -1,4 +1,4 @@
/* $OpenBSD: vector.S,v 1.94 2023/07/31 04:01:07 guenther Exp $ */
/* $OpenBSD: vector.S,v 1.95 2024/02/12 01:18:17 guenther Exp $ */
/* $NetBSD: vector.S,v 1.5 2004/06/28 09:13:11 fvdl Exp $ */
/*
@ -149,6 +149,13 @@ INTRENTRY_LABEL(calltrap_specstk):
movq %r12,%rax
movq %r13,%rdx
wrmsr
/* who knows what happened in this trap; use IPBP on the way out */
CODEPATCH_START
xorl %edx,%edx
movl $PRED_CMD_IBPB,%eax
movl $MSR_PRED_CMD,%ecx
wrmsr
CODEPATCH_END(CPTAG_IBPB_NOP)
call pku_xonly
popq %rdi
popq %rsi

View File

@ -1,4 +1,4 @@
/* $OpenBSD: vmm_machdep.c,v 1.16 2024/01/31 05:49:33 guenther Exp $ */
/* $OpenBSD: vmm_machdep.c,v 1.18 2024/02/12 02:57:14 jsg Exp $ */
/*
* Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
*
@ -4185,6 +4185,16 @@ vcpu_run_vmx(struct vcpu *vcpu, struct vm_run_params *vrp)
TRACEPOINT(vmm, guest_enter, vcpu, vrp);
/*
* If we're resuming to a different VCPU and have IBPB,
* then use it to prevent cross-VM branch-target injection.
*/
if (ci->ci_guest_vcpu != vcpu &&
(ci->ci_feature_sefflags_edx & SEFF0EDX_IBRS)) {
wrmsr(MSR_PRED_CMD, PRED_CMD_IBPB);
ci->ci_guest_vcpu = vcpu;
}
/* Restore any guest PKRU state. */
if (vmm_softc->sc_md.pkru_enabled)
wrpkru(0, vcpu->vc_pkru);
@ -6498,6 +6508,16 @@ vcpu_run_svm(struct vcpu *vcpu, struct vm_run_params *vrp)
break;
}
/*
* If we're resuming to a different VCPU and have IBPB,
* then use it to prevent cross-VM branch-target injection.
*/
if (ci->ci_guest_vcpu != vcpu &&
(ci->ci_feature_amdspec_ebx & CPUIDEBX_IBPB)) {
wrmsr(MSR_PRED_CMD, PRED_CMD_IBPB);
ci->ci_guest_vcpu = vcpu;
}
/* Restore any guest PKRU state. */
if (vmm_softc->sc_md.pkru_enabled)
wrpkru(0, vcpu->vc_pkru);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: codepatch.h,v 1.18 2023/07/31 04:01:07 guenther Exp $ */
/* $OpenBSD: codepatch.h,v 1.19 2024/02/12 01:18:17 guenther Exp $ */
/*
* Copyright (c) 2014-2015 Stefan Fritsch <sf@sfritsch.de>
*
@ -69,6 +69,7 @@ void codepatch_disable(void);
#define CPTAG_RETPOLINE_RAX 14
#define CPTAG_RETPOLINE_R11 15
#define CPTAG_RETPOLINE_R13 16
#define CPTAG_IBPB_NOP 17
/*
* stac/clac SMAP instructions have lfence like semantics. Let's

View File

@ -1,4 +1,4 @@
/* $OpenBSD: cpu.h,v 1.161 2024/02/03 16:21:22 deraadt Exp $ */
/* $OpenBSD: cpu.h,v 1.162 2024/02/12 01:18:17 guenther Exp $ */
/* $NetBSD: cpu.h,v 1.1 2003/04/26 18:39:39 fvdl Exp $ */
/*-
@ -98,6 +98,7 @@ union vmm_cpu_cap {
* o owned (read/modified only) by this CPU
*/
struct x86_64_tss;
struct vcpu;
struct cpu_info {
/*
* The beginning of this structure in mapped in the userspace "u-k"
@ -130,7 +131,8 @@ struct cpu_info {
struct proc *ci_curproc; /* [o] */
struct schedstate_percpu ci_schedstate; /* scheduler state */
struct pmap *ci_proc_pmap; /* last userspace pmap */
struct pmap *ci_proc_pmap; /* active, non-kernel pmap */
struct pmap *ci_user_pmap; /* [o] last pmap used in userspace */
struct pcb *ci_curpcb; /* [o] */
struct pcb *ci_idle_pcb; /* [o] */
@ -219,6 +221,7 @@ struct cpu_info {
union vmm_cpu_cap ci_vmm_cap;
paddr_t ci_vmxon_region_pa;
struct vmxon_region *ci_vmxon_region;
struct vcpu *ci_guest_vcpu; /* [o] last vcpu resumed */
char ci_panicbuf[512];