/* * isr.S – Interrupt Service Routine stubs for x86-64. * * Provides 256 thin stub functions (isr0 – isr255) and a common body * (isr_common) that saves all general-purpose registers, calls the C * handler isr_handler(ISRFrame *), restores registers, and returns * via IRETQ. * * Two macros generate the stubs: * ISR_NOERR – pushes a dummy error code (0) for vectors that don't * ISR_ERR – the CPU already pushed an error code * * A pointer table (isr_stub_table) is emitted at the end so that * idt.c can look up the stub address for each vector by index. */ .text .global isr_handler .global isr_stub_table /* ---------------------------------------------------------------- * Stub macros * ---------------------------------------------------------------- */ .macro ISR_NOERR num .global isr\num isr\num: pushq $0 pushq $\num jmp isr_common .endm .macro ISR_ERR num .global isr\num isr\num: pushq $\num jmp isr_common .endm /* ---------------------------------------------------------------- * Common ISR body – saves state, calls C handler, restores state * ---------------------------------------------------------------- */ isr_common: cld pushq %rax pushq %rbx pushq %rcx pushq %rdx pushq %rsi pushq %rdi pushq %rbp pushq %r8 pushq %r9 pushq %r10 pushq %r11 pushq %r12 pushq %r13 pushq %r14 pushq %r15 movq %rsp, %rdi call isr_handler popq %r15 popq %r14 popq %r13 popq %r12 popq %r11 popq %r10 popq %r9 popq %r8 popq %rbp popq %rdi popq %rsi popq %rdx popq %rcx popq %rbx popq %rax addq $16, %rsp iretq /* ---------------------------------------------------------------- * Stub instantiation (vectors 0-255) * * Vectors 0-31: CPU exceptions (some push error codes) * Vectors 32-47: legacy 8259 PIC hardware IRQs * Vectors 48+: available for software / APIC use * ---------------------------------------------------------------- */ /* CPU exceptions */ ISR_NOERR 0 ISR_NOERR 1 ISR_NOERR 2 ISR_NOERR 3 ISR_NOERR 4 ISR_NOERR 5 ISR_NOERR 6 ISR_NOERR 7 ISR_ERR 8 ISR_NOERR 9 ISR_ERR 10 ISR_ERR 11 ISR_ERR 12 ISR_ERR 13 ISR_ERR 14 ISR_NOERR 15 ISR_NOERR 16 ISR_ERR 17 ISR_NOERR 18 ISR_NOERR 19 ISR_NOERR 20 ISR_NOERR 21 ISR_NOERR 22 ISR_NOERR 23 ISR_NOERR 24 ISR_NOERR 25 ISR_NOERR 26 ISR_NOERR 27 ISR_NOERR 28 ISR_NOERR 29 ISR_ERR 30 ISR_NOERR 31 ISR_NOERR 32 ISR_NOERR 33 ISR_NOERR 34 ISR_NOERR 35 ISR_NOERR 36 ISR_NOERR 37 ISR_NOERR 38 ISR_NOERR 39 ISR_NOERR 40 ISR_NOERR 41 ISR_NOERR 42 ISR_NOERR 43 ISR_NOERR 44 ISR_NOERR 45 ISR_NOERR 46 ISR_NOERR 47 ISR_NOERR 48 ISR_NOERR 49 ISR_NOERR 50 ISR_NOERR 51 ISR_NOERR 52 ISR_NOERR 53 ISR_NOERR 54 ISR_NOERR 55 ISR_NOERR 56 ISR_NOERR 57 ISR_NOERR 58 ISR_NOERR 59 ISR_NOERR 60 ISR_NOERR 61 ISR_NOERR 62 ISR_NOERR 63 ISR_NOERR 64 ISR_NOERR 65 ISR_NOERR 66 ISR_NOERR 67 ISR_NOERR 68 ISR_NOERR 69 ISR_NOERR 70 ISR_NOERR 71 ISR_NOERR 72 ISR_NOERR 73 ISR_NOERR 74 ISR_NOERR 75 ISR_NOERR 76 ISR_NOERR 77 ISR_NOERR 78 ISR_NOERR 79 ISR_NOERR 80 ISR_NOERR 81 ISR_NOERR 82 ISR_NOERR 83 ISR_NOERR 84 ISR_NOERR 85 ISR_NOERR 86 ISR_NOERR 87 ISR_NOERR 88 ISR_NOERR 89 ISR_NOERR 90 ISR_NOERR 91 ISR_NOERR 92 ISR_NOERR 93 ISR_NOERR 94 ISR_NOERR 95 ISR_NOERR 96 ISR_NOERR 97 ISR_NOERR 98 ISR_NOERR 99 ISR_NOERR 100 ISR_NOERR 101 ISR_NOERR 102 ISR_NOERR 103 ISR_NOERR 104 ISR_NOERR 105 ISR_NOERR 106 ISR_NOERR 107 ISR_NOERR 108 ISR_NOERR 109 ISR_NOERR 110 ISR_NOERR 111 ISR_NOERR 112 ISR_NOERR 113 ISR_NOERR 114 ISR_NOERR 115 ISR_NOERR 116 ISR_NOERR 117 ISR_NOERR 118 ISR_NOERR 119 ISR_NOERR 120 ISR_NOERR 121 ISR_NOERR 122 ISR_NOERR 123 ISR_NOERR 124 ISR_NOERR 125 ISR_NOERR 126 ISR_NOERR 127 ISR_NOERR 128 ISR_NOERR 129 ISR_NOERR 130 ISR_NOERR 131 ISR_NOERR 132 ISR_NOERR 133 ISR_NOERR 134 ISR_NOERR 135 ISR_NOERR 136 ISR_NOERR 137 ISR_NOERR 138 ISR_NOERR 139 ISR_NOERR 140 ISR_NOERR 141 ISR_NOERR 142 ISR_NOERR 143 ISR_NOERR 144 ISR_NOERR 145 ISR_NOERR 146 ISR_NOERR 147 ISR_NOERR 148 ISR_NOERR 149 ISR_NOERR 150 ISR_NOERR 151 ISR_NOERR 152 ISR_NOERR 153 ISR_NOERR 154 ISR_NOERR 155 ISR_NOERR 156 ISR_NOERR 157 ISR_NOERR 158 ISR_NOERR 159 ISR_NOERR 160 ISR_NOERR 161 ISR_NOERR 162 ISR_NOERR 163 ISR_NOERR 164 ISR_NOERR 165 ISR_NOERR 166 ISR_NOERR 167 ISR_NOERR 168 ISR_NOERR 169 ISR_NOERR 170 ISR_NOERR 171 ISR_NOERR 172 ISR_NOERR 173 ISR_NOERR 174 ISR_NOERR 175 ISR_NOERR 176 ISR_NOERR 177 ISR_NOERR 178 ISR_NOERR 179 ISR_NOERR 180 ISR_NOERR 181 ISR_NOERR 182 ISR_NOERR 183 ISR_NOERR 184 ISR_NOERR 185 ISR_NOERR 186 ISR_NOERR 187 ISR_NOERR 188 ISR_NOERR 189 ISR_NOERR 190 ISR_NOERR 191 ISR_NOERR 192 ISR_NOERR 193 ISR_NOERR 194 ISR_NOERR 195 ISR_NOERR 196 ISR_NOERR 197 ISR_NOERR 198 ISR_NOERR 199 ISR_NOERR 200 ISR_NOERR 201 ISR_NOERR 202 ISR_NOERR 203 ISR_NOERR 204 ISR_NOERR 205 ISR_NOERR 206 ISR_NOERR 207 ISR_NOERR 208 ISR_NOERR 209 ISR_NOERR 210 ISR_NOERR 211 ISR_NOERR 212 ISR_NOERR 213 ISR_NOERR 214 ISR_NOERR 215 ISR_NOERR 216 ISR_NOERR 217 ISR_NOERR 218 ISR_NOERR 219 ISR_NOERR 220 ISR_NOERR 221 ISR_NOERR 222 ISR_NOERR 223 ISR_NOERR 224 ISR_NOERR 225 ISR_NOERR 226 ISR_NOERR 227 ISR_NOERR 228 ISR_NOERR 229 ISR_NOERR 230 ISR_NOERR 231 ISR_NOERR 232 ISR_NOERR 233 ISR_NOERR 234 ISR_NOERR 235 ISR_NOERR 236 ISR_NOERR 237 ISR_NOERR 238 ISR_NOERR 239 ISR_NOERR 240 ISR_NOERR 241 ISR_NOERR 242 ISR_NOERR 243 ISR_NOERR 244 ISR_NOERR 245 ISR_NOERR 246 ISR_NOERR 247 ISR_NOERR 248 ISR_NOERR 249 ISR_NOERR 250 ISR_NOERR 251 ISR_NOERR 252 ISR_NOERR 253 ISR_NOERR 254 ISR_NOERR 255 /* ---------------------------------------------------------------- * Stub pointer table – indexed by vector number (0-255) * Used by idt_set_gate() in idt.c to populate the IDT. * ---------------------------------------------------------------- */ isr_stub_table: .quad isr0 .quad isr1 .quad isr2 .quad isr3 .quad isr4 .quad isr5 .quad isr6 .quad isr7 .quad isr8 .quad isr9 .quad isr10 .quad isr11 .quad isr12 .quad isr13 .quad isr14 .quad isr15 .quad isr16 .quad isr17 .quad isr18 .quad isr19 .quad isr20 .quad isr21 .quad isr22 .quad isr23 .quad isr24 .quad isr25 .quad isr26 .quad isr27 .quad isr28 .quad isr29 .quad isr30 .quad isr31 .quad isr32 .quad isr33 .quad isr34 .quad isr35 .quad isr36 .quad isr37 .quad isr38 .quad isr39 .quad isr40 .quad isr41 .quad isr42 .quad isr43 .quad isr44 .quad isr45 .quad isr46 .quad isr47 .quad isr48 .quad isr49 .quad isr50 .quad isr51 .quad isr52 .quad isr53 .quad isr54 .quad isr55 .quad isr56 .quad isr57 .quad isr58 .quad isr59 .quad isr60 .quad isr61 .quad isr62 .quad isr63 .quad isr64 .quad isr65 .quad isr66 .quad isr67 .quad isr68 .quad isr69 .quad isr70 .quad isr71 .quad isr72 .quad isr73 .quad isr74 .quad isr75 .quad isr76 .quad isr77 .quad isr78 .quad isr79 .quad isr80 .quad isr81 .quad isr82 .quad isr83 .quad isr84 .quad isr85 .quad isr86 .quad isr87 .quad isr88 .quad isr89 .quad isr90 .quad isr91 .quad isr92 .quad isr93 .quad isr94 .quad isr95 .quad isr96 .quad isr97 .quad isr98 .quad isr99 .quad isr100 .quad isr101 .quad isr102 .quad isr103 .quad isr104 .quad isr105 .quad isr106 .quad isr107 .quad isr108 .quad isr109 .quad isr110 .quad isr111 .quad isr112 .quad isr113 .quad isr114 .quad isr115 .quad isr116 .quad isr117 .quad isr118 .quad isr119 .quad isr120 .quad isr121 .quad isr122 .quad isr123 .quad isr124 .quad isr125 .quad isr126 .quad isr127 .quad isr128 .quad isr129 .quad isr130 .quad isr131 .quad isr132 .quad isr133 .quad isr134 .quad isr135 .quad isr136 .quad isr137 .quad isr138 .quad isr139 .quad isr140 .quad isr141 .quad isr142 .quad isr143 .quad isr144 .quad isr145 .quad isr146 .quad isr147 .quad isr148 .quad isr149 .quad isr150 .quad isr151 .quad isr152 .quad isr153 .quad isr154 .quad isr155 .quad isr156 .quad isr157 .quad isr158 .quad isr159 .quad isr160 .quad isr161 .quad isr162 .quad isr163 .quad isr164 .quad isr165 .quad isr166 .quad isr167 .quad isr168 .quad isr169 .quad isr170 .quad isr171 .quad isr172 .quad isr173 .quad isr174 .quad isr175 .quad isr176 .quad isr177 .quad isr178 .quad isr179 .quad isr180 .quad isr181 .quad isr182 .quad isr183 .quad isr184 .quad isr185 .quad isr186 .quad isr187 .quad isr188 .quad isr189 .quad isr190 .quad isr191 .quad isr192 .quad isr193 .quad isr194 .quad isr195 .quad isr196 .quad isr197 .quad isr198 .quad isr199 .quad isr200 .quad isr201 .quad isr202 .quad isr203 .quad isr204 .quad isr205 .quad isr206 .quad isr207 .quad isr208 .quad isr209 .quad isr210 .quad isr211 .quad isr212 .quad isr213 .quad isr214 .quad isr215 .quad isr216 .quad isr217 .quad isr218 .quad isr219 .quad isr220 .quad isr221 .quad isr222 .quad isr223 .quad isr224 .quad isr225 .quad isr226 .quad isr227 .quad isr228 .quad isr229 .quad isr230 .quad isr231 .quad isr232 .quad isr233 .quad isr234 .quad isr235 .quad isr236 .quad isr237 .quad isr238 .quad isr239 .quad isr240 .quad isr241 .quad isr242 .quad isr243 .quad isr244 .quad isr245 .quad isr246 .quad isr247 .quad isr248 .quad isr249 .quad isr250 .quad isr251 .quad isr252 .quad isr253 .quad isr254 .quad isr255 .section .note.GNU-stack,"",@progbits