1#include "archconst.h" 2#include "apic.h" 3#include "sconst.h" 4#include "apic_asm.h" 5#include <machine/asm.h> 6 7#define APIC_IRQ_HANDLER(irq) \ 8 push $irq ;\ 9 call _C_LABEL(irq_handle) /* intr_handle(irq) */ ;\ 10 add $4, %esp ; 11 12/*===========================================================================*/ 13/* interrupt handlers */ 14/* interrupt handlers for 386 32-bit protected mode */ 15/* APIC interrupt handlers for 386 32-bit protected mode */ 16/*===========================================================================*/ 17#define apic_hwint(irq) \ 18ENTRY(apic_hwint##irq) \ 19 TEST_INT_IN_KERNEL(4, 0f) ;\ 20 \ 21 SAVE_PROCESS_CTX(0, KTS_INT_HARD) ;\ 22 push %ebp ;\ 23 call _C_LABEL(context_stop) ;\ 24 add $4, %esp ;\ 25 movl $0, %ebp /* for stack trace */ ;\ 26 APIC_IRQ_HANDLER(irq) ;\ 27 jmp _C_LABEL(switch_to_user) ;\ 28 \ 290: \ 30 pusha ;\ 31 call _C_LABEL(context_stop_idle) ;\ 32 APIC_IRQ_HANDLER(irq) ;\ 33 CLEAR_IF(10*4(%esp)) ;\ 34 popa ;\ 35 iret ; 36 37#define LAPIC_INTR_HANDLER(func) \ 38 movl $func, %eax ;\ 39 call *%eax /* call the actual handler */ ;\ 40 mov _C_LABEL(lapic_eoi_addr), %eax /* the end of handler*/ ;\ 41 movl $0, (%eax) ; 42 43/*===========================================================================*/ 44/* handler of the local APIC interrupts */ 45/*===========================================================================*/ 46 47#define lapic_intr(func) \ 48 TEST_INT_IN_KERNEL(4, 0f) ;\ 49 \ 50 SAVE_PROCESS_CTX(0, KTS_INT_HARD) ;\ 51 push %ebp ;\ 52 call _C_LABEL(context_stop) ;\ 53 add $4, %esp ;\ 54 movl $0, %ebp /* for stack trace */ ;\ 55 LAPIC_INTR_HANDLER(func) ;\ 56 jmp _C_LABEL(switch_to_user) ;\ 57 \ 580: \ 59 pusha ;\ 60 call _C_LABEL(context_stop_idle) ;\ 61 LAPIC_INTR_HANDLER(func) ;\ 62 CLEAR_IF(10*4(%esp)) ;\ 63 popa ;\ 64 iret ; 65 66/* apic timer tick handlers */ 67ENTRY(lapic_timer_int_handler) 68 lapic_intr(_C_LABEL(timer_int_handler)) 69 70ENTRY(apic_spurios_intr) 71 lapic_intr(_C_LABEL(apic_spurios_intr_handler)) 72 73ENTRY(apic_error_intr) 74 lapic_intr(_C_LABEL(apic_error_intr_handler)) 75 76#ifdef CONFIG_SMP 77 78ENTRY(apic_ipi_sched_intr) 79 lapic_intr(_C_LABEL(smp_ipi_sched_handler)) 80 81ENTRY(apic_ipi_halt_intr) 82 lapic_intr(_C_LABEL(smp_ipi_halt_handler)) 83 84#endif /* CONFIG_SMP */ 85 86#ifdef APIC_DEBUG 87 88.data 89lapic_intr_dummy_handler_msg: 90.ascii "UNHANDLED APIC interrupt vector %d\n" 91 92.text 93 94#define lapic_intr_dummy_handler(vect) \ 95 pushl $vect; \ 96 push $lapic_intr_dummy_handler_msg; \ 97 call _C_LABEL(panic); \ 981: jmp 1b; /* never return */ 99 100#define LAPIC_INTR_DUMMY_HANDLER(vect) \ 101 .balign LAPIC_INTR_DUMMY_HANDLER_SIZE; \ 102 _lapic_intr_dummy_handler_##vect: lapic_intr_dummy_handler(vect) 103 104apic_hwint(0) 105apic_hwint(1) 106apic_hwint(2) 107apic_hwint(3) 108apic_hwint(4) 109apic_hwint(5) 110apic_hwint(6) 111apic_hwint(7) 112apic_hwint(8) 113apic_hwint(9) 114apic_hwint(10) 115apic_hwint(11) 116apic_hwint(12) 117apic_hwint(13) 118apic_hwint(14) 119apic_hwint(15) 120apic_hwint(16) 121apic_hwint(17) 122apic_hwint(18) 123apic_hwint(19) 124apic_hwint(20) 125apic_hwint(21) 126apic_hwint(22) 127apic_hwint(23) 128apic_hwint(24) 129apic_hwint(25) 130apic_hwint(26) 131apic_hwint(27) 132apic_hwint(28) 133apic_hwint(29) 134apic_hwint(30) 135apic_hwint(31) 136apic_hwint(32) 137apic_hwint(33) 138apic_hwint(34) 139apic_hwint(35) 140apic_hwint(36) 141apic_hwint(37) 142apic_hwint(38) 143apic_hwint(39) 144apic_hwint(40) 145apic_hwint(41) 146apic_hwint(42) 147apic_hwint(43) 148apic_hwint(44) 149apic_hwint(45) 150apic_hwint(46) 151apic_hwint(47) 152apic_hwint(48) 153apic_hwint(49) 154apic_hwint(50) 155apic_hwint(51) 156apic_hwint(52) 157apic_hwint(53) 158apic_hwint(54) 159apic_hwint(55) 160apic_hwint(56) 161apic_hwint(57) 162apic_hwint(58) 163apic_hwint(59) 164apic_hwint(60) 165apic_hwint(61) 166apic_hwint(62) 167apic_hwint(63) 168 169LABEL(lapic_intr_dummy_handles_start) 170 LAPIC_INTR_DUMMY_HANDLER(0) 171 LAPIC_INTR_DUMMY_HANDLER(1) 172 LAPIC_INTR_DUMMY_HANDLER(2) 173 LAPIC_INTR_DUMMY_HANDLER(3) 174 LAPIC_INTR_DUMMY_HANDLER(4) 175 LAPIC_INTR_DUMMY_HANDLER(5) 176 LAPIC_INTR_DUMMY_HANDLER(6) 177 LAPIC_INTR_DUMMY_HANDLER(7) 178 LAPIC_INTR_DUMMY_HANDLER(8) 179 LAPIC_INTR_DUMMY_HANDLER(9) 180 LAPIC_INTR_DUMMY_HANDLER(10) 181 LAPIC_INTR_DUMMY_HANDLER(11) 182 LAPIC_INTR_DUMMY_HANDLER(12) 183 LAPIC_INTR_DUMMY_HANDLER(13) 184 LAPIC_INTR_DUMMY_HANDLER(14) 185 LAPIC_INTR_DUMMY_HANDLER(15) 186 LAPIC_INTR_DUMMY_HANDLER(16) 187 LAPIC_INTR_DUMMY_HANDLER(17) 188 LAPIC_INTR_DUMMY_HANDLER(18) 189 LAPIC_INTR_DUMMY_HANDLER(19) 190 LAPIC_INTR_DUMMY_HANDLER(20) 191 LAPIC_INTR_DUMMY_HANDLER(21) 192 LAPIC_INTR_DUMMY_HANDLER(22) 193 LAPIC_INTR_DUMMY_HANDLER(23) 194 LAPIC_INTR_DUMMY_HANDLER(24) 195 LAPIC_INTR_DUMMY_HANDLER(25) 196 LAPIC_INTR_DUMMY_HANDLER(26) 197 LAPIC_INTR_DUMMY_HANDLER(27) 198 LAPIC_INTR_DUMMY_HANDLER(28) 199 LAPIC_INTR_DUMMY_HANDLER(29) 200 LAPIC_INTR_DUMMY_HANDLER(30) 201 LAPIC_INTR_DUMMY_HANDLER(31) 202 LAPIC_INTR_DUMMY_HANDLER(32) 203 LAPIC_INTR_DUMMY_HANDLER(33) 204 LAPIC_INTR_DUMMY_HANDLER(34) 205 LAPIC_INTR_DUMMY_HANDLER(35) 206 LAPIC_INTR_DUMMY_HANDLER(36) 207 LAPIC_INTR_DUMMY_HANDLER(37) 208 LAPIC_INTR_DUMMY_HANDLER(38) 209 LAPIC_INTR_DUMMY_HANDLER(39) 210 LAPIC_INTR_DUMMY_HANDLER(40) 211 LAPIC_INTR_DUMMY_HANDLER(41) 212 LAPIC_INTR_DUMMY_HANDLER(42) 213 LAPIC_INTR_DUMMY_HANDLER(43) 214 LAPIC_INTR_DUMMY_HANDLER(44) 215 LAPIC_INTR_DUMMY_HANDLER(45) 216 LAPIC_INTR_DUMMY_HANDLER(46) 217 LAPIC_INTR_DUMMY_HANDLER(47) 218 LAPIC_INTR_DUMMY_HANDLER(48) 219 LAPIC_INTR_DUMMY_HANDLER(49) 220 LAPIC_INTR_DUMMY_HANDLER(50) 221 LAPIC_INTR_DUMMY_HANDLER(51) 222 LAPIC_INTR_DUMMY_HANDLER(52) 223 LAPIC_INTR_DUMMY_HANDLER(53) 224 LAPIC_INTR_DUMMY_HANDLER(54) 225 LAPIC_INTR_DUMMY_HANDLER(55) 226 LAPIC_INTR_DUMMY_HANDLER(56) 227 LAPIC_INTR_DUMMY_HANDLER(57) 228 LAPIC_INTR_DUMMY_HANDLER(58) 229 LAPIC_INTR_DUMMY_HANDLER(59) 230 LAPIC_INTR_DUMMY_HANDLER(60) 231 LAPIC_INTR_DUMMY_HANDLER(61) 232 LAPIC_INTR_DUMMY_HANDLER(62) 233 LAPIC_INTR_DUMMY_HANDLER(63) 234 LAPIC_INTR_DUMMY_HANDLER(64) 235 LAPIC_INTR_DUMMY_HANDLER(65) 236 LAPIC_INTR_DUMMY_HANDLER(66) 237 LAPIC_INTR_DUMMY_HANDLER(67) 238 LAPIC_INTR_DUMMY_HANDLER(68) 239 LAPIC_INTR_DUMMY_HANDLER(69) 240 LAPIC_INTR_DUMMY_HANDLER(70) 241 LAPIC_INTR_DUMMY_HANDLER(71) 242 LAPIC_INTR_DUMMY_HANDLER(72) 243 LAPIC_INTR_DUMMY_HANDLER(73) 244 LAPIC_INTR_DUMMY_HANDLER(74) 245 LAPIC_INTR_DUMMY_HANDLER(75) 246 LAPIC_INTR_DUMMY_HANDLER(76) 247 LAPIC_INTR_DUMMY_HANDLER(77) 248 LAPIC_INTR_DUMMY_HANDLER(78) 249 LAPIC_INTR_DUMMY_HANDLER(79) 250 LAPIC_INTR_DUMMY_HANDLER(80) 251 LAPIC_INTR_DUMMY_HANDLER(81) 252 LAPIC_INTR_DUMMY_HANDLER(82) 253 LAPIC_INTR_DUMMY_HANDLER(83) 254 LAPIC_INTR_DUMMY_HANDLER(84) 255 LAPIC_INTR_DUMMY_HANDLER(85) 256 LAPIC_INTR_DUMMY_HANDLER(86) 257 LAPIC_INTR_DUMMY_HANDLER(87) 258 LAPIC_INTR_DUMMY_HANDLER(88) 259 LAPIC_INTR_DUMMY_HANDLER(89) 260 LAPIC_INTR_DUMMY_HANDLER(90) 261 LAPIC_INTR_DUMMY_HANDLER(91) 262 LAPIC_INTR_DUMMY_HANDLER(92) 263 LAPIC_INTR_DUMMY_HANDLER(93) 264 LAPIC_INTR_DUMMY_HANDLER(94) 265 LAPIC_INTR_DUMMY_HANDLER(95) 266 LAPIC_INTR_DUMMY_HANDLER(96) 267 LAPIC_INTR_DUMMY_HANDLER(97) 268 LAPIC_INTR_DUMMY_HANDLER(98) 269 LAPIC_INTR_DUMMY_HANDLER(99) 270 LAPIC_INTR_DUMMY_HANDLER(100) 271 LAPIC_INTR_DUMMY_HANDLER(101) 272 LAPIC_INTR_DUMMY_HANDLER(102) 273 LAPIC_INTR_DUMMY_HANDLER(103) 274 LAPIC_INTR_DUMMY_HANDLER(104) 275 LAPIC_INTR_DUMMY_HANDLER(105) 276 LAPIC_INTR_DUMMY_HANDLER(106) 277 LAPIC_INTR_DUMMY_HANDLER(107) 278 LAPIC_INTR_DUMMY_HANDLER(108) 279 LAPIC_INTR_DUMMY_HANDLER(109) 280 LAPIC_INTR_DUMMY_HANDLER(110) 281 LAPIC_INTR_DUMMY_HANDLER(111) 282 LAPIC_INTR_DUMMY_HANDLER(112) 283 LAPIC_INTR_DUMMY_HANDLER(113) 284 LAPIC_INTR_DUMMY_HANDLER(114) 285 LAPIC_INTR_DUMMY_HANDLER(115) 286 LAPIC_INTR_DUMMY_HANDLER(116) 287 LAPIC_INTR_DUMMY_HANDLER(117) 288 LAPIC_INTR_DUMMY_HANDLER(118) 289 LAPIC_INTR_DUMMY_HANDLER(119) 290 LAPIC_INTR_DUMMY_HANDLER(120) 291 LAPIC_INTR_DUMMY_HANDLER(121) 292 LAPIC_INTR_DUMMY_HANDLER(122) 293 LAPIC_INTR_DUMMY_HANDLER(123) 294 LAPIC_INTR_DUMMY_HANDLER(124) 295 LAPIC_INTR_DUMMY_HANDLER(125) 296 LAPIC_INTR_DUMMY_HANDLER(126) 297 LAPIC_INTR_DUMMY_HANDLER(127) 298 LAPIC_INTR_DUMMY_HANDLER(128) 299 LAPIC_INTR_DUMMY_HANDLER(129) 300 LAPIC_INTR_DUMMY_HANDLER(130) 301 LAPIC_INTR_DUMMY_HANDLER(131) 302 LAPIC_INTR_DUMMY_HANDLER(132) 303 LAPIC_INTR_DUMMY_HANDLER(133) 304 LAPIC_INTR_DUMMY_HANDLER(134) 305 LAPIC_INTR_DUMMY_HANDLER(135) 306 LAPIC_INTR_DUMMY_HANDLER(136) 307 LAPIC_INTR_DUMMY_HANDLER(137) 308 LAPIC_INTR_DUMMY_HANDLER(138) 309 LAPIC_INTR_DUMMY_HANDLER(139) 310 LAPIC_INTR_DUMMY_HANDLER(140) 311 LAPIC_INTR_DUMMY_HANDLER(141) 312 LAPIC_INTR_DUMMY_HANDLER(142) 313 LAPIC_INTR_DUMMY_HANDLER(143) 314 LAPIC_INTR_DUMMY_HANDLER(144) 315 LAPIC_INTR_DUMMY_HANDLER(145) 316 LAPIC_INTR_DUMMY_HANDLER(146) 317 LAPIC_INTR_DUMMY_HANDLER(147) 318 LAPIC_INTR_DUMMY_HANDLER(148) 319 LAPIC_INTR_DUMMY_HANDLER(149) 320 LAPIC_INTR_DUMMY_HANDLER(150) 321 LAPIC_INTR_DUMMY_HANDLER(151) 322 LAPIC_INTR_DUMMY_HANDLER(152) 323 LAPIC_INTR_DUMMY_HANDLER(153) 324 LAPIC_INTR_DUMMY_HANDLER(154) 325 LAPIC_INTR_DUMMY_HANDLER(155) 326 LAPIC_INTR_DUMMY_HANDLER(156) 327 LAPIC_INTR_DUMMY_HANDLER(157) 328 LAPIC_INTR_DUMMY_HANDLER(158) 329 LAPIC_INTR_DUMMY_HANDLER(159) 330 LAPIC_INTR_DUMMY_HANDLER(160) 331 LAPIC_INTR_DUMMY_HANDLER(161) 332 LAPIC_INTR_DUMMY_HANDLER(162) 333 LAPIC_INTR_DUMMY_HANDLER(163) 334 LAPIC_INTR_DUMMY_HANDLER(164) 335 LAPIC_INTR_DUMMY_HANDLER(165) 336 LAPIC_INTR_DUMMY_HANDLER(166) 337 LAPIC_INTR_DUMMY_HANDLER(167) 338 LAPIC_INTR_DUMMY_HANDLER(168) 339 LAPIC_INTR_DUMMY_HANDLER(169) 340 LAPIC_INTR_DUMMY_HANDLER(170) 341 LAPIC_INTR_DUMMY_HANDLER(171) 342 LAPIC_INTR_DUMMY_HANDLER(172) 343 LAPIC_INTR_DUMMY_HANDLER(173) 344 LAPIC_INTR_DUMMY_HANDLER(174) 345 LAPIC_INTR_DUMMY_HANDLER(175) 346 LAPIC_INTR_DUMMY_HANDLER(176) 347 LAPIC_INTR_DUMMY_HANDLER(177) 348 LAPIC_INTR_DUMMY_HANDLER(178) 349 LAPIC_INTR_DUMMY_HANDLER(179) 350 LAPIC_INTR_DUMMY_HANDLER(180) 351 LAPIC_INTR_DUMMY_HANDLER(181) 352 LAPIC_INTR_DUMMY_HANDLER(182) 353 LAPIC_INTR_DUMMY_HANDLER(183) 354 LAPIC_INTR_DUMMY_HANDLER(184) 355 LAPIC_INTR_DUMMY_HANDLER(185) 356 LAPIC_INTR_DUMMY_HANDLER(186) 357 LAPIC_INTR_DUMMY_HANDLER(187) 358 LAPIC_INTR_DUMMY_HANDLER(188) 359 LAPIC_INTR_DUMMY_HANDLER(189) 360 LAPIC_INTR_DUMMY_HANDLER(190) 361 LAPIC_INTR_DUMMY_HANDLER(191) 362 LAPIC_INTR_DUMMY_HANDLER(192) 363 LAPIC_INTR_DUMMY_HANDLER(193) 364 LAPIC_INTR_DUMMY_HANDLER(194) 365 LAPIC_INTR_DUMMY_HANDLER(195) 366 LAPIC_INTR_DUMMY_HANDLER(196) 367 LAPIC_INTR_DUMMY_HANDLER(197) 368 LAPIC_INTR_DUMMY_HANDLER(198) 369 LAPIC_INTR_DUMMY_HANDLER(199) 370 LAPIC_INTR_DUMMY_HANDLER(200) 371 LAPIC_INTR_DUMMY_HANDLER(201) 372 LAPIC_INTR_DUMMY_HANDLER(202) 373 LAPIC_INTR_DUMMY_HANDLER(203) 374 LAPIC_INTR_DUMMY_HANDLER(204) 375 LAPIC_INTR_DUMMY_HANDLER(205) 376 LAPIC_INTR_DUMMY_HANDLER(206) 377 LAPIC_INTR_DUMMY_HANDLER(207) 378 LAPIC_INTR_DUMMY_HANDLER(208) 379 LAPIC_INTR_DUMMY_HANDLER(209) 380 LAPIC_INTR_DUMMY_HANDLER(210) 381 LAPIC_INTR_DUMMY_HANDLER(211) 382 LAPIC_INTR_DUMMY_HANDLER(212) 383 LAPIC_INTR_DUMMY_HANDLER(213) 384 LAPIC_INTR_DUMMY_HANDLER(214) 385 LAPIC_INTR_DUMMY_HANDLER(215) 386 LAPIC_INTR_DUMMY_HANDLER(216) 387 LAPIC_INTR_DUMMY_HANDLER(217) 388 LAPIC_INTR_DUMMY_HANDLER(218) 389 LAPIC_INTR_DUMMY_HANDLER(219) 390 LAPIC_INTR_DUMMY_HANDLER(220) 391 LAPIC_INTR_DUMMY_HANDLER(221) 392 LAPIC_INTR_DUMMY_HANDLER(222) 393 LAPIC_INTR_DUMMY_HANDLER(223) 394 LAPIC_INTR_DUMMY_HANDLER(224) 395 LAPIC_INTR_DUMMY_HANDLER(225) 396 LAPIC_INTR_DUMMY_HANDLER(226) 397 LAPIC_INTR_DUMMY_HANDLER(227) 398 LAPIC_INTR_DUMMY_HANDLER(228) 399 LAPIC_INTR_DUMMY_HANDLER(229) 400 LAPIC_INTR_DUMMY_HANDLER(230) 401 LAPIC_INTR_DUMMY_HANDLER(231) 402 LAPIC_INTR_DUMMY_HANDLER(232) 403 LAPIC_INTR_DUMMY_HANDLER(233) 404 LAPIC_INTR_DUMMY_HANDLER(234) 405 LAPIC_INTR_DUMMY_HANDLER(235) 406 LAPIC_INTR_DUMMY_HANDLER(236) 407 LAPIC_INTR_DUMMY_HANDLER(237) 408 LAPIC_INTR_DUMMY_HANDLER(238) 409 LAPIC_INTR_DUMMY_HANDLER(239) 410 LAPIC_INTR_DUMMY_HANDLER(240) 411 LAPIC_INTR_DUMMY_HANDLER(241) 412 LAPIC_INTR_DUMMY_HANDLER(242) 413 LAPIC_INTR_DUMMY_HANDLER(243) 414 LAPIC_INTR_DUMMY_HANDLER(244) 415 LAPIC_INTR_DUMMY_HANDLER(245) 416 LAPIC_INTR_DUMMY_HANDLER(246) 417 LAPIC_INTR_DUMMY_HANDLER(247) 418 LAPIC_INTR_DUMMY_HANDLER(248) 419 LAPIC_INTR_DUMMY_HANDLER(249) 420 LAPIC_INTR_DUMMY_HANDLER(250) 421 LAPIC_INTR_DUMMY_HANDLER(251) 422 LAPIC_INTR_DUMMY_HANDLER(252) 423 LAPIC_INTR_DUMMY_HANDLER(253) 424 LAPIC_INTR_DUMMY_HANDLER(254) 425 LAPIC_INTR_DUMMY_HANDLER(255) 426LABEL(lapic_intr_dummy_handles_end) 427 428 429#endif /* APIC_DEBUG */ 430