Skip to content

Commit 4bc1a88

Browse files
committed
Merge branch kvm-arm64/mmio-sea into kvmarm/next
* kvm-arm64/mmio-sea: : Fix for SEA injection in response to MMIO : : Fix + test coverage for SEA injection in response to an unhandled MMIO : exit to userspace. Naturally, if userspace decides to abort an MMIO : instruction KVM shouldn't continue with instruction emulation... KVM: arm64: selftests: Add tests for MMIO external abort injection KVM: arm64: selftests: Convert to kernel's ESR terminology tools: arm64: Grab a copy of esr.h from kernel KVM: arm64: Don't retire aborted MMIO instruction Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
2 parents fbf3372 + 3eb09a3 commit 4bc1a88

File tree

11 files changed

+706
-32
lines changed

11 files changed

+706
-32
lines changed

arch/arm64/kvm/mmio.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,31 @@ unsigned long kvm_mmio_read_buf(const void *buf, unsigned int len)
7272
return data;
7373
}
7474

75+
static bool kvm_pending_sync_exception(struct kvm_vcpu *vcpu)
76+
{
77+
if (!vcpu_get_flag(vcpu, PENDING_EXCEPTION))
78+
return false;
79+
80+
if (vcpu_el1_is_32bit(vcpu)) {
81+
switch (vcpu_get_flag(vcpu, EXCEPT_MASK)) {
82+
case unpack_vcpu_flag(EXCEPT_AA32_UND):
83+
case unpack_vcpu_flag(EXCEPT_AA32_IABT):
84+
case unpack_vcpu_flag(EXCEPT_AA32_DABT):
85+
return true;
86+
default:
87+
return false;
88+
}
89+
} else {
90+
switch (vcpu_get_flag(vcpu, EXCEPT_MASK)) {
91+
case unpack_vcpu_flag(EXCEPT_AA64_EL1_SYNC):
92+
case unpack_vcpu_flag(EXCEPT_AA64_EL2_SYNC):
93+
return true;
94+
default:
95+
return false;
96+
}
97+
}
98+
}
99+
75100
/**
76101
* kvm_handle_mmio_return -- Handle MMIO loads after user space emulation
77102
* or in-kernel IO emulation
@@ -84,8 +109,11 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu)
84109
unsigned int len;
85110
int mask;
86111

87-
/* Detect an already handled MMIO return */
88-
if (unlikely(!vcpu->mmio_needed))
112+
/*
113+
* Detect if the MMIO return was already handled or if userspace aborted
114+
* the MMIO access.
115+
*/
116+
if (unlikely(!vcpu->mmio_needed || kvm_pending_sync_exception(vcpu)))
89117
return 1;
90118

91119
vcpu->mmio_needed = 0;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Copyright (C) 2012 ARM Ltd.
4+
*/
5+
6+
#ifndef __ASM_BRK_IMM_H
7+
#define __ASM_BRK_IMM_H
8+
9+
/*
10+
* #imm16 values used for BRK instruction generation
11+
* 0x004: for installing kprobes
12+
* 0x005: for installing uprobes
13+
* 0x006: for kprobe software single-step
14+
* 0x007: for kretprobe return
15+
* Allowed values for kgdb are 0x400 - 0x7ff
16+
* 0x100: for triggering a fault on purpose (reserved)
17+
* 0x400: for dynamic BRK instruction
18+
* 0x401: for compile time BRK instruction
19+
* 0x800: kernel-mode BUG() and WARN() traps
20+
* 0x9xx: tag-based KASAN trap (allowed values 0x900 - 0x9ff)
21+
* 0x55xx: Undefined Behavior Sanitizer traps ('U' << 8)
22+
* 0x8xxx: Control-Flow Integrity traps
23+
*/
24+
#define KPROBES_BRK_IMM 0x004
25+
#define UPROBES_BRK_IMM 0x005
26+
#define KPROBES_BRK_SS_IMM 0x006
27+
#define KRETPROBES_BRK_IMM 0x007
28+
#define FAULT_BRK_IMM 0x100
29+
#define KGDB_DYN_DBG_BRK_IMM 0x400
30+
#define KGDB_COMPILED_DBG_BRK_IMM 0x401
31+
#define BUG_BRK_IMM 0x800
32+
#define KASAN_BRK_IMM 0x900
33+
#define KASAN_BRK_MASK 0x0ff
34+
#define UBSAN_BRK_IMM 0x5500
35+
#define UBSAN_BRK_MASK 0x00ff
36+
37+
#define CFI_BRK_IMM_TARGET GENMASK(4, 0)
38+
#define CFI_BRK_IMM_TYPE GENMASK(9, 5)
39+
#define CFI_BRK_IMM_BASE 0x8000
40+
#define CFI_BRK_IMM_MASK (CFI_BRK_IMM_TARGET | CFI_BRK_IMM_TYPE)
41+
42+
#endif

0 commit comments

Comments
 (0)