summaryrefslogtreecommitdiff
path: root/kernel/arch/x86_64/asm/isr.s
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/arch/x86_64/asm/isr.s')
-rw-r--r--kernel/arch/x86_64/asm/isr.s155
1 files changed, 155 insertions, 0 deletions
diff --git a/kernel/arch/x86_64/asm/isr.s b/kernel/arch/x86_64/asm/isr.s
new file mode 100644
index 0000000..a79532d
--- /dev/null
+++ b/kernel/arch/x86_64/asm/isr.s
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2025 Danny Holman <dholman@gymli.org>
+ *
+ * This file is part of BoxOS, a free and open-source Unix-like operating
+ * system.
+ *
+ * BoxOS is free software; you can redistribute it and/or modify under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * BoxOS; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+.section .text
+
+.macro isr_err_stub num
+.global isr_stub_\num
+.type isr_stub_\num, @function
+isr_stub_\num:
+ cli
+ pushq $\num
+ jmp isr_frame_asm
+.endm
+.macro isr_no_err_stub num
+.global isr_stub_\num
+.type isr_stub_\num, @function
+isr_stub_\num:
+ cli
+ pushq $0
+ pushq $\num
+ jmp isr_frame_asm
+.endm
+
+.macro irq_stub num
+.global irq_stub_\num
+.type irq_stub_\num, @function
+irq_stub_\num:
+ cli
+ pushq $0
+ pushq $\num+32
+ jmp isr_frame_asm
+.endm
+
+isr_frame_asm:
+ pushq %rax
+ pushq %rbx
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+
+ movq %cr0, %rax
+ pushq %rax
+ movq %cr2, %rax
+ pushq %rax
+ movq %cr3, %rax
+ pushq %rax
+ movq %cr4, %rax
+ pushq %rax
+
+ movq %rsp, %rdi
+ cld
+ call isr_dispatch
+
+ popq %rax
+ movq %rax, %cr4
+ popq %rax
+ movq %rax, %cr3
+ popq %rax
+ movq %rax, %cr2
+ popq %rax
+ movq %rax, %cr0
+
+ popq %r15
+ popq %r14
+ popq %r13
+ popq %r12
+ popq %r11
+ popq %r10
+ popq %r9
+ popq %r8
+ popq %rdi
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %rbx
+ popq %rax
+ addq $16, %rsp
+ iretq
+
+isr_no_err_stub 0
+isr_no_err_stub 1
+isr_no_err_stub 2
+isr_no_err_stub 3
+isr_no_err_stub 4
+isr_no_err_stub 5
+isr_no_err_stub 6
+isr_no_err_stub 7
+isr_err_stub 8
+isr_no_err_stub 9
+isr_err_stub 10
+isr_err_stub 11
+isr_err_stub 12
+isr_err_stub 13
+isr_err_stub 14
+isr_no_err_stub 15
+isr_no_err_stub 16
+isr_err_stub 17
+isr_no_err_stub 18
+isr_no_err_stub 19
+isr_no_err_stub 20
+isr_err_stub 21
+isr_no_err_stub 22
+isr_no_err_stub 23
+isr_no_err_stub 24
+isr_no_err_stub 25
+isr_no_err_stub 26
+isr_no_err_stub 27
+isr_no_err_stub 28
+isr_err_stub 29
+isr_err_stub 30
+isr_no_err_stub 31
+
+irq_stub 0
+irq_stub 1
+irq_stub 2
+irq_stub 3
+irq_stub 4
+irq_stub 5
+irq_stub 6
+irq_stub 7
+irq_stub 8
+irq_stub 9
+irq_stub 10
+irq_stub 11
+irq_stub 12
+irq_stub 13
+irq_stub 14
+irq_stub 15
+
+isr_no_err_stub 128