1 #include "../generic/check_compat.c"
2
3 // static void __attribute__((noreturn)) shutdown();
4 // static void __attribute__((noreturn)) panic(int cnt);
5
6 extern long *blob_chdk_core;
7 // extern long *blob_copy_and_reset;
8 extern long blob_chdk_core_size;
9 // extern long blob_copy_and_reset_size;
10
11
12 void __attribute__((noreturn)) my_restart()
13 {
14 {
15 // char *dst = dst_void;
16 // const char *src = src_void;
17 long *dst = (long*)MEMISOSTART;
18 const long *src = blob_chdk_core;
19 long length = (blob_chdk_core_size + 3) >> 2;
20
21 core_copy(src, dst, length);
22
23 }
24 asm volatile (
25
26 "MRS R0, CPSR\n"
27 "BIC R0, R0, #0x3F\n"
28 "ORR R0, R0, #0xD3\n"
29 "MSR CPSR, R0\n"
30 //"STM SP!,{R1,R2}\n"
31 //"LDR R1, =0xC0220000\n"
32 //"MOV R2, #0x46\n" //Debug LED_on
33 //"STR R2, [R1,#0x10]\n" //0x10 - Power_LED
34 //"LDM SP!,{R1,R2}\n"
35 "LDR R1, =0xC0200000\n"
36 "MOV R0, #0xFFFFFFFF\n"
37 "STR R0, [R1,#0x10C]\n"
38 "STR R0, [R1,#0xC]\n"
39 "STR R0, [R1,#0x1C]\n"
40 "STR R0, [R1,#0x2C]\n"
41 "STR R0, [R1,#0x3C]\n"
42 "STR R0, [R1,#0x4C]\n"
43 "STR R0, [R1,#0x5C]\n"
44 "STR R0, [R1,#0x6C]\n"
45 "STR R0, [R1,#0x7C]\n"
46 "STR R0, [R1,#0x8C]\n"
47 "STR R0, [R1,#0x9C]\n"
48 "STR R0, [R1,#0xAC]\n"
49 "STR R0, [R1,#0xBC]\n"
50 "STR R0, [R1,#0xCC]\n"
51 "STR R0, [R1,#0xDC]\n"
52 "STR R0, [R1,#0xEC]\n"
53 "CMP R4, #7\n"
54 "STR R0, [R1,#0xFC]\n"
55 "LDMEQFD SP!, {R4,PC}\n"
56 "MOV R0, #0x78\n"
57 "MCR p15, 0, R0,c1,c0\n"
58 "MOV R0, #0\n"
59 "MCR p15, 0, R0,c7,c10, 4\n"
60 "MCR p15, 0, R0,c7,c5\n"
61 "MCR p15, 0, R0,c7,c6\n"
62 "MOV R0, #0x40000006\n"
63 "MCR p15, 0, R0,c9,c1\n"
64 "MCR p15, 0, R0,c9,c1, 1\n"
65 "MRC p15, 0, R0,c1,c0\n"
66 "ORR R0, R0, #0x50000\n"
67 "MCR p15, 0, R0,c1,c0\n"
68 "LDR R0, =0x12345678\n"
69 "MOV R1, #0x40000000\n"
70 "STR R0, [R1,#0xFFC]\n"
71 //"LDR R0, =sub_FF810000\n"
72 "MOV R0, %0\n" // new jump-vector
73 "LDMFD SP!, {R4,LR}\n"
74 "BX R0\n"
75
76 : : "r"(MEMISOSTART) : "memory","r0","r1","r2","r3","r4");
77 while(1);
78 }
79
80 // FROM A3100IS
81 // #define LED_POWER 0xC0220010
82 // #define LED_AF 0xC0220008
83 // #define LED_AF_ALT 0xC0220009
84 // #define LED_AF_ALT_2 0xC022000A
85 // #define LED_AF_ALT_3 0xC022000B
86 // #define WHITE_SCREEN 0xC0220007
87 // #define WHITE_SCREEN_ALT 0xC0220006
88 // #define FLASH 0xC022000C
89 // #define LED_PR 0xC0220010
90 //
91 //
92 // static void __attribute__((noreturn)) shutdown()
93 // {
94 // volatile long *p = (void*)LED_PR; // turned off later, so assumed to be power
95 //
96 // asm(
97 // "MRS R1, CPSR\n"
98 // "AND R0, R1, #0x80\n"
99 // "ORR R1, R1, #0x80\n"
100 // "MSR CPSR_cf, R1\n"
101 // :::"r1","r0");
102 //
103 // *p = 0x44; // led off.
104 //
105 // while(1);
106 // }
107 //
108 //
109 // static void __attribute__((noreturn)) panic(int cnt)
110 // {
111 // volatile long *p=(void*)LED_PR;
112 // int i;
113 //
114 // for(;cnt>0;cnt--){
115 // p[0]=0x46;
116 //
117 // for(i=0;i<0x200000;i++){
118 // asm ("nop\n");
119 // asm ("nop\n");
120 // }
121 // p[0]=0x44;
122 // for(i=0;i<0x200000;i++){
123 // asm ("nop\n");
124 // asm ("nop\n");
125 // }
126 // }
127 // shutdown();
128 // }