123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- ; Defined in isr.c
- [extern isr_handler]
- ; Common ISR code
- isr_common_stub:
- ; 1. Save CPU state
- pusha ; Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
- mov ax, ds ; Lower 16-bits of eax = ds.
- push eax ; save the data segment descriptor
- mov ax, 0x10 ; kernel data segment descriptor
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
-
- ; 2. Call C handler
- call isr_handler
-
- ; 3. Restore state
- pop eax
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
- popa
- add esp, 8 ; Cleans up the pushed error code and pushed ISR number
- sti
- iret ; pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP
-
- ; We don't get information about which interrupt was caller
- ; when the handler is run, so we will need to have a different handler
- ; for every interrupt.
- ; Furthermore, some interrupts push an error code onto the stack but others
- ; don't, so we will push a dummy error code for those which don't, so that
- ; we have a consistent stack for all of them.
- ; First make the ISRs global
- global isr0
- global isr1
- global isr2
- global isr3
- global isr4
- global isr5
- global isr6
- global isr7
- global isr8
- global isr9
- global isr10
- global isr11
- global isr12
- global isr13
- global isr14
- global isr15
- global isr16
- global isr17
- global isr18
- global isr19
- global isr20
- global isr21
- global isr22
- global isr23
- global isr24
- global isr25
- global isr26
- global isr27
- global isr28
- global isr29
- global isr30
- global isr31
- ; 0: Divide By Zero Exception
- isr0:
- cli
- push byte 0
- push byte 0
- jmp isr_common_stub
- ; 1: Debug Exception
- isr1:
- cli
- push byte 0
- push byte 1
- jmp isr_common_stub
- ; 2: Non Maskable Interrupt Exception
- isr2:
- cli
- push byte 0
- push byte 2
- jmp isr_common_stub
- ; 3: Int 3 Exception
- isr3:
- cli
- push byte 0
- push byte 3
- jmp isr_common_stub
- ; 4: INTO Exception
- isr4:
- cli
- push byte 0
- push byte 4
- jmp isr_common_stub
- ; 5: Out of Bounds Exception
- isr5:
- cli
- push byte 0
- push byte 5
- jmp isr_common_stub
- ; 6: Invalid Opcode Exception
- isr6:
- cli
- push byte 0
- push byte 6
- jmp isr_common_stub
- ; 7: Coprocessor Not Available Exception
- isr7:
- cli
- push byte 0
- push byte 7
- jmp isr_common_stub
- ; 8: Double Fault Exception (With Error Code!)
- isr8:
- cli
- push byte 8
- jmp isr_common_stub
- ; 9: Coprocessor Segment Overrun Exception
- isr9:
- cli
- push byte 0
- push byte 9
- jmp isr_common_stub
- ; 10: Bad TSS Exception (With Error Code!)
- isr10:
- cli
- push byte 10
- jmp isr_common_stub
- ; 11: Segment Not Present Exception (With Error Code!)
- isr11:
- cli
- push byte 11
- jmp isr_common_stub
- ; 12: Stack Fault Exception (With Error Code!)
- isr12:
- cli
- push byte 12
- jmp isr_common_stub
- ; 13: General Protection Fault Exception (With Error Code!)
- isr13:
- cli
- push byte 13
- jmp isr_common_stub
- ; 14: Page Fault Exception (With Error Code!)
- isr14:
- cli
- push byte 14
- jmp isr_common_stub
- ; 15: Reserved Exception
- isr15:
- cli
- push byte 0
- push byte 15
- jmp isr_common_stub
- ; 16: Floating Point Exception
- isr16:
- cli
- push byte 0
- push byte 16
- jmp isr_common_stub
- ; 17: Alignment Check Exception
- isr17:
- cli
- push byte 0
- push byte 17
- jmp isr_common_stub
- ; 18: Machine Check Exception
- isr18:
- cli
- push byte 0
- push byte 18
- jmp isr_common_stub
- ; 19: Reserved
- isr19:
- cli
- push byte 0
- push byte 19
- jmp isr_common_stub
- ; 20: Reserved
- isr20:
- cli
- push byte 0
- push byte 20
- jmp isr_common_stub
- ; 21: Reserved
- isr21:
- cli
- push byte 0
- push byte 21
- jmp isr_common_stub
- ; 22: Reserved
- isr22:
- cli
- push byte 0
- push byte 22
- jmp isr_common_stub
- ; 23: Reserved
- isr23:
- cli
- push byte 0
- push byte 23
- jmp isr_common_stub
- ; 24: Reserved
- isr24:
- cli
- push byte 0
- push byte 24
- jmp isr_common_stub
- ; 25: Reserved
- isr25:
- cli
- push byte 0
- push byte 25
- jmp isr_common_stub
- ; 26: Reserved
- isr26:
- cli
- push byte 0
- push byte 26
- jmp isr_common_stub
- ; 27: Reserved
- isr27:
- cli
- push byte 0
- push byte 27
- jmp isr_common_stub
- ; 28: Reserved
- isr28:
- cli
- push byte 0
- push byte 28
- jmp isr_common_stub
- ; 29: Reserved
- isr29:
- cli
- push byte 0
- push byte 29
- jmp isr_common_stub
- ; 30: Reserved
- isr30:
- cli
- push byte 0
- push byte 30
- jmp isr_common_stub
- ; 31: Reserved
- isr31:
- cli
- push byte 0
- push byte 31
- jmp isr_common_stub
|