Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 018
019 019
020 #include <bootstrap/multiboot.h> 020 #include <bootstrap/multiboot.h>
021 #include <hwcore/idt.h> 021 #include <hwcore/idt.h>
022 #include <hwcore/gdt.h> 022 #include <hwcore/gdt.h>
023 #include <hwcore/irq.h> 023 #include <hwcore/irq.h>
024 #include <hwcore/exception.h> 024 #include <hwcore/exception.h>
025 #include <hwcore/i8254.h> 025 #include <hwcore/i8254.h>
026 #include <sos/list.h> 026 #include <sos/list.h>
027 #include <sos/physmem.h> 027 #include <sos/physmem.h>
028 #include <hwcore/paging.h> 028 #include <hwcore/paging.h>
029 #include <hwcore/mm_context.h> 029 #include <hwcore/mm_context.h>
030 #include <hwcore/swintr.h> 030 #include <hwcore/swintr.h>
031 #include <sos/kmem_vmm.h> 031 #include <sos/kmem_vmm.h>
032 #include <sos/kmalloc.h> 032 #include <sos/kmalloc.h>
033 #include <sos/time.h> 033 #include <sos/time.h>
034 #include <sos/thread.h> 034 #include <sos/thread.h>
035 #include <sos/process.h> 035 #include <sos/process.h>
036 #include <sos/umem_vmm.h> <<
037 #include <sos/klibc.h> 036 #include <sos/klibc.h>
038 #include <sos/assert.h> 037 #include <sos/assert.h>
039 #include <drivers/x86_videomem.h> 038 #include <drivers/x86_videomem.h>
040 #include <drivers/bochs.h> 039 #include <drivers/bochs.h>
041 #include <sos/calcload.h> 040 #include <sos/calcload.h>
042 #include <sos/umem_vmm.h> <<
043 #include <sos/binfmt_elf32.h> <<
044 #include <drivers/zero.h> <<
045 041
046 042
047 043
048 044
049 void display_bits(unsigned char row, unsigned 045 void display_bits(unsigned char row, unsigned char col,
050 unsigned char attribute, 046 unsigned char attribute,
051 sos_ui32_t integer) 047 sos_ui32_t integer)
052 { 048 {
053 int i; 049 int i;
054 050
055 for (i = 31 ; i >= 0 ; i--) 051 for (i = 31 ; i >= 0 ; i--)
056 { 052 {
057 053
058 int bit_i = (integer & (1 << i)); 054 int bit_i = (integer & (1 << i));
059 055
060 unsigned char ascii_code = bit_i?219:177 056 unsigned char ascii_code = bit_i?219:177;
061 sos_x86_videomem_putchar(row, col++, 057 sos_x86_videomem_putchar(row, col++,
062 attribute, 058 attribute,
063 ascii_code); 059 ascii_code);
064 } 060 }
065 } 061 }
066 062
067 063
068 064
069 static void clk_it(int intid) 065 static void clk_it(int intid)
070 { 066 {
071 static sos_ui32_t clock_count = 0; 067 static sos_ui32_t clock_count = 0;
072 068
073 display_bits(0, 48, 069 display_bits(0, 48,
074 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 070 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
075 clock_count); 071 clock_count);
076 clock_count++; 072 clock_count++;
077 073
078 074
079 sos_time_do_tick(); 075 sos_time_do_tick();
080 076
081 077
082 sos_sched_do_timer_tick(); 078 sos_sched_do_timer_tick();
083 } 079 }
084 080
085 081
086 082
087 083
088 084
089 085
090 086
091 087
092 static void pgflt_ex(int intid, struct sos_cpu 088 static void pgflt_ex(int intid, struct sos_cpu_state *ctxt)
093 { 089 {
094 static sos_ui32_t demand_paging_count = 0; 090 static sos_ui32_t demand_paging_count = 0;
095 struct sos_thread * cur_thr = sos_thread_get <<
096 sos_vaddr_t faulting_vaddr = sos_cpu_contex 091 sos_vaddr_t faulting_vaddr = sos_cpu_context_get_EX_faulting_vaddr(ctxt);
097 sos_paddr_t ppage_paddr; 092 sos_paddr_t ppage_paddr;
098 093
099 if (sos_cpu_context_is_in_user_mode(ctxt) !! 094 if (sos_cpu_context_is_in_user_mode(ctxt))
100 || (cur_thr->fixup_uaccess.return_vaddr) <<
101 { 095 {
102 __label__ unforce_address_space; !! 096
103 sos_bool_t need_to_setup_mmu; !! 097
104 sos_ui32_t errcode = sos_cpu_context_get <<
105 <<
106 <<
107 <<
108 need_to_setup_mmu = (cur_thr->squatted_m <<
109 != sos_process_get_ <<
110 if (need_to_setup_mmu) <<
111 sos_thread_prepare_user_space_access(N <<
112 <<
113 if (SOS_OK == <<
114 sos_umem_vmm_try_resolve_page_fault( <<
115 <<
116 <<
117 goto unforce_address_space; <<
118 <<
119 <<
120 <<
121 if (! sos_cpu_context_is_in_user_mode(ct <<
122 { <<
123 cur_thr->fixup_uaccess.faulted_uaddr <<
124 sos_cpu_context_set_EX_return_addres <<
125 <<
126 goto unforce_address_space; <<
127 } <<
128 <<
129 if (need_to_setup_mmu) <<
130 sos_thread_end_user_space_access(); <<
131 <<
132 sos_bochs_printf("Unresolved USER page F 098 sos_bochs_printf("Unresolved USER page Fault at instruction 0x%x on access to address 0x%x (info=%x)!\n",
133 sos_cpu_context_get_PC( 099 sos_cpu_context_get_PC(ctxt),
134 (unsigned)faulting_vadd 100 (unsigned)faulting_vaddr,
135 (unsigned)sos_cpu_conte 101 (unsigned)sos_cpu_context_get_EX_info(ctxt));
136 sos_bochs_printf("Terminating User threa 102 sos_bochs_printf("Terminating User thread\n");
137 sos_thread_exit(); 103 sos_thread_exit();
138 <<
139 unforce_address_space: <<
140 if (need_to_setup_mmu) <<
141 sos_thread_end_user_space_access(); <<
142 return; <<
143 } 104 }
144 105
145 106
146 if (! sos_kmem_vmm_is_valid_vaddr(faulting_v 107 if (! sos_kmem_vmm_is_valid_vaddr(faulting_vaddr))
147 { 108 {
148 109
149 110
150 sos_display_fatal_error("Unresolved page 111 sos_display_fatal_error("Unresolved page Fault at instruction 0x%x on access to address 0x%x (info=%x)!",
151 sos_cpu_context_ 112 sos_cpu_context_get_PC(ctxt),
152 (unsigned)faulti 113 (unsigned)faulting_vaddr,
153 (unsigned)sos_cp 114 (unsigned)sos_cpu_context_get_EX_info(ctxt));
154 SOS_ASSERT_FATAL(! "Got page fault (note 115 SOS_ASSERT_FATAL(! "Got page fault (note: demand paging is disabled)");
155 } 116 }
156 117
157 118
158 119
159 120
160 121
161 122
162 123
163 demand_paging_count ++; 124 demand_paging_count ++;
164 display_bits(0, 0, 125 display_bits(0, 0,
165 SOS_X86_VIDEO_FG_LTRED | SOS_X8 126 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
166 demand_paging_count); 127 demand_paging_count);
167 128
168 129
169 ppage_paddr = sos_physmem_ref_physpage_new(F 130 ppage_paddr = sos_physmem_ref_physpage_new(FALSE);
170 if (! ppage_paddr) 131 if (! ppage_paddr)
171 SOS_ASSERT_FATAL(! "TODO: implement swap. 132 SOS_ASSERT_FATAL(! "TODO: implement swap. (Out of mem in demand paging because no swap for kernel yet !)");
172 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(pp 133 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(ppage_paddr,
173 SO 134 SOS_PAGE_ALIGN_INF(faulting_vaddr),
174 FA 135 FALSE,
175 SO 136 SOS_VM_MAP_PROT_READ
176 | 137 | SOS_VM_MAP_PROT_WRITE
177 | 138 | SOS_VM_MAP_ATOMIC));
178 sos_physmem_unref_physpage(ppage_paddr); 139 sos_physmem_unref_physpage(ppage_paddr);
179 140
180 141
181 } 142 }
182 143
183 144
>> 145
>> 146
>> 147
>> 148
>> 149
>> 150
>> 151
>> 152 struct thr_arg
>> 153 {
>> 154 char character;
>> 155 int color;
>> 156
>> 157 int col;
>> 158 int row;
>> 159 };
>> 160
>> 161
>> 162 static void demo_thread(void *arg)
>> 163 {
>> 164 struct thr_arg *thr_arg = (struct thr_arg*)arg;
>> 165 int progress = 0;
>> 166
>> 167 sos_bochs_printf("start %c", thr_arg->character);
>> 168 while (1)
>> 169 {
>> 170 progress ++;
>> 171 display_bits(thr_arg->row, thr_arg->col+1, thr_arg->color, progress);
>> 172
>> 173 sos_bochs_putchar(thr_arg->character);
>> 174
>> 175
>> 176 if ((random() % 100) == 0)
>> 177 {
>> 178 sos_bochs_printf("[37myield(%c)[m\n", thr_arg->character);
>> 179 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'Y');
>> 180 SOS_ASSERT_FATAL(SOS_OK == sos_thread_yield());
>> 181 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
>> 182 }
>> 183
>> 184
>> 185 else if ((random() % 200) == 0)
>> 186 {
>> 187 struct sos_time t = (struct sos_time){ .sec=0, .nanosec=50000000 };
>> 188 sos_bochs_printf("[37msleep1(%c)[m\n", thr_arg->character);
>> 189 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 's');
>> 190 SOS_ASSERT_FATAL(SOS_OK == sos_thread_sleep(& t));
>> 191 SOS_ASSERT_FATAL(sos_time_is_zero(& t));
>> 192 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
>> 193 }
>> 194
>> 195
>> 196 else if ((random() % 300) == 0)
>> 197 {
>> 198 struct sos_time t = (struct sos_time){ .sec=0, .nanosec=300000000 };
>> 199 sos_bochs_printf("[37msleep2(%c)[m\n", thr_arg->character);
>> 200 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'S');
>> 201 SOS_ASSERT_FATAL(SOS_OK == sos_thread_sleep(& t));
>> 202 SOS_ASSERT_FATAL(sos_time_is_zero(& t));
>> 203 sos_x86_videomem_putchar(thr_arg->row, thr_arg->col, 0x1e, 'R');
>> 204 }
>> 205
>> 206
>> 207 }
>> 208 }
>> 209
>> 210
>> 211 static void test_thread()
>> 212 {
>> 213
>> 214
>> 215 static struct thr_arg arg_b, arg_c, arg_d, arg_e, arg_R, arg_S;
>> 216 sos_ui32_t flags;
>> 217
>> 218 sos_disable_IRQs(flags);
>> 219
>> 220 arg_b = (struct thr_arg) { .character='b', .col=0, .row=21, .color=0x14 };
>> 221 sos_create_kernel_thread("YO[b]", demo_thread, (void*)&arg_b, SOS_SCHED_PRIO_TS_LOWEST);
>> 222
>> 223 arg_c = (struct thr_arg) { .character='c', .col=46, .row=21, .color=0x14 };
>> 224 sos_create_kernel_thread("YO[c]", demo_thread, (void*)&arg_c, SOS_SCHED_PRIO_TS_LOWEST);
>> 225
>> 226 arg_d = (struct thr_arg) { .character='d', .col=0, .row=20, .color=0x14 };
>> 227 sos_create_kernel_thread("YO[d]", demo_thread, (void*)&arg_d, SOS_SCHED_PRIO_TS_LOWEST-1);
>> 228
>> 229 arg_e = (struct thr_arg) { .character='e', .col=0, .row=19, .color=0x14 };
>> 230 sos_create_kernel_thread("YO[e]", demo_thread, (void*)&arg_e, SOS_SCHED_PRIO_TS_LOWEST-2);
>> 231
>> 232 arg_R = (struct thr_arg) { .character='R', .col=0, .row=17, .color=0x1c };
>> 233 sos_create_kernel_thread("YO[R]", demo_thread, (void*)&arg_R, SOS_SCHED_PRIO_RT_LOWEST);
>> 234
>> 235 arg_S = (struct thr_arg) { .character='S', .col=0, .row=16, .color=0x1c };
>> 236 sos_create_kernel_thread("YO[S]", demo_thread, (void*)&arg_S, SOS_SCHED_PRIO_RT_LOWEST-1);
>> 237
>> 238 sos_restore_IRQs(flags);
>> 239 }
>> 240
184 241
185 242
186 243
187 244
188 245
189 static void idle_thread() 246 static void idle_thread()
190 { 247 {
191 sos_ui32_t idle_twiddle = 0; 248 sos_ui32_t idle_twiddle = 0;
192 249
193 while (1) 250 while (1)
194 { 251 {
195 252
196 253
197 asm("hlt\n"); 254 asm("hlt\n");
198 255
199 idle_twiddle ++; 256 idle_twiddle ++;
200 display_bits(0, 0, SOS_X86_VIDEO_FG_GREE 257 display_bits(0, 0, SOS_X86_VIDEO_FG_GREEN | SOS_X86_VIDEO_BG_BLUE,
201 idle_twiddle); 258 idle_twiddle);
202 259
203 260
204 sos_thread_yield(); 261 sos_thread_yield();
205 } 262 }
206 } 263 }
207 264
208 265
209 266
210 267
211 268
212 static void stat_thread() 269 static void stat_thread()
213 { 270 {
214 while (1) 271 while (1)
215 { 272 {
216 sos_ui32_t flags; 273 sos_ui32_t flags;
217 sos_ui32_t load1, load5, load15; 274 sos_ui32_t load1, load5, load15;
218 char str1[11], str5[11], str15[11]; 275 char str1[11], str5[11], str15[11];
219 struct sos_time t; 276 struct sos_time t;
220 t.sec = 1; 277 t.sec = 1;
221 t.nanosec = 0; 278 t.nanosec = 0;
222 279
223 sos_thread_sleep(& t); 280 sos_thread_sleep(& t);
224 281
225 sos_disable_IRQs(flags); 282 sos_disable_IRQs(flags);
226 283
227 284
228 sos_load_get_sload(&load1, &load5, &load 285 sos_load_get_sload(&load1, &load5, &load15);
229 sos_load_to_string(str1, load1); 286 sos_load_to_string(str1, load1);
230 sos_load_to_string(str5, load5); 287 sos_load_to_string(str5, load5);
231 sos_load_to_string(str15, load15); 288 sos_load_to_string(str15, load15);
232 sos_x86_videomem_printf(16, 34, 289 sos_x86_videomem_printf(16, 34,
233 SOS_X86_VIDEO_FG 290 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
234 "Kernel (- Idle) 291 "Kernel (- Idle): %s %s %s ",
235 str1, str5, str1 292 str1, str5, str15);
236 293
237 sos_load_get_uload(&load1, &load5, &load 294 sos_load_get_uload(&load1, &load5, &load15);
238 sos_load_to_string(str1, load1); 295 sos_load_to_string(str1, load1);
239 sos_load_to_string(str5, load5); 296 sos_load_to_string(str5, load5);
240 sos_load_to_string(str15, load15); 297 sos_load_to_string(str15, load15);
241 sos_x86_videomem_printf(17, 34, 298 sos_x86_videomem_printf(17, 34,
242 SOS_X86_VIDEO_FG 299 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
243 "User: %s %s %s 300 "User: %s %s %s ",
244 str1, str5, str1 301 str1, str5, str15);
245 302
246 sos_load_get_uratio(&load1, &load5, &loa 303 sos_load_get_uratio(&load1, &load5, &load15);
247 sos_load_to_string(str1, load1); 304 sos_load_to_string(str1, load1);
248 sos_load_to_string(str5, load5); 305 sos_load_to_string(str5, load5);
249 sos_load_to_string(str15, load15); 306 sos_load_to_string(str15, load15);
250 sos_x86_videomem_printf(18, 34, 307 sos_x86_videomem_printf(18, 34,
251 SOS_X86_VIDEO_FG 308 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
252 "User CPU %%: %s 309 "User CPU %%: %s %s %s ",
253 str1, str5, str1 310 str1, str5, str15);
254 311
255 312
256 sos_load_get_sratio(&load1, &load5, &loa 313 sos_load_get_sratio(&load1, &load5, &load15);
257 sos_load_to_string(str1, load1); 314 sos_load_to_string(str1, load1);
258 sos_load_to_string(str5, load5); 315 sos_load_to_string(str5, load5);
259 sos_load_to_string(str15, load15); 316 sos_load_to_string(str15, load15);
260 sos_x86_videomem_printf(19, 34, 317 sos_x86_videomem_printf(19, 34,
261 SOS_X86_VIDEO_FG 318 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
262 "Kernel CPU %% ( 319 "Kernel CPU %% (+ Idle): %s %s %s ",
263 str1, str5, str1 320 str1, str5, str15);
264 sos_restore_IRQs(flags); 321 sos_restore_IRQs(flags);
265 } 322 }
266 } 323 }
267 324
268 325
269 326
270 <<
271 <<
272 static sos_ret_t start_init() <<
273 { <<
274 sos_ret_t retval; <<
275 struct sos_umem_vmm_as *as_init; <<
276 struct sos_process *proc_init; <<
277 struct sos_thread *new_thr; <<
278 sos_uaddr_t ustack, start_uaddr; <<
279 <<
280 <<
281 proc_init = sos_process_create("init", FALSE <<
282 if (! proc_init) <<
283 return -SOS_ENOMEM; <<
284 as_init = sos_process_get_address_space(proc <<
285 <<
286 <<
287 start_uaddr = sos_binfmt_elf32_map(as_init, <<
288 if (0 == start_uaddr) <<
289 { <<
290 sos_process_unref(proc_init); <<
291 return -SOS_ENOENT; <<
292 } <<
293 <<
294 <<
295 ustack = (SOS_PAGING_TOP_USER_ADDRESS - SOS_ <<
296 retval = sos_dev_zero_map(as_init, &ustack, <<
297 SOS_VM_MAP_PROT_RE <<
298 0); <<
299 if (SOS_OK != retval) <<
300 { <<
301 sos_bochs_printf("ici 2\n"); <<
302 sos_process_unref(proc_init); <<
303 return -SOS_ENOMEM; <<
304 } <<
305 <<
306 <<
307 new_thr = sos_create_user_thread(NULL, <<
308 proc_init, <<
309 start_uaddr <<
310 0, 0, <<
311 ustack + SO <<
312 SOS_SCHED_P <<
313 if (! new_thr) <<
314 { <<
315 sos_bochs_printf("ici 3\n"); <<
316 sos_process_unref(proc_init); <<
317 return -SOS_ENOMEM; <<
318 } <<
319 <<
320 sos_process_unref(proc_init); <<
321 return SOS_OK; <<
322 } <<
323 <<
324 <<
325 <<
326 327
327 328
328 void sos_main(unsigned long magic, unsigned lo 329 void sos_main(unsigned long magic, unsigned long addr)
329 { 330 {
330 unsigned i; 331 unsigned i;
331 sos_paddr_t sos_kernel_core_base_paddr, sos_ 332 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
332 struct sos_time tick_resolution; 333 struct sos_time tick_resolution;
333 334
334 335
335 336
336 337
337 multiboot_info_t *mbi; 338 multiboot_info_t *mbi;
338 mbi = (multiboot_info_t *) addr; 339 mbi = (multiboot_info_t *) addr;
339 340
340 341
341 sos_bochs_setup(); 342 sos_bochs_setup();
342 343
343 sos_x86_videomem_setup(); 344 sos_x86_videomem_setup();
344 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 345 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
345 346
346 347
347 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 348 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
348 349
349 sos_x86_videomem_printf(1, 0, 350 sos_x86_videomem_printf(1, 0,
350 SOS_X86_VIDEO_FG_Y 351 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
351 "Welcome From GRUB 352 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
352 "SOS article 7.5", !! 353 "SOS article 7", ',',
353 (unsigned)(mbi->me 354 (unsigned)(mbi->mem_upper >> 10) + 1,
354 (unsigned)mbi->mem 355 (unsigned)mbi->mem_upper);
355 else 356 else
356 357
357 sos_x86_videomem_printf(1, 0, 358 sos_x86_videomem_printf(1, 0,
358 SOS_X86_VIDEO_FG_Y 359 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
359 "Welcome to SOS ar !! 360 "Welcome to SOS article 7");
360 361
361 sos_bochs_putstring("Message in a bochs: Thi !! 362 sos_bochs_putstring("Message in a bochs: This is SOS article 7.\n");
362 363
363 364
364 sos_gdt_subsystem_setup(); 365 sos_gdt_subsystem_setup();
365 sos_idt_subsystem_setup(); 366 sos_idt_subsystem_setup();
366 367
367 368
368 sos_exception_subsystem_setup(); 369 sos_exception_subsystem_setup();
369 sos_irq_subsystem_setup(); 370 sos_irq_subsystem_setup();
370 371
371 372
372 sos_i8254_set_frequency(100); 373 sos_i8254_set_frequency(100);
373 374
374 375
375 376
376 tick_resolution = (struct sos_time) { .sec=0 377 tick_resolution = (struct sos_time) { .sec=0, .nanosec=10000000UL };
377 sos_time_subsysem_setup(& tick_resolution); 378 sos_time_subsysem_setup(& tick_resolution);
378 379
379 380
380 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) 381 if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
381 { 382 {
382 sos_x86_videomem_putstring(20, 0, 383 sos_x86_videomem_putstring(20, 0,
383 SOS_X86_VIDEO 384 SOS_X86_VIDEO_FG_LTRED
384 | SOS_X86_V 385 | SOS_X86_VIDEO_BG_BLUE
385 | SOS_X86_V 386 | SOS_X86_VIDEO_FG_BLINKING,
386 "I'm not load 387 "I'm not loaded with Grub !");
387 388
388 for (;;) 389 for (;;)
389 continue; 390 continue;
390 } 391 }
391 392
392 393
393 394
394 395
395 396
396 397
397 sos_irq_set_routine(SOS_IRQ_TIMER, 398 sos_irq_set_routine(SOS_IRQ_TIMER,
398 clk_it); 399 clk_it);
399 400
400 401
401 402
402 403
403 404
404 405
405 406
406 407
407 sos_physmem_subsystem_setup((mbi->mem_upper< 408 sos_physmem_subsystem_setup((mbi->mem_upper<<10) + (1<<20),
408 & sos_kernel_cor 409 & sos_kernel_core_base_paddr,
409 & sos_kernel_cor 410 & sos_kernel_core_top_paddr);
410 411
411 412
412 413
413 414
414 415
415 416
416 417
417 SOS_ASSERT_FATAL(SOS_OK == 418 SOS_ASSERT_FATAL(SOS_OK ==
418 sos_paging_subsystem_setup( 419 sos_paging_subsystem_setup(sos_kernel_core_base_paddr,
419 420 sos_kernel_core_top_paddr));
420 421
421 422
422 sos_exception_set_routine(SOS_EXCEPT_PAGE_FA 423 sos_exception_set_routine(SOS_EXCEPT_PAGE_FAULT,
423 pgflt_ex); 424 pgflt_ex);
424 425
425 426
426 427
427 428
428 429
429 if (sos_kmem_vmm_subsystem_setup(sos_kernel_ 430 if (sos_kmem_vmm_subsystem_setup(sos_kernel_core_base_paddr,
430 sos_kernel_ 431 sos_kernel_core_top_paddr,
431 bootstrap_s 432 bootstrap_stack_bottom,
432 bootstrap_s 433 bootstrap_stack_bottom
433 + bootstrap 434 + bootstrap_stack_size))
434 sos_bochs_printf("Could not setup the Kern 435 sos_bochs_printf("Could not setup the Kernel virtual space allocator\n");
435 436
436 if (sos_kmalloc_subsystem_setup()) 437 if (sos_kmalloc_subsystem_setup())
437 sos_bochs_printf("Could not setup the Kmal 438 sos_bochs_printf("Could not setup the Kmalloc subsystem\n");
438 439
439 440
440 441
441 442
442 sos_mm_context_subsystem_setup(); 443 sos_mm_context_subsystem_setup();
443 444
444 445
445 446
446 447
447 sos_cpu_context_subsystem_setup(); 448 sos_cpu_context_subsystem_setup();
448 449
449 450
450 451
451 452
452 sos_swintr_subsystem_setup(); 453 sos_swintr_subsystem_setup();
453 454
454 455
455 456
456 457
457 458
458 459
459 460
460 sos_thread_subsystem_setup(bootstrap_stack_b 461 sos_thread_subsystem_setup(bootstrap_stack_bottom,
461 bootstrap_stack_s 462 bootstrap_stack_size);
462 463
463 464
464 sos_sched_subsystem_setup(); 465 sos_sched_subsystem_setup();
465 466
466 467
467 SOS_ASSERT_FATAL(sos_create_kernel_thread("i 468 SOS_ASSERT_FATAL(sos_create_kernel_thread("idle", idle_thread, NULL,
468 SO 469 SOS_SCHED_PRIO_TS_LOWEST) != NULL);
469 470
470 471
471 sos_load_subsystem_setup(); 472 sos_load_subsystem_setup();
472 473
473 474
474 SOS_ASSERT_FATAL(sos_create_kernel_thread("s 475 SOS_ASSERT_FATAL(sos_create_kernel_thread("stat_thread", stat_thread,
475 NU 476 NULL,
476 SO 477 SOS_SCHED_PRIO_TS_LOWEST) != NULL);
477 478
478 479
479 480
480 <<
481 <<
482 sos_umem_vmm_subsystem_setup(); <<
483 sos_dev_zero_subsystem_setup(); <<
484 <<
485 <<
486 481
487 482
488 sos_process_subsystem_setup(); 483 sos_process_subsystem_setup();
489 484
490 485
491 486
492 487
493 asm volatile ("sti\n"); 488 asm volatile ("sti\n");
494 489
495 !! 490
496 !! 491 extern void test_art7();
497 start_init(); !! 492 test_art7();
>> 493
>> 494
>> 495 extern void MouseSim();
>> 496 MouseSim();
>> 497 test_thread();
498 498
499 499
500 500
501 501
502 502
503 503
504 504
505 505
506 506
507 507
508 508
509 509
510 510
511 sos_bochs_printf("Bye from primary thread !\ 511 sos_bochs_printf("Bye from primary thread !\n");
512 sos_thread_exit(); 512 sos_thread_exit();
513 SOS_FATAL_ERROR("No trespassing !"); 513 SOS_FATAL_ERROR("No trespassing !");
514 } 514 }