#include "idt.h" #include "memops.h" #include "interrupts/generic.h" #include "asm_inline.h" #include "kprintf.h" extern void asm_generic_interrupt(); idt_load idt_l; __attribute__((aligned(0x08))) uint64_t idt[512] = {0}; #define VNM(x) vector##x void fill_idt(); void init_idt() { /* for(int i = 0; i < 512; i+=2) { gate g = { // .target_offset = (uint64_t)asm_generic_interrupt, .target_offset = (uint64_t)vector1, .target_selector = 0x8, .ist = 0x0, .type = INT_INT, .dpl = 0x0, .p = true }; uint64_t converted_gate[2]; make_int_gate(&g, converted_gate); kmemcpy(&converted_gate, &idt[i], 2*sizeof(uint64_t)); } */ fill_idt(); /* kprintf("IDT ADDR: %p\n", idt); kprintf("INTERRUPT ADDR: %p\n", asm_generic_interrupt); */ idt_l.size = 256 * 2 * sizeof(uint64_t) - 1; idt_l.ptr = (uint64_t)(idt); lidt(&idt_l); } void make_call_gate(gate* g, uint64_t* rg) { uint32_t* srg = (uint32_t*)rg; // lower 64 rg[0] = 0x0; rg[1] = 0x0; srg[0] |= g->target_offset & 0xFFFF; srg[0] |= (g->target_selector & 0xFFFF) << 16; // srg[1] |= (g->ist & 0xFF); srg[1] |= (g->type & 0xFF ) << 8; srg[1] |= (g->dpl & 0xFF) << 13; srg[1] |= (g->p & 0xF) << 15; // <- this +16 (next field side is 61, so I did this wrong) <- this should offset by 47, to end in 48 srg[1] |= ((g->target_offset >> 16) & 0xFFFF) << 16; srg[2] |= ((g->target_offset >> 32) & 0xFFFFFFFF); } void make_int_gate(gate* g, uint64_t* rg) { uint32_t* srg = (uint32_t*)rg; // lower 64 rg[0] = 0x0; rg[1] = 0x0; srg[0] |= g->target_offset & 0xFFFF; srg[0] |= (g->target_selector & 0xFFFF) << 16; srg[1] |= (g->ist & 0xFF); srg[1] |= (g->type & 0xFF ) << 8; srg[1] |= (g->dpl & 0xFF) << 13; srg[1] |= (g->p & 0xF) << 15; // <- this +16 (next field side is 61, so I did this wrong) <- this should offset by 47, to end in 48 // srg[1] |= ((g->target_offset >> 16) & 0xFFFF) << 16; srg[1] |= g->target_offset & 0xFFFF0000; srg[2] |= ((g->target_offset >> 32) & 0xFFFFFFFF); } #define MKI(x) make_gate((uint64_t) vector##x, x) void make_gate(uint64_t vector, uint32_t i) { gate g = { // .target_offset = (uint64_t)asm_generic_interrupt, .target_offset = vector, .target_selector = 0x8, .ist = 0x0, .type = INT_INT, .dpl = 0x0, .p = true }; uint64_t converted_gate[2]; make_int_gate(&g, converted_gate); kmemcpy(&converted_gate, &idt[2*i], 2*sizeof(uint64_t)); } void fill_idt() { MKI(0); MKI(1); MKI(2); MKI(3); MKI(4); MKI(5); MKI(6); MKI(7); MKI(8); MKI(9); MKI(10); MKI(11); MKI(12); MKI(13); MKI(14); MKI(15); MKI(16); MKI(17); MKI(18); MKI(19); MKI(20); MKI(21); MKI(22); MKI(23); MKI(24); MKI(25); MKI(26); MKI(27); MKI(28); MKI(29); MKI(30); MKI(31); MKI(32); MKI(33); MKI(34); MKI(35); MKI(36); MKI(37); MKI(38); MKI(39); MKI(40); MKI(41); MKI(42); MKI(43); MKI(44); MKI(45); MKI(46); MKI(47); MKI(48); MKI(49); MKI(50); MKI(51); MKI(52); MKI(53); MKI(54); MKI(55); MKI(56); MKI(57); MKI(58); MKI(59); MKI(60); MKI(61); MKI(62); MKI(63); MKI(64); MKI(65); MKI(66); MKI(67); MKI(68); MKI(69); MKI(70); MKI(71); MKI(72); MKI(73); MKI(74); MKI(75); MKI(76); MKI(77); MKI(78); MKI(79); MKI(80); MKI(81); MKI(82); MKI(83); MKI(84); MKI(85); MKI(86); MKI(87); MKI(88); MKI(89); MKI(90); MKI(91); MKI(92); MKI(93); MKI(94); MKI(95); MKI(96); MKI(97); MKI(98); MKI(99); MKI(100); MKI(101); MKI(102); MKI(103); MKI(104); MKI(105); MKI(106); MKI(107); MKI(108); MKI(109); MKI(110); MKI(111); MKI(112); MKI(113); MKI(114); MKI(115); MKI(116); MKI(117); MKI(118); MKI(119); MKI(120); MKI(121); MKI(122); MKI(123); MKI(124); MKI(125); MKI(126); MKI(127); MKI(128); MKI(129); MKI(130); MKI(131); MKI(132); MKI(133); MKI(134); MKI(135); MKI(136); MKI(137); MKI(138); MKI(139); MKI(140); MKI(141); MKI(142); MKI(143); MKI(144); MKI(145); MKI(146); MKI(147); MKI(148); MKI(149); MKI(150); MKI(151); MKI(152); MKI(153); MKI(154); MKI(155); MKI(156); MKI(157); MKI(158); MKI(159); MKI(160); MKI(161); MKI(162); MKI(163); MKI(164); MKI(165); MKI(166); MKI(167); MKI(168); MKI(169); MKI(170); MKI(171); MKI(172); MKI(173); MKI(174); MKI(175); MKI(176); MKI(177); MKI(178); MKI(179); MKI(180); MKI(181); MKI(182); MKI(183); MKI(184); MKI(185); MKI(186); MKI(187); MKI(188); MKI(189); MKI(190); MKI(191); MKI(192); MKI(193); MKI(194); MKI(195); MKI(196); MKI(197); MKI(198); MKI(199); MKI(200); MKI(201); MKI(202); MKI(203); MKI(204); MKI(205); MKI(206); MKI(207); MKI(208); MKI(209); MKI(210); MKI(211); MKI(212); MKI(213); MKI(214); MKI(215); MKI(216); MKI(217); MKI(218); MKI(219); MKI(220); MKI(221); MKI(222); MKI(223); MKI(224); MKI(225); MKI(226); MKI(227); MKI(228); MKI(229); MKI(230); MKI(231); MKI(232); MKI(233); MKI(234); MKI(235); MKI(236); MKI(237); MKI(238); MKI(239); MKI(240); MKI(241); MKI(242); MKI(243); MKI(244); MKI(245); MKI(246); MKI(247); MKI(248); MKI(249); MKI(250); MKI(251); MKI(252); MKI(253); MKI(254); MKI(255); }