[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 3/6] target/s390x: Diagnose specification excepti
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v2 3/6] target/s390x: Diagnose specification exception for atomics |
Date: |
Mon, 8 May 2017 08:17:04 -0700 |
All of the interlocked access facility instructions raise a
specification exception for unaligned accesses. Do this by
using the (previously unused) unaligned_access hook.
Signed-off-by: Richard Henderson <address@hidden>
---
target/s390x/cpu.c | 1 +
target/s390x/cpu.h | 3 +++
target/s390x/helper.c | 16 ++++++++++++++++
3 files changed, 20 insertions(+)
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 066dcd1..a1bf2ba 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -430,6 +430,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
cc->write_elf64_note = s390_cpu_write_elf64_note;
cc->cpu_exec_interrupt = s390_cpu_exec_interrupt;
cc->debug_excp_handler = s390x_cpu_debug_excp_handler;
+ cc->do_unaligned_access = s390x_cpu_do_unaligned_access;
#endif
cc->disas_set_info = s390_cpu_disas_set_info;
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 058ddad..bbed320 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -480,6 +480,9 @@ int s390_cpu_handle_mmu_fault(CPUState *cpu, vaddr address,
int rw,
#ifndef CONFIG_USER_ONLY
void do_restart_interrupt(CPUS390XState *env);
+void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
+ MMUAccessType access_type,
+ int mmu_idx, uintptr_t retaddr);
static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
uint8_t *ar)
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index 68bd2f9..9978490 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -718,4 +718,20 @@ void s390x_cpu_debug_excp_handler(CPUState *cs)
cpu_loop_exit_noexc(cs);
}
}
+
+/* Unaligned accesses are only diagnosed with MO_ALIGN. At the moment,
+ this is only for the atomic operations, for which we want to raise a
+ specification exception. */
+void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
+ MMUAccessType access_type,
+ int mmu_idx, uintptr_t retaddr)
+{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
+ if (retaddr) {
+ cpu_restore_state(cs, retaddr);
+ }
+ program_interrupt(env, PGM_SPECIFICATION, ILEN_LATER);
+}
#endif /* CONFIG_USER_ONLY */
--
2.9.3
[Qemu-devel] [PATCH v2 2/6] target/s390x: Implement LOAD PROGRAM PARAMETER, Richard Henderson, 2017/05/08
[Qemu-devel] [PATCH v2 3/6] target/s390x: Diagnose specification exception for atomics,
Richard Henderson <=
[Qemu-devel] [PATCH v2 4/6] target/s390x: Implement LOAD PAIR DISJOINT, Richard Henderson, 2017/05/08
[Qemu-devel] [PATCH v2 5/6] target/s390x: Use atomic operations for COMPARE SWAP, Richard Henderson, 2017/05/08
[Qemu-devel] [PATCH v2 6/6] target/s390x: Use atomic operations for LOAD AND OP, Richard Henderson, 2017/05/08
Re: [Qemu-devel] [PATCH v2 0/6] target/s390x patches, no-reply, 2017/05/08