#include #include #include #include extern void load_idt(struct idt_pointer *idtp); struct idt_entry idt[256]; struct idt_pointer idtp; void init_idt_entry(size_t num, uint32_t offset, uint16_t selector, uint8_t type_attr) { idt[num].offset1=(uint16_t)(offset & 0xffff); idt[num].selector=selector; idt[num].zero=0; idt[num].type_attr=type_attr; idt[num].offset2=(uint16_t)((offset & 0xffff0000)>>16); } void add_idt_entry(size_t num, uint32_t offset) { init_idt_entry(num,offset,KERNEL_CODE,INTERRUPT_GATE_32); } void init_pic(void) { ioport_out(PIC1_COMMAND_PORT, 0x11); ioport_out(PIC2_COMMAND_PORT, 0x11); ioport_out(PIC1_DATA_PORT, 0x20); ioport_out(PIC2_DATA_PORT, 0x28); ioport_out(PIC1_DATA_PORT, 0x04); ioport_out(PIC2_DATA_PORT, 0x02); ioport_out(PIC1_DATA_PORT, 0x01); ioport_out(PIC2_DATA_PORT, 0x01); ioport_out(PIC1_DATA_PORT, 0xff); ioport_out(PIC2_DATA_PORT, 0xff); ioport_out(PIC1_DATA_PORT, 0xFC); } void init_idt_table(void) { init_pic(); add_idt_entry(0,(uint32_t)irq0); add_idt_entry(1,(uint32_t)irq1); add_idt_entry(2,(uint32_t)irq2); add_idt_entry(3,(uint32_t)irq3); add_idt_entry(4,(uint32_t)irq4); add_idt_entry(5,(uint32_t)irq5); add_idt_entry(6,(uint32_t)irq6); add_idt_entry(7,(uint32_t)irq7); add_idt_entry(8,(uint32_t)irq8); add_idt_entry(9,(uint32_t)irq9); add_idt_entry(10,(uint32_t)irq10); add_idt_entry(11,(uint32_t)irq11); add_idt_entry(12,(uint32_t)irq12); add_idt_entry(13,(uint32_t)irq13); add_idt_entry(14,(uint32_t)irq14); add_idt_entry(15,(uint32_t)irq15); add_idt_entry(16,(uint32_t)irq16); add_idt_entry(17,(uint32_t)irq17); add_idt_entry(18,(uint32_t)irq18); add_idt_entry(19,(uint32_t)irq19); add_idt_entry(20,(uint32_t)irq20); add_idt_entry(21,(uint32_t)irq21); add_idt_entry(22,(uint32_t)irq22); add_idt_entry(23,(uint32_t)irq23); add_idt_entry(24,(uint32_t)irq24); add_idt_entry(25,(uint32_t)irq25); add_idt_entry(26,(uint32_t)irq26); add_idt_entry(27,(uint32_t)irq27); add_idt_entry(28,(uint32_t)irq28); add_idt_entry(29,(uint32_t)irq29); add_idt_entry(30,(uint32_t)irq30); add_idt_entry(31,(uint32_t)irq31); add_idt_entry(32,(uint32_t)timer_irq); add_idt_entry(33,(uint32_t)keyboard_irq); add_idt_entry(34,(uint32_t)irq34); add_idt_entry(35,(uint32_t)irq35); add_idt_entry(36,(uint32_t)irq36); add_idt_entry(37,(uint32_t)irq37); add_idt_entry(38,(uint32_t)irq38); add_idt_entry(39,(uint32_t)irq39); add_idt_entry(40,(uint32_t)irq40); add_idt_entry(41,(uint32_t)irq41); add_idt_entry(42,(uint32_t)irq42); add_idt_entry(43,(uint32_t)irq43); add_idt_entry(44,(uint32_t)irq44); add_idt_entry(45,(uint32_t)irq45); add_idt_entry(46,(uint32_t)irq46); add_idt_entry(47,(uint32_t)irq47); add_idt_entry(48,(uint32_t)irq48); add_idt_entry(49,(uint32_t)irq49); add_idt_entry(50,(uint32_t)irq50); add_idt_entry(51,(uint32_t)irq51); add_idt_entry(52,(uint32_t)irq52); add_idt_entry(53,(uint32_t)irq53); add_idt_entry(54,(uint32_t)irq54); add_idt_entry(55,(uint32_t)irq55); add_idt_entry(56,(uint32_t)irq56); add_idt_entry(57,(uint32_t)irq57); add_idt_entry(58,(uint32_t)irq58); add_idt_entry(59,(uint32_t)irq59); add_idt_entry(60,(uint32_t)irq60); add_idt_entry(61,(uint32_t)irq61); add_idt_entry(62,(uint32_t)irq62); add_idt_entry(63,(uint32_t)irq63); add_idt_entry(64,(uint32_t)irq64); add_idt_entry(65,(uint32_t)irq65); add_idt_entry(66,(uint32_t)irq66); add_idt_entry(67,(uint32_t)irq67); add_idt_entry(68,(uint32_t)irq68); add_idt_entry(69,(uint32_t)irq69); add_idt_entry(70,(uint32_t)irq70); add_idt_entry(71,(uint32_t)irq71); add_idt_entry(72,(uint32_t)irq72); add_idt_entry(73,(uint32_t)irq73); add_idt_entry(74,(uint32_t)irq74); add_idt_entry(75,(uint32_t)irq75); add_idt_entry(76,(uint32_t)irq76); add_idt_entry(77,(uint32_t)irq77); add_idt_entry(78,(uint32_t)irq78); add_idt_entry(79,(uint32_t)irq79); add_idt_entry(80,(uint32_t)irq80); add_idt_entry(81,(uint32_t)irq81); add_idt_entry(82,(uint32_t)irq82); add_idt_entry(83,(uint32_t)irq83); add_idt_entry(84,(uint32_t)irq84); add_idt_entry(85,(uint32_t)irq85); add_idt_entry(86,(uint32_t)irq86); add_idt_entry(87,(uint32_t)irq87); add_idt_entry(88,(uint32_t)irq88); add_idt_entry(89,(uint32_t)irq89); add_idt_entry(90,(uint32_t)irq90); add_idt_entry(91,(uint32_t)irq91); add_idt_entry(92,(uint32_t)irq92); add_idt_entry(93,(uint32_t)irq93); add_idt_entry(94,(uint32_t)irq94); add_idt_entry(95,(uint32_t)irq95); add_idt_entry(96,(uint32_t)irq96); add_idt_entry(97,(uint32_t)irq97); add_idt_entry(98,(uint32_t)irq98); add_idt_entry(99,(uint32_t)irq99); add_idt_entry(100,(uint32_t)irq100); add_idt_entry(101,(uint32_t)irq101); add_idt_entry(102,(uint32_t)irq102); add_idt_entry(103,(uint32_t)irq103); add_idt_entry(104,(uint32_t)irq104); add_idt_entry(105,(uint32_t)irq105); add_idt_entry(106,(uint32_t)irq106); add_idt_entry(107,(uint32_t)irq107); add_idt_entry(108,(uint32_t)irq108); add_idt_entry(109,(uint32_t)irq109); add_idt_entry(110,(uint32_t)irq110); add_idt_entry(111,(uint32_t)irq111); add_idt_entry(112,(uint32_t)irq112); add_idt_entry(113,(uint32_t)irq113); add_idt_entry(114,(uint32_t)irq114); add_idt_entry(115,(uint32_t)irq115); add_idt_entry(116,(uint32_t)irq116); add_idt_entry(117,(uint32_t)irq117); add_idt_entry(118,(uint32_t)irq118); add_idt_entry(119,(uint32_t)irq119); add_idt_entry(120,(uint32_t)irq120); add_idt_entry(121,(uint32_t)irq121); add_idt_entry(122,(uint32_t)irq122); add_idt_entry(123,(uint32_t)irq123); add_idt_entry(124,(uint32_t)irq124); add_idt_entry(125,(uint32_t)irq125); add_idt_entry(126,(uint32_t)irq126); add_idt_entry(127,(uint32_t)irq127); add_idt_entry(128,(uint32_t)irq128); add_idt_entry(129,(uint32_t)irq129); add_idt_entry(130,(uint32_t)irq130); add_idt_entry(131,(uint32_t)irq131); add_idt_entry(132,(uint32_t)irq132); add_idt_entry(133,(uint32_t)irq133); add_idt_entry(134,(uint32_t)irq134); add_idt_entry(135,(uint32_t)irq135); add_idt_entry(136,(uint32_t)irq136); add_idt_entry(137,(uint32_t)irq137); add_idt_entry(138,(uint32_t)irq138); add_idt_entry(139,(uint32_t)irq139); add_idt_entry(140,(uint32_t)irq140); add_idt_entry(141,(uint32_t)irq141); add_idt_entry(142,(uint32_t)irq142); add_idt_entry(143,(uint32_t)irq143); add_idt_entry(144,(uint32_t)irq144); add_idt_entry(145,(uint32_t)irq145); add_idt_entry(146,(uint32_t)irq146); add_idt_entry(147,(uint32_t)irq147); add_idt_entry(148,(uint32_t)irq148); add_idt_entry(149,(uint32_t)irq149); add_idt_entry(150,(uint32_t)irq150); add_idt_entry(151,(uint32_t)irq151); add_idt_entry(152,(uint32_t)irq152); add_idt_entry(153,(uint32_t)irq153); add_idt_entry(154,(uint32_t)irq154); add_idt_entry(155,(uint32_t)irq155); add_idt_entry(156,(uint32_t)irq156); add_idt_entry(157,(uint32_t)irq157); add_idt_entry(158,(uint32_t)irq158); add_idt_entry(159,(uint32_t)irq159); add_idt_entry(160,(uint32_t)irq160); add_idt_entry(161,(uint32_t)irq161); add_idt_entry(162,(uint32_t)irq162); add_idt_entry(163,(uint32_t)irq163); add_idt_entry(164,(uint32_t)irq164); add_idt_entry(165,(uint32_t)irq165); add_idt_entry(166,(uint32_t)irq166); add_idt_entry(167,(uint32_t)irq167); add_idt_entry(168,(uint32_t)irq168); add_idt_entry(169,(uint32_t)irq169); add_idt_entry(170,(uint32_t)irq170); add_idt_entry(171,(uint32_t)irq171); add_idt_entry(172,(uint32_t)irq172); add_idt_entry(173,(uint32_t)irq173); add_idt_entry(174,(uint32_t)irq174); add_idt_entry(175,(uint32_t)irq175); add_idt_entry(176,(uint32_t)irq176); add_idt_entry(177,(uint32_t)irq177); add_idt_entry(178,(uint32_t)irq178); add_idt_entry(179,(uint32_t)irq179); add_idt_entry(180,(uint32_t)irq180); add_idt_entry(181,(uint32_t)irq181); add_idt_entry(182,(uint32_t)irq182); add_idt_entry(183,(uint32_t)irq183); add_idt_entry(184,(uint32_t)irq184); add_idt_entry(185,(uint32_t)irq185); add_idt_entry(186,(uint32_t)irq186); add_idt_entry(187,(uint32_t)irq187); add_idt_entry(188,(uint32_t)irq188); add_idt_entry(189,(uint32_t)irq189); add_idt_entry(190,(uint32_t)irq190); add_idt_entry(191,(uint32_t)irq191); add_idt_entry(192,(uint32_t)irq192); add_idt_entry(193,(uint32_t)irq193); add_idt_entry(194,(uint32_t)irq194); add_idt_entry(195,(uint32_t)irq195); add_idt_entry(196,(uint32_t)irq196); add_idt_entry(197,(uint32_t)irq197); add_idt_entry(198,(uint32_t)irq198); add_idt_entry(199,(uint32_t)irq199); add_idt_entry(200,(uint32_t)irq200); add_idt_entry(201,(uint32_t)irq201); add_idt_entry(202,(uint32_t)irq202); add_idt_entry(203,(uint32_t)irq203); add_idt_entry(204,(uint32_t)irq204); add_idt_entry(205,(uint32_t)irq205); add_idt_entry(206,(uint32_t)irq206); add_idt_entry(207,(uint32_t)irq207); add_idt_entry(208,(uint32_t)irq208); add_idt_entry(209,(uint32_t)irq209); add_idt_entry(210,(uint32_t)irq210); add_idt_entry(211,(uint32_t)irq211); add_idt_entry(212,(uint32_t)irq212); add_idt_entry(213,(uint32_t)irq213); add_idt_entry(214,(uint32_t)irq214); add_idt_entry(215,(uint32_t)irq215); add_idt_entry(216,(uint32_t)irq216); add_idt_entry(217,(uint32_t)irq217); add_idt_entry(218,(uint32_t)irq218); add_idt_entry(219,(uint32_t)irq219); add_idt_entry(220,(uint32_t)irq220); add_idt_entry(221,(uint32_t)irq221); add_idt_entry(222,(uint32_t)irq222); add_idt_entry(223,(uint32_t)irq223); add_idt_entry(224,(uint32_t)irq224); add_idt_entry(225,(uint32_t)irq225); add_idt_entry(226,(uint32_t)irq226); add_idt_entry(227,(uint32_t)irq227); add_idt_entry(228,(uint32_t)irq228); add_idt_entry(229,(uint32_t)irq229); add_idt_entry(230,(uint32_t)irq230); add_idt_entry(231,(uint32_t)irq231); add_idt_entry(232,(uint32_t)irq232); add_idt_entry(233,(uint32_t)irq233); add_idt_entry(234,(uint32_t)irq234); add_idt_entry(235,(uint32_t)irq235); add_idt_entry(236,(uint32_t)irq236); add_idt_entry(237,(uint32_t)irq237); add_idt_entry(238,(uint32_t)irq238); add_idt_entry(239,(uint32_t)irq239); add_idt_entry(240,(uint32_t)irq240); add_idt_entry(241,(uint32_t)irq241); add_idt_entry(242,(uint32_t)irq242); add_idt_entry(243,(uint32_t)irq243); add_idt_entry(244,(uint32_t)irq244); add_idt_entry(245,(uint32_t)irq245); add_idt_entry(246,(uint32_t)irq246); add_idt_entry(247,(uint32_t)irq247); add_idt_entry(248,(uint32_t)irq248); add_idt_entry(249,(uint32_t)irq249); add_idt_entry(250,(uint32_t)irq250); add_idt_entry(251,(uint32_t)irq251); add_idt_entry(252,(uint32_t)irq252); add_idt_entry(253,(uint32_t)irq253); add_idt_entry(254,(uint32_t)irq254); add_idt_entry(255,(uint32_t)irq255); idtp.size=sizeof(struct idt_entry)*256-1; idtp.offset=(uint32_t)&idt; load_idt(&idtp); }