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