void set_all_irq_status(bool status) { if(status) { pic_set_mask(0xFFFF); } else { pic_set_mask(0); } }
void irq_set_mask(unsigned char irq, bool set) { uint16_t mask = pic_get_mask(); if( set ) { mask |= (1<<irq); } else { mask &= ~(1<<irq); } pic_set_mask(mask); }
void block_for_irq(int irq) { if((irq < 0) || (irq > 15)) return; waiting_for = irq; unsigned short mask = pic_get_mask(); set_all_irq_status(true); irq_set_mask(irq, false); while(true) { system_wait_for_interrupt(); if(waiting_for == -1) break; } pic_set_mask(mask); }
// main function loaded through loader.asm int kmain(multiboot_info_t* mbi, uint32_t magic) { (void)magic; /* TODO: check if multiboot loader magic number is correct */ gdt_init(); idt_init(); pic_init(); pic_set_mask(PIC1_KBD_IRQ, PIC_NO_IRQ); asm volatile("sti"); fb_enable_cursor(); clrscr(); printk(PRINTK_FB, "Cursor position: %u\n", fb_get_cursor()); printk(PRINTK_FB, "Cursor start: %h\n", (unsigned int)(fb_get_cursor_start())); printk(PRINTK_FB, "Cursor end: %h\n", (unsigned int)(fb_get_cursor_end())); printk(PRINTK_FB, "Frame buffer address: %h\n", fb_get_start_address()); print_memory_info(mbi); printk(PRINTK_FB, "bitsize - char: %u\n", sizeof(char)*8); printk(PRINTK_FB, "bitsize - short: %u\n", sizeof(short)*8); printk(PRINTK_FB, "bitsize - int: %u\n", sizeof(int)*8); printk(PRINTK_FB, "bitsize - long: %u\n", sizeof(long)*8); printk(PRINTK_FB, "sizeof page_entry_t: %u\n", sizeof(page_entry_t)); for (;;) { asm volatile("hlt"); } return 0; }