diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 7233b8b141621cb8ca4ed0b0973b71b329197833..50e162a27b52ea034ea87a82821dd5e2fe1791e6 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -35,6 +35,7 @@ #define TT_NFPU_INSN 0x04 #define TT_WIN_OVF 0x05 #define TT_WIN_UNF 0x06 +#define TT_UNALIGNED 0x07 #define TT_FP_EXCP 0x08 #define TT_DFAULT 0x09 #define TT_TOVF 0x0a @@ -55,6 +56,7 @@ #define TT_DFAULT 0x30 #define TT_DMISS 0x31 #define TT_DPROT 0x32 +#define TT_UNALIGNED 0x34 #define TT_PRIV_ACT 0x37 #define TT_EXTINT 0x40 #define TT_SPILL 0x80 diff --git a/target-sparc/op.c b/target-sparc/op.c index c9f068457ecbc1bd80a6637b1db4254cb139a38e..96c8b2db72e617b954e6759c4dc7106a2d0ce7df 100644 --- a/target-sparc/op.c +++ b/target-sparc/op.c @@ -1486,7 +1486,10 @@ void OPPROTO op_movl_npc_im(void) void OPPROTO op_movl_npc_T0(void) { - env->npc = T0; + if (T0 & 0x3) + raise_exception(TT_UNALIGNED); + else + env->npc = T0; } void OPPROTO op_mov_pc_npc(void) diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c index 21612bd2384e422422d8d5e87e3e86a5c8e4fa49..2edc8d741507fb815af7c3c6b03b68019f85e188 100644 --- a/target-sparc/op_helper.c +++ b/target-sparc/op_helper.c @@ -923,7 +923,11 @@ void do_interrupt(int intno) #if !defined(CONFIG_USER_ONLY) +static void do_unaligned_access(target_ulong addr, int is_write, int is_user, + void *retaddr); + #define MMUSUFFIX _mmu +#define ALIGNED_ONLY #define GETPC() (__builtin_return_address(0)) #define SHIFT 0 @@ -938,6 +942,14 @@ void do_interrupt(int intno) #define SHIFT 3 #include "softmmu_template.h" +static void do_unaligned_access(target_ulong addr, int is_write, int is_user, + void *retaddr) +{ + /* Uncomment the following line to enable mem_address_not_aligned traps */ + /* Not enabled yet because of bugs in OpenBIOS */ + //raise_exception(TT_UNALIGNED); + //printf("Unaligned access to 0x%x from 0x%x\n", addr, env->pc); +} /* try to fill the TLB and return an exception if error. If retaddr is NULL, it means that the function was called in C code (i.e. not diff --git a/target-sparc/translate.c b/target-sparc/translate.c index e51a2e459c8ba8d3c3c173fb980f49d87c1d3399..19b10a200f5a2afa3927ff5f014e5fa35c1d76e3 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -25,7 +25,6 @@ Rest of V9 instructions, VIS instructions NPC/PC static optimisations (use JUMP_TB when possible) Optimize synthetic instructions - Optional alignment check 128-bit float */