Rev 3124 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3124 | Rev 3126 | ||
|---|---|---|---|
| Line 52... | Line 52... | ||
| 52 | /* Branch */ |
52 | /* Branch */ |
| 53 | OP_B, |
53 | OP_B, |
| 54 | OP_BL, |
54 | OP_BL, |
| 55 | OP_BLX1, |
55 | OP_BLX1, |
| 56 | OP_BLX2, |
56 | OP_BLX2, |
| 57 | OP_BX |
57 | OP_BX, |
| - | 58 | ||
| - | 59 | OP_MOV_PC_LR |
|
| 58 | } op_t; |
60 | } op_t; |
| 59 | 61 | ||
| 60 | typedef struct { |
62 | typedef struct { |
| 61 | uint32_t mask; |
63 | uint32_t mask; |
| 62 | uint32_t value; |
64 | uint32_t value; |
| Line 76... | Line 78... | ||
| 76 | 78 | ||
| 77 | /* Branch (and link) */ |
79 | /* Branch (and link) */ |
| 78 | { 0x0f000000, 0x0a000000, OP_B }, |
80 | { 0x0f000000, 0x0a000000, OP_B }, |
| 79 | { 0x0f000000, 0x0b000000, OP_BL }, |
81 | { 0x0f000000, 0x0b000000, OP_BL }, |
| 80 | 82 | ||
| - | 83 | /* mov pc, lr */ |
|
| - | 84 | { 0xffffffff, 0xe1a0f00e, OP_MOV_PC_LR }, |
|
| - | 85 | ||
| 81 | { 0, 0, -1 } |
86 | { 0, 0, -1 } |
| 82 | }; |
87 | }; |
| 83 | 88 | ||
| 84 | /** Sign-extend a value to 32 bits. |
89 | /** Sign-extend a value to 32 bits. |
| 85 | * |
90 | * |
| Line 230... | Line 235... | ||
| 230 | buffer[0] = regv & ~0x1; |
235 | buffer[0] = regv & ~0x1; |
| 231 | buffer[1] = addr + 4; |
236 | buffer[1] = addr + 4; |
| 232 | n = 2; |
237 | n = 2; |
| 233 | break; |
238 | break; |
| 234 | 239 | ||
| - | 240 | case OP_MOV_PC_LR: |
|
| - | 241 | /* mov pc, lr - this is typically used as 'return' */ |
|
| - | 242 | rc = get_reg(dt, 14 /* lr */, ®v); |
|
| - | 243 | if (rc != 0) return rc; |
|
| - | 244 | ||
| - | 245 | buffer[0] = regv & ~0x1; |
|
| - | 246 | printf("mov pc, lr ---> 0x%x\n", buffer[0]); |
|
| - | 247 | n = 1; |
|
| - | 248 | break; |
|
| - | 249 | ||
| 235 | /* TODO: handle instructions writing r15 */ |
250 | /* TODO: handle general case of instructions writing r15(pc) */ |
| 236 | 251 | ||
| 237 | default: |
252 | default: |
| 238 | /* Regular instruction */ |
253 | /* Regular instruction */ |
| 239 | buffer[0] = addr + 4; |
254 | buffer[0] = addr + 4; |
| 240 | n = 1; |
255 | n = 1; |