void kmain(uint32_t magic) { if ( magic != 0x2BADB002 ) { print("Something went not according to specs."); exit(); } kclear(); char printbuf[256]; snprintf(printbuf, 256, "kernel loaded at %p, ends at %p\n", kernel_start, kernel_end); print(printbuf); print("initializing GDT...\n"); init_gdt(); print("initializing IDT...\n"); init_idt(); print("initializing physical memory manager...\n"); init_pmm(); if (pmm_is_free((paddr_t)kernel_start) || pmm_is_free((paddr_t)kernel_end)) panic("kernel memory is not reserved"); if (pmm_is_free((paddr_t)0xb8000)) panic("video ram is not reserved"); print("initializing virtual memory manager...\n"); init_vmm(); print("initializing PICs...\n"); init_pics(0x20, 0x28); print("initializing keyboard...\n"); init_keyboard(); print("enabling keyboard interrupts...\n"); enable_irq(1); send_eoi(0); __asm__ __volatile__ ("sti"); print("initializing symbol table...\n"); init_stacktrace(); print("initializing timer...\n"); init_timer(10); enable_irq(0); print("initializing speaker...\n"); print("initializing ACPI...\n"); init_acpi(); print("reclaiming ACPI memory...\n"); acpi_reclaim_memory(); print("initializing shell...\n"); init_shell_builtins(); beep(100, 100); cprint("Hello OS\n", 2); update_cursor(); shell(); }
static int sef_cb_init_fresh(int type, sef_init_info_t *info) { int r; init_acpi(); /* Let SEF know about ACPI special cache word. */ r = sef_llvm_add_special_mem_region((void*)0xCACACACA, 1, "%MMAP_CACHE_WORD"); if(r < 0) { printf("acpi: sef_llvm_add_special_mem_region failed %d\n", r); } /* XXX To-do: acpi requires custom state transfer handlers for * unions acpi_operand_object and acpi_generic_state (and nested unions) * for generic state transfer to work correctly. */ return OK; }
int parse_acpi(s_acpi * acpi) { int ret_val; init_acpi(acpi); /* Let's seach for RSDP table */ if ((ret_val = search_rsdp(acpi)) != RSDP_TABLE_FOUND) return ret_val; /* Let's seach for RSDT table * That's not a big deal not having it, XSDT is far more relevant */ parse_rsdt(&acpi->rsdt); if (parse_xsdt(acpi) != XSDT_TABLE_FOUND) { DEBUG_PRINT(("XSDT Detection failed\n")); for (int table=0; table <acpi->rsdt.entry_count; table++) { parse_header((uint64_t *)acpi->rsdt.entry[table],acpi); } } return ACPI_FOUND; }
static void w83627ehg_init(struct device *dev) { struct resource *res0; if (!dev->enabled) return; switch (dev->path.pnp.device) { case W83627EHG_KBC: pc_keyboard_init(NO_AUX_DEVICE); break; case W83627EHG_HWM: res0 = find_resource(dev, PNP_IDX_IO0); #define HWM_INDEX_PORT 5 init_hwm(res0->base + HWM_INDEX_PORT); break; case W83627EHG_ACPI: init_acpi(dev); break; } }
void x86_kernel_main(struct multiboot *multiboot) { init_output(); init_paging(multiboot); init_acpi(); init_descriptor_tables(); kprint("Stack pointer: "); kprint_hexnl(read_esp()); kprint("Mod count: "); kprint_hexnl(multiboot->mods_count); kprint("Kernel phys end : "); kprint_hexnl((u32)&__phys_end); kprint("Mod addr start : "); kprint_hexnl(*(u32*)(phys_to_virt(multiboot->mods_addr))); kprint("Mod addr end : "); kprint_hexnl(*(u32*)(phys_to_virt(multiboot->mods_addr) + 4)); //init_tasking(); kernel_main(); if (multiboot->mods_count == 13) { kprint("Executing module..\n"); typedef void (*module_fun)(void); u32 modaddr = phys_to_virt(multiboot->mods_addr); modaddr = phys_to_virt(*(u32*)modaddr); //kprint_hexnl(modaddr); //kprint_hexnl(*(u32*)modaddr); module_fun module = (module_fun)modaddr; module(); kprint("Modadr is "); } }
static void w83627ehg_init(device_t dev) { struct superio_winbond_w83627ehg_config *conf = dev->chip_info; struct resource *res0; if (!dev->enabled) return; switch(dev->path.pnp.device) { case W83627EHG_KBC: pc_keyboard_init(&conf->keyboard); break; case W83627EHG_HWM: res0 = find_resource(dev, PNP_IDX_IO0); #define HWM_INDEX_PORT 5 init_hwm(res0->base + HWM_INDEX_PORT); break; case W83627EHG_ACPI: init_acpi(dev); break; } }
PRIVATE int sef_cb_init_fresh(int type, sef_init_info_t *info) { init_acpi(); return OK; }
void init(uint64_t loader, struct unfold64_objl *object_list, struct unfold64_mmap *memory_map) { // parse configuration for (size_t i = 0; i < object_list->count; i++) { if (!strcmp(object_list->entry[i].name, "/boot/pconf")) { config_parse((char*) object_list->entry[i].base); break; } } // initialize the physical memory manager pmm_init(memory_map); // initialize paging pcx_init(); // initialize interrupt handling idt_init(); // allocate the CCB for processor 0 ccb_new(); // initialize LAPIC timer struct ccb *ccb = ccb_get_self(); ccb->lapic->destination_format = 0xFFFFFFFF; ccb->lapic->logical_destination = (ccb->lapic->logical_destination & 0xFFFFFF) | 1; ccb->lapic->lvt_timer = 0x10000; ccb->lapic->lvt_performance_monitoring_counters = 0x400; ccb->lapic->lvt_lint0 = 0x10000; ccb->lapic->lvt_lint1 = 0x10000; ccb->lapic->task_priority = 0; ccb->lapic->spurious_interrupt_vector = 33 | 0x100; ccb->lapic->timer_initial_count = 100000; // roughly 1 KHz ccb->lapic->lvt_timer = 32 | 0x20000; ccb->lapic->timer_divide_configuration = 3; // 16 // initialize interrupt routes // pinion (pagefault, zombie, etc.) interrupt vector page pinion_vector_page_vtable.on_reset = pinion_on_reset; interrupt_add_vector_page(0x0080, &pinion_vector_page_vtable); // IRQ interrupt vector page irq_vector_page_vtable.on_fire = irq_on_fire; irq_vector_page_vtable.on_reset = irq_on_reset; interrupt_add_vector_page(0x0100, &irq_vector_page_vtable); // initialize ACPI (for IRQ routing info) init_acpi(); // allocate initial thread TCB and add to scheduler scheduler_add_tcb(tcb_new()); // schedule first thread scheduler_schedule(); // load kernel image load_kernel(object_list); }
static void acpiinit(void) { init_acpi(); }
static void acpireset(void) { init_acpi(); }
int main(int argc, char *argv[]) { errval_t err; // Parse CMD Arguments bool got_apic_id = false; bool do_video_init = false; vtd_force_off = false; for (int i = 1; i < argc; i++) { if(sscanf(argv[i], "apicid=%" PRIuPTR, &my_apic_id) == 1) { got_apic_id = true; } if (strcmp(argv[i], "video_init") == 0) { do_video_init = true; } else if (strncmp(argv[i], "vtd_force_off", strlen("vtd_force_off")) == 0) { vtd_force_off = true; } } if(got_apic_id == false) { fprintf(stderr, "Usage: %s APIC_ID\n", argv[0]); fprintf(stderr, "Wrong monitor version?\n"); return EXIT_FAILURE; } err = oct_init(); if (err_is_fail(err)) { USER_PANIC_ERR(err, "Initialize dist"); } //connect to the SKB ACPI_DEBUG("acpi: connecting to the SKB...\n"); skb_client_connect(); skb_execute("[pci_queries]."); err = setup_skb_info(); if (err_is_fail(err)) { USER_PANIC_ERR(err, "Populating SKB failed."); } err = init_allocators(); if (err_is_fail(err)) { USER_PANIC_ERR(err, "Init memory allocator"); } err = copy_bios_mem(); if (err_is_fail(err)) { USER_PANIC_ERR(err, "Copy BIOS Memory"); } int r = init_acpi(); assert(r == 0); buttons_init(); if (do_video_init) { video_init(); } start_service(); messages_handler_loop(); }