@@ -15,29 +15,30 @@ limitations under the License.
1515*/
1616
1717use crate :: interrupt_entry:: {
18- _do_excp0, _do_excp1, _do_excp2, _do_excp3, _do_excp4, _do_excp5, _do_excp6, _do_excp7,
19- _do_excp8, _do_excp9, _do_excp10, _do_excp11, _do_excp12, _do_excp13, _do_excp14, _do_excp15,
20- _do_excp16, _do_excp17, _do_excp18, _do_excp19, _do_excp20, _do_excp30} ;
18+ _do_excp0, _do_excp1, _do_excp10, _do_excp11, _do_excp12, _do_excp13, _do_excp14, _do_excp15,
19+ _do_excp16, _do_excp17, _do_excp18, _do_excp19, _do_excp2, _do_excp20, _do_excp3, _do_excp30,
20+ _do_excp4, _do_excp5, _do_excp6, _do_excp7, _do_excp8, _do_excp9,
21+ } ;
2122
2223// An entry in the Interrupt Descriptor Table (IDT)
2324// For reference, see: https://wiki.osdev.org/Interrupt_Descriptor_Table#Structure_on_x86-64
2425#[ repr( C , align( 16 ) ) ]
2526pub ( crate ) struct IdtEntry {
26- offset_low : u16 , // Lower 16 bits of handler address
27- selector : u16 , // code segment selector in GDT
28- ist : u8 , // Interrupt Stack Table offset
29- type_attr : u8 , // Gate type and flags
30- offset_mid : u16 , // Middle 16 bits of handler address
31- offset_high : u32 , // High 32 bits of handler address
32- zero : u32 , // Reserved (always 0)
27+ offset_low : u16 , // Lower 16 bits of handler address
28+ selector : u16 , // code segment selector in GDT
29+ interrupt_stack_table_offset : u8 , // Interrupt Stack Table offset
30+ type_attr : u8 , // Gate type and flags
31+ offset_mid : u16 , // Middle 16 bits of handler address
32+ offset_high : u32 , // High 32 bits of handler address
33+ zero : u32 , // Reserved (always 0)
3334}
3435
3536impl IdtEntry {
3637 fn new ( handler : u64 ) -> Self {
3738 Self {
3839 offset_low : ( handler & 0xFFFF ) as u16 ,
39- selector : 0x08 , // Kernel Code Segment
40- ist : 0 , // No IST used
40+ selector : 0x08 , // Kernel Code Segment
41+ interrupt_stack_table_offset : 0 , // No interrupt stack table used
4142 type_attr : 0x8E ,
4243 // 0x8E = 10001110b
4344 // 1 00 0 1110
@@ -53,38 +54,38 @@ impl IdtEntry {
5354 }
5455}
5556
56-
5757// The IDT is an array of 256 IDT entries
5858// (for reference, see: https://wiki.osdev.org/Interrupt_Descriptor_Table#Structure_on_x86-64)
5959pub ( crate ) static mut IDT : [ IdtEntry ; 256 ] = unsafe { core:: mem:: zeroed ( ) } ;
6060
6161pub ( crate ) fn init_idt ( ) {
62- set_idt_entry ( 0 , _do_excp0) ; // Divide by zero
63- set_idt_entry ( 1 , _do_excp1) ; // Debug
64- set_idt_entry ( 2 , _do_excp2) ; // Non-maskable interrupt
65- set_idt_entry ( 3 , _do_excp3) ; // Breakpoint
66- set_idt_entry ( 4 , _do_excp4) ; // Overflow
67- set_idt_entry ( 5 , _do_excp5) ; // Bound Range Exceeded
68- set_idt_entry ( 6 , _do_excp6) ; // Invalid Opcode
69- set_idt_entry ( 7 , _do_excp7) ; // Device Not Available
70- set_idt_entry ( 8 , _do_excp8) ; // Double Fault
71- set_idt_entry ( 9 , _do_excp9) ; // Coprocessor Segment Overrun
72- set_idt_entry ( 10 , _do_excp10) ; // Invalid TSS
73- set_idt_entry ( 11 , _do_excp11) ; // Segment Not Present
74- set_idt_entry ( 12 , _do_excp12) ; // Stack-Segment Fault
75- set_idt_entry ( 13 , _do_excp13) ; // General Protection Fault
76- set_idt_entry ( 14 , _do_excp14) ; // Page Fault
77- set_idt_entry ( 15 , _do_excp15) ; // Reserved
78- set_idt_entry ( 16 , _do_excp16) ; // x87 Floating-Point Exception
79- set_idt_entry ( 17 , _do_excp17) ; // Alignment Check
80- set_idt_entry ( 18 , _do_excp18) ; // Machine Check
81- set_idt_entry ( 19 , _do_excp19) ; // SIMD Floating-Point Exception
82- set_idt_entry ( 20 , _do_excp20) ; // Virtualization Exception
83- set_idt_entry ( 30 , _do_excp30) ; // Security Exception
62+ set_idt_entry ( 0 , _do_excp0) ; // Divide by zero
63+ set_idt_entry ( 1 , _do_excp1) ; // Debug
64+ set_idt_entry ( 2 , _do_excp2) ; // Non-maskable interrupt
65+ set_idt_entry ( 3 , _do_excp3) ; // Breakpoint
66+ set_idt_entry ( 4 , _do_excp4) ; // Overflow
67+ set_idt_entry ( 5 , _do_excp5) ; // Bound Range Exceeded
68+ set_idt_entry ( 6 , _do_excp6) ; // Invalid Opcode
69+ set_idt_entry ( 7 , _do_excp7) ; // Device Not Available
70+ set_idt_entry ( 8 , _do_excp8) ; // Double Fault
71+ set_idt_entry ( 9 , _do_excp9) ; // Coprocessor Segment Overrun
72+ set_idt_entry ( 10 , _do_excp10) ; // Invalid TSS
73+ set_idt_entry ( 11 , _do_excp11) ; // Segment Not Present
74+ set_idt_entry ( 12 , _do_excp12) ; // Stack-Segment Fault
75+ set_idt_entry ( 13 , _do_excp13) ; // General Protection Fault
76+ set_idt_entry ( 14 , _do_excp14) ; // Page Fault
77+ set_idt_entry ( 15 , _do_excp15) ; // Reserved
78+ set_idt_entry ( 16 , _do_excp16) ; // x87 Floating-Point Exception
79+ set_idt_entry ( 17 , _do_excp17) ; // Alignment Check
80+ set_idt_entry ( 18 , _do_excp18) ; // Machine Check
81+ set_idt_entry ( 19 , _do_excp19) ; // SIMD Floating-Point Exception
82+ set_idt_entry ( 20 , _do_excp20) ; // Virtualization Exception
83+ set_idt_entry ( 30 , _do_excp30) ; // Security Exception
8484}
8585
8686fn set_idt_entry ( index : usize , handler : unsafe extern "sysv64" fn ( ) ) {
8787 let handler_addr = handler as * const ( ) as u64 ;
88- unsafe { IDT [ index] = IdtEntry :: new ( handler_addr) ; }
88+ unsafe {
89+ IDT [ index] = IdtEntry :: new ( handler_addr) ;
90+ }
8991}
90-
0 commit comments