diff options
Diffstat (limited to 'asm/asm_int.s')
| -rw-r--r-- | asm/asm_int.s | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/asm/asm_int.s b/asm/asm_int.s new file mode 100644 index 0000000..566b646 --- /dev/null +++ b/asm/asm_int.s @@ -0,0 +1,174 @@ +.global int0 +.global int1 +.global int2 +.global int3 +.global int4 +.global int5 +.global int6 +.global int7 + +.global int8 +.global int9 +.global int10 +.global int11 +.global int12 +.global int13 +.global int14 +.global int15 + +.global int128 +.global int129 +.global int255 + +.global exc0 +.global exc1 +.global exc2 +.global exc3 +.global exc4 +.global exc5 +.global exc6 +.global exc7 +.global exc8 +.global exc9 +.global exc10 +.global exc11 +.global exc12 +.global exc13 +.global exc14 +.global exc15 +.global exc16 +.global exc17 +.global exc18 + +// nothing to ack +.macro ack0 +.endm + +// ack master +.macro ack1 + push %eax // persist + mov $0x20,%al + out %al,$0x20 + pop %eax // load original +.endm + +// ack master and servant +.macro ack2 + push %eax // persist + mov $0x20,%al + out %al,$0xa0 // slave + out %al,$0x20 // master + pop %eax // load original +.endm + +.macro intx ack num func + + /* + Once we arrived here the stack already contains 3x 32bit values, + which will be poped by 'iret' + + - eflags + - return code segment selector + - return instruction pointer + + There are two possiblities concerning our stack position: + + a) if the interrupt occured while kernel code was executed we are + on the same stack and have no clue about the stack alignment + + b) if the interrupt occured while user code was executed the + configured tss.esp0 was used, in this case we are at the start + of the esp0 stack. + */ + + \ack //acknowledge interrupt + //also remember that we will get new interrupts only + //after iret or reenabling themn explicitly! + + push $0x666 //make room for potential C functions 'return value'. + //we use eax already for esp (so we can context switch) + + push $0x0 //indicate if we want to return the value in ebx 0x0=NO + + pusha //Push all standard registers 8 regs x 4bytes/32bit + push %ds //Push data segment + push %es //etc... + push %fs + push %gs + + mov %esp,%eax // remember THIS stack position + + and $-16,%esp // padding to align stack on 16byte boundary before CALL + sub $8,%esp // ... + + push \num // pass in this interrupt number + push %eax // pass in original %esp (saved just few lines before) + call \func + mov %eax,%esp // use the %esp we got from c function + + pop %gs // pop everything back... + pop %fs // ... + pop %es + pop %ds + popa + + cmp $0x0,(%esp) + je skip\num + pop %ebx + pop %ebx + jmp ret\num + skip\num: + add $8,%esp // potentially set return value to eax to return to the caller + ret\num: + + iret // pops the return instruction pointer, return code segment selector, and EFLAGS image from the stack + +.endm + +.macro excx func + call \func + jmp . +.endm + +int0: intx ack1 $0 interrupt_handler +int1: intx ack1 $1 interrupt_handler +int2: intx ack1 $2 interrupt_handler +int3: intx ack1 $3 interrupt_handler +int4: intx ack1 $4 interrupt_handler +int5: intx ack1 $5 interrupt_handler +int6: intx ack1 $6 interrupt_handler +int7: intx ack1 $7 interrupt_handler + +int8: intx ack2 $8 interrupt_handler +int9: intx ack2 $9 interrupt_handler +int10: intx ack2 $10 interrupt_handler +int11: intx ack2 $11 interrupt_handler +int12: intx ack2 $12 interrupt_handler +int13: intx ack2 $13 interrupt_handler +int14: intx ack2 $14 interrupt_handler +int15: intx ack2 $15 interrupt_handler + +int128: intx ack0 $128 interrupt_handler +int129: intx ack0 $129 interrupt_handler + +int255: intx ack0 $255 interrupt_handler + +exc0: excx exception_handle_0 +exc1: excx exception_handle_1 +exc2: excx exception_handle_2 +exc3: excx exception_handle_3 +exc4: excx exception_handle_4 +exc5: excx exception_handle_5 +exc6: excx exception_handle_6 +exc7: excx exception_handle_7 +exc8: excx exception_handle_8 +exc9: excx exception_handle_9 +exc10: excx exception_handle_10 +exc11: excx exception_handle_11 +exc12: excx exception_handle_12 +exc13: excx exception_handle_13 +exc14: excx exception_handle_14 +exc15: excx exception_handle_15 +exc16: excx exception_handle_16 +exc17: excx exception_handle_17 +exc18: excx exception_handle_18 |
