1- #define IDT_SIZE 1
1+ #define IDT_SIZE 16
22
3+ extern void interrupt_nohup ();
4+ extern void load_idt_table (unsigned int idtr_address );
5+
6+ #pragma pack(push, 1)
37struct IDTEntry {
4- unsigned short something0 ;
5- unsigned short something1 ;
6- unsigned short something2 ;
7- unsigned short something3 ;
8- unsigned short something4 ;
9- unsigned short something5 ;
10- unsigned short something6 ;
11- unsigned short something7 ;
8+ unsigned short offset_0 ;
9+ unsigned short selector ;
10+ unsigned char unused ;
11+ unsigned char type_attr ;
12+ unsigned short offset_1 ;
1213};
1314
1415struct IDTReference {
1516 unsigned short size ;
1617 unsigned int base_address ;
1718};
19+ #pragma pack(pop)
20+
1821struct IDTReference idtr ;
1922struct IDTEntry idt_table [IDT_SIZE ];
2023
21- void populate_ict_entry (struct IDTEntry * entry ) {
24+ void populate_idt_entry (int id ,
25+ unsigned short selector ,
26+ unsigned int address ,
27+ unsigned char present , // 1-bit
28+ unsigned char dpl , // 2-bit
29+ unsigned char storage_segment , // 1-bit
30+ unsigned char gate_type // 4-bit
31+ ) {
32+ struct IDTEntry * entry = & idt_table [id ];
33+ entry -> offset_0 = address & 0xFFFF ;
34+ entry -> offset_1 = (address >>16 )& 0xFFFF ;
35+ entry -> selector = selector ;
36+ entry -> unused = 0 ;
37+ entry -> type_attr = (present <<7 ) | (dpl <<5 ) | (storage_segment <<4 ) | gate_type ;
38+ }
39+
40+ void populate_idt_entry_32bit (int id ,
41+ unsigned int address ,
42+ unsigned char dpl , // 2-bit
43+ int is_trap
44+ ) {
45+ populate_idt_entry (
46+ id ,
47+ 0x08 , // kernel code segment selector
48+ address ,
49+ 1 ,
50+ dpl ,
51+ 0 ,
52+ is_trap ?0b1111 :0b1110
53+ );
2254}
2355
24- int populate_idt_table () {
25- return (int )& idtr ;
56+ void populate_and_load_idt_table () {
57+ for (int i = 0 ; i < IDT_SIZE ; ++ i ) {
58+ populate_idt_entry_32bit (i , (unsigned int )interrupt_nohup , 0 , 1 );
59+ }
60+ idtr .size = sizeof (struct IDTEntry )* IDT_SIZE ;
61+ idtr .base_address = ((int )idt_table + KERNEL_MEMORY_LOCATION );
62+
63+ move_xy (4 ,4 );
64+ print_line ("IDT Reference: " );
65+ int idtr_address = (int )& idtr ;
66+ print_hex_int (idtr_address );
67+
68+ move_xy (4 ,5 );
69+ print_line ("IDT Table: " );
70+ print_hex_int (idtr .base_address );
71+ print_char (' ' );
72+ print_hex_int (idtr .size );
73+
74+ load_idt_table (idtr_address );
2675}
0 commit comments