[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[qemu-s390x] [PULL 17/26] s390x/tcg: fix disabling/enabling DAT
From: |
Cornelia Huck |
Subject: |
[qemu-s390x] [PULL 17/26] s390x/tcg: fix disabling/enabling DAT |
Date: |
Tue, 27 Feb 2018 14:21:41 +0100 |
From: David Hildenbrand <address@hidden>
Currently, all memory accesses go via the MMU of the address space
(primary, secondary, ...). This is bad, because we don't flush the TLB
when disabling/enabling DAT. So we could add a tlb flush. However it
is easier to simply select the MMU we already have in place for real
memory access.
All we have to do is point at the right MMU and allow to execute these
pages.
Signed-off-by: David Hildenbrand <address@hidden>
Message-Id: <address@hidden>
Reviewed-by: Richard Henderson <address@hidden>
[CH: get rid of tabs]
Signed-off-by: Cornelia Huck <address@hidden>
---
target/s390x/cpu.h | 7 ++++++-
target/s390x/mmu_helper.c | 2 +-
target/s390x/translate.c | 10 +++++++---
3 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 09ec8a9b76..d4641663ef 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -312,11 +312,12 @@ extern const struct VMStateDescription vmstate_s390_cpu;
#define FLAG_MASK_PSW_SHIFT 31
#define FLAG_MASK_PER (PSW_MASK_PER >> FLAG_MASK_PSW_SHIFT)
+#define FLAG_MASK_DAT (PSW_MASK_DAT >> FLAG_MASK_PSW_SHIFT)
#define FLAG_MASK_PSTATE (PSW_MASK_PSTATE >> FLAG_MASK_PSW_SHIFT)
#define FLAG_MASK_ASC (PSW_MASK_ASC >> FLAG_MASK_PSW_SHIFT)
#define FLAG_MASK_64 (PSW_MASK_64 >> FLAG_MASK_PSW_SHIFT)
#define FLAG_MASK_32 (PSW_MASK_32 >> FLAG_MASK_PSW_SHIFT)
-#define FLAG_MASK_PSW (FLAG_MASK_PER | FLAG_MASK_PSTATE \
+#define FLAG_MASK_PSW (FLAG_MASK_PER | FLAG_MASK_DAT |
FLAG_MASK_PSTATE \
| FLAG_MASK_ASC | FLAG_MASK_64 | FLAG_MASK_32)
/* Control register 0 bits */
@@ -340,6 +341,10 @@ extern const struct VMStateDescription vmstate_s390_cpu;
static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
{
+ if (!(env->psw.mask & PSW_MASK_DAT)) {
+ return MMU_REAL_IDX;
+ }
+
switch (env->psw.mask & PSW_MASK_ASC) {
case PSW_ASC_PRIMARY:
return MMU_PRIMARY_IDX;
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
index f477cc006a..23fb2e7501 100644
--- a/target/s390x/mmu_helper.c
+++ b/target/s390x/mmu_helper.c
@@ -544,7 +544,7 @@ int mmu_translate_real(CPUS390XState *env, target_ulong
raddr, int rw,
{
const bool lowprot_enabled = env->cregs[0] & CR0_LOWPROT;
- *flags = PAGE_READ | PAGE_WRITE;
+ *flags = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
if (is_low_address(raddr & TARGET_PAGE_MASK) && lowprot_enabled) {
/* see comment in mmu_translate() how this works */
*flags |= PAGE_WRITE_INV;
diff --git a/target/s390x/translate.c b/target/s390x/translate.c
index b470d691d3..5aea3bbca6 100644
--- a/target/s390x/translate.c
+++ b/target/s390x/translate.c
@@ -252,13 +252,17 @@ static inline uint64_t ld_code4(CPUS390XState *env,
uint64_t pc)
static int get_mem_index(DisasContext *s)
{
+ if (!(s->tb->flags & FLAG_MASK_DAT)) {
+ return MMU_REAL_IDX;
+ }
+
switch (s->tb->flags & FLAG_MASK_ASC) {
case PSW_ASC_PRIMARY >> FLAG_MASK_PSW_SHIFT:
- return 0;
+ return MMU_PRIMARY_IDX;
case PSW_ASC_SECONDARY >> FLAG_MASK_PSW_SHIFT:
- return 1;
+ return MMU_SECONDARY_IDX;
case PSW_ASC_HOME >> FLAG_MASK_PSW_SHIFT:
- return 2;
+ return MMU_HOME_IDX;
default:
tcg_abort();
break;
--
2.13.6
- [qemu-s390x] [PULL 08/26] s390-ccw: read stage2 boot loader data to find menu, (continued)
- [qemu-s390x] [PULL 08/26] s390-ccw: read stage2 boot loader data to find menu, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 09/26] s390-ccw: print zipl boot menu, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 07/26] s390-ccw: set up interactive boot menu parameters, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 11/26] s390-ccw: set cp_receive mask only when needed and consume pending service irqs, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 10/26] s390-ccw: read user input for boot index via the SCLP console, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 12/26] s390-ccw: use zipl values when no boot menu options are present, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 13/26] s390-ccw: interactive boot menu for scsi, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 16/26] s390/stattrib: Make SaveVMHandlers data static, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 18/26] s390x/tcg: add various alignment checks, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 15/26] s390x/cpu: expose the guest crash information, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 17/26] s390x/tcg: fix disabling/enabling DAT,
Cornelia Huck <=
- [qemu-s390x] [PULL 21/26] qmp: add architecture specific cpu data for query-cpus-fast, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 20/26] qmp: add query-cpus-fast, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 19/26] qmp: expose s390-specific CPU info, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 22/26] qemu-doc: deprecate query-cpus, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 23/26] hmp: change hmp_info_cpus to use query-cpus-fast, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 24/26] s390x/cpumodel: document S390FeatDef.bit not applicable, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 26/26] s390x: remove s390_get_memslot_count, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 25/26] s390x/sclp: remove memory hotplug support, Cornelia Huck, 2018/02/27
- [qemu-s390x] [PULL 14/26] pc-bios/s390: Rebuild the s390x firmware images with the boot menu changes, Cornelia Huck, 2018/02/27