summaryrefslogtreecommitdiff
path: root/asm/asm_int.s
diff options
context:
space:
mode:
Diffstat (limited to 'asm/asm_int.s')
-rw-r--r--asm/asm_int.s174
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