int module_install(void) { nodes=0; api=0; primary = (struct ata_controller *)kmalloc(sizeof(struct ata_controller)); secondary = (struct ata_controller *)kmalloc(sizeof(struct ata_controller)); int res = init_ata_device(); if(res) { if(res < 0) kprintf("Error in init'ing ATA controller\n"); kfree(primary); kfree(secondary); if(nodes) kfree(nodes); return EEXIST; } irq_primary = cpu_interrupt_register_handler(32 + ATA_PRIMARY_IRQ, ata_irq_handler); irq_secondary = cpu_interrupt_register_handler(32 + ATA_SECONDARY_IRQ, ata_irq_handler); api = dm_set_available_block_device(atapi_rw_main, 2048, ioctl_atapi, atapi_rw_main_multiple, 0); dm_set_block_device(3, ata_rw_main, 512, ioctl_ata, ata_rw_multiple, 0); primary->wait = mutex_create(0, 0); secondary->wait = mutex_create(0, 0); primary->id=0; secondary->id=1; init_ata_controller(primary); init_ata_controller(secondary); return 0; }
void mm_init(struct multiboot *m) { printk(KERN_DEBUG, "[mm]: Setting up Memory Management...\n"); arch_mm_virtual_init(&kernel_context); cpu_interrupt_register_handler (14, &arch_mm_page_fault_handle); pmm_buddy_init(); process_memorymap(m); slab_init(MEMMAP_KMALLOC_START, MEMMAP_KMALLOC_END); set_ksf(KSF_MMU); /* hey, look at that, we have happy memory times! */ mm_reclaim_init(); for(size_t i=0;i<=(sizeof(struct pagedata) * maximum_page_number) / mm_page_size(1);i++) { mm_virtual_map(MEMMAP_FRAMECOUNT_START + i * mm_page_size(1), mm_physical_allocate(mm_page_size(1), true), PAGE_PRESENT | PAGE_WRITE, mm_page_size(1)); } frames = (struct pagedata *)(MEMMAP_FRAMECOUNT_START); printk(0, "[mm]: allocated %d KB for page-frame counting.\n", sizeof(struct pagedata) * maximum_page_number / 1024); #if CONFIG_MODULES loader_add_kernel_symbol(slab_kmalloc); loader_add_kernel_symbol(slab_kfree); loader_add_kernel_symbol(mm_virtual_map); loader_add_kernel_symbol(mm_virtual_getmap); loader_add_kernel_symbol(mm_allocate_dma_buffer); loader_add_kernel_symbol(mm_free_dma_buffer); loader_add_kernel_symbol(mm_physical_allocate); loader_add_kernel_symbol(mm_physical_deallocate); #endif }
void arch_cpu_timer_install(int hz) { cpu_interrupt_register_handler(IRQ0, &tm_timer_handler); uint32_t divisor = 1193180 / hz; outb(0x43, 0x36); uint8_t l = (uint8_t)(divisor & 0xFF); uint8_t h = (uint8_t)( (divisor>>8) & 0xFF ); outb(0x40, l); outb(0x40, h); }
int module_install(void) { printk(1, "[keyboard]: Driver loading\n"); spinlock_create(&lock); irqk = cpu_interrupt_register_handler(IRQ1, __int_handle); flush_port(); keyboard_major = dm_device_register(&kbkd); sys_mknod("/dev/keyboard", S_IFCHR | 0644, GETDEV(keyboard_major, 0)); printk(1, "[keyboard]: initialized keyboard\n"); return 0; }
void mm_init(struct multiboot *m) { printk(KERN_DEBUG, "[MM]: Setting up Memory Management...\n"); arch_mm_virtual_init(&kernel_context); cpu_interrupt_register_handler(14, &arch_mm_page_fault_handle); pmm_buddy_init(); process_memorymap(m); slab_init(MEMMAP_KMALLOC_START, MEMMAP_KMALLOC_END); set_ksf(KSF_MMU); // Memory init, check! mm_reclaim_init(); for(size_t i = 0; i <= (sizeof(struct pagedata) * maximum_page_number) / mm_page_size(1); i++) { mm_virtual_map(MEMMAP_FRAMECOUNT_START + i * mm_page_size(1), mm_physical_allocate(mm_page_size(1), true), PAGE_PRESENT | PAGE_WRITE, mm_page_size(1)); } frames = (struct pagedata *)(MEMMAP_FRAMECOUNT_START); printk(0, "[MM]: allocated %d KB for page-frame counting.\n", sizeof(struct pagedata) * maximum_page_number / 1024); }