111 lines
2.1 KiB
ArmAsm
111 lines
2.1 KiB
ArmAsm
.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)
|