Files
mango/arch/x86_64/irqvec.S
Max Wash dbe117135b x86_64: implement proper user/kernel %gs base switching
the %gs base address is now always set to the current cpu block while
in kernel-mode, and is switched back to the userspace %gs base
when returning to user-mode.
2026-02-23 18:26:21 +00:00

447 lines
5.5 KiB
ArmAsm

.section .text
.align 4
.macro ISR_ERROR index
.global _isr\index
.type _isr\index, @function
_isr\index:
cli
pushq $\index
jmp isr_common_stub
.endm
.macro ISR_NO_ERROR index
.global _isr\index
.type _isr\index, @function
_isr\index:
cli
pushq $0
pushq $\index
jmp isr_common_stub
.endm
.macro IRQ id byte
.global _irq\id
.type _irq\id, @function
_irq\id:
cli
pushq $\id
pushq $\byte
jmp irq_common_stub
.endm
.macro PUSH_REGS
push %rax
push %rcx
push %rdx
push %rbx
pushq $0
push %rbp
push %rsi
push %rdi
push %r8
push %r9
push %r10
push %r11
push %r12
push %r13
push %r14
push %r15
.endm
.macro POP_REGS
pop %r15
pop %r14
pop %r13
pop %r12
pop %r11
pop %r10
pop %r9
pop %r8
pop %rdi
pop %rsi
pop %rbp
add $8, %rsp
pop %rbx
pop %rdx
pop %rcx
pop %rax
.endm
ISR_NO_ERROR 0
ISR_NO_ERROR 1
ISR_NO_ERROR 2
ISR_NO_ERROR 3
ISR_NO_ERROR 4
ISR_NO_ERROR 5
ISR_NO_ERROR 6
ISR_NO_ERROR 7
ISR_ERROR 8
ISR_NO_ERROR 9
ISR_ERROR 10
ISR_ERROR 11
ISR_ERROR 12
ISR_ERROR 13
ISR_ERROR 14
ISR_NO_ERROR 15
ISR_NO_ERROR 16
ISR_NO_ERROR 17
ISR_NO_ERROR 18
ISR_NO_ERROR 19
ISR_NO_ERROR 20
ISR_NO_ERROR 21
ISR_NO_ERROR 22
ISR_NO_ERROR 23
ISR_NO_ERROR 24
ISR_NO_ERROR 25
ISR_NO_ERROR 26
ISR_NO_ERROR 27
ISR_NO_ERROR 28
ISR_NO_ERROR 29
ISR_NO_ERROR 30
ISR_NO_ERROR 31
IRQ 0, 32
IRQ 1, 33
IRQ 2, 34
IRQ 3, 35
IRQ 4, 36
IRQ 5, 37
IRQ 6, 38
IRQ 7, 39
IRQ 8, 40
IRQ 9, 41
IRQ 10, 42
IRQ 11, 43
IRQ 12, 44
IRQ 13, 45
IRQ 14, 46
IRQ 15, 47
IRQ 16, 48
IRQ 17, 49
IRQ 18, 50
IRQ 19, 51
IRQ 20, 52
IRQ 21, 53
IRQ 22, 54
IRQ 23, 55
IRQ 24, 56
IRQ 25, 57
IRQ 26, 58
IRQ 27, 59
IRQ 28, 60
IRQ 29, 61
IRQ 30, 62
IRQ 31, 63
IRQ 32, 64
IRQ 33, 65
IRQ 34, 66
IRQ 35, 67
IRQ 36, 68
IRQ 37, 69
IRQ 38, 70
IRQ 39, 71
IRQ 40, 72
IRQ 41, 73
IRQ 42, 74
IRQ 43, 75
IRQ 44, 76
IRQ 45, 77
IRQ 46, 78
IRQ 47, 79
IRQ 48, 80
IRQ 49, 81
IRQ 50, 82
IRQ 51, 83
IRQ 52, 84
IRQ 53, 85
IRQ 54, 86
IRQ 55, 87
IRQ 56, 88
IRQ 57, 89
IRQ 58, 90
IRQ 59, 91
IRQ 60, 92
IRQ 61, 93
IRQ 62, 94
IRQ 63, 95
IRQ 64, 96
IRQ 65, 97
IRQ 66, 98
IRQ 67, 99
IRQ 68, 100
IRQ 69, 101
IRQ 70, 102
IRQ 71, 103
IRQ 72, 104
IRQ 73, 105
IRQ 74, 106
IRQ 75, 107
IRQ 76, 108
IRQ 77, 109
IRQ 78, 110
IRQ 79, 111
IRQ 80, 112
IRQ 81, 113
IRQ 82, 114
IRQ 83, 115
IRQ 84, 116
IRQ 85, 117
IRQ 86, 118
IRQ 87, 119
IRQ 88, 120
IRQ 89, 121
IRQ 90, 122
IRQ 91, 123
IRQ 92, 124
IRQ 93, 125
IRQ 94, 126
IRQ 95, 127
IRQ 96, 128
IRQ 97, 129
IRQ 98, 130
IRQ 99, 131
IRQ 100, 132
IRQ 101, 133
IRQ 102, 134
IRQ 103, 135
IRQ 104, 136
IRQ 105, 137
IRQ 106, 138
IRQ 107, 139
IRQ 108, 140
IRQ 109, 141
IRQ 110, 142
IRQ 111, 143
IRQ 112, 144
IRQ 113, 145
IRQ 114, 146
IRQ 115, 147
IRQ 116, 148
IRQ 117, 149
IRQ 118, 150
IRQ 119, 151
IRQ 120, 152
IRQ 121, 153
IRQ 122, 154
IRQ 123, 155
IRQ 124, 156
IRQ 125, 157
IRQ 126, 158
IRQ 127, 159
IRQ 128, 160
IRQ 129, 161
IRQ 130, 162
IRQ 131, 163
IRQ 132, 164
IRQ 133, 165
IRQ 134, 166
IRQ 135, 167
IRQ 136, 168
IRQ 137, 169
IRQ 138, 170
IRQ 139, 171
IRQ 140, 172
IRQ 141, 173
IRQ 142, 174
IRQ 143, 175
IRQ 144, 176
IRQ 145, 177
IRQ 146, 178
IRQ 147, 179
IRQ 148, 180
IRQ 149, 181
IRQ 150, 182
IRQ 151, 183
IRQ 152, 184
IRQ 153, 185
IRQ 154, 186
IRQ 155, 187
IRQ 156, 188
IRQ 157, 189
IRQ 158, 190
IRQ 159, 191
IRQ 160, 192
IRQ 161, 193
IRQ 162, 194
IRQ 163, 195
IRQ 164, 196
IRQ 165, 197
IRQ 166, 198
IRQ 167, 199
IRQ 168, 200
IRQ 169, 201
IRQ 170, 202
IRQ 171, 203
IRQ 172, 204
IRQ 173, 205
IRQ 174, 206
IRQ 175, 207
IRQ 176, 208
IRQ 177, 209
IRQ 178, 210
IRQ 179, 211
IRQ 180, 212
IRQ 181, 213
IRQ 182, 214
IRQ 183, 215
IRQ 184, 216
IRQ 185, 217
IRQ 186, 218
IRQ 187, 219
IRQ 188, 220
IRQ 189, 221
IRQ 190, 222
IRQ 191, 223
IRQ 192, 224
IRQ 193, 225
IRQ 194, 226
IRQ 195, 227
IRQ 196, 228
IRQ 197, 229
IRQ 198, 230
IRQ 199, 231
IRQ 200, 232
IRQ 201, 233
IRQ 202, 234
IRQ 203, 235
IRQ 204, 236
IRQ 205, 237
IRQ 206, 238
IRQ 207, 239
IRQ 208, 240
IRQ 209, 241
IRQ 210, 242
IRQ 211, 243
IRQ 212, 244
IRQ 213, 245
IRQ 214, 246
IRQ 215, 247
IRQ 216, 248
IRQ 217, 249
IRQ 218, 250
IRQ 219, 251
IRQ 220, 252
IRQ 221, 253
IRQ 222, 254
IRQ 223, 255
.global isr_common_stub
.type isr_common_stub, @function
isr_common_stub:
PUSH_REGS
# When ISR occurs in Ring 3, CPU sets %ss (and other non-code selectors)
# to 0.
mov %ss, %ax
cmp $0, %ax
jne isr_skipgs1
mov $0x10, %ax
mov %ax, %ss
swapgs
isr_skipgs1:
mov %rsp, %rdi
call isr_dispatch
POP_REGS
add $16, %rsp
cmpq $0x1b, 32(%rsp)
jne isr_skipgs2
swapgs
isr_skipgs2:
iretq
.global irq_common_stub
.type irq_common_stub, @function
irq_common_stub:
PUSH_REGS
# When IRQ occurs in Ring 3, CPU sets %ss (and other non-code selectors)
# to 0.
mov %ss, %ax
cmp $0, %ax
jne irq_skipgs1
mov $0x10, %ax
mov %ax, %ss
swapgs
irq_skipgs1:
mov %rsp, %rdi
call irq_dispatch
POP_REGS
add $16, %rsp
cmpq $0x1b, 32(%rsp)
jne isr_skipgs2
swapgs
irq_skipgs2:
iretq
.global syscall_gate
.type syscall_gate, @function
.extern syscall_dispatch
.type syscall_dispatch, @function
syscall_gate:
swapgs
movq %rsp, %gs:94 # GS+20 = rsp2 in the current TSS block (user stack storage)
movq %gs:78, %rsp # GS+4 = rsp0 in the current TSS block (per-thread kstack)
# start building a ml_cpu_context
pushq $0x1b
pushq %gs:94
push %r11
push $0x23
push %rcx
pushq $0
pushq $0x80
PUSH_REGS
mov %rsp, %rdi
call syscall_dispatch
POP_REGS
add $16, %rsp
pop %rcx
add $8, %rsp
pop %r11
add $16, %rsp
movq %gs:94, %rsp # GS+20 = rsp2 in the current TSS block
swapgs
# back to usermode
sysretq
.global pf_faultptr
.type pf_faultptr, @function
pf_faultptr:
mov %cr2, %rax
ret