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