summaryrefslogtreecommitdiff
path: root/kernel/arch/x86_64/asm/isr.s
blob: a79532dd0fcc40f5ea5c8408b2eb2f72ee4d8a0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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