1e1d76d85SSepherosa Ziehau/* 2e1d76d85SSepherosa Ziehau * from: vector.s, 386BSD 0.1 unknown origin 3e1d76d85SSepherosa Ziehau * $FreeBSD: src/sys/i386/isa/apic_vector.s,v 1.47.2.5 2001/09/01 22:33:38 tegge Exp $ 4e1d76d85SSepherosa Ziehau */ 5e1d76d85SSepherosa Ziehau 6e1d76d85SSepherosa Ziehau#include <machine/asmacros.h> 7e1d76d85SSepherosa Ziehau#include <machine/lock.h> 8e1d76d85SSepherosa Ziehau#include <machine/psl.h> 9e1d76d85SSepherosa Ziehau#include <machine/trap.h> 10e1d76d85SSepherosa Ziehau#include <machine/segments.h> 11e1d76d85SSepherosa Ziehau 12e1d76d85SSepherosa Ziehau#include "assym.s" 13e1d76d85SSepherosa Ziehau 14e1d76d85SSepherosa Ziehau#ifdef foo 15e1d76d85SSepherosa Ziehau/* convert an absolute IRQ# into bitmask */ 16e1d76d85SSepherosa Ziehau#define IRQ_LBIT(irq_num) (1UL << (irq_num & 0x3f)) 17e1d76d85SSepherosa Ziehau#endif 18e1d76d85SSepherosa Ziehau 19e1d76d85SSepherosa Ziehau#define IRQ_SBITS(irq_num) ((irq_num) & 0x3f) 20e1d76d85SSepherosa Ziehau 21e1d76d85SSepherosa Ziehau/* convert an absolute IRQ# into gd_ipending index */ 22e1d76d85SSepherosa Ziehau#define IRQ_LIDX(irq_num) ((irq_num) >> 6) 23e1d76d85SSepherosa Ziehau 24e1d76d85SSepherosa Ziehau#define MSI_PUSH_FRAME \ 254611d87fSMatthew Dillon PUSH_FRAME_TFRIP ; /* 15 regs + space for 5 extras */ \ 26e1d76d85SSepherosa Ziehau movq $0,TF_XFLAGS(%rsp) ; \ 27e1d76d85SSepherosa Ziehau movq $0,TF_TRAPNO(%rsp) ; \ 28e1d76d85SSepherosa Ziehau movq $0,TF_ADDR(%rsp) ; \ 29e1d76d85SSepherosa Ziehau movq $0,TF_FLAGS(%rsp) ; \ 30e1d76d85SSepherosa Ziehau movq $0,TF_ERR(%rsp) ; \ 31e1d76d85SSepherosa Ziehau cld ; \ 32e1d76d85SSepherosa Ziehau 33e1d76d85SSepherosa Ziehau/* 34e1d76d85SSepherosa Ziehau * Interrupt call handlers run in the following sequence: 35e1d76d85SSepherosa Ziehau * 36e1d76d85SSepherosa Ziehau * - Push the trap frame required by doreti 37e1d76d85SSepherosa Ziehau * - If we cannot take the interrupt set its ipending bit and 38e1d76d85SSepherosa Ziehau * doreti. 39e1d76d85SSepherosa Ziehau * - If we can take the interrupt clear its ipending bit, 40e1d76d85SSepherosa Ziehau * call the handler and doreti. 41e1d76d85SSepherosa Ziehau * 42e1d76d85SSepherosa Ziehau * YYY can cache gd base opitner instead of using hidden %fs prefixes. 43e1d76d85SSepherosa Ziehau */ 44e1d76d85SSepherosa Ziehau 45e1d76d85SSepherosa Ziehau#define MSI_HANDLER(irq_num) \ 46e1d76d85SSepherosa Ziehau .text ; \ 47e1d76d85SSepherosa Ziehau SUPERALIGN_TEXT ; \ 48e1d76d85SSepherosa ZiehauIDTVEC(msi_intr##irq_num) ; \ 49e1d76d85SSepherosa Ziehau MSI_PUSH_FRAME ; \ 50e1d76d85SSepherosa Ziehau FAKE_MCOUNT(TF_RIP(%rsp)) ; \ 51*3c38fc60SSepherosa Ziehau movq lapic_eoi, %rax ; \ 52*3c38fc60SSepherosa Ziehau callq *%rax ; \ 53e1d76d85SSepherosa Ziehau movq PCPU(curthread),%rbx ; \ 54e1d76d85SSepherosa Ziehau testl $-1,TD_NEST_COUNT(%rbx) ; \ 55e1d76d85SSepherosa Ziehau jne 1f ; \ 56e1d76d85SSepherosa Ziehau testl $-1,TD_CRITCOUNT(%rbx) ; \ 57e1d76d85SSepherosa Ziehau je 2f ; \ 58e1d76d85SSepherosa Ziehau1: ; \ 59e1d76d85SSepherosa Ziehau /* in critical section, make interrupt pending */ \ 60e1d76d85SSepherosa Ziehau /* set the pending bit and return, leave interrupt masked */ \ 61e1d76d85SSepherosa Ziehau movq $1,%rcx ; \ 62e1d76d85SSepherosa Ziehau shlq $IRQ_SBITS(irq_num),%rcx ; \ 63e1d76d85SSepherosa Ziehau movq $IRQ_LIDX(irq_num),%rdx ; \ 64e1d76d85SSepherosa Ziehau orq %rcx,PCPU_E8(ipending,%rdx) ; \ 65e1d76d85SSepherosa Ziehau orl $RQF_INTPEND,PCPU(reqflags) ; \ 66e1d76d85SSepherosa Ziehau jmp 5f ; \ 67e1d76d85SSepherosa Ziehau2: ; \ 68e1d76d85SSepherosa Ziehau /* clear pending bit, run handler */ \ 69e1d76d85SSepherosa Ziehau movq $1,%rcx ; \ 70e1d76d85SSepherosa Ziehau shlq $IRQ_SBITS(irq_num),%rcx ; \ 71e1d76d85SSepherosa Ziehau notq %rcx ; \ 72e1d76d85SSepherosa Ziehau movq $IRQ_LIDX(irq_num),%rdx ; \ 73e1d76d85SSepherosa Ziehau andq %rcx,PCPU_E8(ipending,%rdx) ; \ 74e1d76d85SSepherosa Ziehau pushq $irq_num ; /* trapframe -> intrframe */ \ 75e1d76d85SSepherosa Ziehau movq %rsp, %rdi ; /* pass frame by reference */ \ 76e1d76d85SSepherosa Ziehau incl TD_CRITCOUNT(%rbx) ; \ 77e1d76d85SSepherosa Ziehau sti ; \ 78e1d76d85SSepherosa Ziehau call ithread_fast_handler ; \ 79e1d76d85SSepherosa Ziehau decl TD_CRITCOUNT(%rbx) ; \ 80e1d76d85SSepherosa Ziehau addq $8, %rsp ; /* intrframe -> trapframe */ \ 81e1d76d85SSepherosa Ziehau5: ; \ 82e1d76d85SSepherosa Ziehau MEXITCOUNT ; \ 83e1d76d85SSepherosa Ziehau jmp doreti ; \ 84e1d76d85SSepherosa Ziehau 85e1d76d85SSepherosa Ziehau 86e1d76d85SSepherosa ZiehauMCOUNT_LABEL(bintr) 87be16ed47SSepherosa Ziehau MSI_HANDLER(0) 88be16ed47SSepherosa Ziehau MSI_HANDLER(1) 89be16ed47SSepherosa Ziehau MSI_HANDLER(2) 90be16ed47SSepherosa Ziehau MSI_HANDLER(3) 91be16ed47SSepherosa Ziehau MSI_HANDLER(4) 92be16ed47SSepherosa Ziehau MSI_HANDLER(5) 93be16ed47SSepherosa Ziehau MSI_HANDLER(6) 94be16ed47SSepherosa Ziehau MSI_HANDLER(7) 95be16ed47SSepherosa Ziehau MSI_HANDLER(8) 96be16ed47SSepherosa Ziehau MSI_HANDLER(9) 97be16ed47SSepherosa Ziehau MSI_HANDLER(10) 98be16ed47SSepherosa Ziehau MSI_HANDLER(11) 99be16ed47SSepherosa Ziehau MSI_HANDLER(12) 100be16ed47SSepherosa Ziehau MSI_HANDLER(13) 101be16ed47SSepherosa Ziehau MSI_HANDLER(14) 102be16ed47SSepherosa Ziehau MSI_HANDLER(15) 103e1d76d85SSepherosa Ziehau MSI_HANDLER(16) 104e1d76d85SSepherosa Ziehau MSI_HANDLER(17) 105e1d76d85SSepherosa Ziehau MSI_HANDLER(18) 106e1d76d85SSepherosa Ziehau MSI_HANDLER(19) 107e1d76d85SSepherosa Ziehau MSI_HANDLER(20) 108e1d76d85SSepherosa Ziehau MSI_HANDLER(21) 109e1d76d85SSepherosa Ziehau MSI_HANDLER(22) 110e1d76d85SSepherosa Ziehau MSI_HANDLER(23) 111e1d76d85SSepherosa Ziehau MSI_HANDLER(24) 112e1d76d85SSepherosa Ziehau MSI_HANDLER(25) 113e1d76d85SSepherosa Ziehau MSI_HANDLER(26) 114e1d76d85SSepherosa Ziehau MSI_HANDLER(27) 115e1d76d85SSepherosa Ziehau MSI_HANDLER(28) 116e1d76d85SSepherosa Ziehau MSI_HANDLER(29) 117e1d76d85SSepherosa Ziehau MSI_HANDLER(30) 118e1d76d85SSepherosa Ziehau MSI_HANDLER(31) 119e1d76d85SSepherosa Ziehau MSI_HANDLER(32) 120e1d76d85SSepherosa Ziehau MSI_HANDLER(33) 121e1d76d85SSepherosa Ziehau MSI_HANDLER(34) 122e1d76d85SSepherosa Ziehau MSI_HANDLER(35) 123e1d76d85SSepherosa Ziehau MSI_HANDLER(36) 124e1d76d85SSepherosa Ziehau MSI_HANDLER(37) 125e1d76d85SSepherosa Ziehau MSI_HANDLER(38) 126e1d76d85SSepherosa Ziehau MSI_HANDLER(39) 127e1d76d85SSepherosa Ziehau MSI_HANDLER(40) 128e1d76d85SSepherosa Ziehau MSI_HANDLER(41) 129e1d76d85SSepherosa Ziehau MSI_HANDLER(42) 130e1d76d85SSepherosa Ziehau MSI_HANDLER(43) 131e1d76d85SSepherosa Ziehau MSI_HANDLER(44) 132e1d76d85SSepherosa Ziehau MSI_HANDLER(45) 133e1d76d85SSepherosa Ziehau MSI_HANDLER(46) 134e1d76d85SSepherosa Ziehau MSI_HANDLER(47) 135e1d76d85SSepherosa Ziehau MSI_HANDLER(48) 136e1d76d85SSepherosa Ziehau MSI_HANDLER(49) 137e1d76d85SSepherosa Ziehau MSI_HANDLER(50) 138e1d76d85SSepherosa Ziehau MSI_HANDLER(51) 139e1d76d85SSepherosa Ziehau MSI_HANDLER(52) 140e1d76d85SSepherosa Ziehau MSI_HANDLER(53) 141e1d76d85SSepherosa Ziehau MSI_HANDLER(54) 142e1d76d85SSepherosa Ziehau MSI_HANDLER(55) 143e1d76d85SSepherosa Ziehau MSI_HANDLER(56) 144e1d76d85SSepherosa Ziehau MSI_HANDLER(57) 145e1d76d85SSepherosa Ziehau MSI_HANDLER(58) 146e1d76d85SSepherosa Ziehau MSI_HANDLER(59) 147e1d76d85SSepherosa Ziehau MSI_HANDLER(60) 148e1d76d85SSepherosa Ziehau MSI_HANDLER(61) 149e1d76d85SSepherosa Ziehau MSI_HANDLER(62) 150e1d76d85SSepherosa Ziehau MSI_HANDLER(63) 151e1d76d85SSepherosa Ziehau MSI_HANDLER(64) 152e1d76d85SSepherosa Ziehau MSI_HANDLER(65) 153e1d76d85SSepherosa Ziehau MSI_HANDLER(66) 154e1d76d85SSepherosa Ziehau MSI_HANDLER(67) 155e1d76d85SSepherosa Ziehau MSI_HANDLER(68) 156e1d76d85SSepherosa Ziehau MSI_HANDLER(69) 157e1d76d85SSepherosa Ziehau MSI_HANDLER(70) 158e1d76d85SSepherosa Ziehau MSI_HANDLER(71) 159e1d76d85SSepherosa Ziehau MSI_HANDLER(72) 160e1d76d85SSepherosa Ziehau MSI_HANDLER(73) 161e1d76d85SSepherosa Ziehau MSI_HANDLER(74) 162e1d76d85SSepherosa Ziehau MSI_HANDLER(75) 163e1d76d85SSepherosa Ziehau MSI_HANDLER(76) 164e1d76d85SSepherosa Ziehau MSI_HANDLER(77) 165e1d76d85SSepherosa Ziehau MSI_HANDLER(78) 166e1d76d85SSepherosa Ziehau MSI_HANDLER(79) 167e1d76d85SSepherosa Ziehau MSI_HANDLER(80) 168e1d76d85SSepherosa Ziehau MSI_HANDLER(81) 169e1d76d85SSepherosa Ziehau MSI_HANDLER(82) 170e1d76d85SSepherosa Ziehau MSI_HANDLER(83) 171e1d76d85SSepherosa Ziehau MSI_HANDLER(84) 172e1d76d85SSepherosa Ziehau MSI_HANDLER(85) 173e1d76d85SSepherosa Ziehau MSI_HANDLER(86) 174e1d76d85SSepherosa Ziehau MSI_HANDLER(87) 175e1d76d85SSepherosa Ziehau MSI_HANDLER(88) 176e1d76d85SSepherosa Ziehau MSI_HANDLER(89) 177e1d76d85SSepherosa Ziehau MSI_HANDLER(90) 178e1d76d85SSepherosa Ziehau MSI_HANDLER(91) 179e1d76d85SSepherosa Ziehau MSI_HANDLER(92) 180e1d76d85SSepherosa Ziehau MSI_HANDLER(93) 181e1d76d85SSepherosa Ziehau MSI_HANDLER(94) 182e1d76d85SSepherosa Ziehau MSI_HANDLER(95) 183e1d76d85SSepherosa Ziehau MSI_HANDLER(96) 184e1d76d85SSepherosa Ziehau MSI_HANDLER(97) 185e1d76d85SSepherosa Ziehau MSI_HANDLER(98) 186e1d76d85SSepherosa Ziehau MSI_HANDLER(99) 187e1d76d85SSepherosa Ziehau MSI_HANDLER(100) 188e1d76d85SSepherosa Ziehau MSI_HANDLER(101) 189e1d76d85SSepherosa Ziehau MSI_HANDLER(102) 190e1d76d85SSepherosa Ziehau MSI_HANDLER(103) 191e1d76d85SSepherosa Ziehau MSI_HANDLER(104) 192e1d76d85SSepherosa Ziehau MSI_HANDLER(105) 193e1d76d85SSepherosa Ziehau MSI_HANDLER(106) 194e1d76d85SSepherosa Ziehau MSI_HANDLER(107) 195e1d76d85SSepherosa Ziehau MSI_HANDLER(108) 196e1d76d85SSepherosa Ziehau MSI_HANDLER(109) 197e1d76d85SSepherosa Ziehau MSI_HANDLER(110) 198e1d76d85SSepherosa Ziehau MSI_HANDLER(111) 199e1d76d85SSepherosa Ziehau MSI_HANDLER(112) 200e1d76d85SSepherosa Ziehau MSI_HANDLER(113) 201e1d76d85SSepherosa Ziehau MSI_HANDLER(114) 202e1d76d85SSepherosa Ziehau MSI_HANDLER(115) 203e1d76d85SSepherosa Ziehau MSI_HANDLER(116) 204e1d76d85SSepherosa Ziehau MSI_HANDLER(117) 205e1d76d85SSepherosa Ziehau MSI_HANDLER(118) 206e1d76d85SSepherosa Ziehau MSI_HANDLER(119) 207e1d76d85SSepherosa Ziehau MSI_HANDLER(120) 208e1d76d85SSepherosa Ziehau MSI_HANDLER(121) 209e1d76d85SSepherosa Ziehau MSI_HANDLER(122) 210e1d76d85SSepherosa Ziehau MSI_HANDLER(123) 211e1d76d85SSepherosa Ziehau MSI_HANDLER(124) 212e1d76d85SSepherosa Ziehau MSI_HANDLER(125) 213e1d76d85SSepherosa Ziehau MSI_HANDLER(126) 214e1d76d85SSepherosa Ziehau MSI_HANDLER(127) 215e1d76d85SSepherosa Ziehau MSI_HANDLER(128) 216e1d76d85SSepherosa Ziehau MSI_HANDLER(129) 217e1d76d85SSepherosa Ziehau MSI_HANDLER(130) 218e1d76d85SSepherosa Ziehau MSI_HANDLER(131) 219e1d76d85SSepherosa Ziehau MSI_HANDLER(132) 220e1d76d85SSepherosa Ziehau MSI_HANDLER(133) 221e1d76d85SSepherosa Ziehau MSI_HANDLER(134) 222e1d76d85SSepherosa Ziehau MSI_HANDLER(135) 223e1d76d85SSepherosa Ziehau MSI_HANDLER(136) 224e1d76d85SSepherosa Ziehau MSI_HANDLER(137) 225e1d76d85SSepherosa Ziehau MSI_HANDLER(138) 226e1d76d85SSepherosa Ziehau MSI_HANDLER(139) 227e1d76d85SSepherosa Ziehau MSI_HANDLER(140) 228e1d76d85SSepherosa Ziehau MSI_HANDLER(141) 229e1d76d85SSepherosa Ziehau MSI_HANDLER(142) 230e1d76d85SSepherosa Ziehau MSI_HANDLER(143) 231e1d76d85SSepherosa Ziehau MSI_HANDLER(144) 232e1d76d85SSepherosa Ziehau MSI_HANDLER(145) 233e1d76d85SSepherosa Ziehau MSI_HANDLER(146) 234e1d76d85SSepherosa Ziehau MSI_HANDLER(147) 235e1d76d85SSepherosa Ziehau MSI_HANDLER(148) 236e1d76d85SSepherosa Ziehau MSI_HANDLER(149) 237e1d76d85SSepherosa Ziehau MSI_HANDLER(150) 238e1d76d85SSepherosa Ziehau MSI_HANDLER(151) 239e1d76d85SSepherosa Ziehau MSI_HANDLER(152) 240e1d76d85SSepherosa Ziehau MSI_HANDLER(153) 241e1d76d85SSepherosa Ziehau MSI_HANDLER(154) 242e1d76d85SSepherosa Ziehau MSI_HANDLER(155) 243e1d76d85SSepherosa Ziehau MSI_HANDLER(156) 244e1d76d85SSepherosa Ziehau MSI_HANDLER(157) 245e1d76d85SSepherosa Ziehau MSI_HANDLER(158) 246e1d76d85SSepherosa Ziehau MSI_HANDLER(159) 247e1d76d85SSepherosa Ziehau MSI_HANDLER(160) 248e1d76d85SSepherosa Ziehau MSI_HANDLER(161) 249e1d76d85SSepherosa Ziehau MSI_HANDLER(162) 250e1d76d85SSepherosa Ziehau MSI_HANDLER(163) 251e1d76d85SSepherosa Ziehau MSI_HANDLER(164) 252e1d76d85SSepherosa Ziehau MSI_HANDLER(165) 253e1d76d85SSepherosa Ziehau MSI_HANDLER(166) 254e1d76d85SSepherosa Ziehau MSI_HANDLER(167) 255e1d76d85SSepherosa Ziehau MSI_HANDLER(168) 256e1d76d85SSepherosa Ziehau MSI_HANDLER(169) 257e1d76d85SSepherosa Ziehau MSI_HANDLER(170) 258e1d76d85SSepherosa Ziehau MSI_HANDLER(171) 259e1d76d85SSepherosa Ziehau MSI_HANDLER(172) 260e1d76d85SSepherosa Ziehau MSI_HANDLER(173) 261e1d76d85SSepherosa Ziehau MSI_HANDLER(174) 262e1d76d85SSepherosa Ziehau MSI_HANDLER(175) 263e1d76d85SSepherosa Ziehau MSI_HANDLER(176) 264e1d76d85SSepherosa Ziehau MSI_HANDLER(177) 265e1d76d85SSepherosa Ziehau MSI_HANDLER(178) 266e1d76d85SSepherosa Ziehau MSI_HANDLER(179) 267e1d76d85SSepherosa Ziehau MSI_HANDLER(180) 268e1d76d85SSepherosa Ziehau MSI_HANDLER(181) 269e1d76d85SSepherosa Ziehau MSI_HANDLER(182) 270e1d76d85SSepherosa Ziehau MSI_HANDLER(183) 271e1d76d85SSepherosa Ziehau MSI_HANDLER(184) 272e1d76d85SSepherosa Ziehau MSI_HANDLER(185) 273e1d76d85SSepherosa Ziehau MSI_HANDLER(186) 274e1d76d85SSepherosa Ziehau MSI_HANDLER(187) 275e1d76d85SSepherosa Ziehau MSI_HANDLER(188) 276e1d76d85SSepherosa Ziehau MSI_HANDLER(189) 277e1d76d85SSepherosa Ziehau MSI_HANDLER(190) 278e1d76d85SSepherosa Ziehau MSI_HANDLER(191) 279e1d76d85SSepherosa ZiehauMCOUNT_LABEL(eintr) 280e1d76d85SSepherosa Ziehau 281e1d76d85SSepherosa Ziehau .data 282e1d76d85SSepherosa Ziehau 283e1d76d85SSepherosa Ziehau .text 284