sos

[unmaintained] experimenting with low level OS development
Log | Files | Refs | README | LICENSE

idt.c (10835B)


      1 #include <stdint.h>
      2 #include "idt.h"
      3 
      4 static void idt_set_entry(unsigned int pos, uint32_t base,
      5         uint16_t selector, uint8_t type_attributes)
      6 {
      7     idt[pos].base_lower = base & 0xffff;
      8     idt[pos].selector = selector;
      9     idt[pos].unused = 0x0;
     10     idt[pos].type_attributes = type_attributes;
     11     idt[pos].base_higher = (base >> 16) & 0xffff;
     12 }
     13 
     14 extern void int_handler_0();
     15 extern void int_handler_1();
     16 extern void int_handler_2();
     17 extern void int_handler_3();
     18 extern void int_handler_4();
     19 extern void int_handler_5();
     20 extern void int_handler_6();
     21 extern void int_handler_7();
     22 extern void int_handler_8();
     23 extern void int_handler_9();
     24 extern void int_handler_10();
     25 extern void int_handler_11();
     26 extern void int_handler_12();
     27 extern void int_handler_13();
     28 extern void int_handler_14();
     29 extern void int_handler_15();
     30 extern void int_handler_16();
     31 extern void int_handler_17();
     32 extern void int_handler_18();
     33 extern void int_handler_19();
     34 extern void int_handler_20();
     35 extern void int_handler_21();
     36 extern void int_handler_22();
     37 extern void int_handler_23();
     38 extern void int_handler_24();
     39 extern void int_handler_25();
     40 extern void int_handler_26();
     41 extern void int_handler_27();
     42 extern void int_handler_28();
     43 extern void int_handler_29();
     44 extern void int_handler_30();
     45 extern void int_handler_31();
     46 extern void int_handler_32();
     47 extern void int_handler_33();
     48 extern void int_handler_34();
     49 extern void int_handler_35();
     50 extern void int_handler_36();
     51 extern void int_handler_37();
     52 extern void int_handler_38();
     53 extern void int_handler_39();
     54 extern void int_handler_40();
     55 extern void int_handler_41();
     56 extern void int_handler_42();
     57 extern void int_handler_43();
     58 extern void int_handler_44();
     59 extern void int_handler_45();
     60 extern void int_handler_46();
     61 extern void int_handler_47();
     62 extern void int_handler_48();
     63 extern void int_handler_49();
     64 extern void int_handler_50();
     65 extern void int_handler_51();
     66 extern void int_handler_52();
     67 extern void int_handler_53();
     68 extern void int_handler_54();
     69 extern void int_handler_55();
     70 extern void int_handler_56();
     71 extern void int_handler_57();
     72 extern void int_handler_58();
     73 extern void int_handler_59();
     74 extern void int_handler_60();
     75 extern void int_handler_61();
     76 extern void int_handler_62();
     77 extern void int_handler_63();
     78 extern void int_handler_64();
     79 extern void int_handler_65();
     80 extern void int_handler_66();
     81 extern void int_handler_67();
     82 extern void int_handler_68();
     83 extern void int_handler_69();
     84 extern void int_handler_70();
     85 extern void int_handler_71();
     86 extern void int_handler_72();
     87 extern void int_handler_73();
     88 extern void int_handler_74();
     89 extern void int_handler_75();
     90 extern void int_handler_76();
     91 extern void int_handler_77();
     92 extern void int_handler_78();
     93 extern void int_handler_79();
     94 extern void int_handler_80();
     95 extern void int_handler_81();
     96 extern void int_handler_82();
     97 extern void int_handler_83();
     98 extern void int_handler_84();
     99 extern void int_handler_85();
    100 extern void int_handler_86();
    101 extern void int_handler_87();
    102 extern void int_handler_88();
    103 extern void int_handler_89();
    104 extern void int_handler_90();
    105 extern void int_handler_91();
    106 extern void int_handler_92();
    107 extern void int_handler_93();
    108 extern void int_handler_94();
    109 extern void int_handler_95();
    110 extern void int_handler_96();
    111 extern void int_handler_97();
    112 extern void int_handler_98();
    113 extern void int_handler_99();
    114 
    115 void idt_setup()
    116 {
    117     idt_desc.limit = IDT_ENTRIES * sizeof(struct idt_entry) - 1;
    118     idt_desc.base = (uint32_t) (uintptr_t) idt;
    119 
    120     idt_set_entry(0, (uint32_t)(uintptr_t)&int_handler_0, 0x8, 0x8e);
    121     idt_set_entry(1, (uint32_t)(uintptr_t)&int_handler_1, 0x8, 0x8e);
    122     idt_set_entry(2, (uint32_t)(uintptr_t)&int_handler_2, 0x8, 0x8e);
    123     idt_set_entry(3, (uint32_t)(uintptr_t)&int_handler_3, 0x8, 0x8e);
    124     idt_set_entry(4, (uint32_t)(uintptr_t)&int_handler_4, 0x8, 0x8e);
    125     idt_set_entry(5, (uint32_t)(uintptr_t)&int_handler_5, 0x8, 0x8e);
    126     idt_set_entry(6, (uint32_t)(uintptr_t)&int_handler_6, 0x8, 0x8e);
    127     idt_set_entry(7, (uint32_t)(uintptr_t)&int_handler_7, 0x8, 0x8e);
    128     idt_set_entry(8, (uint32_t)(uintptr_t)&int_handler_8, 0x8, 0x8e);
    129     idt_set_entry(9, (uint32_t)(uintptr_t)&int_handler_9, 0x8, 0x8e);
    130     idt_set_entry(10, (uint32_t)(uintptr_t)&int_handler_10, 0x8, 0x8e);
    131     idt_set_entry(11, (uint32_t)(uintptr_t)&int_handler_11, 0x8, 0x8e);
    132     idt_set_entry(12, (uint32_t)(uintptr_t)&int_handler_12, 0x8, 0x8e);
    133     idt_set_entry(13, (uint32_t)(uintptr_t)&int_handler_13, 0x8, 0x8e);
    134     idt_set_entry(14, (uint32_t)(uintptr_t)&int_handler_14, 0x8, 0x8e);
    135     idt_set_entry(15, (uint32_t)(uintptr_t)&int_handler_15, 0x8, 0x8e);
    136     idt_set_entry(16, (uint32_t)(uintptr_t)&int_handler_16, 0x8, 0x8e);
    137     idt_set_entry(17, (uint32_t)(uintptr_t)&int_handler_17, 0x8, 0x8e);
    138     idt_set_entry(18, (uint32_t)(uintptr_t)&int_handler_18, 0x8, 0x8e);
    139     idt_set_entry(19, (uint32_t)(uintptr_t)&int_handler_19, 0x8, 0x8e);
    140     idt_set_entry(20, (uint32_t)(uintptr_t)&int_handler_20, 0x8, 0x8e);
    141     idt_set_entry(21, (uint32_t)(uintptr_t)&int_handler_21, 0x8, 0x8e);
    142     idt_set_entry(22, (uint32_t)(uintptr_t)&int_handler_22, 0x8, 0x8e);
    143     idt_set_entry(23, (uint32_t)(uintptr_t)&int_handler_23, 0x8, 0x8e);
    144     idt_set_entry(24, (uint32_t)(uintptr_t)&int_handler_24, 0x8, 0x8e);
    145     idt_set_entry(25, (uint32_t)(uintptr_t)&int_handler_25, 0x8, 0x8e);
    146     idt_set_entry(26, (uint32_t)(uintptr_t)&int_handler_26, 0x8, 0x8e);
    147     idt_set_entry(27, (uint32_t)(uintptr_t)&int_handler_27, 0x8, 0x8e);
    148     idt_set_entry(28, (uint32_t)(uintptr_t)&int_handler_28, 0x8, 0x8e);
    149     idt_set_entry(29, (uint32_t)(uintptr_t)&int_handler_29, 0x8, 0x8e);
    150     idt_set_entry(30, (uint32_t)(uintptr_t)&int_handler_30, 0x8, 0x8e);
    151     idt_set_entry(31, (uint32_t)(uintptr_t)&int_handler_31, 0x8, 0x8e);
    152     idt_set_entry(32, (uint32_t)(uintptr_t)&int_handler_32, 0x8, 0x8e);
    153     idt_set_entry(33, (uint32_t)(uintptr_t)&int_handler_33, 0x8, 0x8e);
    154     idt_set_entry(34, (uint32_t)(uintptr_t)&int_handler_34, 0x8, 0x8e);
    155     idt_set_entry(35, (uint32_t)(uintptr_t)&int_handler_35, 0x8, 0x8e);
    156     idt_set_entry(36, (uint32_t)(uintptr_t)&int_handler_36, 0x8, 0x8e);
    157     idt_set_entry(37, (uint32_t)(uintptr_t)&int_handler_37, 0x8, 0x8e);
    158     idt_set_entry(38, (uint32_t)(uintptr_t)&int_handler_38, 0x8, 0x8e);
    159     idt_set_entry(39, (uint32_t)(uintptr_t)&int_handler_39, 0x8, 0x8e);
    160     idt_set_entry(40, (uint32_t)(uintptr_t)&int_handler_40, 0x8, 0x8e);
    161     idt_set_entry(41, (uint32_t)(uintptr_t)&int_handler_41, 0x8, 0x8e);
    162     idt_set_entry(42, (uint32_t)(uintptr_t)&int_handler_42, 0x8, 0x8e);
    163     idt_set_entry(43, (uint32_t)(uintptr_t)&int_handler_43, 0x8, 0x8e);
    164     idt_set_entry(44, (uint32_t)(uintptr_t)&int_handler_44, 0x8, 0x8e);
    165     idt_set_entry(45, (uint32_t)(uintptr_t)&int_handler_45, 0x8, 0x8e);
    166     idt_set_entry(46, (uint32_t)(uintptr_t)&int_handler_46, 0x8, 0x8e);
    167     idt_set_entry(47, (uint32_t)(uintptr_t)&int_handler_47, 0x8, 0x8e);
    168     idt_set_entry(48, (uint32_t)(uintptr_t)&int_handler_48, 0x8, 0x8e);
    169     idt_set_entry(49, (uint32_t)(uintptr_t)&int_handler_49, 0x8, 0x8e);
    170     idt_set_entry(50, (uint32_t)(uintptr_t)&int_handler_50, 0x8, 0x8e);
    171     idt_set_entry(51, (uint32_t)(uintptr_t)&int_handler_51, 0x8, 0x8e);
    172     idt_set_entry(52, (uint32_t)(uintptr_t)&int_handler_52, 0x8, 0x8e);
    173     idt_set_entry(53, (uint32_t)(uintptr_t)&int_handler_53, 0x8, 0x8e);
    174     idt_set_entry(54, (uint32_t)(uintptr_t)&int_handler_54, 0x8, 0x8e);
    175     idt_set_entry(55, (uint32_t)(uintptr_t)&int_handler_55, 0x8, 0x8e);
    176     idt_set_entry(56, (uint32_t)(uintptr_t)&int_handler_56, 0x8, 0x8e);
    177     idt_set_entry(57, (uint32_t)(uintptr_t)&int_handler_57, 0x8, 0x8e);
    178     idt_set_entry(58, (uint32_t)(uintptr_t)&int_handler_58, 0x8, 0x8e);
    179     idt_set_entry(59, (uint32_t)(uintptr_t)&int_handler_59, 0x8, 0x8e);
    180     idt_set_entry(60, (uint32_t)(uintptr_t)&int_handler_60, 0x8, 0x8e);
    181     idt_set_entry(61, (uint32_t)(uintptr_t)&int_handler_61, 0x8, 0x8e);
    182     idt_set_entry(62, (uint32_t)(uintptr_t)&int_handler_62, 0x8, 0x8e);
    183     idt_set_entry(63, (uint32_t)(uintptr_t)&int_handler_63, 0x8, 0x8e);
    184     idt_set_entry(64, (uint32_t)(uintptr_t)&int_handler_64, 0x8, 0x8e);
    185     idt_set_entry(65, (uint32_t)(uintptr_t)&int_handler_65, 0x8, 0x8e);
    186     idt_set_entry(66, (uint32_t)(uintptr_t)&int_handler_66, 0x8, 0x8e);
    187     idt_set_entry(67, (uint32_t)(uintptr_t)&int_handler_67, 0x8, 0x8e);
    188     idt_set_entry(68, (uint32_t)(uintptr_t)&int_handler_68, 0x8, 0x8e);
    189     idt_set_entry(69, (uint32_t)(uintptr_t)&int_handler_69, 0x8, 0x8e);
    190     idt_set_entry(70, (uint32_t)(uintptr_t)&int_handler_70, 0x8, 0x8e);
    191     idt_set_entry(71, (uint32_t)(uintptr_t)&int_handler_71, 0x8, 0x8e);
    192     idt_set_entry(72, (uint32_t)(uintptr_t)&int_handler_72, 0x8, 0x8e);
    193     idt_set_entry(73, (uint32_t)(uintptr_t)&int_handler_73, 0x8, 0x8e);
    194     idt_set_entry(74, (uint32_t)(uintptr_t)&int_handler_74, 0x8, 0x8e);
    195     idt_set_entry(75, (uint32_t)(uintptr_t)&int_handler_75, 0x8, 0x8e);
    196     idt_set_entry(76, (uint32_t)(uintptr_t)&int_handler_76, 0x8, 0x8e);
    197     idt_set_entry(77, (uint32_t)(uintptr_t)&int_handler_77, 0x8, 0x8e);
    198     idt_set_entry(78, (uint32_t)(uintptr_t)&int_handler_78, 0x8, 0x8e);
    199     idt_set_entry(79, (uint32_t)(uintptr_t)&int_handler_79, 0x8, 0x8e);
    200     idt_set_entry(80, (uint32_t)(uintptr_t)&int_handler_80, 0x8, 0x8e);
    201     idt_set_entry(81, (uint32_t)(uintptr_t)&int_handler_81, 0x8, 0x8e);
    202     idt_set_entry(82, (uint32_t)(uintptr_t)&int_handler_82, 0x8, 0x8e);
    203     idt_set_entry(83, (uint32_t)(uintptr_t)&int_handler_83, 0x8, 0x8e);
    204     idt_set_entry(84, (uint32_t)(uintptr_t)&int_handler_84, 0x8, 0x8e);
    205     idt_set_entry(85, (uint32_t)(uintptr_t)&int_handler_85, 0x8, 0x8e);
    206     idt_set_entry(86, (uint32_t)(uintptr_t)&int_handler_86, 0x8, 0x8e);
    207     idt_set_entry(87, (uint32_t)(uintptr_t)&int_handler_87, 0x8, 0x8e);
    208     idt_set_entry(88, (uint32_t)(uintptr_t)&int_handler_88, 0x8, 0x8e);
    209     idt_set_entry(89, (uint32_t)(uintptr_t)&int_handler_89, 0x8, 0x8e);
    210     idt_set_entry(90, (uint32_t)(uintptr_t)&int_handler_90, 0x8, 0x8e);
    211     idt_set_entry(91, (uint32_t)(uintptr_t)&int_handler_91, 0x8, 0x8e);
    212     idt_set_entry(92, (uint32_t)(uintptr_t)&int_handler_92, 0x8, 0x8e);
    213     idt_set_entry(93, (uint32_t)(uintptr_t)&int_handler_93, 0x8, 0x8e);
    214     idt_set_entry(94, (uint32_t)(uintptr_t)&int_handler_94, 0x8, 0x8e);
    215     idt_set_entry(95, (uint32_t)(uintptr_t)&int_handler_95, 0x8, 0x8e);
    216     idt_set_entry(96, (uint32_t)(uintptr_t)&int_handler_96, 0x8, 0x8e);
    217     idt_set_entry(97, (uint32_t)(uintptr_t)&int_handler_97, 0x8, 0x8e);
    218     idt_set_entry(98, (uint32_t)(uintptr_t)&int_handler_98, 0x8, 0x8e);
    219     for (int i = 99; i < IDT_ENTRIES; i++) {
    220         idt_set_entry(i, (uint32_t)(uintptr_t)&int_handler_99,
    221             0x8, 0x8e);
    222     }
    223 
    224     asm volatile("lidt (%0)" :: "m"(idt_desc));
    225     asm volatile("xchg %bx, %bx");
    226     asm volatile("sti");
    227 }