mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-22 14:35:31 +00:00
target/m68k: add M68K_FEATURE_UNALIGNED_DATA feature
According to the M68040UM Appendix D the requirement for data accesses to be word aligned is only for the 68000, 68008 and 68010 CPUs. Later CPUs from the 68020 onwards will allow unaligned data accesses but at the cost of being less efficient. Add a new M68K_FEATURE_UNALIGNED_DATA feature to specify that data accesses are not required to be word aligned, and don't perform the alignment on the stack pointer when taking an exception if this feature is not selected. This is required because the MacOS DAFB driver attempts to call an A-trap with a byte-aligned stack pointer during initialisation and without this the stack pointer is off by one when the A-trap returns. Backports a9431a03f70c8c711a870d4c1a0439bdbb4703cf
This commit is contained in:
parent
7d5dfd6b53
commit
9777741703
|
@ -178,6 +178,7 @@ static void m68020_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque)
|
|||
m68k_set_feature(env, M68K_FEATURE_CAS);
|
||||
m68k_set_feature(env, M68K_FEATURE_CHK2);
|
||||
m68k_set_feature(env, M68K_FEATURE_MSP);
|
||||
m68k_set_feature(env, M68K_FEATURE_UNALIGNED_DATA);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -522,6 +522,8 @@ enum m68k_features {
|
|||
M68K_FEATURE_MOVEP,
|
||||
/* MOVEC insn. (from 68010) */
|
||||
M68K_FEATURE_MOVEC,
|
||||
/* Unaligned data accesses (680[2346]0) */
|
||||
M68K_FEATURE_UNALIGNED_DATA,
|
||||
};
|
||||
|
||||
static inline int m68k_feature(CPUM68KState *env, int feature)
|
||||
|
|
|
@ -355,7 +355,10 @@ static void m68k_interrupt_all(CPUM68KState *env, int is_hw)
|
|||
cpu_m68k_set_sr(env, sr);
|
||||
sp = env->aregs[7];
|
||||
|
||||
sp &= ~1;
|
||||
if (!m68k_feature(env, M68K_FEATURE_UNALIGNED_DATA)) {
|
||||
sp &= ~1;
|
||||
}
|
||||
|
||||
if (cs->exception_index == EXCP_ACCESS) {
|
||||
if (env->mmu.fault) {
|
||||
cpu_abort(cs, "DOUBLE MMU FAULT\n");
|
||||
|
|
Loading…
Reference in a new issue