.extern amd64_intr_handler #define err(z) \ pushq $z; #define no_err(z) \ pushq $0; \ pushq $z; #define push_regs \ pushq %rax; \ pushq %rcx; \ pushq %rdx; \ pushq %rsi; \ pushq %rdi; \ pushq %rbp; \ pushq %rbx; \ pushq %r8; \ pushq %r9; \ pushq %r10; \ pushq %r11; \ pushq %r12; \ pushq %r13; \ pushq %r14; \ pushq %r15; #define pop_regs \ popq %r15; \ popq %r14; \ popq %r13; \ popq %r12; \ popq %r11; \ popq %r10; \ popq %r9; \ popq %r8; \ popq %rbx; \ popq %rbp; \ popq %rdi; \ popq %rsi; \ popq %rdx; \ popq %rcx; \ popq %rax; #define make_intr_stub(x, n) \ .global amd64_intr ## n; \ amd64_intr ## n:; \ x(n); \ cli; \ push_regs; \ cld; \ movq %rsp, %rdi; \ movq %rsp, %rax; \ subq $8, %rsp; \ andq $~0xF, %rsp; \ movq %rax, (%rsp); \ callq amd64_intr_handler; \ movq (%rsp), %rsp; \ pop_regs; \ addq $16, %rsp; \ iretq; make_intr_stub(no_err, 0) make_intr_stub(no_err, 1) make_intr_stub(no_err, 2) make_intr_stub(no_err, 3) make_intr_stub(no_err, 4) make_intr_stub(no_err, 5) make_intr_stub(no_err, 6) make_intr_stub(no_err, 7) make_intr_stub(err, 8) make_intr_stub(no_err, 9) make_intr_stub(err, 10) make_intr_stub(err, 11) make_intr_stub(err, 12) make_intr_stub(err, 13) make_intr_stub(err, 14) make_intr_stub(no_err, 15) make_intr_stub(no_err, 16) make_intr_stub(err, 17) make_intr_stub(no_err, 18) make_intr_stub(no_err, 19) make_intr_stub(no_err, 20) make_intr_stub(err, 21) make_intr_stub(no_err, 22) make_intr_stub(no_err, 23) make_intr_stub(no_err, 24) make_intr_stub(no_err, 25) make_intr_stub(no_err, 26) make_intr_stub(no_err, 27) make_intr_stub(no_err, 28) make_intr_stub(err, 29) make_intr_stub(err, 30) make_intr_stub(no_err, 31) make_intr_stub(no_err, 32) make_intr_stub(no_err, 33) make_intr_stub(no_err, 34) make_intr_stub(no_err, 35) make_intr_stub(no_err, 36) make_intr_stub(no_err, 37) make_intr_stub(no_err, 38) make_intr_stub(no_err, 39) make_intr_stub(no_err, 40) make_intr_stub(no_err, 41) make_intr_stub(no_err, 42) make_intr_stub(no_err, 43) make_intr_stub(no_err, 44) make_intr_stub(no_err, 45) make_intr_stub(no_err, 46) make_intr_stub(no_err, 47)