1handle_exception: 2 push %r15 3 push %r14 4 push %r13 5 push %r12 6 push %r11 7 push %r10 8 push %r9 9 push %r8 10 11 push %rdi 12 push %rsi 13 push %rbp 14 push %rbx 15 push %rdx 16 push %rcx 17 push %rax 18 mov %rsp, %rdi 19 20 call route_exception 21 22 pop %rax 23 pop %rcx 24 pop %rdx 25 pop %rbx 26 pop %rbp 27 pop %rsi 28 pop %rdi 29 pop %r8 30 pop %r9 31 pop %r10 32 pop %r11 33 pop %r12 34 pop %r13 35 pop %r14 36 pop %r15 37 38 /* Discard vector and error code. */ 39 add $16, %rsp 40 iretq 41 42/* 43 * Build the handle_exception wrappers which push the vector/error code on the 44 * stack and an array of pointers to those wrappers. 45 */ 46.pushsection .rodata 47.globl idt_handlers 48idt_handlers: 49.popsection 50 51.macro HANDLERS has_error from to 52 vector = \from 53 .rept \to - \from + 1 54 .align 8 55 56 /* Fetch current address and append it to idt_handlers. */ 57 current_handler = . 58.pushsection .rodata 59.quad current_handler 60.popsection 61 62 .if ! \has_error 63 pushq $0 64 .endif 65 pushq $vector 66 jmp handle_exception 67 vector = vector + 1 68 .endr 69.endm 70 71.global idt_handler_code 72idt_handler_code: 73 HANDLERS has_error=0 from=0 to=7 74 HANDLERS has_error=1 from=8 to=8 75 HANDLERS has_error=0 from=9 to=9 76 HANDLERS has_error=1 from=10 to=14 77 HANDLERS has_error=0 from=15 to=16 78 HANDLERS has_error=1 from=17 to=17 79 HANDLERS has_error=0 from=18 to=255 80 81.section .note.GNU-stack, "", %progbits 82