Skip to content

Commit

Permalink
target/m68k: Fix exception frame format for 68010
Browse files Browse the repository at this point in the history
From the 68010 a word with the frame format and exception vector
are placed on the stack before the PC and SR.

M68K_FEATURE_QUAD_MULDIV is currently checked to workout if to do
this or not for the configured CPU but that flag isn't set for
68010 so currently the exception stack when 68010 is configured
is incorrect.

It seems like checking M68K_FEATURE_MOVEFROMSR_PRIV would do but
adding a new flag that shows exactly what is going on here is
maybe clearer.

Add a new flag for the behaviour, M68K_FEATURE_EXCEPTION_FORMAT_VEC,
and set it for 68010 and above, and then use it to control if the
format and vector word are pushed/pop during exception entry/exit.

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2164
Signed-off-by: Daniel Palmer <daniel@0x0f.com>
Message-ID: <20240115101643.2165387-1-daniel@0x0f.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
  • Loading branch information
fifteenhex authored and huth committed Feb 23, 2024
1 parent 3d54cbf commit f3c6376
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 3 deletions.
4 changes: 3 additions & 1 deletion target/m68k/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ static void m68000_cpu_initfn(Object *obj)
}

/*
* Adds BKPT, MOVE-from-SR *now priv instr, and MOVEC, MOVES, RTD
* Adds BKPT, MOVE-from-SR *now priv instr, and MOVEC, MOVES, RTD,
* format+vector in exception frame.
*/
static void m68010_cpu_initfn(Object *obj)
{
Expand All @@ -155,6 +156,7 @@ static void m68010_cpu_initfn(Object *obj)
m68k_set_feature(env, M68K_FEATURE_BKPT);
m68k_set_feature(env, M68K_FEATURE_MOVEC);
m68k_set_feature(env, M68K_FEATURE_MOVEFROMSR_PRIV);
m68k_set_feature(env, M68K_FEATURE_EXCEPTION_FORMAT_VEC);
}

/*
Expand Down
2 changes: 2 additions & 0 deletions target/m68k/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,8 @@ enum m68k_features {
M68K_FEATURE_TRAPCC,
/* MOVE from SR privileged (from 68010) */
M68K_FEATURE_MOVEFROMSR_PRIV,
/* Exception frame with format+vector (from 68010) */
M68K_FEATURE_EXCEPTION_FORMAT_VEC,
};

static inline bool m68k_feature(CPUM68KState *env, int feature)
Expand Down
4 changes: 2 additions & 2 deletions target/m68k/op_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static void m68k_rte(CPUM68KState *env)
sp += 2;
env->pc = cpu_ldl_mmuidx_ra(env, sp, MMU_KERNEL_IDX, 0);
sp += 4;
if (m68k_feature(env, M68K_FEATURE_QUAD_MULDIV)) {
if (m68k_feature(env, M68K_FEATURE_EXCEPTION_FORMAT_VEC)) {
/* all except 68000 */
fmt = cpu_lduw_mmuidx_ra(env, sp, MMU_KERNEL_IDX, 0);
sp += 2;
Expand Down Expand Up @@ -256,7 +256,7 @@ static inline void do_stack_frame(CPUM68KState *env, uint32_t *sp,
uint16_t format, uint16_t sr,
uint32_t addr, uint32_t retaddr)
{
if (m68k_feature(env, M68K_FEATURE_QUAD_MULDIV)) {
if (m68k_feature(env, M68K_FEATURE_EXCEPTION_FORMAT_VEC)) {
/* all except 68000 */
CPUState *cs = env_cpu(env);
switch (format) {
Expand Down

0 comments on commit f3c6376

Please sign in to comment.