| 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 | void __attribute__((noreturn)) copy_and_restart(void *dst_void, const void *src_void, long length) |
|---|
| 10 | { |
|---|
| 11 | { |
|---|
| 12 | char *dst = dst_void; |
|---|
| 13 | const char *src = src_void; |
|---|
| 14 | |
|---|
| 15 | if (src < dst && dst < src + length) |
|---|
| 16 | { |
|---|
| 17 | /* Have to copy backwards */ |
|---|
| 18 | src += length; |
|---|
| 19 | dst += length; |
|---|
| 20 | while (length--) |
|---|
| 21 | { |
|---|
| 22 | *--dst = *--src; |
|---|
| 23 | } |
|---|
| 24 | } |
|---|
| 25 | else |
|---|
| 26 | { |
|---|
| 27 | while (length--) |
|---|
| 28 | { |
|---|
| 29 | *dst++ = *src++; |
|---|
| 30 | } |
|---|
| 31 | } |
|---|
| 32 | } |
|---|
| 33 | |
|---|
| 34 | asm volatile( |
|---|
| 35 | "MRS R1, CPSR\n" |
|---|
| 36 | "BIC R1, R1, #0x3F\n" |
|---|
| 37 | "ORR R1, R1, #0xD3\n" |
|---|
| 38 | "MSR CPSR_cf, R1\n" |
|---|
| 39 | |
|---|
| 40 | "LDR R2, =0xC0200000\n" |
|---|
| 41 | "MOV R1, #0xFFFFFFFF\n" |
|---|
| 42 | "STR R1, [R2,#0x10C]\n" |
|---|
| 43 | "STR R1, [R2,#0xC]\n" |
|---|
| 44 | "STR R1, [R2,#0x1C]\n" |
|---|
| 45 | "STR R1, [R2,#0x2C]\n" |
|---|
| 46 | "STR R1, [R2,#0x3C]\n" |
|---|
| 47 | "STR R1, [R2,#0x4C]\n" |
|---|
| 48 | "STR R1, [R2,#0x5C]\n" |
|---|
| 49 | "STR R1, [R2,#0x6C]\n" |
|---|
| 50 | "STR R1, [R2,#0x7C]\n" |
|---|
| 51 | "STR R1, [R2,#0x8C]\n" |
|---|
| 52 | "STR R1, [R2,#0x9C]\n" |
|---|
| 53 | "STR R1, [R2,#0xAC]\n" |
|---|
| 54 | "STR R1, [R2,#0xBC]\n" |
|---|
| 55 | "STR R1, [R2,#0xCC]\n" |
|---|
| 56 | "STR R1, [R2,#0xDC]\n" |
|---|
| 57 | "STR R1, [R2,#0xEC]\n" |
|---|
| 58 | "STR R1, [R2,#0xFC]\n" |
|---|
| 59 | |
|---|
| 60 | "MOV R1, #0x78\n" |
|---|
| 61 | "MCR p15, 0, R1,c1,c0\n" |
|---|
| 62 | "MOV R1, #0\n" |
|---|
| 63 | "MCR p15, 0, R1,c7,c10, 4\n" |
|---|
| 64 | "MCR p15, 0, R1,c7,c5\n" |
|---|
| 65 | "MCR p15, 0, R1,c7,c6\n" |
|---|
| 66 | "MOV R2, #0x40000000\n" |
|---|
| 67 | "ORR R1, R2, #6\n" |
|---|
| 68 | "MCR p15, 0, R1,c9,c1\n" |
|---|
| 69 | "ORR R1, R1, #6\n" |
|---|
| 70 | "MCR p15, 0, R1,c9,c1, 1\n" |
|---|
| 71 | "MRC p15, 0, R1,c1,c0\n" |
|---|
| 72 | "ORR R1, R1, #0x50000\n" |
|---|
| 73 | "MCR p15, 0, R1,c1,c0\n" |
|---|
| 74 | |
|---|
| 75 | "MOV R3, #0xFF0\n" |
|---|
| 76 | "LDR R1, =0x12345678\n" |
|---|
| 77 | "ADD R3, R3, #0x4000000C\n" |
|---|
| 78 | "STR R1, [R3]\n" |
|---|
| 79 | |
|---|
| 80 | "MOV SP, #0x1900\n" |
|---|
| 81 | "MOV LR, PC\n" |
|---|
| 82 | "MOV PC, %0\n" |
|---|
| 83 | : : "r"(dst_void) : "memory","r1","r2","r3"); |
|---|
| 84 | |
|---|
| 85 | while(1); |
|---|
| 86 | } |
|---|
Note: See
TracBrowser
for help on using the repository browser.