int arch_init(void*);
int sched_init(void);
-extern void io_main(void);
-extern void _stdio(void);
-extern void _net(void);
-extern int vga_main(int, char**);
-extern int kbd_main(int, char**);
-
extern struct initfs initfs;
-void _print_mptbl(void *tbl)
-{
- u32_t *pmcp;
- u16_t entries;
-
- dbg_printf("MP: 0x%08x [0x%08x]\n", (u32_t)tbl, *(u32_t*)tbl);
-
- pmcp = (u32_t*)*(u32_t*)(tbl + 4);
-
- if(*pmcp == 0x504d4350 || *pmcp == 0x50434d50) {
- entries = *(u16_t*)(pmcp + 1);
-
- dbg_printf("PMCP: 0x%08x, l: %hu, [0x%08x]\n",
- pmcp, entries, *pmcp);
- tbl += 0x2c;
-
- while(entries) {
- u8_t type;
-
- type = *(u8_t*)tbl;
-
- switch(type) {
- case 0: /* processor entry */
- tbl += 0x14;
- break;
- case 1: /* bus entry */
- tbl += 8;
- break;
- case 2: /* IO APIC entry */
- tbl += 8;
- break;
- case 3: /* IO Interrupt entry */
- dbg_printf("[INT] T: 0x%02hhx SRC: 0x%02hhx "
- "IRQ: 0x%02hhx DEST: 0x%02hhx "
- "DINT: 0x%02hhx\n",
- *((u8_t*)tbl + 1), *((u8_t*)tbl + 4),
- *((u8_t*)tbl + 5), *((u8_t*)tbl + 6),
- *((u8_t*)tbl + 7));
- tbl += 8;
- break;
- case 4: /* Local Interrupt assignment entry */
- tbl += 8;
- break;
- default:
- dbg_printf("Unsupported entry\n");
- entries = 1;
- break;
- }
-
- entries--;
- }
- }
-
- return;
-}
-
static void _idle(void)
{
/*
char env0[16];
char *envp[3];
- snprintf(argv0, sizeof(argv0), "%s", initfs.ifs_entries[i].ife_name);
+ snprintf(argv0, sizeof(argv0), "%s",
+ initfs.ifs_entries[i].ife_name);
snprintf(argv1, sizeof(argv1), "--verbose");
argv[0] = argv0;
process_t *proc;
int err;
- dbg_printf("Corax 0.1 - As the Crow flies\n");
- dbg_printf("(C) 2020 Matthias Kruk <matt@corax.cc>\n");
- dbg_printf("Compiled on %s at %s\n", __DATE__, __TIME__);
-
-/*
- void *ptr;
+ dbg_printf("Corax 0.1 - As the Crow flies\n");
+ dbg_printf("(C) 2020 Matthias Kruk <matt@corax.cc>\n");
+ dbg_printf("Compiled on %s at %s\n", __DATE__, __TIME__);
- for(ptr = (void*)0xd0000; ptr < (void*)0xffffd; ptr++) {
- if(*(u32_t*)ptr == 0x5f504d5f || *(u32_t*)ptr == 0x5f4d505f) {
- _print_mptbl(ptr);
- }
- }
-
- for(ptr = (void*)0x9fc00; ptr <= (void*)0x9fffc; ptr++) {
- if(*(u32_t*)ptr == 0x5f504d5f || *(u32_t*)ptr == 0x5f4d505f) {
- _print_mptbl(ptr);
- }
- }
-
- for(ptr = NULL; ptr <= (void*)0x1000000; ptr++) {
- if(*(u32_t*)ptr == 0x5f504d5f || *(u32_t*)ptr == 0x5f4d505f) {
- _print_mptbl(ptr);
- }
- }
- */
-
- arch_init(mb_info);
-#if 0
- {
- u64_t capabilities = cpu_get_capabilities();
-
- dbg_printf("CPUID.01h = 0x%016llx\n", capabilities);
- }
-#endif
-
-#if 0
- {
- volatile register u64_t sysenter, sysexit;
-
- sysenter = cpu_timestamp();
- asm volatile("int $0xCC");
- sysexit = cpu_timestamp();
-
- dbg_printf("Syscall took %llu cycles\n", sysexit - sysenter);
- }
-#endif
+ arch_init(mb_info);
err = sched_init();
PANIC("Failed to initialize scheduler\n");
}
- dbg_printf("initfs has %01u entries\n", initfs.ifs_num_entries);
-
- for(err = 0; err < initfs.ifs_num_entries; err++) {
- dbg_printf("initfs[%01u] = { \"%s\", 0x%08x : 0x%08x }\n",
- err,
- initfs.ifs_entries[err].ife_name,
- initfs.ifs_entries[err].ife_base,
- initfs.ifs_entries[err].ife_limit);
- }
-
+ /* spawn idle process - pid 0 */
err = process_create(&proc, 0, (void*)_idle);
if(err < 0) {
PANIC("Could not spawn idle process\n");
}
+ /* spawn init process - pid 1 */
err = process_create(&proc, 3, (void*)_init);
if(err < 0) {
}
/*
- * Disable early printf - all further output should
- * be printed through the VGA process that is spawned
- * by init.
+ * Disable early printf - all further output should be printed through
+ * the VGA process that is spawned by init.
*/
-/* dbg_printf_disable(); */
+ /* dbg_printf_disable(); */
sched_tick();
- dbg_printf("This should not get printed\n");
-
while(1) {
asm volatile("hlt");
}