Modules/InitRD - Fixing ARM bug (actually in boot args)
[tpg/acess2.git] / Kernel / arch / armv7 / main.c
1 /*
2  * Acess2
3  *
4  * ARM7 Entrypoint
5  * arch/arm7/main.c
6  */
7 #define DEBUG   0
8
9 #include <acess.h>
10 #include <modules.h>
11
12 // === IMPORTS ===
13 extern void     Interrupts_Setup(void);
14 extern void     Arch_LoadBootModules(void);
15 extern void     Heap_Install(void);
16 extern void     Threads_Init(void);
17 extern void     System_Init(const char *Commandline);
18
19 // === PROTOTYPES ===
20  int    kmain(void);
21 Uint32  ARMv7_int_HandleSyscalls(Uint32 Num, Uint32 *Args);
22
23 // === CODE ===
24 int kmain(void)
25 {
26         LogF("Acess2 ARMv7 v"EXPAND_STR(KERNEL_VERSION)"\n");
27         LogF(" Build %i\n", BUILD_NUM);
28 //      Interrupts_Setup();
29         
30         MM_SetupPhys();
31
32         LogF("Heap Setup...\n");
33         Heap_Install();
34
35         LogF("Threads Init...\n");
36         Threads_Init();
37         
38         LogF("VFS Init...\n");
39         VFS_Init();
40
41         // Boot modules?
42         Module_EnsureLoaded("armv7_GIC");
43
44         //
45         LogF("Moving to arch-independent init\n");
46         System_Init("Acess2.armv7.bin /Acess=initrd: -VTerm:Video=PL110");
47 //      System_Init("/Acess=initrd:");
48         //TODO: 
49         LogF("End of kmain(), for(;;) Threads_Sleep();\n");
50         for(;;)
51                 Threads_Sleep();
52 }
53
54 void Arch_LoadBootModules(void)
55 {
56 }
57
58 Uint32 ARMv7_int_HandleSyscalls(Uint32 Num, Uint32 *Args)
59 {
60         Uint32  ret = -1, err = 0;
61         Uint32  addr;
62         ENTER("iNum xArgs[0] xArgs[1] xArgs[2] xArgs[3]",
63                 Num, Args[0], Args[1], Args[2], Args[3]
64                 );
65         switch(Num)
66         {
67         case 1:
68 //              Log_Debug("ARMv7", "__clear_cache(%p, %p)", Args[0], Args[1]);
69                 // Align
70                 Args[0] &= ~0xFFF;
71                 Args[1] += 0xFFF;       Args[1] &= ~0xFFF;
72                 // Invalidate!
73                 for( addr = Args[0]; addr < Args[1]; addr += 0x1000 )
74                 {
75                         LOG("addr = %p", addr);
76                         __asm__ __volatile__ (
77                                 "mcrlt p15, 0, %0, c7, c5, 1;\n\t"
78                                 "mcrlt p15, 0, %0, c7, c6, 1;\n\t"
79                                 :
80                                 : "r" (addr)
81                                 );
82                 }
83                 ret = 0;
84                 break;
85         }
86         Args[0] = ret;  // RetLow
87         Args[1] = 0;    // RetHi
88         Args[2] = err;  // Errno
89         LEAVE('x', ret);
90         return ret;
91 }
92

UCC git Repository :: git.ucc.asn.au