[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v16 09/10] target-arm: kvm64: inject synchronous Ext
From: |
Dongjiu Geng |
Subject: |
[Qemu-devel] [PATCH v16 09/10] target-arm: kvm64: inject synchronous External Abort |
Date: |
Mon, 13 May 2019 05:43:07 -0700 |
Add synchronous external abort injection logic, setup
exception type and syndrome value. When switch to guest,
it will jump to the synchronous external abort vector
table entry.
The ESR_ELx.DFSC is set to synchronous external abort(0x10),
and ESR_ELx.FnV is set to not valid(0x1), which will tell
guest that FAR is not valid and hold an UNKNOWN value.
These value will be set to KVM register structures through
KVM_SET_ONE_REG IOCTL.
Signed-off-by: Dongjiu Geng <address@hidden>
---
target/arm/internals.h | 5 +++--
target/arm/kvm64.c | 34 ++++++++++++++++++++++++++++++++++
target/arm/op_helper.c | 2 +-
3 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/target/arm/internals.h b/target/arm/internals.h
index 587a1dd..4d67a91 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -451,13 +451,14 @@ static inline uint32_t syn_insn_abort(int same_el, int
ea, int s1ptw, int fsc)
| ARM_EL_IL | (ea << 9) | (s1ptw << 7) | fsc;
}
-static inline uint32_t syn_data_abort_no_iss(int same_el,
+static inline uint32_t syn_data_abort_no_iss(int same_el, int fnv,
int ea, int cm, int s1ptw,
int wnr, int fsc)
{
return (EC_DATAABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
| ARM_EL_IL
- | (ea << 9) | (cm << 8) | (s1ptw << 7) | (wnr << 6) | fsc;
+ | (fnv << 10) | (ea << 9) | (cm << 8) | (s1ptw << 7)
+ | (wnr << 6) | fsc;
}
static inline uint32_t syn_data_abort_with_iss(int same_el,
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
index e3ba149..c7bdc6a 100644
--- a/target/arm/kvm64.c
+++ b/target/arm/kvm64.c
@@ -697,6 +697,40 @@ int kvm_arm_cpreg_level(uint64_t regidx)
return KVM_PUT_RUNTIME_STATE;
}
+/* Inject synchronous external abort */
+static void kvm_inject_arm_sea(CPUState *c)
+{
+ ARMCPU *cpu = ARM_CPU(c);
+ CPUARMState *env = &cpu->env;
+ CPUClass *cc = CPU_GET_CLASS(c);
+ uint32_t esr;
+ bool same_el;
+
+ /**
+ * set the exception type to synchronous data abort
+ * and the target exception Level to EL1.
+ */
+ c->exception_index = EXCP_DATA_ABORT;
+ env->exception.target_el = 1;
+
+ /*
+ * Set the DFSC to synchronous external abort and set FnV to not valid,
+ * this will tell guest the FAR_ELx is UNKNOWN for this abort.
+ */
+
+ /* This exception comes from lower or current exception level. */
+ same_el = arm_current_el(env) == env->exception.target_el;
+ esr = syn_data_abort_no_iss(same_el, 1, 0, 0, 0, 0, 0x10);
+
+ env->exception.syndrome = esr;
+
+ /**
+ * The vcpu thread already hold BQL, so no need hold again when
+ * calling do_interrupt
+ */
+ cc->do_interrupt(c);
+}
+
#define AARCH64_CORE_REG(x) (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | \
KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(x))
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
index 8698b4d..d43134a 100644
--- a/target/arm/op_helper.c
+++ b/target/arm/op_helper.c
@@ -109,7 +109,7 @@ static inline uint32_t merge_syn_data_abort(uint32_t
template_syn,
* ISV field.
*/
if (!(template_syn & ARM_EL_ISV) || target_el != 2 || s1ptw) {
- syn = syn_data_abort_no_iss(same_el,
+ syn = syn_data_abort_no_iss(same_el, 0,
ea, 0, s1ptw, is_write, fsc);
} else {
/* Fields: IL, ISV, SAS, SSE, SRT, SF and AR come from the template
--
1.8.3.1
- [Qemu-devel] [PATCH v16 00/10] Add ARMv8 RAS virtualization support in QEMU, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 10/10] target-arm: kvm64: handle SIGBUS signal from kernel or KVM, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 09/10] target-arm: kvm64: inject synchronous External Abort,
Dongjiu Geng <=
- [Qemu-devel] [PATCH v16 07/10] ACPI: Add APEI GHES table generation support, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 02/10] ACPI: add some GHES structures and macros definition, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 01/10] hw/arm/virt: Add RAS platform version for migration, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 08/10] KVM: Move related hwpoison page functions to accel/kvm/ folder, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 05/10] acpi: add build_append_ghes_generic_status() helper for Generic Error Status Block, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 04/10] acpi: add build_append_ghes_generic_data() helper for Generic Error Data Entry, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 06/10] docs: APEI GHES generation and CPER record description, Dongjiu Geng, 2019/05/13
- [Qemu-devel] [PATCH v16 03/10] acpi: add build_append_ghes_notify() helper for Hardware Error Notification, Dongjiu Geng, 2019/05/13