source: trunk/loader/a800/resetcode/main.c @ 1723

Revision 1723, 1.8 KB checked in by reyalp, 2 years ago (diff)

a800 100a port from mland, patch by waterwings in http://chdk.setepontos.com/index.php?topic=650.msg81174#msg81174

  • Property svn:eol-style set to native
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
9void __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        //0xffc2b10c
35    asm volatile(
36        "LDR     R1, =0xC0200000\n"
37        "MVN     R0, #0\n"
38        "STR     R0, [R1,#0x10C]\n"
39        "STR     R0, [R1,#0xC]\n"
40        "STR     R0, [R1,#0x1C]\n"
41        "STR     R0, [R1,#0x2C]\n"
42        "STR     R0, [R1,#0x3C]\n"
43        "STR     R0, [R1,#0x4C]\n"
44        "STR     R0, [R1,#0x5C]\n"
45        "STR     R0, [R1,#0x6C]\n"
46        "STR     R0, [R1,#0x7C]\n"
47        "STR     R0, [R1,#0x8C]\n"
48        "STR     R0, [R1,#0x9C]\n"
49        "STR     R0, [R1,#0xAC]\n"
50        "STR     R0, [R1,#0xBC]\n"
51        "STR     R0, [R1,#0xCC]\n"
52        "STR     R0, [R1,#0xDC]\n"
53        "STR     R0, [R1,#0xEC]\n"
54    "CMP     R4, #7\n"
55    "STR     R0, [R1,#0xFC]\n"
56        //"LDMEQFD SP!, {R4,PC}\n"
57        "MOV     R0, #0x78\n"
58        "MCR     p15, 0, R0,c1,c0\n"
59        "MOV     R0, #0\n"
60        "MCR     p15, 0, R0,c7,c10, 4\n"
61        "MCR     p15, 0, R0,c7,c5\n"
62        "MCR     p15, 0, R0,c7,c6\n"
63        "MOV     R0, #0x40000006\n"
64        "MCR     p15, 0, R0,c9,c1\n"
65        "MCR     p15, 0, R0,c9,c1, 1\n"
66        "MRC     p15, 0, R0,c1,c0\n"
67        "ORR     R0, R0, #0x50000\n"
68        "MCR     p15, 0, R0,c1,c0\n"
69
70        "LDR     R0, =0x12345678\n"
71        "MOV     R1, #0x40000000\n"
72        "STR     R0, [R1,#0xFFC]\n"
73
74        //"LDR     R0, =0xFFC00000\n"  //original jump-vector
75    "MOV     R0, %0\n"                          //new jump-vector
76    "LDMFD   SP!, {R4,LR}\n"
77    "BX      R0\n"
78        : : "r"(dst_void) : "memory","r0","r1","r2","r3","r4"
79        );
80    while(1);
81}
Note: See TracBrowser for help on using the repository browser.