[Docs] Added Information about Secure Monitor
[3rdparty/ote_partner/tlk.git] / kernel / main.c
1 /*
2  * Copyright (c) 2008 Travis Geiselbrecht
3  * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files
7  * (the "Software"), to deal in the Software without restriction,
8  * including without limitation the rights to use, copy, modify, merge,
9  * publish, distribute, sublicense, and/or sell copies of the Software,
10  * and to permit persons to whom the Software is furnished to do so,
11  * subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #include <compiler.h>
25 #include <debug.h>
26 #include <string.h>
27 #include <app.h>
28 #include <arch.h>
29 #include <platform.h>
30 #include <target.h>
31 #include <lib/heap.h>
32 #include <lib/fs.h>
33 #include <lib/bio.h>
34 #include <kernel/thread.h>
35 #include <kernel/timer.h>
36 #include <kernel/dpc.h>
37 #include <kernel/boot_params.h>
38
39 extern void *__ctor_list;
40 extern void *__ctor_end;
41 extern int __bss_start;
42 extern int _end;
43
44 static int bootstrap2(void *arg);
45
46 static void call_constructors(void)
47 {
48         void **ctor;
49
50         ctor = &__ctor_list;
51         while(ctor != &__ctor_end) {
52                 void (*func)(void);
53
54                 func = (void (*)())*ctor;
55
56                 func();
57                 ctor++;
58         }
59 }
60
61 /* called from crt0.S */
62 void kmain(void) __NO_RETURN __EXTERNALLY_VISIBLE;
63 void kmain(void)
64 {
65         inc_critical_section();
66
67         // get us into some sort of thread context
68         thread_init_early();
69
70         // get boot arguments based on structure passed
71         get_boot_params();
72
73         // early arch stuff
74         arch_early_init();
75
76         // do any super early platform initialization
77         platform_early_init();
78
79         // do any super early target initialization
80         target_early_init();
81
82         // do any super early task initialization
83         task_early_init();
84
85         dputs(CRITICAL, "Welcome to TLK\n\n");
86
87         // deal with any static constructors
88         dprintf(SPEW, "calling constructors\n");
89         call_constructors();
90
91         // bring up the kernel heap
92         dprintf(SPEW, "initializing heap\n");
93         heap_init();
94
95         // initialize the threading system
96         dprintf(SPEW, "initializing threads\n");
97         thread_init();
98
99         // initialize the dpc system
100         dprintf(SPEW, "initializing dpc\n");
101         dpc_init();
102
103         // initialize kernel timers
104         dprintf(SPEW, "initializing timers\n");
105         timer_init();
106
107         // create a thread to complete system initialization
108         dprintf(SPEW, "creating bootstrap completion thread\n");
109         thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
110
111         // become the idle thread and enable interrupts to start the scheduler
112         thread_become_idle();
113 }
114
115 int main(void);
116
117 static int bootstrap2(void *arg)
118 {
119         dprintf(SPEW, "top of bootstrap2()\n");
120
121         arch_init();
122
123         // XXX put this somewhere else
124 #if WITH_LIB_BIO
125         bio_init();
126 #endif
127 #if WITH_LIB_FS
128         fs_init();
129 #endif
130
131         // initialize the rest of the platform
132         dprintf(SPEW, "initializing platform\n");
133         platform_init();
134
135         // initialize the target
136         dprintf(SPEW, "initializing target\n");
137         target_init();
138
139         dprintf(SPEW, "calling task_init()\n");
140         task_init();
141
142         dprintf(SPEW, "calling apps_init()\n");
143         apps_init();
144
145         return 0;
146 }
147