Пример #1
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
	}
}
Пример #5
0
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 ");

	}
}
Пример #6
0
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;
	}
}
Пример #7
0
PRIVATE int sef_cb_init_fresh(int type, sef_init_info_t *info)
{
	init_acpi();

	return OK;
}
Пример #8
0
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);
}
Пример #9
0
static void
acpiinit(void)
{
	init_acpi();
}
Пример #10
0
static void
acpireset(void)
{
	init_acpi();
}
Пример #11
0
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();
}