Commit d2889a3efc3851e62de69cb9d88fb784c28e0ed8
1 parent
24be5ae3
Alignment check mechanism (not fully enabled yet) (Aurelien Jarno)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2655 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
18 additions
and
2 deletions
target-sparc/cpu.h
| ... | ... | @@ -35,6 +35,7 @@ |
| 35 | 35 | #define TT_NFPU_INSN 0x04 |
| 36 | 36 | #define TT_WIN_OVF 0x05 |
| 37 | 37 | #define TT_WIN_UNF 0x06 |
| 38 | +#define TT_UNALIGNED 0x07 | |
| 38 | 39 | #define TT_FP_EXCP 0x08 |
| 39 | 40 | #define TT_DFAULT 0x09 |
| 40 | 41 | #define TT_TOVF 0x0a |
| ... | ... | @@ -55,6 +56,7 @@ |
| 55 | 56 | #define TT_DFAULT 0x30 |
| 56 | 57 | #define TT_DMISS 0x31 |
| 57 | 58 | #define TT_DPROT 0x32 |
| 59 | +#define TT_UNALIGNED 0x34 | |
| 58 | 60 | #define TT_PRIV_ACT 0x37 |
| 59 | 61 | #define TT_EXTINT 0x40 |
| 60 | 62 | #define TT_SPILL 0x80 | ... | ... |
target-sparc/op.c
| ... | ... | @@ -1486,7 +1486,10 @@ void OPPROTO op_movl_npc_im(void) |
| 1486 | 1486 | |
| 1487 | 1487 | void OPPROTO op_movl_npc_T0(void) |
| 1488 | 1488 | { |
| 1489 | - env->npc = T0; | |
| 1489 | + if (T0 & 0x3) | |
| 1490 | + raise_exception(TT_UNALIGNED); | |
| 1491 | + else | |
| 1492 | + env->npc = T0; | |
| 1490 | 1493 | } |
| 1491 | 1494 | |
| 1492 | 1495 | void OPPROTO op_mov_pc_npc(void) | ... | ... |
target-sparc/op_helper.c
| ... | ... | @@ -923,7 +923,11 @@ void do_interrupt(int intno) |
| 923 | 923 | |
| 924 | 924 | #if !defined(CONFIG_USER_ONLY) |
| 925 | 925 | |
| 926 | +static void do_unaligned_access(target_ulong addr, int is_write, int is_user, | |
| 927 | + void *retaddr); | |
| 928 | + | |
| 926 | 929 | #define MMUSUFFIX _mmu |
| 930 | +#define ALIGNED_ONLY | |
| 927 | 931 | #define GETPC() (__builtin_return_address(0)) |
| 928 | 932 | |
| 929 | 933 | #define SHIFT 0 |
| ... | ... | @@ -938,6 +942,14 @@ void do_interrupt(int intno) |
| 938 | 942 | #define SHIFT 3 |
| 939 | 943 | #include "softmmu_template.h" |
| 940 | 944 | |
| 945 | +static void do_unaligned_access(target_ulong addr, int is_write, int is_user, | |
| 946 | + void *retaddr) | |
| 947 | +{ | |
| 948 | + /* Uncomment the following line to enable mem_address_not_aligned traps */ | |
| 949 | + /* Not enabled yet because of bugs in OpenBIOS */ | |
| 950 | + //raise_exception(TT_UNALIGNED); | |
| 951 | + //printf("Unaligned access to 0x%x from 0x%x\n", addr, env->pc); | |
| 952 | +} | |
| 941 | 953 | |
| 942 | 954 | /* try to fill the TLB and return an exception if error. If retaddr is |
| 943 | 955 | NULL, it means that the function was called in C code (i.e. not | ... | ... |