mirror of https://github.com/xemu-project/xemu.git
target/s390x: Fix s390_probe_access for user-only
In db9aab5783
we broke the contract of s390_probe_access, in that it
no longer returned an exception code, nor set __excp_addr. Fix both.
Reported-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: David Hildenbrand <david@redhat.com>
Message-Id: <20230109201856.3916639-2-richard.henderson@linaro.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
4376a770c7
commit
4049431478
|
@ -138,23 +138,27 @@ typedef struct S390Access {
|
||||||
* For !CONFIG_USER_ONLY, the TEC is stored stored to env->tlb_fill_tec.
|
* For !CONFIG_USER_ONLY, the TEC is stored stored to env->tlb_fill_tec.
|
||||||
* For CONFIG_USER_ONLY, the faulting address is stored to env->__excp_addr.
|
* For CONFIG_USER_ONLY, the faulting address is stored to env->__excp_addr.
|
||||||
*/
|
*/
|
||||||
static int s390_probe_access(CPUArchState *env, target_ulong addr, int size,
|
static inline int s390_probe_access(CPUArchState *env, target_ulong addr,
|
||||||
MMUAccessType access_type, int mmu_idx,
|
int size, MMUAccessType access_type,
|
||||||
bool nonfault, void **phost, uintptr_t ra)
|
int mmu_idx, bool nonfault,
|
||||||
|
void **phost, uintptr_t ra)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_USER_ONLY)
|
int flags = probe_access_flags(env, addr, access_type, mmu_idx,
|
||||||
return probe_access_flags(env, addr, access_type, mmu_idx,
|
|
||||||
nonfault, phost, ra);
|
nonfault, phost, ra);
|
||||||
#else
|
|
||||||
int flags;
|
|
||||||
|
|
||||||
env->tlb_fill_exc = 0;
|
if (unlikely(flags & TLB_INVALID_MASK)) {
|
||||||
flags = probe_access_flags(env, addr, access_type, mmu_idx, nonfault, phost,
|
assert(!nonfault);
|
||||||
ra);
|
#ifdef CONFIG_USER_ONLY
|
||||||
if (env->tlb_fill_exc) {
|
/* Address is in TEC in system mode; see s390_cpu_record_sigsegv. */
|
||||||
|
env->__excp_addr = addr & TARGET_PAGE_MASK;
|
||||||
|
return (page_get_flags(addr) & PAGE_VALID
|
||||||
|
? PGM_PROTECTION : PGM_ADDRESSING);
|
||||||
|
#else
|
||||||
return env->tlb_fill_exc;
|
return env->tlb_fill_exc;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
if (unlikely(flags & TLB_WATCHPOINT)) {
|
if (unlikely(flags & TLB_WATCHPOINT)) {
|
||||||
/* S390 does not presently use transaction attributes. */
|
/* S390 does not presently use transaction attributes. */
|
||||||
cpu_check_watchpoint(env_cpu(env), addr, size,
|
cpu_check_watchpoint(env_cpu(env), addr, size,
|
||||||
|
@ -162,8 +166,9 @@ static int s390_probe_access(CPUArchState *env, target_ulong addr, int size,
|
||||||
(access_type == MMU_DATA_STORE
|
(access_type == MMU_DATA_STORE
|
||||||
? BP_MEM_WRITE : BP_MEM_READ), ra);
|
? BP_MEM_WRITE : BP_MEM_READ), ra);
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int access_prepare_nf(S390Access *access, CPUS390XState *env,
|
static int access_prepare_nf(S390Access *access, CPUS390XState *env,
|
||||||
|
|
Loading…
Reference in New Issue