2023-02-08 20:24:40 +00:00
|
|
|
.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
|
2023-05-07 21:43:04 +01:00
|
|
|
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
|
2023-02-08 20:24:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
.global isr_common_stub
|
|
|
|
|
.type isr_common_stub, @function
|
|
|
|
|
|
|
|
|
|
isr_common_stub:
|
|
|
|
|
PUSH_REGS
|
|
|
|
|
|
|
|
|
|
mov %rsp, %rdi
|
|
|
|
|
call isr_dispatch
|
|
|
|
|
|
|
|
|
|
POP_REGS
|
|
|
|
|
add $16, %rsp
|
|
|
|
|
iretq
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.global irq_common_stub
|
|
|
|
|
.type irq_common_stub, @function
|
|
|
|
|
|
|
|
|
|
irq_common_stub:
|
|
|
|
|
PUSH_REGS
|
|
|
|
|
|
|
|
|
|
mov %rsp, %rdi
|
|
|
|
|
call irq_dispatch
|
|
|
|
|
|
|
|
|
|
POP_REGS
|
|
|
|
|
add $16, %rsp
|
|
|
|
|
iretq
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.global syscall_gate
|
|
|
|
|
.type syscall_gate, @function
|
|
|
|
|
|
|
|
|
|
.extern syscall_dispatch
|
|
|
|
|
.type syscall_dispatch, @function
|
|
|
|
|
|
|
|
|
|
syscall_gate:
|
|
|
|
|
swapgs
|
|
|
|
|
movq %rsp, %gs:20 # GS+20 = rsp2 in the current TSS block (user stack storage)
|
|
|
|
|
movq %gs:4, %rsp # GS+4 = rsp0 in the current TSS block (per-thread kstack)
|
|
|
|
|
|
|
|
|
|
# start building a pf_cpu_context
|
|
|
|
|
pushq $0x1b
|
|
|
|
|
pushq %gs:20
|
|
|
|
|
push %r11
|
|
|
|
|
push $0x23
|
|
|
|
|
push %rcx
|
|
|
|
|
|
|
|
|
|
pushq $0
|
|
|
|
|
pushq $0x80
|
|
|
|
|
|
|
|
|
|
PUSH_REGS
|
|
|
|
|
|
|
|
|
|
mov %rsp, %rdi
|
|
|
|
|
|
|
|
|
|
# switch back to user gs while in syscall_dispatch. Interrupts are enabled in syscall_dispatch,
|
|
|
|
|
# and if the task gets pre-empted, the incoming task will expect %gs to have its usermode value.
|
|
|
|
|
swapgs
|
|
|
|
|
|
|
|
|
|
call syscall_dispatch
|
|
|
|
|
|
|
|
|
|
POP_REGS
|
|
|
|
|
|
|
|
|
|
add $16, %rsp
|
|
|
|
|
pop %rcx
|
|
|
|
|
add $8, %rsp
|
|
|
|
|
pop %r11
|
|
|
|
|
add $16, %rsp
|
|
|
|
|
|
|
|
|
|
swapgs
|
|
|
|
|
movq %gs:20, %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
|
|
|
|
|
|
|
|
|
|
|