Thu, 08 Dec 2011 23:44:19 +0000
[musashi] fix stackframe type for bus errors
Bus errors incorrectly pushed a Type 0000 stackframe, when they should have pushed a Type 1000 (Type $8) stackframe.
Also, type 1000 frames were not handled for 68010 CPUs. They are now, but code must later be added to handle them for 68020s. FIXME!
Reported-By: Armin Diehl <ad ardiehl.de>
src/musashi/m68k_in.c | file | annotate | diff | revisions | |
src/musashi/m68kcpu.h | file | annotate | diff | revisions |
1.1 --- a/src/musashi/m68k_in.c Tue Nov 15 10:12:37 2011 +0000 1.2 +++ b/src/musashi/m68k_in.c Thu Dec 08 23:44:19 2011 +0000 1.3 @@ -8636,8 +8636,32 @@ 1.4 m68ki_jump(new_pc); 1.5 m68ki_set_sr(new_sr); 1.6 return; 1.7 + } else if (format_word == 8) { 1.8 + /* Format 8 stack frame -- 68010 only. 29 word bus/address error */ 1.9 + new_sr = m68ki_pull_16(); 1.10 + new_pc = m68ki_pull_32(); 1.11 + m68ki_fake_pull_16(); /* format word */ 1.12 + m68ki_fake_pull_16(); /* special status word */ 1.13 + m68ki_fake_pull_32(); /* fault address */ 1.14 + m68ki_fake_pull_16(); /* unused/reserved */ 1.15 + m68ki_fake_pull_16(); /* data output buffer */ 1.16 + m68ki_fake_pull_16(); /* unused/reserved */ 1.17 + m68ki_fake_pull_16(); /* data input buffer */ 1.18 + m68ki_fake_pull_16(); /* unused/reserved */ 1.19 + m68ki_fake_pull_16(); /* instruction input buffer */ 1.20 + m68ki_fake_pull_32(); /* internal information, 16 words */ 1.21 + m68ki_fake_pull_32(); /* (actually, we use 8 DWORDs) */ 1.22 + m68ki_fake_pull_32(); 1.23 + m68ki_fake_pull_32(); 1.24 + m68ki_fake_pull_32(); 1.25 + m68ki_fake_pull_32(); 1.26 + m68ki_fake_pull_32(); 1.27 + m68ki_fake_pull_32(); 1.28 + m68ki_jump(new_pc); 1.29 + m68ki_set_sr(new_sr); 1.30 + return; 1.31 } 1.32 - /* Not handling bus fault (9) */ 1.33 + /* FIXME: Not handling other exception types (9) */ 1.34 m68ki_exception_format_error(); 1.35 return; 1.36 } 1.37 @@ -8669,7 +8693,7 @@ 1.38 m68ki_set_sr(new_sr); 1.39 return; 1.40 } 1.41 - /* Not handling long or short bus fault */ 1.42 + /* FIXME: Not handling long or short bus fault */ 1.43 m68ki_exception_format_error(); 1.44 return; 1.45 }
2.1 --- a/src/musashi/m68kcpu.h Tue Nov 15 10:12:37 2011 +0000 2.2 +++ b/src/musashi/m68kcpu.h Thu Dec 08 23:44:19 2011 +0000 2.3 @@ -1700,7 +1700,7 @@ 2.4 INLINE void m68ki_jump_bus_error_vector(void) 2.5 { 2.6 uint sr = m68ki_init_exception(); 2.7 - m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_BUS_ERROR); 2.8 + m68ki_stack_frame_1000(REG_PPC, sr, EXCEPTION_BUS_ERROR); 2.9 m68ki_jump_vector(EXCEPTION_BUS_ERROR); 2.10 } 2.11