.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 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