Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

idt.asm (1197B)


      1 bits 64
      2 
      3 extern interrupt_handler
      4 global idt_handler_0
      5 global idt_handler_13 ; GPF pushes an error code
      6 
      7 ; Macro for interrupts that DO NOT push an error code
      8 %macro ISR_NOERR 1
      9 global idt_handler_%1
     10 idt_handler_%1:
     11     push qword 0      ; Push dummy error code
     12     push qword %1     ; Push vector number
     13     jmp isr_common
     14 %endmacro
     15 
     16 ; Macro for interrupts that DO push an error code
     17 %macro ISR_ERR 1
     18 global idt_handler_%1
     19 idt_handler_%1:
     20     push qword %1     ; Push vector number (error code is already there)
     21     jmp isr_common
     22 %endmacro
     23 
     24 ISR_NOERR 0           ; Divide by Zero
     25 ISR_ERR   13          ; General Protection Fault
     26 
     27 isr_common:
     28     push rax
     29     push rbx
     30     push rcx
     31     push rdx
     32     push rsi
     33     push rdi
     34     push rbp
     35     push r8
     36     push r9
     37     push r10
     38     push r11
     39     push r12
     40     push r13
     41     push r14
     42     push r15
     43 
     44     mov rdi, rsp      ; Pass stack pointer as first argument to C handler
     45     call interrupt_handler
     46 
     47     pop r15
     48     pop r14
     49     pop r13
     50     pop r12
     51     pop r11
     52     pop r10
     53     pop r9
     54     pop r8
     55     pop rbp
     56     pop rdi
     57     pop rsi
     58     pop rdx
     59     pop rcx
     60     pop rbx
     61     pop rax
     62     add rsp, 16       ; Clean up pushed vector number and error code
     63     iretq