Interrupt handling/cpu exceptions
This commit is contained in:
110
kernel/amd64/intr_stub.S
Normal file
110
kernel/amd64/intr_stub.S
Normal file
@@ -0,0 +1,110 @@
|
||||
.extern amd64_intr_handler
|
||||
|
||||
dupa:
|
||||
jmp dupa
|
||||
|
||||
#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; \
|
||||
pushq %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; \
|
||||
andq $~0xF, %rsp; \
|
||||
callq amd64_intr_handler; \
|
||||
movq %rdi, %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)
|
||||
Reference in New Issue
Block a user