diff options
author | Thomas Huth <thuth@linux.vnet.ibm.com> | 2015-02-12 18:09:30 +0100 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2015-02-18 09:37:15 +0100 |
commit | 801cdd355f8bc578f1d02462a91313959e55bee7 (patch) | |
tree | 8002276a62643a1b26bccf8df9c1ca2bb02f5429 /target-s390x/mmu_helper.c | |
parent | 9d77309c9fedca33525cae820b9eff6f35c795f4 (diff) | |
download | qemu-801cdd355f8bc578f1d02462a91313959e55bee7.zip qemu-801cdd355f8bc578f1d02462a91313959e55bee7.tar.gz qemu-801cdd355f8bc578f1d02462a91313959e55bee7.tar.bz2 |
s390x/kvm: Add function for injecting pgm access exceptions
Program access exceptions are defined to deliver a translation exception
code in the low-core. Add a function trigger_access_exception() that
generates the proper program interrupt on both KVM and non-KVM systems
and switch the existing code to use it.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'target-s390x/mmu_helper.c')
-rw-r--r-- | target-s390x/mmu_helper.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/target-s390x/mmu_helper.c b/target-s390x/mmu_helper.c index 32a51f3..a1ee992 100644 --- a/target-s390x/mmu_helper.c +++ b/target-s390x/mmu_helper.c @@ -46,10 +46,23 @@ #define FS_READ 0x800 #define FS_WRITE 0x400 +static void trigger_access_exception(CPUS390XState *env, uint32_t type, + uint32_t ilen, uint64_t tec) +{ + S390CPU *cpu = s390_env_get_cpu(env); + + if (kvm_enabled()) { + kvm_s390_access_exception(cpu, type, tec); + } else { + CPUState *cs = CPU(cpu); + stq_phys(cs->as, env->psa + offsetof(LowCore, trans_exc_code), tec); + trigger_pgm_exception(env, type, ilen); + } +} + static void trigger_prot_fault(CPUS390XState *env, target_ulong vaddr, uint64_t asc, int rw, bool exc) { - CPUState *cs = CPU(s390_env_get_cpu(env)); uint64_t tec; tec = vaddr | (rw == 1 ? FS_WRITE : FS_READ) | 4 | asc >> 46; @@ -60,14 +73,12 @@ static void trigger_prot_fault(CPUS390XState *env, target_ulong vaddr, return; } - stq_phys(cs->as, env->psa + offsetof(LowCore, trans_exc_code), tec); - trigger_pgm_exception(env, PGM_PROTECTION, ILEN_LATER_INC); + trigger_access_exception(env, PGM_PROTECTION, ILEN_LATER_INC, tec); } static void trigger_page_fault(CPUS390XState *env, target_ulong vaddr, uint32_t type, uint64_t asc, int rw, bool exc) { - CPUState *cs = CPU(s390_env_get_cpu(env)); int ilen = ILEN_LATER; uint64_t tec; @@ -84,8 +95,7 @@ static void trigger_page_fault(CPUS390XState *env, target_ulong vaddr, ilen = 2; } - stq_phys(cs->as, env->psa + offsetof(LowCore, trans_exc_code), tec); - trigger_pgm_exception(env, type, ilen); + trigger_access_exception(env, type, ilen, tec); } /** |