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