This source file includes following definitions.
- my_restart
- shutdown
- panic
1 static void __attribute__((noreturn)) shutdown();
2 static void __attribute__((noreturn)) panic(int cnt);
3
4 extern long *blob_chdk_core;
5 extern long *blob_copy_and_reset;
6 extern long blob_chdk_core_size;
7 extern long blob_copy_and_reset_size;
8
9
10
11 void __attribute__((noreturn)) my_restart()
12 {
13 void __attribute__((noreturn)) (*copy_and_restart)(char *dst, char *src, long length);
14 unsigned i;
15
16 for (i=0; i<(blob_copy_and_reset_size/sizeof(long)); i++){
17 ((long*)(RESTARTSTART))[i] = blob_copy_and_reset[i];
18 }
19
20 copy_and_restart = (void*)RESTARTSTART;
21 copy_and_restart((void*)MEMISOSTART, (char*)blob_chdk_core, blob_chdk_core_size);
22 }
23
24
25 #define LED_PR 0xC022006C
26
27 static void __attribute__((noreturn)) shutdown()
28 {
29
30 volatile long *p = (void*)LED_PR;
31
32 asm(
33 "MRS R1, CPSR\n"
34 "AND R0, R1, #0x80\n"
35 "ORR R1, R1, #0x80\n"
36 "MSR CPSR_cf, R1\n"
37 :::"r1","r0");
38
39 *p = 0x44;
40
41 while(1);
42 }
43
44
45 static void __attribute__((noreturn)) panic(int cnt)
46 {
47 volatile long *p=(void*)LED_PR;
48 int i;
49
50 for(;cnt>0;cnt--){
51 p[0]=0x46;
52
53 for(i=0;i<0x200000;i++){
54 asm ("nop\n");
55 asm ("nop\n");
56 }
57 p[0]=0x44;
58 for(i=0;i<0x200000;i++){
59 asm ("nop\n");
60 asm ("nop\n");
61 }
62 }
63 shutdown();
64 }