Diff markup
001 001
002 <<
003 002
004 003
005 004
006 005
007 006
008 007
009 008
010 009
011 010
012 011
013 012
014 013
015 014
016 015
017 016
018 017
019 018
>> 019 #include <sos/errno.h>
>> 020
020 021
021 #include <bootstrap/multiboot.h> 022 #include <bootstrap/multiboot.h>
022 #include <hwcore/idt.h> 023 #include <hwcore/idt.h>
023 #include <hwcore/gdt.h> 024 #include <hwcore/gdt.h>
024 #include <hwcore/irq.h> 025 #include <hwcore/irq.h>
025 #include <hwcore/exception.h> 026 #include <hwcore/exception.h>
026 #include <hwcore/i8254.h> 027 #include <hwcore/i8254.h>
027 #include <sos/list.h> 028 #include <sos/list.h>
028 #include <sos/physmem.h> 029 #include <sos/physmem.h>
029 #include <hwcore/paging.h> 030 #include <hwcore/paging.h>
>> 031 #include <hwcore/mm_context.h>
>> 032 #include <hwcore/swintr.h>
030 #include <sos/kmem_vmm.h> 033 #include <sos/kmem_vmm.h>
031 #include <sos/kmalloc.h> 034 #include <sos/kmalloc.h>
>> 035 #include <sos/time.h>
>> 036 #include <sos/thread.h>
>> 037 #include <sos/process.h>
>> 038 #include <sos/umem_vmm.h>
032 #include <sos/klibc.h> 039 #include <sos/klibc.h>
033 #include <sos/assert.h> 040 #include <sos/assert.h>
034 #include <drivers/x86_videomem.h> 041 #include <drivers/x86_videomem.h>
035 #include <drivers/bochs.h> 042 #include <drivers/bochs.h>
036 !! 043 #include <sos/calcload.h>
>> 044 #include <sos/umem_vmm.h>
>> 045 #include <sos/binfmt_elf32.h>
>> 046 #include <drivers/zero.h>
>> 047 #include <sos/fs.h>
>> 048 #include <drivers/fs_virtfs.h>
037 049
038 050
039 051
040 static void display_bits(unsigned char row, un !! 052 void display_bits(unsigned char row, unsigned char col,
041 unsigned char attribu !! 053 unsigned char attribute,
042 sos_ui32_t integer) !! 054 sos_ui32_t integer)
043 { 055 {
044 int i; 056 int i;
045 057
046 for (i = 31 ; i >= 0 ; i--) 058 for (i = 31 ; i >= 0 ; i--)
047 { 059 {
048 060
049 int bit_i = (integer & (1 << i)); 061 int bit_i = (integer & (1 << i));
050 062
051 unsigned char ascii_code = bit_i?219:177 063 unsigned char ascii_code = bit_i?219:177;
052 sos_x86_videomem_putchar(row, col++, 064 sos_x86_videomem_putchar(row, col++,
053 attribute, 065 attribute,
054 ascii_code); 066 ascii_code);
055 } 067 }
056 } 068 }
057 069
058 <<
059 070
060 static void clk_it(int intid) 071 static void clk_it(int intid)
061 { 072 {
062 static sos_ui32_t clock_count = 0; 073 static sos_ui32_t clock_count = 0;
063 074
064 display_bits(0, 48, 075 display_bits(0, 48,
065 SOS_X86_VIDEO_FG_LTGREEN | SOS_ 076 SOS_X86_VIDEO_FG_LTGREEN | SOS_X86_VIDEO_BG_BLUE,
066 clock_count); 077 clock_count);
067 clock_count++; 078 clock_count++;
068 079
069 } !! 080
070 struct digit !! 081 sos_time_do_tick();
071 { <<
072 struct digit *prev, *next; <<
073 char value; <<
074 }; <<
075 <<
076 <<
077 <<
078 <<
079 typedef struct digit * big_number_t; <<
080 <<
081 082
082 !! 083
083 void bn_push_lsd(big_number_t * bn, char value !! 084 sos_sched_do_timer_tick();
084 { <<
085 struct digit *d; <<
086 d = (struct digit*) sos_kmalloc(sizeof(struc <<
087 SOS_ASSERT_FATAL(d != NULL); <<
088 d->value = value; <<
089 list_add_tail(*bn, d); <<
090 } 085 }
091 086
092 087
093 !! 088
094 void bn_push_msd(big_number_t * bn, char value !! 089
095 { !! 090
096 struct digit *d; <<
097 d = (struct digit*) sos_kmalloc(sizeof(struc <<
098 SOS_ASSERT_FATAL(d != NULL); <<
099 d->value = value; <<
100 list_add_head(*bn, d); <<
101 } <<
102 091
103 092
104 !! 093
105 big_number_t bn_new(unsigned long int i) !! 094 static void pgflt_ex(int intid, struct sos_cpu_state *ctxt)
106 { 095 {
107 big_number_t retval; !! 096 static sos_ui32_t demand_paging_count = 0;
>> 097 struct sos_thread * cur_thr = sos_thread_get_current();
>> 098 sos_vaddr_t faulting_vaddr = sos_cpu_context_get_EX_faulting_vaddr(ctxt);
>> 099 sos_paddr_t ppage_paddr;
108 100
109 list_init(retval); !! 101 if (sos_cpu_context_is_in_user_mode(ctxt)
110 do !! 102 || (cur_thr->fixup_uaccess.return_vaddr))
111 { 103 {
112 bn_push_msd(&retval, i%10); !! 104 __label__ unforce_address_space;
113 i /= 10; !! 105 sos_bool_t need_to_setup_mmu;
114 } !! 106 sos_ui32_t errcode = sos_cpu_context_get_EX_info(ctxt);
115 while (i != 0); <<
116 107
117 return retval; !! 108
118 } !! 109
>> 110 need_to_setup_mmu = (cur_thr->squatted_mm_context
>> 111 != sos_process_get_mm_context(cur_thr->process));
>> 112 if (need_to_setup_mmu)
>> 113 sos_thread_prepare_user_space_access(NULL, 0);
119 114
>> 115 if (SOS_OK ==
>> 116 sos_umem_vmm_try_resolve_page_fault(faulting_vaddr,
>> 117 errcode & (1 << 1),
>> 118 TRUE))
>> 119 goto unforce_address_space;
120 120
121 !! 121
122 big_number_t bn_copy(const big_number_t bn) !! 122
123 { !! 123 if (! sos_cpu_context_is_in_user_mode(ctxt))
124 big_number_t retval; !! 124 {
125 int nb_elts; !! 125 cur_thr->fixup_uaccess.faulted_uaddr = faulting_vaddr;
126 struct digit *d; !! 126 sos_cpu_context_set_EX_return_address(ctxt,
>> 127 cur_thr->fixup_uaccess.return_vaddr);
>> 128 goto unforce_address_space;
>> 129 }
127 130
128 list_init(retval); !! 131 if (need_to_setup_mmu)
129 list_foreach(bn, d, nb_elts) !! 132 sos_thread_end_user_space_access();
130 { !! 133
131 bn_push_lsd(&retval, d->value); !! 134 sos_bochs_printf("Unresolved USER page Fault at instruction 0x%x on access to address 0x%x (info=%x)!\n",
>> 135 sos_cpu_context_get_PC(ctxt),
>> 136 (unsigned)faulting_vaddr,
>> 137 (unsigned)sos_cpu_context_get_EX_info(ctxt));
>> 138 sos_bochs_printf("Terminating User thread\n");
>> 139 sos_thread_exit();
>> 140
>> 141 unforce_address_space:
>> 142 if (need_to_setup_mmu)
>> 143 sos_thread_end_user_space_access();
>> 144 return;
>> 145 }
>> 146
>> 147
>> 148 if (! sos_kmem_vmm_is_valid_vaddr(faulting_vaddr))
>> 149 {
>> 150
>> 151
>> 152 sos_display_fatal_error("Unresolved page Fault at instruction 0x%x on access to address 0x%x (info=%x)!",
>> 153 sos_cpu_context_get_PC(ctxt),
>> 154 (unsigned)faulting_vaddr,
>> 155 (unsigned)sos_cpu_context_get_EX_info(ctxt));
>> 156 SOS_ASSERT_FATAL(! "Got page fault (note: demand paging is disabled)");
132 } 157 }
133 158
134 return retval; <<
135 } <<
136 159
>> 160
>> 161
>> 162
>> 163
>> 164
>> 165 demand_paging_count ++;
>> 166 display_bits(0, 0,
>> 167 SOS_X86_VIDEO_FG_LTRED | SOS_X86_VIDEO_BG_BLUE,
>> 168 demand_paging_count);
>> 169
>> 170
>> 171 ppage_paddr = sos_physmem_ref_physpage_new(FALSE);
>> 172 if (! ppage_paddr)
>> 173 SOS_ASSERT_FATAL(! "TODO: implement swap. (Out of mem in demand paging because no swap for kernel yet !)");
>> 174 SOS_ASSERT_FATAL(SOS_OK == sos_paging_map(ppage_paddr,
>> 175 SOS_PAGE_ALIGN_INF(faulting_vaddr),
>> 176 FALSE,
>> 177 SOS_VM_MAP_PROT_READ
>> 178 | SOS_VM_MAP_PROT_WRITE
>> 179 | SOS_VM_MAP_ATOMIC));
>> 180 sos_physmem_unref_physpage(ppage_paddr);
>> 181
>> 182
>> 183 }
>> 184
>> 185
>> 186
>> 187
>> 188
>> 189
>> 190
>> 191 static void idle_thread()
>> 192 {
>> 193 sos_ui32_t idle_twiddle = 0;
>> 194
>> 195 while (1)
>> 196 {
>> 197
>> 198
>> 199 asm("hlt\n");
>> 200
>> 201 idle_twiddle ++;
>> 202 display_bits(0, 0, SOS_X86_VIDEO_FG_GREEN | SOS_X86_VIDEO_BG_BLUE,
>> 203 idle_twiddle);
>> 204
>> 205
>> 206 sos_thread_yield();
>> 207 }
>> 208 }
>> 209
>> 210
>> 211
>> 212
>> 213
>> 214 static void stat_thread()
>> 215 {
>> 216 while (1)
>> 217 {
>> 218 sos_ui32_t flags;
>> 219 sos_ui32_t load1, load5, load15;
>> 220 char str1[11], str5[11], str15[11];
>> 221 struct sos_time t;
>> 222 t.sec = 1;
>> 223 t.nanosec = 0;
>> 224
>> 225 sos_thread_sleep(& t);
>> 226
>> 227 sos_disable_IRQs(flags);
>> 228
>> 229
>> 230 sos_load_get_sload(&load1, &load5, &load15);
>> 231 sos_load_to_string(str1, load1);
>> 232 sos_load_to_string(str5, load5);
>> 233 sos_load_to_string(str15, load15);
>> 234 sos_x86_videomem_printf(16, 34,
>> 235 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 236 "Kernel (- Idle): %s %s %s ",
>> 237 str1, str5, str15);
>> 238
>> 239 sos_load_get_uload(&load1, &load5, &load15);
>> 240 sos_load_to_string(str1, load1);
>> 241 sos_load_to_string(str5, load5);
>> 242 sos_load_to_string(str15, load15);
>> 243 sos_x86_videomem_printf(17, 34,
>> 244 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 245 "User: %s %s %s ",
>> 246 str1, str5, str15);
>> 247
>> 248 sos_load_get_uratio(&load1, &load5, &load15);
>> 249 sos_load_to_string(str1, load1);
>> 250 sos_load_to_string(str5, load5);
>> 251 sos_load_to_string(str15, load15);
>> 252 sos_x86_videomem_printf(18, 34,
>> 253 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 254 "User CPU %%: %s %s %s ",
>> 255 str1, str5, str15);
>> 256
>> 257
>> 258 sos_load_get_sratio(&load1, &load5, &load15);
>> 259 sos_load_to_string(str1, load1);
>> 260 sos_load_to_string(str5, load5);
>> 261 sos_load_to_string(str15, load15);
>> 262 sos_x86_videomem_printf(19, 34,
>> 263 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 264 "Kernel CPU %% (+ Idle): %s %s %s ",
>> 265 str1, str5, str15);
>> 266 sos_restore_IRQs(flags);
>> 267 }
>> 268 }
>> 269
>> 270
>> 271
>> 272
>> 273
>> 274 static sos_ret_t
>> 275 start_init(struct sos_fs_manager_instance * rootfs)
>> 276 {
>> 277 sos_ret_t retval;
>> 278 struct sos_umem_vmm_as *as_init;
>> 279 struct sos_process *proc_init;
>> 280 struct sos_thread *new_thr;
>> 281 sos_uaddr_t ustack, start_uaddr;
>> 282 struct sos_fs_opened_file * init_root, * init_cwd, * unused_of;
>> 283
>> 284
>> 285 proc_init = sos_process_create("init", FALSE);
>> 286 if (! proc_init)
>> 287 return -SOS_ENOMEM;
>> 288 as_init = sos_process_get_address_space(proc_init);
137 289
138 <<
139 void bn_del(big_number_t * bn) <<
140 { <<
141 struct digit *d; <<
142 290
143 list_collapse(*bn, d) !! 291
>> 292
>> 293
>> 294
>> 295
>> 296 retval = sos_fs_new_opened_file(proc_init, rootfs->root,
>> 297 SOS_FS_OPEN_READ | SOS_FS_OPEN_WRITE,
>> 298 & init_root);
>> 299 if (SOS_OK != retval)
144 { 300 {
145 sos_kfree((sos_vaddr_t)d); !! 301 sos_process_unref(proc_init);
>> 302 return -SOS_ENOENT;
146 } 303 }
147 } <<
148 304
149 !! 305
150 !! 306
151 void bn_shift(big_number_t *bn, int shift) !! 307 retval = sos_fs_duplicate_opened_file(init_root, proc_init,
152 { !! 308 & init_cwd);
153 for ( ; shift > 0 ; shift --) !! 309 if (SOS_OK != retval)
154 { 310 {
155 bn_push_lsd(bn, 0); !! 311 sos_fs_close(init_root);
>> 312 sos_process_unref(proc_init);
>> 313 return -SOS_ENOENT;
156 } 314 }
157 } <<
158 <<
159 315
160 !! 316
161 void bn_print_bochs(const big_number_t bn) !! 317 if ( ( SOS_OK != sos_process_chroot(proc_init, init_root, & unused_of) )
162 { !! 318 || ( SOS_OK != sos_process_chdir(proc_init, init_cwd, & unused_of) ) )
163 int nb_elts; <<
164 const struct digit *d; <<
165 <<
166 if (list_is_empty(bn)) <<
167 sos_bochs_printf("0"); <<
168 else <<
169 list_foreach(bn, d, nb_elts) <<
170 sos_bochs_printf("%d", d->value); <<
171 } <<
172 <<
173 <<
174 void bn_print_console(unsigned char row, unsig <<
175 unsigned char attribute, <<
176 const big_number_t bn, <<
177 int nb_decimals) <<
178 { <<
179 if (list_is_empty(bn)) <<
180 sos_x86_videomem_printf(row, col, attribut <<
181 else <<
182 { 319 {
183 int nb_elts; !! 320 sos_fs_close(init_root);
184 const struct digit *d; !! 321 sos_fs_close(init_cwd);
185 unsigned char x = col; !! 322 sos_process_chroot(proc_init, NULL, & unused_of);
186 !! 323 sos_process_chdir(proc_init, NULL, & unused_of);
187 list_foreach(bn, d, nb_elts) !! 324 sos_process_unref(proc_init);
188 { !! 325 return -SOS_ENOENT;
189 if (nb_elts == 0) <<
190 { <<
191 sos_x86_videomem_printf(row, x, <<
192 x += 2; <<
193 } <<
194 else if (nb_elts < nb_decimals) <<
195 { <<
196 sos_x86_videomem_printf(row, x, <<
197 x ++; <<
198 } <<
199 } <<
200 <<
201 sos_x86_videomem_printf(row, x, attribut <<
202 } 326 }
203 } <<
204 327
205 !! 328
206 !! 329 start_uaddr = sos_binfmt_elf32_map(as_init, "init");
207 big_number_t bn_add (const big_number_t bn1, c !! 330 if (0 == start_uaddr)
208 { <<
209 big_number_t retval; <<
210 const struct digit *d1, *d2; <<
211 sos_bool_t bn1_end = FALSE, bn2_end = FALSE <<
212 char carry = 0; <<
213 <<
214 list_init(retval); <<
215 d1 = list_get_tail(bn1); <<
216 bn1_end = list_is_empty(bn1); <<
217 d2 = list_get_tail(bn2); <<
218 bn2_end = list_is_empty(bn2); <<
219 do <<
220 { <<
221 if (! bn1_end) <<
222 carry += d1->value; <<
223 if (! bn2_end) <<
224 carry += d2->value; <<
225 <<
226 bn_push_msd(&retval, carry % 10); <<
227 carry /= 10; <<
228 <<
229 if (! bn1_end) <<
230 d1 = d1->prev; <<
231 if (! bn2_end) <<
232 d2 = d2->prev; <<
233 if (d1 == list_get_tail(bn1)) <<
234 bn1_end = TRUE; <<
235 if (d2 == list_get_tail(bn2)) <<
236 bn2_end = TRUE; <<
237 } <<
238 while (!bn1_end || !bn2_end); <<
239 <<
240 if (carry > 0) <<
241 { 331 {
242 bn_push_msd(&retval, carry); !! 332 sos_process_unref(proc_init);
>> 333 return -SOS_ENOENT;
243 } 334 }
244 335
245 return retval; !! 336
246 } !! 337 ustack = (SOS_PAGING_TOP_USER_ADDRESS - SOS_DEFAULT_USER_STACK_SIZE) + 1;
247 !! 338 retval = sos_dev_zero_map(as_init, &ustack, SOS_DEFAULT_USER_STACK_SIZE,
248 !! 339 SOS_VM_MAP_PROT_READ | SOS_VM_MAP_PROT_WRITE,
249 !! 340 0);
250 big_number_t bn_muli (const big_number_t bn, c !! 341 if (SOS_OK != retval)
251 { <<
252 big_number_t retval; <<
253 int nb_elts; <<
254 char carry = 0; <<
255 const struct digit *d; <<
256 <<
257 list_init(retval); <<
258 list_foreach_backward(bn, d, nb_elts) <<
259 { 342 {
260 carry += d->value * digit; !! 343 sos_process_unref(proc_init);
261 bn_push_msd(&retval, carry % 10); !! 344 return -SOS_ENOMEM;
262 carry /= 10; <<
263 } 345 }
264 346
265 if (carry > 0) !! 347
>> 348 new_thr = sos_create_user_thread(NULL,
>> 349 proc_init,
>> 350 start_uaddr,
>> 351 0, 0,
>> 352 ustack + SOS_DEFAULT_USER_STACK_SIZE - 4,
>> 353 SOS_SCHED_PRIO_TS_LOWEST);
>> 354 if (! new_thr)
266 { 355 {
267 bn_push_msd(&retval, carry); !! 356 sos_process_unref(proc_init);
>> 357 return -SOS_ENOMEM;
268 } 358 }
269 359
270 return retval; !! 360 sos_process_unref(proc_init);
>> 361 return SOS_OK;
271 } 362 }
272 363
273 364
274 !! 365
275 big_number_t bn_mult(const big_number_t bn1, c !! 366
276 { !! 367
277 int shift = 0; !! 368 void sos_main(unsigned long magic, unsigned long arg)
278 big_number_t retval; <<
279 int nb_elts; <<
280 struct digit *d; <<
281 <<
282 list_init(retval); <<
283 list_foreach_backward(bn2, d, nb_elts) <<
284 { <<
285 big_number_t retmult = bn_muli(bn1, d->v <<
286 big_number_t old_retval = retval; <<
287 bn_shift(& retmult, shift); <<
288 retval = bn_add(old_retval, retmult); <<
289 bn_del(& retmult); <<
290 bn_del(& old_retval); <<
291 shift ++; <<
292 } <<
293 <<
294 return retval; <<
295 } <<
296 <<
297 <<
298 <<
299 big_number_t bn_fact(unsigned long int v) <<
300 { <<
301 unsigned long int i; <<
302 big_number_t retval = bn_new(1); <<
303 for (i = 1 ; i <= v ; i++) <<
304 { <<
305 big_number_t I = bn_new(i); <<
306 big_number_t tmp = bn_mult(retval, I); <<
307 sos_x86_videomem_printf(4, 0, <<
308 SOS_X86_VIDEO_BG <<
309 "%d! = ", (int)i <<
310 bn_print_console(4, 8, SOS_X86_VIDEO_BG_ <<
311 tmp, 55); <<
312 bn_del(& I); <<
313 bn_del(& retval); <<
314 retval = tmp; <<
315 } <<
316 <<
317 return retval; <<
318 } <<
319 <<
320 <<
321 void bn_test() <<
322 { <<
323 big_number_t bn = bn_fact(1000); <<
324 sos_bochs_printf("1000! = "); <<
325 bn_print_bochs(bn); <<
326 sos_bochs_printf("\n"); <<
327 <<
328 } <<
329 <<
330 <<
331 <<
332 void sos_main(unsigned long magic, unsigned lo <<
333 { 369 {
334 unsigned i; 370 unsigned i;
335 sos_paddr_t sos_kernel_core_base_paddr, sos_ 371 sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
>> 372 struct sos_time tick_resolution;
>> 373 struct sos_fs_manager_instance * rootfs;
336 374
337 !! 375
338 !! 376 unsigned long int upper_mem = 0;
339 <<
340 multiboot_info_t *mbi; <<
341 mbi = (multiboot_info_t *) addr; <<
342 377
343 378
344 sos_bochs_setup(); 379 sos_bochs_setup();
345 380
346 sos_x86_videomem_setup(); 381 sos_x86_videomem_setup();
347 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE); 382 sos_x86_videomem_cls(SOS_X86_VIDEO_BG_BLUE);
348 383
349 384
350 if (magic == MULTIBOOT_BOOTLOADER_MAGIC) 385 if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
351 !! 386 {
352 sos_x86_videomem_printf(1, 0, !! 387
353 SOS_X86_VIDEO_FG_Y !! 388
354 "Welcome From GRUB !! 389
355 "SOS", ',', !! 390 multiboot_info_t *mbi = (multiboot_info_t *) arg;
356 (unsigned)(mbi->me !! 391
357 (unsigned)mbi->mem !! 392
>> 393
>> 394
>> 395
>> 396 upper_mem = mbi->mem_upper;
>> 397 sos_x86_videomem_printf(1, 0,
>> 398 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 399 "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
>> 400 "SOS article 8", ',',
>> 401 (unsigned)(upper_mem >> 10) + 1,
>> 402 (unsigned)upper_mem);
>> 403 }
>> 404 else if (magic == 0x42244224)
>> 405 {
>> 406
>> 407 upper_mem = arg;
>> 408 sos_x86_videomem_printf(1, 0,
>> 409 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
>> 410 "Welcome to %s%c RAM is %dMB (upper mem = 0x%x kB)",
>> 411 "SOS article 8", ',',
>> 412 (unsigned)(upper_mem >> 10) + 1,
>> 413 (unsigned)upper_mem);
>> 414 }
358 else 415 else
359 !! 416
360 sos_x86_videomem_printf(1, 0, 417 sos_x86_videomem_printf(1, 0,
361 SOS_X86_VIDEO_FG_Y 418 SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
362 "Welcome to SOS"); !! 419 "Welcome to SOS article 8");
363 420
364 sos_bochs_putstring("Message in a bochs\n"); !! 421 sos_bochs_putstring("Message in a bochs: This is SOS article 8.\n");
365 422
366 423
367 sos_gdt_setup(); !! 424 sos_gdt_subsystem_setup();
368 sos_idt_setup(); !! 425 sos_idt_subsystem_setup();
369 426
370 427
371 sos_exceptions_setup(); !! 428 sos_exception_subsystem_setup();
372 sos_irq_setup(); !! 429 sos_irq_subsystem_setup();
373 430
374 431
375 sos_i8254_set_frequency(100); 432 sos_i8254_set_frequency(100);
376 433
>> 434
>> 435
>> 436 tick_resolution = (struct sos_time) { .sec=0, .nanosec=10000000UL };
>> 437 sos_time_subsysem_setup(& tick_resolution);
377 438
378 !! 439
379 if (magic != MULTIBOOT_BOOTLOADER_MAGIC) !! 440 if (upper_mem == 0)
380 { 441 {
381 sos_x86_videomem_putstring(20, 0, 442 sos_x86_videomem_putstring(20, 0,
382 SOS_X86_VIDEO 443 SOS_X86_VIDEO_FG_LTRED
383 | SOS_X86_V 444 | SOS_X86_VIDEO_BG_BLUE
384 | SOS_X86_V 445 | SOS_X86_VIDEO_FG_BLINKING,
385 "I'm not load !! 446 "I don't know RAM size ! Load me with Grub...");
386 447
387 for (;;) 448 for (;;)
388 continue; 449 continue;
389 } 450 }
390 451
>> 452
>> 453
>> 454
>> 455
391 456
392 sos_irq_set_routine(SOS_IRQ_TIMER, 457 sos_irq_set_routine(SOS_IRQ_TIMER,
393 clk_it); !! 458 clk_it);
394 !! 459
395 !! 460
396 asm volatile ("sti\n"); !! 461
397 !! 462
398 !! 463
399 !! 464 SOS_ASSERT_FATAL(SOS_OK
400 sos_physmem_setup((mbi->mem_upper<<10) + (1< !! 465 == sos_physmem_subsystem_setup((upper_mem<<10) + (1<<20),
401 & sos_kernel_core_base_pad !! 466 &sos_kernel_core_base_paddr,
402 & sos_kernel_core_top_padd !! 467 &sos_kernel_core_top_paddr));
403 468
404 469
405 470
406 471
407 472
408 473
409 474
410 if (sos_paging_setup(sos_kernel_core_base_pa !! 475 SOS_ASSERT_FATAL(SOS_OK ==
411 sos_kernel_core_top_pad !! 476 sos_paging_subsystem_setup(sos_kernel_core_base_paddr,
412 sos_bochs_printf("Could not setup paged me !! 477 sos_kernel_core_top_paddr));
413 sos_x86_videomem_printf(2, 0, !! 478
414 SOS_X86_VIDEO_FG_YEL !! 479
415 "Paged-memory mode i !! 480 sos_exception_set_routine(SOS_EXCEPT_PAGE_FAULT,
>> 481 pgflt_ex);
416 482
>> 483
>> 484
>> 485
417 486
418 if (sos_kmem_vmm_setup(sos_kernel_core_base_ !! 487 if (sos_kmem_vmm_subsystem_setup(sos_kernel_core_base_paddr,
419 sos_kernel_core_top_p !! 488 sos_kernel_core_top_paddr,
>> 489 bootstrap_stack_bottom,
>> 490 bootstrap_stack_bottom
>> 491 + bootstrap_stack_size))
420 sos_bochs_printf("Could not setup the Kern 492 sos_bochs_printf("Could not setup the Kernel virtual space allocator\n");
421 493
422 if (sos_kmalloc_setup()) !! 494 if (sos_kmalloc_subsystem_setup())
423 sos_bochs_printf("Could not setup the Kmal 495 sos_bochs_printf("Could not setup the Kmalloc subsystem\n");
424 496
425 !! 497
426 bn_test(); !! 498
>> 499
>> 500 sos_mm_context_subsystem_setup();
>> 501
>> 502
>> 503
>> 504
>> 505 sos_cpu_context_subsystem_setup();
>> 506
>> 507
>> 508
>> 509
>> 510 sos_swintr_subsystem_setup();
>> 511
427 512
428 !! 513
429 for (;;) !! 514
430 continue; !! 515
>> 516
>> 517
>> 518 sos_thread_subsystem_setup(bootstrap_stack_bottom,
>> 519 bootstrap_stack_size);
>> 520
>> 521
>> 522 sos_sched_subsystem_setup();
>> 523
>> 524
>> 525 SOS_ASSERT_FATAL(sos_create_kernel_thread("idle", idle_thread, NULL,
>> 526 SOS_SCHED_PRIO_TS_LOWEST) != NULL);
>> 527
>> 528
>> 529 sos_load_subsystem_setup();
>> 530
>> 531
>> 532 SOS_ASSERT_FATAL(sos_create_kernel_thread("stat_thread", stat_thread,
>> 533 NULL,
>> 534 SOS_SCHED_PRIO_TS_LOWEST) != NULL);
431 535
432 return; !! 536
>> 537
>> 538
>> 539
>> 540 sos_umem_vmm_subsystem_setup();
>> 541 sos_dev_zero_subsystem_setup();
>> 542
>> 543
>> 544
>> 545
>> 546 sos_process_subsystem_setup();
>> 547
>> 548
>> 549
>> 550
>> 551 asm volatile ("sti\n");
>> 552
>> 553
>> 554 SOS_ASSERT_FATAL(SOS_OK == sos_fs_virtfs_subsystem_setup());
>> 555 SOS_ASSERT_FATAL(SOS_OK == sos_fs_subsystem_setup(NULL,
>> 556 "virtfs",
>> 557 NULL,
>> 558 & rootfs));
>> 559
>> 560
>> 561
>> 562
>> 563 start_init(rootfs);
>> 564
>> 565
>> 566
>> 567
>> 568
>> 569
>> 570
>> 571
>> 572
>> 573
>> 574
>> 575
>> 576 sos_bochs_printf("Bye from primary thread !\n");
>> 577 sos_thread_exit();
>> 578 SOS_FATAL_ERROR("No trespassing !");
433 } 579 }