mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 12:55:29 +00:00
target-arm: Split data abort syndrome generator
Split the data abort syndrome generator into two versions: One with a valid Instruction Specific Syndrome (ISS) and another without. The following new flags are supported by the syndrome generator with ISS: * isv - Instruction syndrome valid * sas - Syndrome access size * sse - Syndrome sign extend * srt - Syndrome register transfer * sf - Sixty-Four bit register width * ar - Acquire/Release These flags are not yet used, so this patch has no functional change except that we will now correctly set the IL bit in data abort syndromes without ISS information. Backports commit 094d028a7968236cd2b7f7b96394f7a3b8ad97c8 from qemu
This commit is contained in:
parent
bfc74c4da2
commit
56e9d7c09e
|
@ -266,7 +266,9 @@ enum arm_exception_class {
|
|||
|
||||
#define ARM_EL_EC_SHIFT 26
|
||||
#define ARM_EL_IL_SHIFT 25
|
||||
#define ARM_EL_ISV_SHIFT 24
|
||||
#define ARM_EL_IL (1 << ARM_EL_IL_SHIFT)
|
||||
#define ARM_EL_ISV (1 << ARM_EL_ISV_SHIFT)
|
||||
|
||||
/* Utility functions for constructing various kinds of syndrome value.
|
||||
* Note that in general we follow the AArch64 syndrome values; in a
|
||||
|
@ -386,11 +388,27 @@ static inline uint32_t syn_insn_abort(int same_el, int ea, int s1ptw, int fsc)
|
|||
| (ea << 9) | (s1ptw << 7) | fsc;
|
||||
}
|
||||
|
||||
static inline uint32_t syn_data_abort(int same_el, int ea, int cm, int s1ptw,
|
||||
int wnr, int fsc)
|
||||
static inline uint32_t syn_data_abort_no_iss(int same_el,
|
||||
int ea, int cm, int s1ptw,
|
||||
int wnr, int fsc)
|
||||
{
|
||||
return (EC_DATAABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
|
||||
| (ea << 9) | (cm << 8) | (s1ptw << 7) | (wnr << 6) | fsc;
|
||||
| ARM_EL_IL
|
||||
| (ea << 9) | (cm << 8) | (s1ptw << 7) | (wnr << 6) | fsc;
|
||||
}
|
||||
|
||||
static inline uint32_t syn_data_abort_with_iss(int same_el,
|
||||
int sas, int sse, int srt,
|
||||
int sf, int ar,
|
||||
int ea, int cm, int s1ptw,
|
||||
int wnr, int fsc,
|
||||
bool is_16bit)
|
||||
{
|
||||
return (EC_DATAABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
|
||||
| (is_16bit ? 0 : ARM_EL_IL)
|
||||
| ARM_EL_ISV | (sas << 22) | (sse << 21) | (srt << 16)
|
||||
| (sf << 15) | (ar << 14)
|
||||
| (ea << 9) | (cm << 8) | (s1ptw << 7) | (wnr << 6) | fsc;
|
||||
}
|
||||
|
||||
static inline uint32_t syn_swstep(int same_el, int isv, int ex)
|
||||
|
|
|
@ -115,7 +115,8 @@ void tlb_fill(CPUState *cs, target_ulong addr, int is_write, int mmu_idx,
|
|||
syn = syn_insn_abort(same_el, 0, fi.s1ptw, syn);
|
||||
exc = EXCP_PREFETCH_ABORT;
|
||||
} else {
|
||||
syn = syn_data_abort(same_el, 0, 0, fi.s1ptw, is_write == 1, syn);
|
||||
syn = syn_data_abort_no_iss(same_el,
|
||||
0, 0, fi.s1ptw, is_write == 1, syn);
|
||||
if (is_write == 1 && arm_feature(env, ARM_FEATURE_V6)) {
|
||||
fsr |= (1 << 11);
|
||||
}
|
||||
|
@ -161,7 +162,8 @@ void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr, int is_write,
|
|||
}
|
||||
|
||||
raise_exception(env, EXCP_DATA_ABORT,
|
||||
syn_data_abort(same_el, 0, 0, 0, is_write == 1, 0x21),
|
||||
syn_data_abort_no_iss(same_el,
|
||||
0, 0, 0, is_write == 1, 0x21),
|
||||
target_el);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue