129faeb96SAaron Lewishandle_exception: 229faeb96SAaron Lewis push %r15 329faeb96SAaron Lewis push %r14 429faeb96SAaron Lewis push %r13 529faeb96SAaron Lewis push %r12 629faeb96SAaron Lewis push %r11 729faeb96SAaron Lewis push %r10 829faeb96SAaron Lewis push %r9 929faeb96SAaron Lewis push %r8 1029faeb96SAaron Lewis 1129faeb96SAaron Lewis push %rdi 1229faeb96SAaron Lewis push %rsi 1329faeb96SAaron Lewis push %rbp 1429faeb96SAaron Lewis push %rbx 1529faeb96SAaron Lewis push %rdx 1629faeb96SAaron Lewis push %rcx 1729faeb96SAaron Lewis push %rax 1829faeb96SAaron Lewis mov %rsp, %rdi 1929faeb96SAaron Lewis 2029faeb96SAaron Lewis call route_exception 2129faeb96SAaron Lewis 2229faeb96SAaron Lewis pop %rax 2329faeb96SAaron Lewis pop %rcx 2429faeb96SAaron Lewis pop %rdx 2529faeb96SAaron Lewis pop %rbx 2629faeb96SAaron Lewis pop %rbp 2729faeb96SAaron Lewis pop %rsi 2829faeb96SAaron Lewis pop %rdi 2929faeb96SAaron Lewis pop %r8 3029faeb96SAaron Lewis pop %r9 3129faeb96SAaron Lewis pop %r10 3229faeb96SAaron Lewis pop %r11 3329faeb96SAaron Lewis pop %r12 3429faeb96SAaron Lewis pop %r13 3529faeb96SAaron Lewis pop %r14 3629faeb96SAaron Lewis pop %r15 3729faeb96SAaron Lewis 3829faeb96SAaron Lewis /* Discard vector and error code. */ 3929faeb96SAaron Lewis add $16, %rsp 4029faeb96SAaron Lewis iretq 4129faeb96SAaron Lewis 4229faeb96SAaron Lewis/* 4329faeb96SAaron Lewis * Build the handle_exception wrappers which push the vector/error code on the 4429faeb96SAaron Lewis * stack and an array of pointers to those wrappers. 4529faeb96SAaron Lewis */ 4629faeb96SAaron Lewis.pushsection .rodata 4729faeb96SAaron Lewis.globl idt_handlers 4829faeb96SAaron Lewisidt_handlers: 4929faeb96SAaron Lewis.popsection 5029faeb96SAaron Lewis 5129faeb96SAaron Lewis.macro HANDLERS has_error from to 5229faeb96SAaron Lewis vector = \from 5329faeb96SAaron Lewis .rept \to - \from + 1 5429faeb96SAaron Lewis .align 8 5529faeb96SAaron Lewis 5629faeb96SAaron Lewis /* Fetch current address and append it to idt_handlers. */ 57*5f443e42SBill Wendling666 : 5829faeb96SAaron Lewis.pushsection .rodata 59*5f443e42SBill Wendling .quad 666b 6029faeb96SAaron Lewis.popsection 6129faeb96SAaron Lewis 6229faeb96SAaron Lewis .if ! \has_error 6329faeb96SAaron Lewis pushq $0 6429faeb96SAaron Lewis .endif 6529faeb96SAaron Lewis pushq $vector 6629faeb96SAaron Lewis jmp handle_exception 6729faeb96SAaron Lewis vector = vector + 1 6829faeb96SAaron Lewis .endr 6929faeb96SAaron Lewis.endm 7029faeb96SAaron Lewis 7129faeb96SAaron Lewis.global idt_handler_code 7229faeb96SAaron Lewisidt_handler_code: 7329faeb96SAaron Lewis HANDLERS has_error=0 from=0 to=7 7429faeb96SAaron Lewis HANDLERS has_error=1 from=8 to=8 7529faeb96SAaron Lewis HANDLERS has_error=0 from=9 to=9 7629faeb96SAaron Lewis HANDLERS has_error=1 from=10 to=14 7729faeb96SAaron Lewis HANDLERS has_error=0 from=15 to=16 7829faeb96SAaron Lewis HANDLERS has_error=1 from=17 to=17 7929faeb96SAaron Lewis HANDLERS has_error=0 from=18 to=255 8029faeb96SAaron Lewis 8129faeb96SAaron Lewis.section .note.GNU-stack, "", %progbits 82