2
0

apic.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. /*
  2. * APIC support
  3. *
  4. * Copyright (c) 2004-2005 Fabrice Bellard
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, see <http://www.gnu.org/licenses/>
  18. */
  19. #include "qemu-thread.h"
  20. #include "apic_internal.h"
  21. #include "apic.h"
  22. #include "ioapic.h"
  23. #include "pci/msi.h"
  24. #include "host-utils.h"
  25. #include "trace.h"
  26. #include "pc.h"
  27. #include "apic-msidef.h"
  28. #define MAX_APIC_WORDS 8
  29. #define SYNC_FROM_VAPIC 0x1
  30. #define SYNC_TO_VAPIC 0x2
  31. #define SYNC_ISR_IRR_TO_VAPIC 0x4
  32. static APICCommonState *local_apics[MAX_APICS + 1];
  33. static void apic_set_irq(APICCommonState *s, int vector_num, int trigger_mode);
  34. static void apic_update_irq(APICCommonState *s);
  35. static void apic_get_delivery_bitmask(uint32_t *deliver_bitmask,
  36. uint8_t dest, uint8_t dest_mode);
  37. /* Find first bit starting from msb */
  38. static int fls_bit(uint32_t value)
  39. {
  40. return 31 - clz32(value);
  41. }
  42. /* Find first bit starting from lsb */
  43. static int ffs_bit(uint32_t value)
  44. {
  45. return ctz32(value);
  46. }
  47. static inline void set_bit(uint32_t *tab, int index)
  48. {
  49. int i, mask;
  50. i = index >> 5;
  51. mask = 1 << (index & 0x1f);
  52. tab[i] |= mask;
  53. }
  54. static inline void reset_bit(uint32_t *tab, int index)
  55. {
  56. int i, mask;
  57. i = index >> 5;
  58. mask = 1 << (index & 0x1f);
  59. tab[i] &= ~mask;
  60. }
  61. static inline int get_bit(uint32_t *tab, int index)
  62. {
  63. int i, mask;
  64. i = index >> 5;
  65. mask = 1 << (index & 0x1f);
  66. return !!(tab[i] & mask);
  67. }
  68. /* return -1 if no bit is set */
  69. static int get_highest_priority_int(uint32_t *tab)
  70. {
  71. int i;
  72. for (i = 7; i >= 0; i--) {
  73. if (tab[i] != 0) {
  74. return i * 32 + fls_bit(tab[i]);
  75. }
  76. }
  77. return -1;
  78. }
  79. static void apic_sync_vapic(APICCommonState *s, int sync_type)
  80. {
  81. VAPICState vapic_state;
  82. size_t length;
  83. off_t start;
  84. int vector;
  85. if (!s->vapic_paddr) {
  86. return;
  87. }
  88. if (sync_type & SYNC_FROM_VAPIC) {
  89. cpu_physical_memory_rw(s->vapic_paddr, (void *)&vapic_state,
  90. sizeof(vapic_state), 0);
  91. s->tpr = vapic_state.tpr;
  92. }
  93. if (sync_type & (SYNC_TO_VAPIC | SYNC_ISR_IRR_TO_VAPIC)) {
  94. start = offsetof(VAPICState, isr);
  95. length = offsetof(VAPICState, enabled) - offsetof(VAPICState, isr);
  96. if (sync_type & SYNC_TO_VAPIC) {
  97. assert(qemu_cpu_is_self(CPU(s->cpu)));
  98. vapic_state.tpr = s->tpr;
  99. vapic_state.enabled = 1;
  100. start = 0;
  101. length = sizeof(VAPICState);
  102. }
  103. vector = get_highest_priority_int(s->isr);
  104. if (vector < 0) {
  105. vector = 0;
  106. }
  107. vapic_state.isr = vector & 0xf0;
  108. vapic_state.zero = 0;
  109. vector = get_highest_priority_int(s->irr);
  110. if (vector < 0) {
  111. vector = 0;
  112. }
  113. vapic_state.irr = vector & 0xff;
  114. cpu_physical_memory_write_rom(s->vapic_paddr + start,
  115. ((void *)&vapic_state) + start, length);
  116. }
  117. }
  118. static void apic_vapic_base_update(APICCommonState *s)
  119. {
  120. apic_sync_vapic(s, SYNC_TO_VAPIC);
  121. }
  122. static void apic_local_deliver(APICCommonState *s, int vector)
  123. {
  124. uint32_t lvt = s->lvt[vector];
  125. int trigger_mode;
  126. trace_apic_local_deliver(vector, (lvt >> 8) & 7);
  127. if (lvt & APIC_LVT_MASKED)
  128. return;
  129. switch ((lvt >> 8) & 7) {
  130. case APIC_DM_SMI:
  131. cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_SMI);
  132. break;
  133. case APIC_DM_NMI:
  134. cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_NMI);
  135. break;
  136. case APIC_DM_EXTINT:
  137. cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_HARD);
  138. break;
  139. case APIC_DM_FIXED:
  140. trigger_mode = APIC_TRIGGER_EDGE;
  141. if ((vector == APIC_LVT_LINT0 || vector == APIC_LVT_LINT1) &&
  142. (lvt & APIC_LVT_LEVEL_TRIGGER))
  143. trigger_mode = APIC_TRIGGER_LEVEL;
  144. apic_set_irq(s, lvt & 0xff, trigger_mode);
  145. }
  146. }
  147. void apic_deliver_pic_intr(DeviceState *d, int level)
  148. {
  149. APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
  150. if (level) {
  151. apic_local_deliver(s, APIC_LVT_LINT0);
  152. } else {
  153. uint32_t lvt = s->lvt[APIC_LVT_LINT0];
  154. switch ((lvt >> 8) & 7) {
  155. case APIC_DM_FIXED:
  156. if (!(lvt & APIC_LVT_LEVEL_TRIGGER))
  157. break;
  158. reset_bit(s->irr, lvt & 0xff);
  159. /* fall through */
  160. case APIC_DM_EXTINT:
  161. cpu_reset_interrupt(&s->cpu->env, CPU_INTERRUPT_HARD);
  162. break;
  163. }
  164. }
  165. }
  166. static void apic_external_nmi(APICCommonState *s)
  167. {
  168. apic_local_deliver(s, APIC_LVT_LINT1);
  169. }
  170. #define foreach_apic(apic, deliver_bitmask, code) \
  171. {\
  172. int __i, __j, __mask;\
  173. for(__i = 0; __i < MAX_APIC_WORDS; __i++) {\
  174. __mask = deliver_bitmask[__i];\
  175. if (__mask) {\
  176. for(__j = 0; __j < 32; __j++) {\
  177. if (__mask & (1 << __j)) {\
  178. apic = local_apics[__i * 32 + __j];\
  179. if (apic) {\
  180. code;\
  181. }\
  182. }\
  183. }\
  184. }\
  185. }\
  186. }
  187. static void apic_bus_deliver(const uint32_t *deliver_bitmask,
  188. uint8_t delivery_mode, uint8_t vector_num,
  189. uint8_t trigger_mode)
  190. {
  191. APICCommonState *apic_iter;
  192. switch (delivery_mode) {
  193. case APIC_DM_LOWPRI:
  194. /* XXX: search for focus processor, arbitration */
  195. {
  196. int i, d;
  197. d = -1;
  198. for(i = 0; i < MAX_APIC_WORDS; i++) {
  199. if (deliver_bitmask[i]) {
  200. d = i * 32 + ffs_bit(deliver_bitmask[i]);
  201. break;
  202. }
  203. }
  204. if (d >= 0) {
  205. apic_iter = local_apics[d];
  206. if (apic_iter) {
  207. apic_set_irq(apic_iter, vector_num, trigger_mode);
  208. }
  209. }
  210. }
  211. return;
  212. case APIC_DM_FIXED:
  213. break;
  214. case APIC_DM_SMI:
  215. foreach_apic(apic_iter, deliver_bitmask,
  216. cpu_interrupt(&apic_iter->cpu->env, CPU_INTERRUPT_SMI)
  217. );
  218. return;
  219. case APIC_DM_NMI:
  220. foreach_apic(apic_iter, deliver_bitmask,
  221. cpu_interrupt(&apic_iter->cpu->env, CPU_INTERRUPT_NMI)
  222. );
  223. return;
  224. case APIC_DM_INIT:
  225. /* normal INIT IPI sent to processors */
  226. foreach_apic(apic_iter, deliver_bitmask,
  227. cpu_interrupt(&apic_iter->cpu->env,
  228. CPU_INTERRUPT_INIT)
  229. );
  230. return;
  231. case APIC_DM_EXTINT:
  232. /* handled in I/O APIC code */
  233. break;
  234. default:
  235. return;
  236. }
  237. foreach_apic(apic_iter, deliver_bitmask,
  238. apic_set_irq(apic_iter, vector_num, trigger_mode) );
  239. }
  240. void apic_deliver_irq(uint8_t dest, uint8_t dest_mode, uint8_t delivery_mode,
  241. uint8_t vector_num, uint8_t trigger_mode)
  242. {
  243. uint32_t deliver_bitmask[MAX_APIC_WORDS];
  244. trace_apic_deliver_irq(dest, dest_mode, delivery_mode, vector_num,
  245. trigger_mode);
  246. apic_get_delivery_bitmask(deliver_bitmask, dest, dest_mode);
  247. apic_bus_deliver(deliver_bitmask, delivery_mode, vector_num, trigger_mode);
  248. }
  249. static void apic_set_base(APICCommonState *s, uint64_t val)
  250. {
  251. s->apicbase = (val & 0xfffff000) |
  252. (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE));
  253. /* if disabled, cannot be enabled again */
  254. if (!(val & MSR_IA32_APICBASE_ENABLE)) {
  255. s->apicbase &= ~MSR_IA32_APICBASE_ENABLE;
  256. cpu_clear_apic_feature(&s->cpu->env);
  257. s->spurious_vec &= ~APIC_SV_ENABLE;
  258. }
  259. }
  260. static void apic_set_tpr(APICCommonState *s, uint8_t val)
  261. {
  262. /* Updates from cr8 are ignored while the VAPIC is active */
  263. if (!s->vapic_paddr) {
  264. s->tpr = val << 4;
  265. apic_update_irq(s);
  266. }
  267. }
  268. static uint8_t apic_get_tpr(APICCommonState *s)
  269. {
  270. apic_sync_vapic(s, SYNC_FROM_VAPIC);
  271. return s->tpr >> 4;
  272. }
  273. static int apic_get_ppr(APICCommonState *s)
  274. {
  275. int tpr, isrv, ppr;
  276. tpr = (s->tpr >> 4);
  277. isrv = get_highest_priority_int(s->isr);
  278. if (isrv < 0)
  279. isrv = 0;
  280. isrv >>= 4;
  281. if (tpr >= isrv)
  282. ppr = s->tpr;
  283. else
  284. ppr = isrv << 4;
  285. return ppr;
  286. }
  287. static int apic_get_arb_pri(APICCommonState *s)
  288. {
  289. /* XXX: arbitration */
  290. return 0;
  291. }
  292. /*
  293. * <0 - low prio interrupt,
  294. * 0 - no interrupt,
  295. * >0 - interrupt number
  296. */
  297. static int apic_irq_pending(APICCommonState *s)
  298. {
  299. int irrv, ppr;
  300. irrv = get_highest_priority_int(s->irr);
  301. if (irrv < 0) {
  302. return 0;
  303. }
  304. ppr = apic_get_ppr(s);
  305. if (ppr && (irrv & 0xf0) <= (ppr & 0xf0)) {
  306. return -1;
  307. }
  308. return irrv;
  309. }
  310. /* signal the CPU if an irq is pending */
  311. static void apic_update_irq(APICCommonState *s)
  312. {
  313. CPUState *cpu = CPU(s->cpu);
  314. if (!(s->spurious_vec & APIC_SV_ENABLE)) {
  315. return;
  316. }
  317. if (!qemu_cpu_is_self(cpu)) {
  318. cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_POLL);
  319. } else if (apic_irq_pending(s) > 0) {
  320. cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_HARD);
  321. }
  322. }
  323. void apic_poll_irq(DeviceState *d)
  324. {
  325. APICCommonState *s = APIC_COMMON(d);
  326. apic_sync_vapic(s, SYNC_FROM_VAPIC);
  327. apic_update_irq(s);
  328. }
  329. static void apic_set_irq(APICCommonState *s, int vector_num, int trigger_mode)
  330. {
  331. apic_report_irq_delivered(!get_bit(s->irr, vector_num));
  332. set_bit(s->irr, vector_num);
  333. if (trigger_mode)
  334. set_bit(s->tmr, vector_num);
  335. else
  336. reset_bit(s->tmr, vector_num);
  337. if (s->vapic_paddr) {
  338. apic_sync_vapic(s, SYNC_ISR_IRR_TO_VAPIC);
  339. /*
  340. * The vcpu thread needs to see the new IRR before we pull its current
  341. * TPR value. That way, if we miss a lowering of the TRP, the guest
  342. * has the chance to notice the new IRR and poll for IRQs on its own.
  343. */
  344. smp_wmb();
  345. apic_sync_vapic(s, SYNC_FROM_VAPIC);
  346. }
  347. apic_update_irq(s);
  348. }
  349. static void apic_eoi(APICCommonState *s)
  350. {
  351. int isrv;
  352. isrv = get_highest_priority_int(s->isr);
  353. if (isrv < 0)
  354. return;
  355. reset_bit(s->isr, isrv);
  356. if (!(s->spurious_vec & APIC_SV_DIRECTED_IO) && get_bit(s->tmr, isrv)) {
  357. ioapic_eoi_broadcast(isrv);
  358. }
  359. apic_sync_vapic(s, SYNC_FROM_VAPIC | SYNC_TO_VAPIC);
  360. apic_update_irq(s);
  361. }
  362. static int apic_find_dest(uint8_t dest)
  363. {
  364. APICCommonState *apic = local_apics[dest];
  365. int i;
  366. if (apic && apic->id == dest)
  367. return dest; /* shortcut in case apic->id == apic->idx */
  368. for (i = 0; i < MAX_APICS; i++) {
  369. apic = local_apics[i];
  370. if (apic && apic->id == dest)
  371. return i;
  372. if (!apic)
  373. break;
  374. }
  375. return -1;
  376. }
  377. static void apic_get_delivery_bitmask(uint32_t *deliver_bitmask,
  378. uint8_t dest, uint8_t dest_mode)
  379. {
  380. APICCommonState *apic_iter;
  381. int i;
  382. if (dest_mode == 0) {
  383. if (dest == 0xff) {
  384. memset(deliver_bitmask, 0xff, MAX_APIC_WORDS * sizeof(uint32_t));
  385. } else {
  386. int idx = apic_find_dest(dest);
  387. memset(deliver_bitmask, 0x00, MAX_APIC_WORDS * sizeof(uint32_t));
  388. if (idx >= 0)
  389. set_bit(deliver_bitmask, idx);
  390. }
  391. } else {
  392. /* XXX: cluster mode */
  393. memset(deliver_bitmask, 0x00, MAX_APIC_WORDS * sizeof(uint32_t));
  394. for(i = 0; i < MAX_APICS; i++) {
  395. apic_iter = local_apics[i];
  396. if (apic_iter) {
  397. if (apic_iter->dest_mode == 0xf) {
  398. if (dest & apic_iter->log_dest)
  399. set_bit(deliver_bitmask, i);
  400. } else if (apic_iter->dest_mode == 0x0) {
  401. if ((dest & 0xf0) == (apic_iter->log_dest & 0xf0) &&
  402. (dest & apic_iter->log_dest & 0x0f)) {
  403. set_bit(deliver_bitmask, i);
  404. }
  405. }
  406. } else {
  407. break;
  408. }
  409. }
  410. }
  411. }
  412. static void apic_startup(APICCommonState *s, int vector_num)
  413. {
  414. s->sipi_vector = vector_num;
  415. cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_SIPI);
  416. }
  417. void apic_sipi(DeviceState *d)
  418. {
  419. APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
  420. cpu_reset_interrupt(&s->cpu->env, CPU_INTERRUPT_SIPI);
  421. if (!s->wait_for_sipi)
  422. return;
  423. cpu_x86_load_seg_cache_sipi(s->cpu, s->sipi_vector);
  424. s->wait_for_sipi = 0;
  425. }
  426. static void apic_deliver(DeviceState *d, uint8_t dest, uint8_t dest_mode,
  427. uint8_t delivery_mode, uint8_t vector_num,
  428. uint8_t trigger_mode)
  429. {
  430. APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
  431. uint32_t deliver_bitmask[MAX_APIC_WORDS];
  432. int dest_shorthand = (s->icr[0] >> 18) & 3;
  433. APICCommonState *apic_iter;
  434. switch (dest_shorthand) {
  435. case 0:
  436. apic_get_delivery_bitmask(deliver_bitmask, dest, dest_mode);
  437. break;
  438. case 1:
  439. memset(deliver_bitmask, 0x00, sizeof(deliver_bitmask));
  440. set_bit(deliver_bitmask, s->idx);
  441. break;
  442. case 2:
  443. memset(deliver_bitmask, 0xff, sizeof(deliver_bitmask));
  444. break;
  445. case 3:
  446. memset(deliver_bitmask, 0xff, sizeof(deliver_bitmask));
  447. reset_bit(deliver_bitmask, s->idx);
  448. break;
  449. }
  450. switch (delivery_mode) {
  451. case APIC_DM_INIT:
  452. {
  453. int trig_mode = (s->icr[0] >> 15) & 1;
  454. int level = (s->icr[0] >> 14) & 1;
  455. if (level == 0 && trig_mode == 1) {
  456. foreach_apic(apic_iter, deliver_bitmask,
  457. apic_iter->arb_id = apic_iter->id );
  458. return;
  459. }
  460. }
  461. break;
  462. case APIC_DM_SIPI:
  463. foreach_apic(apic_iter, deliver_bitmask,
  464. apic_startup(apic_iter, vector_num) );
  465. return;
  466. }
  467. apic_bus_deliver(deliver_bitmask, delivery_mode, vector_num, trigger_mode);
  468. }
  469. static bool apic_check_pic(APICCommonState *s)
  470. {
  471. if (!apic_accept_pic_intr(&s->busdev.qdev) || !pic_get_output(isa_pic)) {
  472. return false;
  473. }
  474. apic_deliver_pic_intr(&s->busdev.qdev, 1);
  475. return true;
  476. }
  477. int apic_get_interrupt(DeviceState *d)
  478. {
  479. APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
  480. int intno;
  481. /* if the APIC is installed or enabled, we let the 8259 handle the
  482. IRQs */
  483. if (!s)
  484. return -1;
  485. if (!(s->spurious_vec & APIC_SV_ENABLE))
  486. return -1;
  487. apic_sync_vapic(s, SYNC_FROM_VAPIC);
  488. intno = apic_irq_pending(s);
  489. if (intno == 0) {
  490. apic_sync_vapic(s, SYNC_TO_VAPIC);
  491. return -1;
  492. } else if (intno < 0) {
  493. apic_sync_vapic(s, SYNC_TO_VAPIC);
  494. return s->spurious_vec & 0xff;
  495. }
  496. reset_bit(s->irr, intno);
  497. set_bit(s->isr, intno);
  498. apic_sync_vapic(s, SYNC_TO_VAPIC);
  499. /* re-inject if there is still a pending PIC interrupt */
  500. apic_check_pic(s);
  501. apic_update_irq(s);
  502. return intno;
  503. }
  504. int apic_accept_pic_intr(DeviceState *d)
  505. {
  506. APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
  507. uint32_t lvt0;
  508. if (!s)
  509. return -1;
  510. lvt0 = s->lvt[APIC_LVT_LINT0];
  511. if ((s->apicbase & MSR_IA32_APICBASE_ENABLE) == 0 ||
  512. (lvt0 & APIC_LVT_MASKED) == 0)
  513. return 1;
  514. return 0;
  515. }
  516. static uint32_t apic_get_current_count(APICCommonState *s)
  517. {
  518. int64_t d;
  519. uint32_t val;
  520. d = (qemu_get_clock_ns(vm_clock) - s->initial_count_load_time) >>
  521. s->count_shift;
  522. if (s->lvt[APIC_LVT_TIMER] & APIC_LVT_TIMER_PERIODIC) {
  523. /* periodic */
  524. val = s->initial_count - (d % ((uint64_t)s->initial_count + 1));
  525. } else {
  526. if (d >= s->initial_count)
  527. val = 0;
  528. else
  529. val = s->initial_count - d;
  530. }
  531. return val;
  532. }
  533. static void apic_timer_update(APICCommonState *s, int64_t current_time)
  534. {
  535. if (apic_next_timer(s, current_time)) {
  536. qemu_mod_timer(s->timer, s->next_time);
  537. } else {
  538. qemu_del_timer(s->timer);
  539. }
  540. }
  541. static void apic_timer(void *opaque)
  542. {
  543. APICCommonState *s = opaque;
  544. apic_local_deliver(s, APIC_LVT_TIMER);
  545. apic_timer_update(s, s->next_time);
  546. }
  547. static uint32_t apic_mem_readb(void *opaque, hwaddr addr)
  548. {
  549. return 0;
  550. }
  551. static uint32_t apic_mem_readw(void *opaque, hwaddr addr)
  552. {
  553. return 0;
  554. }
  555. static void apic_mem_writeb(void *opaque, hwaddr addr, uint32_t val)
  556. {
  557. }
  558. static void apic_mem_writew(void *opaque, hwaddr addr, uint32_t val)
  559. {
  560. }
  561. static uint32_t apic_mem_readl(void *opaque, hwaddr addr)
  562. {
  563. DeviceState *d;
  564. APICCommonState *s;
  565. uint32_t val;
  566. int index;
  567. d = cpu_get_current_apic();
  568. if (!d) {
  569. return 0;
  570. }
  571. s = DO_UPCAST(APICCommonState, busdev.qdev, d);
  572. index = (addr >> 4) & 0xff;
  573. switch(index) {
  574. case 0x02: /* id */
  575. val = s->id << 24;
  576. break;
  577. case 0x03: /* version */
  578. val = 0x11 | ((APIC_LVT_NB - 1) << 16); /* version 0x11 */
  579. break;
  580. case 0x08:
  581. apic_sync_vapic(s, SYNC_FROM_VAPIC);
  582. if (apic_report_tpr_access) {
  583. cpu_report_tpr_access(&s->cpu->env, TPR_ACCESS_READ);
  584. }
  585. val = s->tpr;
  586. break;
  587. case 0x09:
  588. val = apic_get_arb_pri(s);
  589. break;
  590. case 0x0a:
  591. /* ppr */
  592. val = apic_get_ppr(s);
  593. break;
  594. case 0x0b:
  595. val = 0;
  596. break;
  597. case 0x0d:
  598. val = s->log_dest << 24;
  599. break;
  600. case 0x0e:
  601. val = s->dest_mode << 28;
  602. break;
  603. case 0x0f:
  604. val = s->spurious_vec;
  605. break;
  606. case 0x10 ... 0x17:
  607. val = s->isr[index & 7];
  608. break;
  609. case 0x18 ... 0x1f:
  610. val = s->tmr[index & 7];
  611. break;
  612. case 0x20 ... 0x27:
  613. val = s->irr[index & 7];
  614. break;
  615. case 0x28:
  616. val = s->esr;
  617. break;
  618. case 0x30:
  619. case 0x31:
  620. val = s->icr[index & 1];
  621. break;
  622. case 0x32 ... 0x37:
  623. val = s->lvt[index - 0x32];
  624. break;
  625. case 0x38:
  626. val = s->initial_count;
  627. break;
  628. case 0x39:
  629. val = apic_get_current_count(s);
  630. break;
  631. case 0x3e:
  632. val = s->divide_conf;
  633. break;
  634. default:
  635. s->esr |= ESR_ILLEGAL_ADDRESS;
  636. val = 0;
  637. break;
  638. }
  639. trace_apic_mem_readl(addr, val);
  640. return val;
  641. }
  642. static void apic_send_msi(hwaddr addr, uint32_t data)
  643. {
  644. uint8_t dest = (addr & MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT;
  645. uint8_t vector = (data & MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT;
  646. uint8_t dest_mode = (addr >> MSI_ADDR_DEST_MODE_SHIFT) & 0x1;
  647. uint8_t trigger_mode = (data >> MSI_DATA_TRIGGER_SHIFT) & 0x1;
  648. uint8_t delivery = (data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x7;
  649. /* XXX: Ignore redirection hint. */
  650. apic_deliver_irq(dest, dest_mode, delivery, vector, trigger_mode);
  651. }
  652. static void apic_mem_writel(void *opaque, hwaddr addr, uint32_t val)
  653. {
  654. DeviceState *d;
  655. APICCommonState *s;
  656. int index = (addr >> 4) & 0xff;
  657. if (addr > 0xfff || !index) {
  658. /* MSI and MMIO APIC are at the same memory location,
  659. * but actually not on the global bus: MSI is on PCI bus
  660. * APIC is connected directly to the CPU.
  661. * Mapping them on the global bus happens to work because
  662. * MSI registers are reserved in APIC MMIO and vice versa. */
  663. apic_send_msi(addr, val);
  664. return;
  665. }
  666. d = cpu_get_current_apic();
  667. if (!d) {
  668. return;
  669. }
  670. s = DO_UPCAST(APICCommonState, busdev.qdev, d);
  671. trace_apic_mem_writel(addr, val);
  672. switch(index) {
  673. case 0x02:
  674. s->id = (val >> 24);
  675. break;
  676. case 0x03:
  677. break;
  678. case 0x08:
  679. if (apic_report_tpr_access) {
  680. cpu_report_tpr_access(&s->cpu->env, TPR_ACCESS_WRITE);
  681. }
  682. s->tpr = val;
  683. apic_sync_vapic(s, SYNC_TO_VAPIC);
  684. apic_update_irq(s);
  685. break;
  686. case 0x09:
  687. case 0x0a:
  688. break;
  689. case 0x0b: /* EOI */
  690. apic_eoi(s);
  691. break;
  692. case 0x0d:
  693. s->log_dest = val >> 24;
  694. break;
  695. case 0x0e:
  696. s->dest_mode = val >> 28;
  697. break;
  698. case 0x0f:
  699. s->spurious_vec = val & 0x1ff;
  700. apic_update_irq(s);
  701. break;
  702. case 0x10 ... 0x17:
  703. case 0x18 ... 0x1f:
  704. case 0x20 ... 0x27:
  705. case 0x28:
  706. break;
  707. case 0x30:
  708. s->icr[0] = val;
  709. apic_deliver(d, (s->icr[1] >> 24) & 0xff, (s->icr[0] >> 11) & 1,
  710. (s->icr[0] >> 8) & 7, (s->icr[0] & 0xff),
  711. (s->icr[0] >> 15) & 1);
  712. break;
  713. case 0x31:
  714. s->icr[1] = val;
  715. break;
  716. case 0x32 ... 0x37:
  717. {
  718. int n = index - 0x32;
  719. s->lvt[n] = val;
  720. if (n == APIC_LVT_TIMER) {
  721. apic_timer_update(s, qemu_get_clock_ns(vm_clock));
  722. } else if (n == APIC_LVT_LINT0 && apic_check_pic(s)) {
  723. apic_update_irq(s);
  724. }
  725. }
  726. break;
  727. case 0x38:
  728. s->initial_count = val;
  729. s->initial_count_load_time = qemu_get_clock_ns(vm_clock);
  730. apic_timer_update(s, s->initial_count_load_time);
  731. break;
  732. case 0x39:
  733. break;
  734. case 0x3e:
  735. {
  736. int v;
  737. s->divide_conf = val & 0xb;
  738. v = (s->divide_conf & 3) | ((s->divide_conf >> 1) & 4);
  739. s->count_shift = (v + 1) & 7;
  740. }
  741. break;
  742. default:
  743. s->esr |= ESR_ILLEGAL_ADDRESS;
  744. break;
  745. }
  746. }
  747. static void apic_pre_save(APICCommonState *s)
  748. {
  749. apic_sync_vapic(s, SYNC_FROM_VAPIC);
  750. }
  751. static void apic_post_load(APICCommonState *s)
  752. {
  753. if (s->timer_expiry != -1) {
  754. qemu_mod_timer(s->timer, s->timer_expiry);
  755. } else {
  756. qemu_del_timer(s->timer);
  757. }
  758. }
  759. static const MemoryRegionOps apic_io_ops = {
  760. .old_mmio = {
  761. .read = { apic_mem_readb, apic_mem_readw, apic_mem_readl, },
  762. .write = { apic_mem_writeb, apic_mem_writew, apic_mem_writel, },
  763. },
  764. .endianness = DEVICE_NATIVE_ENDIAN,
  765. };
  766. static void apic_init(APICCommonState *s)
  767. {
  768. memory_region_init_io(&s->io_memory, &apic_io_ops, s, "apic-msi",
  769. MSI_SPACE_SIZE);
  770. s->timer = qemu_new_timer_ns(vm_clock, apic_timer, s);
  771. local_apics[s->idx] = s;
  772. msi_supported = true;
  773. }
  774. static void apic_class_init(ObjectClass *klass, void *data)
  775. {
  776. APICCommonClass *k = APIC_COMMON_CLASS(klass);
  777. k->init = apic_init;
  778. k->set_base = apic_set_base;
  779. k->set_tpr = apic_set_tpr;
  780. k->get_tpr = apic_get_tpr;
  781. k->vapic_base_update = apic_vapic_base_update;
  782. k->external_nmi = apic_external_nmi;
  783. k->pre_save = apic_pre_save;
  784. k->post_load = apic_post_load;
  785. }
  786. static TypeInfo apic_info = {
  787. .name = "apic",
  788. .instance_size = sizeof(APICCommonState),
  789. .parent = TYPE_APIC_COMMON,
  790. .class_init = apic_class_init,
  791. };
  792. static void apic_register_types(void)
  793. {
  794. type_register_static(&apic_info);
  795. }
  796. type_init(apic_register_types)