| Line | |
|---|
| 1 | |
|---|
| 2 | /* |
|---|
| 3 | * Operating system has died. Known functions will be killed |
|---|
| 4 | * after memmove. |
|---|
| 5 | * |
|---|
| 6 | * Make sure stack is not used. |
|---|
| 7 | */ |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | void __attribute__((noreturn)) copy_and_restart(void *dst_void, const void *src_void, long length) { |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | { |
|---|
| 14 | char *dst = dst_void; |
|---|
| 15 | const char *src = src_void; |
|---|
| 16 | |
|---|
| 17 | if (src < dst && dst < src + length) |
|---|
| 18 | { |
|---|
| 19 | /* Have to copy backwards */ |
|---|
| 20 | src += length; |
|---|
| 21 | dst += length; |
|---|
| 22 | while (length--) |
|---|
| 23 | { |
|---|
| 24 | *--dst = *--src; |
|---|
| 25 | } |
|---|
| 26 | } |
|---|
| 27 | else |
|---|
| 28 | { |
|---|
| 29 | while (length--) |
|---|
| 30 | { |
|---|
| 31 | *dst++ = *src++; |
|---|
| 32 | } |
|---|
| 33 | } |
|---|
| 34 | } |
|---|
| 35 | |
|---|
| 36 | //SX230 found at FF02D3D8 |
|---|
| 37 | asm volatile ( |
|---|
| 38 | //SX220 found at FF02D058 |
|---|
| 39 | // "MRS R0, CPSR\n" //SX220 not present in dump |
|---|
| 40 | // "BIC R0, R0, #0x3F\n" |
|---|
| 41 | // "ORR R0, R0, #0xD3\n" |
|---|
| 42 | // "MSR CPSR, R0\n" |
|---|
| 43 | "LDR R1, =0xC0200000\n" |
|---|
| 44 | "MVN R0, #0\n" |
|---|
| 45 | "STR R0, [R1,#0x10C]\n" |
|---|
| 46 | "STR R0, [R1,#0xC]\n" |
|---|
| 47 | "STR R0, [R1,#0x1C]\n" |
|---|
| 48 | "STR R0, [R1,#0x2C]\n" |
|---|
| 49 | "STR R0, [R1,#0x3C]\n" |
|---|
| 50 | "STR R0, [R1,#0x4C]\n" |
|---|
| 51 | "STR R0, [R1,#0x5C]\n" |
|---|
| 52 | "STR R0, [R1,#0x6C]\n" |
|---|
| 53 | "STR R0, [R1,#0x7C]\n" |
|---|
| 54 | "STR R0, [R1,#0x8C]\n" |
|---|
| 55 | "STR R0, [R1,#0x9C]\n" |
|---|
| 56 | "STR R0, [R1,#0xAC]\n" |
|---|
| 57 | "STR R0, [R1,#0xBC]\n" |
|---|
| 58 | "STR R0, [R1,#0xCC]\n" |
|---|
| 59 | "STR R0, [R1,#0xDC]\n" |
|---|
| 60 | "STR R0, [R1,#0xEC]\n" |
|---|
| 61 | "CMP R4, #7\n" |
|---|
| 62 | "STR R0, [R1,#0xFC]\n" |
|---|
| 63 | "LDMEQFD SP!, {R4,PC}\n" |
|---|
| 64 | "MOV R0, #0x78\n" |
|---|
| 65 | "MCR p15, 0, R0,c1,c0\n" |
|---|
| 66 | "MOV R0, #0\n" |
|---|
| 67 | "MCR p15, 0, R0,c7,c10, 4\n" |
|---|
| 68 | "MCR p15, 0, R0,c7,c5\n" |
|---|
| 69 | "MCR p15, 0, R0,c7,c6\n" |
|---|
| 70 | "MOV R0, #0x80000006\n" |
|---|
| 71 | "MCR p15, 0, R0,c9,c1\n" |
|---|
| 72 | "MCR p15, 0, R0,c9,c1, 1\n" |
|---|
| 73 | "MRC p15, 0, R0,c1,c0\n" |
|---|
| 74 | "ORR R0, R0, #0x50000\n" |
|---|
| 75 | "MCR p15, 0, R0,c1,c0\n" |
|---|
| 76 | "LDR R0, =0x12345678\n" |
|---|
| 77 | "MOV R1, #0x80000000\n" |
|---|
| 78 | "STR R0, [R1,#0xFFC]\n" |
|---|
| 79 | // "LDR R0, =0xFF000000\n" //SX220 was disabled previously |
|---|
| 80 | "MOV R0, %0\n" // new jump-vector |
|---|
| 81 | "LDMFD SP!, {R4,LR}\n" |
|---|
| 82 | "BX R0\n" |
|---|
| 83 | : : "r"(dst_void) : "memory","r0","r1","r2","r3","r4" |
|---|
| 84 | ); |
|---|
| 85 | |
|---|
| 86 | while(1); |
|---|
| 87 | } |
|---|
Note: See
TracBrowser
for help on using the repository browser.