1 /* 2 * ITS emulation for a GICv3-based system 3 * 4 * Copyright Linaro.org 2021 5 * 6 * Authors: 7 * Shashi Mallela <shashi.mallela@linaro.org> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2 or (at your 10 * option) any later version. See the COPYING file in the top-level directory. 11 * 12 */ 13 14 #include "qemu/osdep.h" 15 #include "qemu/log.h" 16 #include "trace.h" 17 #include "hw/qdev-properties.h" 18 #include "hw/intc/arm_gicv3_its_common.h" 19 #include "gicv3_internal.h" 20 #include "qom/object.h" 21 #include "qapi/error.h" 22 23 typedef struct GICv3ITSClass GICv3ITSClass; 24 /* This is reusing the GICv3ITSState typedef from ARM_GICV3_ITS_COMMON */ 25 DECLARE_OBJ_CHECKERS(GICv3ITSState, GICv3ITSClass, 26 ARM_GICV3_ITS, TYPE_ARM_GICV3_ITS) 27 28 struct GICv3ITSClass { 29 GICv3ITSCommonClass parent_class; 30 ResettablePhases parent_phases; 31 }; 32 33 /* 34 * This is an internal enum used to distinguish between LPI triggered 35 * via command queue and LPI triggered via gits_translater write. 36 */ 37 typedef enum ItsCmdType { 38 NONE = 0, /* internal indication for GITS_TRANSLATER write */ 39 CLEAR = 1, 40 DISCARD = 2, 41 INTERRUPT = 3, 42 } ItsCmdType; 43 44 typedef struct DTEntry { 45 bool valid; 46 unsigned size; 47 uint64_t ittaddr; 48 } DTEntry; 49 50 typedef struct CTEntry { 51 bool valid; 52 uint32_t rdbase; 53 } CTEntry; 54 55 typedef struct ITEntry { 56 bool valid; 57 int inttype; 58 uint32_t intid; 59 uint32_t doorbell; 60 uint32_t icid; 61 uint32_t vpeid; 62 } ITEntry; 63 64 typedef struct VTEntry { 65 bool valid; 66 unsigned vptsize; 67 uint32_t rdbase; 68 uint64_t vptaddr; 69 } VTEntry; 70 71 /* 72 * The ITS spec permits a range of CONSTRAINED UNPREDICTABLE options 73 * if a command parameter is not correct. These include both "stall 74 * processing of the command queue" and "ignore this command, and 75 * keep processing the queue". In our implementation we choose that 76 * memory transaction errors reading the command packet provoke a 77 * stall, but errors in parameters cause us to ignore the command 78 * and continue processing. 79 * The process_* functions which handle individual ITS commands all 80 * return an ItsCmdResult which tells process_cmdq() whether it should 81 * stall, keep going because of an error, or keep going because the 82 * command was a success. 83 */ 84 typedef enum ItsCmdResult { 85 CMD_STALL = 0, 86 CMD_CONTINUE = 1, 87 CMD_CONTINUE_OK = 2, 88 } ItsCmdResult; 89 90 /* True if the ITS supports the GICv4 virtual LPI feature */ 91 static bool its_feature_virtual(GICv3ITSState *s) 92 { 93 return s->typer & R_GITS_TYPER_VIRTUAL_MASK; 94 } 95 96 static inline bool intid_in_lpi_range(uint32_t id) 97 { 98 return id >= GICV3_LPI_INTID_START && 99 id < (1 << (GICD_TYPER_IDBITS + 1)); 100 } 101 102 static inline bool valid_doorbell(uint32_t id) 103 { 104 /* Doorbell fields may be an LPI, or 1023 to mean "no doorbell" */ 105 return id == INTID_SPURIOUS || intid_in_lpi_range(id); 106 } 107 108 static uint64_t baser_base_addr(uint64_t value, uint32_t page_sz) 109 { 110 uint64_t result = 0; 111 112 switch (page_sz) { 113 case GITS_PAGE_SIZE_4K: 114 case GITS_PAGE_SIZE_16K: 115 result = FIELD_EX64(value, GITS_BASER, PHYADDR) << 12; 116 break; 117 118 case GITS_PAGE_SIZE_64K: 119 result = FIELD_EX64(value, GITS_BASER, PHYADDRL_64K) << 16; 120 result |= FIELD_EX64(value, GITS_BASER, PHYADDRH_64K) << 48; 121 break; 122 123 default: 124 break; 125 } 126 return result; 127 } 128 129 static uint64_t table_entry_addr(GICv3ITSState *s, TableDesc *td, 130 uint32_t idx, MemTxResult *res) 131 { 132 /* 133 * Given a TableDesc describing one of the ITS in-guest-memory 134 * tables and an index into it, return the guest address 135 * corresponding to that table entry. 136 * If there was a memory error reading the L1 table of an 137 * indirect table, *res is set accordingly, and we return -1. 138 * If the L1 table entry is marked not valid, we return -1 with 139 * *res set to MEMTX_OK. 140 * 141 * The specification defines the format of level 1 entries of a 142 * 2-level table, but the format of level 2 entries and the format 143 * of flat-mapped tables is IMPDEF. 144 */ 145 AddressSpace *as = &s->gicv3->dma_as; 146 uint32_t l2idx; 147 uint64_t l2; 148 uint32_t num_l2_entries; 149 150 *res = MEMTX_OK; 151 152 if (!td->indirect) { 153 /* Single level table */ 154 return td->base_addr + idx * td->entry_sz; 155 } 156 157 /* Two level table */ 158 l2idx = idx / (td->page_sz / L1TABLE_ENTRY_SIZE); 159 160 l2 = address_space_ldq_le(as, 161 td->base_addr + (l2idx * L1TABLE_ENTRY_SIZE), 162 MEMTXATTRS_UNSPECIFIED, res); 163 if (*res != MEMTX_OK) { 164 return -1; 165 } 166 if (!(l2 & L2_TABLE_VALID_MASK)) { 167 return -1; 168 } 169 170 num_l2_entries = td->page_sz / td->entry_sz; 171 return (l2 & ((1ULL << 51) - 1)) + (idx % num_l2_entries) * td->entry_sz; 172 } 173 174 /* 175 * Read the Collection Table entry at index @icid. On success (including 176 * successfully determining that there is no valid CTE for this index), 177 * we return MEMTX_OK and populate the CTEntry struct @cte accordingly. 178 * If there is an error reading memory then we return the error code. 179 */ 180 static MemTxResult get_cte(GICv3ITSState *s, uint16_t icid, CTEntry *cte) 181 { 182 AddressSpace *as = &s->gicv3->dma_as; 183 MemTxResult res = MEMTX_OK; 184 uint64_t entry_addr = table_entry_addr(s, &s->ct, icid, &res); 185 uint64_t cteval; 186 187 if (entry_addr == -1) { 188 /* No L2 table entry, i.e. no valid CTE, or a memory error */ 189 cte->valid = false; 190 goto out; 191 } 192 193 cteval = address_space_ldq_le(as, entry_addr, MEMTXATTRS_UNSPECIFIED, &res); 194 if (res != MEMTX_OK) { 195 goto out; 196 } 197 cte->valid = FIELD_EX64(cteval, CTE, VALID); 198 cte->rdbase = FIELD_EX64(cteval, CTE, RDBASE); 199 out: 200 if (res != MEMTX_OK) { 201 trace_gicv3_its_cte_read_fault(icid); 202 } else { 203 trace_gicv3_its_cte_read(icid, cte->valid, cte->rdbase); 204 } 205 return res; 206 } 207 208 /* 209 * Update the Interrupt Table entry at index @evinted in the table specified 210 * by the dte @dte. Returns true on success, false if there was a memory 211 * access error. 212 */ 213 static bool update_ite(GICv3ITSState *s, uint32_t eventid, const DTEntry *dte, 214 const ITEntry *ite) 215 { 216 AddressSpace *as = &s->gicv3->dma_as; 217 MemTxResult res = MEMTX_OK; 218 hwaddr iteaddr = dte->ittaddr + eventid * ITS_ITT_ENTRY_SIZE; 219 uint64_t itel = 0; 220 uint32_t iteh = 0; 221 222 trace_gicv3_its_ite_write(dte->ittaddr, eventid, ite->valid, 223 ite->inttype, ite->intid, ite->icid, 224 ite->vpeid, ite->doorbell); 225 226 if (ite->valid) { 227 itel = FIELD_DP64(itel, ITE_L, VALID, 1); 228 itel = FIELD_DP64(itel, ITE_L, INTTYPE, ite->inttype); 229 itel = FIELD_DP64(itel, ITE_L, INTID, ite->intid); 230 itel = FIELD_DP64(itel, ITE_L, ICID, ite->icid); 231 itel = FIELD_DP64(itel, ITE_L, VPEID, ite->vpeid); 232 iteh = FIELD_DP32(iteh, ITE_H, DOORBELL, ite->doorbell); 233 } 234 235 address_space_stq_le(as, iteaddr, itel, MEMTXATTRS_UNSPECIFIED, &res); 236 if (res != MEMTX_OK) { 237 return false; 238 } 239 address_space_stl_le(as, iteaddr + 8, iteh, MEMTXATTRS_UNSPECIFIED, &res); 240 return res == MEMTX_OK; 241 } 242 243 /* 244 * Read the Interrupt Table entry at index @eventid from the table specified 245 * by the DTE @dte. On success, we return MEMTX_OK and populate the ITEntry 246 * struct @ite accordingly. If there is an error reading memory then we return 247 * the error code. 248 */ 249 static MemTxResult get_ite(GICv3ITSState *s, uint32_t eventid, 250 const DTEntry *dte, ITEntry *ite) 251 { 252 AddressSpace *as = &s->gicv3->dma_as; 253 MemTxResult res = MEMTX_OK; 254 uint64_t itel; 255 uint32_t iteh; 256 hwaddr iteaddr = dte->ittaddr + eventid * ITS_ITT_ENTRY_SIZE; 257 258 itel = address_space_ldq_le(as, iteaddr, MEMTXATTRS_UNSPECIFIED, &res); 259 if (res != MEMTX_OK) { 260 trace_gicv3_its_ite_read_fault(dte->ittaddr, eventid); 261 return res; 262 } 263 264 iteh = address_space_ldl_le(as, iteaddr + 8, MEMTXATTRS_UNSPECIFIED, &res); 265 if (res != MEMTX_OK) { 266 trace_gicv3_its_ite_read_fault(dte->ittaddr, eventid); 267 return res; 268 } 269 270 ite->valid = FIELD_EX64(itel, ITE_L, VALID); 271 ite->inttype = FIELD_EX64(itel, ITE_L, INTTYPE); 272 ite->intid = FIELD_EX64(itel, ITE_L, INTID); 273 ite->icid = FIELD_EX64(itel, ITE_L, ICID); 274 ite->vpeid = FIELD_EX64(itel, ITE_L, VPEID); 275 ite->doorbell = FIELD_EX64(iteh, ITE_H, DOORBELL); 276 trace_gicv3_its_ite_read(dte->ittaddr, eventid, ite->valid, 277 ite->inttype, ite->intid, ite->icid, 278 ite->vpeid, ite->doorbell); 279 return MEMTX_OK; 280 } 281 282 /* 283 * Read the Device Table entry at index @devid. On success (including 284 * successfully determining that there is no valid DTE for this index), 285 * we return MEMTX_OK and populate the DTEntry struct accordingly. 286 * If there is an error reading memory then we return the error code. 287 */ 288 static MemTxResult get_dte(GICv3ITSState *s, uint32_t devid, DTEntry *dte) 289 { 290 MemTxResult res = MEMTX_OK; 291 AddressSpace *as = &s->gicv3->dma_as; 292 uint64_t entry_addr = table_entry_addr(s, &s->dt, devid, &res); 293 uint64_t dteval; 294 295 if (entry_addr == -1) { 296 /* No L2 table entry, i.e. no valid DTE, or a memory error */ 297 dte->valid = false; 298 goto out; 299 } 300 dteval = address_space_ldq_le(as, entry_addr, MEMTXATTRS_UNSPECIFIED, &res); 301 if (res != MEMTX_OK) { 302 goto out; 303 } 304 dte->valid = FIELD_EX64(dteval, DTE, VALID); 305 dte->size = FIELD_EX64(dteval, DTE, SIZE); 306 /* DTE word field stores bits [51:8] of the ITT address */ 307 dte->ittaddr = FIELD_EX64(dteval, DTE, ITTADDR) << ITTADDR_SHIFT; 308 out: 309 if (res != MEMTX_OK) { 310 trace_gicv3_its_dte_read_fault(devid); 311 } else { 312 trace_gicv3_its_dte_read(devid, dte->valid, dte->size, dte->ittaddr); 313 } 314 return res; 315 } 316 317 /* 318 * Read the vPE Table entry at index @vpeid. On success (including 319 * successfully determining that there is no valid entry for this index), 320 * we return MEMTX_OK and populate the VTEntry struct accordingly. 321 * If there is an error reading memory then we return the error code. 322 */ 323 static MemTxResult get_vte(GICv3ITSState *s, uint32_t vpeid, VTEntry *vte) 324 { 325 MemTxResult res = MEMTX_OK; 326 AddressSpace *as = &s->gicv3->dma_as; 327 uint64_t entry_addr = table_entry_addr(s, &s->vpet, vpeid, &res); 328 uint64_t vteval; 329 330 if (entry_addr == -1) { 331 /* No L2 table entry, i.e. no valid VTE, or a memory error */ 332 vte->valid = false; 333 trace_gicv3_its_vte_read_fault(vpeid); 334 return MEMTX_OK; 335 } 336 vteval = address_space_ldq_le(as, entry_addr, MEMTXATTRS_UNSPECIFIED, &res); 337 if (res != MEMTX_OK) { 338 trace_gicv3_its_vte_read_fault(vpeid); 339 return res; 340 } 341 vte->valid = FIELD_EX64(vteval, VTE, VALID); 342 vte->vptsize = FIELD_EX64(vteval, VTE, VPTSIZE); 343 vte->vptaddr = FIELD_EX64(vteval, VTE, VPTADDR); 344 vte->rdbase = FIELD_EX64(vteval, VTE, RDBASE); 345 trace_gicv3_its_vte_read(vpeid, vte->valid, vte->vptsize, 346 vte->vptaddr, vte->rdbase); 347 return res; 348 } 349 350 /* 351 * Given a (DeviceID, EventID), look up the corresponding ITE, including 352 * checking for the various invalid-value cases. If we find a valid ITE, 353 * fill in @ite and @dte and return CMD_CONTINUE_OK. Otherwise return 354 * CMD_STALL or CMD_CONTINUE as appropriate (and the contents of @ite 355 * should not be relied on). 356 * 357 * The string @who is purely for the LOG_GUEST_ERROR messages, 358 * and should indicate the name of the calling function or similar. 359 */ 360 static ItsCmdResult lookup_ite(GICv3ITSState *s, const char *who, 361 uint32_t devid, uint32_t eventid, ITEntry *ite, 362 DTEntry *dte) 363 { 364 uint64_t num_eventids; 365 366 if (devid >= s->dt.num_entries) { 367 qemu_log_mask(LOG_GUEST_ERROR, 368 "%s: invalid command attributes: devid %d>=%d", 369 who, devid, s->dt.num_entries); 370 return CMD_CONTINUE; 371 } 372 373 if (get_dte(s, devid, dte) != MEMTX_OK) { 374 return CMD_STALL; 375 } 376 if (!dte->valid) { 377 qemu_log_mask(LOG_GUEST_ERROR, 378 "%s: invalid command attributes: " 379 "invalid dte for %d\n", who, devid); 380 return CMD_CONTINUE; 381 } 382 383 num_eventids = 1ULL << (dte->size + 1); 384 if (eventid >= num_eventids) { 385 qemu_log_mask(LOG_GUEST_ERROR, 386 "%s: invalid command attributes: eventid %d >= %" 387 PRId64 "\n", who, eventid, num_eventids); 388 return CMD_CONTINUE; 389 } 390 391 if (get_ite(s, eventid, dte, ite) != MEMTX_OK) { 392 return CMD_STALL; 393 } 394 395 if (!ite->valid) { 396 qemu_log_mask(LOG_GUEST_ERROR, 397 "%s: invalid command attributes: invalid ITE\n", who); 398 return CMD_CONTINUE; 399 } 400 401 return CMD_CONTINUE_OK; 402 } 403 404 /* 405 * Given an ICID, look up the corresponding CTE, including checking for various 406 * invalid-value cases. If we find a valid CTE, fill in @cte and return 407 * CMD_CONTINUE_OK; otherwise return CMD_STALL or CMD_CONTINUE (and the 408 * contents of @cte should not be relied on). 409 * 410 * The string @who is purely for the LOG_GUEST_ERROR messages, 411 * and should indicate the name of the calling function or similar. 412 */ 413 static ItsCmdResult lookup_cte(GICv3ITSState *s, const char *who, 414 uint32_t icid, CTEntry *cte) 415 { 416 if (icid >= s->ct.num_entries) { 417 qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid ICID 0x%x\n", who, icid); 418 return CMD_CONTINUE; 419 } 420 if (get_cte(s, icid, cte) != MEMTX_OK) { 421 return CMD_STALL; 422 } 423 if (!cte->valid) { 424 qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid CTE\n", who); 425 return CMD_CONTINUE; 426 } 427 if (cte->rdbase >= s->gicv3->num_cpu) { 428 return CMD_CONTINUE; 429 } 430 return CMD_CONTINUE_OK; 431 } 432 433 /* 434 * Given a VPEID, look up the corresponding VTE, including checking 435 * for various invalid-value cases. if we find a valid VTE, fill in @vte 436 * and return CMD_CONTINUE_OK; otherwise return CMD_STALL or CMD_CONTINUE 437 * (and the contents of @vte should not be relied on). 438 * 439 * The string @who is purely for the LOG_GUEST_ERROR messages, 440 * and should indicate the name of the calling function or similar. 441 */ 442 static ItsCmdResult lookup_vte(GICv3ITSState *s, const char *who, 443 uint32_t vpeid, VTEntry *vte) 444 { 445 if (vpeid >= s->vpet.num_entries) { 446 qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid VPEID 0x%x\n", who, vpeid); 447 return CMD_CONTINUE; 448 } 449 450 if (get_vte(s, vpeid, vte) != MEMTX_OK) { 451 return CMD_STALL; 452 } 453 if (!vte->valid) { 454 qemu_log_mask(LOG_GUEST_ERROR, 455 "%s: invalid VTE for VPEID 0x%x\n", who, vpeid); 456 return CMD_CONTINUE; 457 } 458 459 if (vte->rdbase >= s->gicv3->num_cpu) { 460 return CMD_CONTINUE; 461 } 462 return CMD_CONTINUE_OK; 463 } 464 465 static ItsCmdResult process_its_cmd_phys(GICv3ITSState *s, const ITEntry *ite, 466 int irqlevel) 467 { 468 CTEntry cte; 469 ItsCmdResult cmdres; 470 471 cmdres = lookup_cte(s, __func__, ite->icid, &cte); 472 if (cmdres != CMD_CONTINUE_OK) { 473 return cmdres; 474 } 475 gicv3_redist_process_lpi(&s->gicv3->cpu[cte.rdbase], ite->intid, irqlevel); 476 return CMD_CONTINUE_OK; 477 } 478 479 static ItsCmdResult process_its_cmd_virt(GICv3ITSState *s, const ITEntry *ite, 480 int irqlevel) 481 { 482 VTEntry vte; 483 ItsCmdResult cmdres; 484 485 cmdres = lookup_vte(s, __func__, ite->vpeid, &vte); 486 if (cmdres != CMD_CONTINUE_OK) { 487 return cmdres; 488 } 489 490 if (!intid_in_lpi_range(ite->intid) || 491 ite->intid >= (1ULL << (vte.vptsize + 1))) { 492 qemu_log_mask(LOG_GUEST_ERROR, "%s: intid 0x%x out of range\n", 493 __func__, ite->intid); 494 return CMD_CONTINUE; 495 } 496 497 /* 498 * For QEMU the actual pending of the vLPI is handled in the 499 * redistributor code 500 */ 501 gicv3_redist_process_vlpi(&s->gicv3->cpu[vte.rdbase], ite->intid, 502 vte.vptaddr << 16, ite->doorbell, irqlevel); 503 return CMD_CONTINUE_OK; 504 } 505 506 /* 507 * This function handles the processing of following commands based on 508 * the ItsCmdType parameter passed:- 509 * 1. triggering of lpi interrupt translation via ITS INT command 510 * 2. triggering of lpi interrupt translation via gits_translater register 511 * 3. handling of ITS CLEAR command 512 * 4. handling of ITS DISCARD command 513 */ 514 static ItsCmdResult do_process_its_cmd(GICv3ITSState *s, uint32_t devid, 515 uint32_t eventid, ItsCmdType cmd) 516 { 517 DTEntry dte; 518 ITEntry ite; 519 ItsCmdResult cmdres; 520 int irqlevel; 521 522 cmdres = lookup_ite(s, __func__, devid, eventid, &ite, &dte); 523 if (cmdres != CMD_CONTINUE_OK) { 524 return cmdres; 525 } 526 527 irqlevel = (cmd == CLEAR || cmd == DISCARD) ? 0 : 1; 528 529 switch (ite.inttype) { 530 case ITE_INTTYPE_PHYSICAL: 531 cmdres = process_its_cmd_phys(s, &ite, irqlevel); 532 break; 533 case ITE_INTTYPE_VIRTUAL: 534 if (!its_feature_virtual(s)) { 535 /* Can't happen unless guest is illegally writing to table memory */ 536 qemu_log_mask(LOG_GUEST_ERROR, 537 "%s: invalid type %d in ITE (table corrupted?)\n", 538 __func__, ite.inttype); 539 return CMD_CONTINUE; 540 } 541 cmdres = process_its_cmd_virt(s, &ite, irqlevel); 542 break; 543 default: 544 g_assert_not_reached(); 545 } 546 547 if (cmdres == CMD_CONTINUE_OK && cmd == DISCARD) { 548 ITEntry i = {}; 549 /* remove mapping from interrupt translation table */ 550 i.valid = false; 551 return update_ite(s, eventid, &dte, &i) ? CMD_CONTINUE_OK : CMD_STALL; 552 } 553 return CMD_CONTINUE_OK; 554 } 555 556 static ItsCmdResult process_its_cmd(GICv3ITSState *s, const uint64_t *cmdpkt, 557 ItsCmdType cmd) 558 { 559 uint32_t devid, eventid; 560 561 devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT; 562 eventid = cmdpkt[1] & EVENTID_MASK; 563 switch (cmd) { 564 case INTERRUPT: 565 trace_gicv3_its_cmd_int(devid, eventid); 566 break; 567 case CLEAR: 568 trace_gicv3_its_cmd_clear(devid, eventid); 569 break; 570 case DISCARD: 571 trace_gicv3_its_cmd_discard(devid, eventid); 572 break; 573 default: 574 g_assert_not_reached(); 575 } 576 return do_process_its_cmd(s, devid, eventid, cmd); 577 } 578 579 static ItsCmdResult process_mapti(GICv3ITSState *s, const uint64_t *cmdpkt, 580 bool ignore_pInt) 581 { 582 uint32_t devid, eventid; 583 uint32_t pIntid = 0; 584 uint64_t num_eventids; 585 uint16_t icid = 0; 586 DTEntry dte; 587 ITEntry ite; 588 589 devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT; 590 eventid = cmdpkt[1] & EVENTID_MASK; 591 icid = cmdpkt[2] & ICID_MASK; 592 593 if (ignore_pInt) { 594 pIntid = eventid; 595 trace_gicv3_its_cmd_mapi(devid, eventid, icid); 596 } else { 597 pIntid = (cmdpkt[1] & pINTID_MASK) >> pINTID_SHIFT; 598 trace_gicv3_its_cmd_mapti(devid, eventid, icid, pIntid); 599 } 600 601 if (devid >= s->dt.num_entries) { 602 qemu_log_mask(LOG_GUEST_ERROR, 603 "%s: invalid command attributes: devid %d>=%d", 604 __func__, devid, s->dt.num_entries); 605 return CMD_CONTINUE; 606 } 607 608 if (get_dte(s, devid, &dte) != MEMTX_OK) { 609 return CMD_STALL; 610 } 611 num_eventids = 1ULL << (dte.size + 1); 612 613 if (icid >= s->ct.num_entries) { 614 qemu_log_mask(LOG_GUEST_ERROR, 615 "%s: invalid ICID 0x%x >= 0x%x\n", 616 __func__, icid, s->ct.num_entries); 617 return CMD_CONTINUE; 618 } 619 620 if (!dte.valid) { 621 qemu_log_mask(LOG_GUEST_ERROR, 622 "%s: no valid DTE for devid 0x%x\n", __func__, devid); 623 return CMD_CONTINUE; 624 } 625 626 if (eventid >= num_eventids) { 627 qemu_log_mask(LOG_GUEST_ERROR, 628 "%s: invalid event ID 0x%x >= 0x%" PRIx64 "\n", 629 __func__, eventid, num_eventids); 630 return CMD_CONTINUE; 631 } 632 633 if (!intid_in_lpi_range(pIntid)) { 634 qemu_log_mask(LOG_GUEST_ERROR, 635 "%s: invalid interrupt ID 0x%x\n", __func__, pIntid); 636 return CMD_CONTINUE; 637 } 638 639 /* add ite entry to interrupt translation table */ 640 ite.valid = true; 641 ite.inttype = ITE_INTTYPE_PHYSICAL; 642 ite.intid = pIntid; 643 ite.icid = icid; 644 ite.doorbell = INTID_SPURIOUS; 645 ite.vpeid = 0; 646 return update_ite(s, eventid, &dte, &ite) ? CMD_CONTINUE_OK : CMD_STALL; 647 } 648 649 static ItsCmdResult process_vmapti(GICv3ITSState *s, const uint64_t *cmdpkt, 650 bool ignore_vintid) 651 { 652 uint32_t devid, eventid, vintid, doorbell, vpeid; 653 uint32_t num_eventids; 654 DTEntry dte; 655 ITEntry ite; 656 657 if (!its_feature_virtual(s)) { 658 return CMD_CONTINUE; 659 } 660 661 devid = FIELD_EX64(cmdpkt[0], VMAPTI_0, DEVICEID); 662 eventid = FIELD_EX64(cmdpkt[1], VMAPTI_1, EVENTID); 663 vpeid = FIELD_EX64(cmdpkt[1], VMAPTI_1, VPEID); 664 doorbell = FIELD_EX64(cmdpkt[2], VMAPTI_2, DOORBELL); 665 if (ignore_vintid) { 666 vintid = eventid; 667 trace_gicv3_its_cmd_vmapi(devid, eventid, vpeid, doorbell); 668 } else { 669 vintid = FIELD_EX64(cmdpkt[2], VMAPTI_2, VINTID); 670 trace_gicv3_its_cmd_vmapti(devid, eventid, vpeid, vintid, doorbell); 671 } 672 673 if (devid >= s->dt.num_entries) { 674 qemu_log_mask(LOG_GUEST_ERROR, 675 "%s: invalid DeviceID 0x%x (must be less than 0x%x)\n", 676 __func__, devid, s->dt.num_entries); 677 return CMD_CONTINUE; 678 } 679 680 if (get_dte(s, devid, &dte) != MEMTX_OK) { 681 return CMD_STALL; 682 } 683 684 if (!dte.valid) { 685 qemu_log_mask(LOG_GUEST_ERROR, 686 "%s: no entry in device table for DeviceID 0x%x\n", 687 __func__, devid); 688 return CMD_CONTINUE; 689 } 690 691 num_eventids = 1ULL << (dte.size + 1); 692 693 if (eventid >= num_eventids) { 694 qemu_log_mask(LOG_GUEST_ERROR, 695 "%s: EventID 0x%x too large for DeviceID 0x%x " 696 "(must be less than 0x%x)\n", 697 __func__, eventid, devid, num_eventids); 698 return CMD_CONTINUE; 699 } 700 if (!intid_in_lpi_range(vintid)) { 701 qemu_log_mask(LOG_GUEST_ERROR, 702 "%s: VIntID 0x%x not a valid LPI\n", 703 __func__, vintid); 704 return CMD_CONTINUE; 705 } 706 if (!valid_doorbell(doorbell)) { 707 qemu_log_mask(LOG_GUEST_ERROR, 708 "%s: Doorbell %d not 1023 and not a valid LPI\n", 709 __func__, doorbell); 710 return CMD_CONTINUE; 711 } 712 if (vpeid >= s->vpet.num_entries) { 713 qemu_log_mask(LOG_GUEST_ERROR, 714 "%s: VPEID 0x%x out of range (must be less than 0x%x)\n", 715 __func__, vpeid, s->vpet.num_entries); 716 return CMD_CONTINUE; 717 } 718 /* add ite entry to interrupt translation table */ 719 ite.valid = true; 720 ite.inttype = ITE_INTTYPE_VIRTUAL; 721 ite.intid = vintid; 722 ite.icid = 0; 723 ite.doorbell = doorbell; 724 ite.vpeid = vpeid; 725 return update_ite(s, eventid, &dte, &ite) ? CMD_CONTINUE_OK : CMD_STALL; 726 } 727 728 /* 729 * Update the Collection Table entry for @icid to @cte. Returns true 730 * on success, false if there was a memory access error. 731 */ 732 static bool update_cte(GICv3ITSState *s, uint16_t icid, const CTEntry *cte) 733 { 734 AddressSpace *as = &s->gicv3->dma_as; 735 uint64_t entry_addr; 736 uint64_t cteval = 0; 737 MemTxResult res = MEMTX_OK; 738 739 trace_gicv3_its_cte_write(icid, cte->valid, cte->rdbase); 740 741 if (cte->valid) { 742 /* add mapping entry to collection table */ 743 cteval = FIELD_DP64(cteval, CTE, VALID, 1); 744 cteval = FIELD_DP64(cteval, CTE, RDBASE, cte->rdbase); 745 } 746 747 entry_addr = table_entry_addr(s, &s->ct, icid, &res); 748 if (res != MEMTX_OK) { 749 /* memory access error: stall */ 750 return false; 751 } 752 if (entry_addr == -1) { 753 /* No L2 table for this index: discard write and continue */ 754 return true; 755 } 756 757 address_space_stq_le(as, entry_addr, cteval, MEMTXATTRS_UNSPECIFIED, &res); 758 return res == MEMTX_OK; 759 } 760 761 static ItsCmdResult process_mapc(GICv3ITSState *s, const uint64_t *cmdpkt) 762 { 763 uint16_t icid; 764 CTEntry cte; 765 766 icid = cmdpkt[2] & ICID_MASK; 767 cte.valid = cmdpkt[2] & CMD_FIELD_VALID_MASK; 768 if (cte.valid) { 769 cte.rdbase = (cmdpkt[2] & R_MAPC_RDBASE_MASK) >> R_MAPC_RDBASE_SHIFT; 770 cte.rdbase &= RDBASE_PROCNUM_MASK; 771 } else { 772 cte.rdbase = 0; 773 } 774 trace_gicv3_its_cmd_mapc(icid, cte.rdbase, cte.valid); 775 776 if (icid >= s->ct.num_entries) { 777 qemu_log_mask(LOG_GUEST_ERROR, "ITS MAPC: invalid ICID 0x%x\n", icid); 778 return CMD_CONTINUE; 779 } 780 if (cte.valid && cte.rdbase >= s->gicv3->num_cpu) { 781 qemu_log_mask(LOG_GUEST_ERROR, 782 "ITS MAPC: invalid RDBASE %u\n", cte.rdbase); 783 return CMD_CONTINUE; 784 } 785 786 return update_cte(s, icid, &cte) ? CMD_CONTINUE_OK : CMD_STALL; 787 } 788 789 /* 790 * Update the Device Table entry for @devid to @dte. Returns true 791 * on success, false if there was a memory access error. 792 */ 793 static bool update_dte(GICv3ITSState *s, uint32_t devid, const DTEntry *dte) 794 { 795 AddressSpace *as = &s->gicv3->dma_as; 796 uint64_t entry_addr; 797 uint64_t dteval = 0; 798 MemTxResult res = MEMTX_OK; 799 800 trace_gicv3_its_dte_write(devid, dte->valid, dte->size, dte->ittaddr); 801 802 if (dte->valid) { 803 /* add mapping entry to device table */ 804 dteval = FIELD_DP64(dteval, DTE, VALID, 1); 805 dteval = FIELD_DP64(dteval, DTE, SIZE, dte->size); 806 dteval = FIELD_DP64(dteval, DTE, ITTADDR, dte->ittaddr); 807 } 808 809 entry_addr = table_entry_addr(s, &s->dt, devid, &res); 810 if (res != MEMTX_OK) { 811 /* memory access error: stall */ 812 return false; 813 } 814 if (entry_addr == -1) { 815 /* No L2 table for this index: discard write and continue */ 816 return true; 817 } 818 address_space_stq_le(as, entry_addr, dteval, MEMTXATTRS_UNSPECIFIED, &res); 819 return res == MEMTX_OK; 820 } 821 822 static ItsCmdResult process_mapd(GICv3ITSState *s, const uint64_t *cmdpkt) 823 { 824 uint32_t devid; 825 DTEntry dte; 826 827 devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT; 828 dte.size = cmdpkt[1] & SIZE_MASK; 829 dte.ittaddr = (cmdpkt[2] & ITTADDR_MASK) >> ITTADDR_SHIFT; 830 dte.valid = cmdpkt[2] & CMD_FIELD_VALID_MASK; 831 832 trace_gicv3_its_cmd_mapd(devid, dte.size, dte.ittaddr, dte.valid); 833 834 if (devid >= s->dt.num_entries) { 835 qemu_log_mask(LOG_GUEST_ERROR, 836 "ITS MAPD: invalid device ID field 0x%x >= 0x%x\n", 837 devid, s->dt.num_entries); 838 return CMD_CONTINUE; 839 } 840 841 if (dte.size > FIELD_EX64(s->typer, GITS_TYPER, IDBITS)) { 842 qemu_log_mask(LOG_GUEST_ERROR, 843 "ITS MAPD: invalid size %d\n", dte.size); 844 return CMD_CONTINUE; 845 } 846 847 return update_dte(s, devid, &dte) ? CMD_CONTINUE_OK : CMD_STALL; 848 } 849 850 static ItsCmdResult process_movall(GICv3ITSState *s, const uint64_t *cmdpkt) 851 { 852 uint64_t rd1, rd2; 853 854 rd1 = FIELD_EX64(cmdpkt[2], MOVALL_2, RDBASE1); 855 rd2 = FIELD_EX64(cmdpkt[3], MOVALL_3, RDBASE2); 856 857 trace_gicv3_its_cmd_movall(rd1, rd2); 858 859 if (rd1 >= s->gicv3->num_cpu) { 860 qemu_log_mask(LOG_GUEST_ERROR, 861 "%s: RDBASE1 %" PRId64 862 " out of range (must be less than %d)\n", 863 __func__, rd1, s->gicv3->num_cpu); 864 return CMD_CONTINUE; 865 } 866 if (rd2 >= s->gicv3->num_cpu) { 867 qemu_log_mask(LOG_GUEST_ERROR, 868 "%s: RDBASE2 %" PRId64 869 " out of range (must be less than %d)\n", 870 __func__, rd2, s->gicv3->num_cpu); 871 return CMD_CONTINUE; 872 } 873 874 if (rd1 == rd2) { 875 /* Move to same target must succeed as a no-op */ 876 return CMD_CONTINUE_OK; 877 } 878 879 /* Move all pending LPIs from redistributor 1 to redistributor 2 */ 880 gicv3_redist_movall_lpis(&s->gicv3->cpu[rd1], &s->gicv3->cpu[rd2]); 881 882 return CMD_CONTINUE_OK; 883 } 884 885 static ItsCmdResult process_movi(GICv3ITSState *s, const uint64_t *cmdpkt) 886 { 887 uint32_t devid, eventid; 888 uint16_t new_icid; 889 DTEntry dte; 890 CTEntry old_cte, new_cte; 891 ITEntry old_ite; 892 ItsCmdResult cmdres; 893 894 devid = FIELD_EX64(cmdpkt[0], MOVI_0, DEVICEID); 895 eventid = FIELD_EX64(cmdpkt[1], MOVI_1, EVENTID); 896 new_icid = FIELD_EX64(cmdpkt[2], MOVI_2, ICID); 897 898 trace_gicv3_its_cmd_movi(devid, eventid, new_icid); 899 900 cmdres = lookup_ite(s, __func__, devid, eventid, &old_ite, &dte); 901 if (cmdres != CMD_CONTINUE_OK) { 902 return cmdres; 903 } 904 905 if (old_ite.inttype != ITE_INTTYPE_PHYSICAL) { 906 qemu_log_mask(LOG_GUEST_ERROR, 907 "%s: invalid command attributes: invalid ITE\n", 908 __func__); 909 return CMD_CONTINUE; 910 } 911 912 cmdres = lookup_cte(s, __func__, old_ite.icid, &old_cte); 913 if (cmdres != CMD_CONTINUE_OK) { 914 return cmdres; 915 } 916 cmdres = lookup_cte(s, __func__, new_icid, &new_cte); 917 if (cmdres != CMD_CONTINUE_OK) { 918 return cmdres; 919 } 920 921 if (old_cte.rdbase != new_cte.rdbase) { 922 /* Move the LPI from the old redistributor to the new one */ 923 gicv3_redist_mov_lpi(&s->gicv3->cpu[old_cte.rdbase], 924 &s->gicv3->cpu[new_cte.rdbase], 925 old_ite.intid); 926 } 927 928 /* Update the ICID field in the interrupt translation table entry */ 929 old_ite.icid = new_icid; 930 return update_ite(s, eventid, &dte, &old_ite) ? CMD_CONTINUE_OK : CMD_STALL; 931 } 932 933 /* 934 * Update the vPE Table entry at index @vpeid with the entry @vte. 935 * Returns true on success, false if there was a memory access error. 936 */ 937 static bool update_vte(GICv3ITSState *s, uint32_t vpeid, const VTEntry *vte) 938 { 939 AddressSpace *as = &s->gicv3->dma_as; 940 uint64_t entry_addr; 941 uint64_t vteval = 0; 942 MemTxResult res = MEMTX_OK; 943 944 trace_gicv3_its_vte_write(vpeid, vte->valid, vte->vptsize, vte->vptaddr, 945 vte->rdbase); 946 947 if (vte->valid) { 948 vteval = FIELD_DP64(vteval, VTE, VALID, 1); 949 vteval = FIELD_DP64(vteval, VTE, VPTSIZE, vte->vptsize); 950 vteval = FIELD_DP64(vteval, VTE, VPTADDR, vte->vptaddr); 951 vteval = FIELD_DP64(vteval, VTE, RDBASE, vte->rdbase); 952 } 953 954 entry_addr = table_entry_addr(s, &s->vpet, vpeid, &res); 955 if (res != MEMTX_OK) { 956 return false; 957 } 958 if (entry_addr == -1) { 959 /* No L2 table for this index: discard write and continue */ 960 return true; 961 } 962 address_space_stq_le(as, entry_addr, vteval, MEMTXATTRS_UNSPECIFIED, &res); 963 return res == MEMTX_OK; 964 } 965 966 static ItsCmdResult process_vmapp(GICv3ITSState *s, const uint64_t *cmdpkt) 967 { 968 VTEntry vte; 969 uint32_t vpeid; 970 971 if (!its_feature_virtual(s)) { 972 return CMD_CONTINUE; 973 } 974 975 vpeid = FIELD_EX64(cmdpkt[1], VMAPP_1, VPEID); 976 vte.rdbase = FIELD_EX64(cmdpkt[2], VMAPP_2, RDBASE); 977 vte.valid = FIELD_EX64(cmdpkt[2], VMAPP_2, V); 978 vte.vptsize = FIELD_EX64(cmdpkt[3], VMAPP_3, VPTSIZE); 979 vte.vptaddr = FIELD_EX64(cmdpkt[3], VMAPP_3, VPTADDR); 980 981 trace_gicv3_its_cmd_vmapp(vpeid, vte.rdbase, vte.valid, 982 vte.vptaddr, vte.vptsize); 983 984 /* 985 * For GICv4.0 the VPT_size field is only 5 bits, whereas we 986 * define our field macros to include the full GICv4.1 8 bits. 987 * The range check on VPT_size will catch the cases where 988 * the guest set the RES0-in-GICv4.0 bits [7:6]. 989 */ 990 if (vte.vptsize > FIELD_EX64(s->typer, GITS_TYPER, IDBITS)) { 991 qemu_log_mask(LOG_GUEST_ERROR, 992 "%s: invalid VPT_size 0x%x\n", __func__, vte.vptsize); 993 return CMD_CONTINUE; 994 } 995 996 if (vte.valid && vte.rdbase >= s->gicv3->num_cpu) { 997 qemu_log_mask(LOG_GUEST_ERROR, 998 "%s: invalid rdbase 0x%x\n", __func__, vte.rdbase); 999 return CMD_CONTINUE; 1000 } 1001 1002 if (vpeid >= s->vpet.num_entries) { 1003 qemu_log_mask(LOG_GUEST_ERROR, 1004 "%s: VPEID 0x%x out of range (must be less than 0x%x)\n", 1005 __func__, vpeid, s->vpet.num_entries); 1006 return CMD_CONTINUE; 1007 } 1008 1009 return update_vte(s, vpeid, &vte) ? CMD_CONTINUE_OK : CMD_STALL; 1010 } 1011 1012 typedef struct VmovpCallbackData { 1013 uint64_t rdbase; 1014 uint32_t vpeid; 1015 /* 1016 * Overall command result. If more than one callback finds an 1017 * error, STALL beats CONTINUE. 1018 */ 1019 ItsCmdResult result; 1020 } VmovpCallbackData; 1021 1022 static void vmovp_callback(gpointer data, gpointer opaque) 1023 { 1024 /* 1025 * This function is called to update the VPEID field in a VPE 1026 * table entry for this ITS. This might be because of a VMOVP 1027 * command executed on any ITS that is connected to the same GIC 1028 * as this ITS. We need to read the VPE table entry for the VPEID 1029 * and update its RDBASE field. 1030 */ 1031 GICv3ITSState *s = data; 1032 VmovpCallbackData *cbdata = opaque; 1033 VTEntry vte; 1034 ItsCmdResult cmdres; 1035 1036 cmdres = lookup_vte(s, __func__, cbdata->vpeid, &vte); 1037 switch (cmdres) { 1038 case CMD_STALL: 1039 cbdata->result = CMD_STALL; 1040 return; 1041 case CMD_CONTINUE: 1042 if (cbdata->result != CMD_STALL) { 1043 cbdata->result = CMD_CONTINUE; 1044 } 1045 return; 1046 case CMD_CONTINUE_OK: 1047 break; 1048 } 1049 1050 vte.rdbase = cbdata->rdbase; 1051 if (!update_vte(s, cbdata->vpeid, &vte)) { 1052 cbdata->result = CMD_STALL; 1053 } 1054 } 1055 1056 static ItsCmdResult process_vmovp(GICv3ITSState *s, const uint64_t *cmdpkt) 1057 { 1058 VmovpCallbackData cbdata; 1059 1060 if (!its_feature_virtual(s)) { 1061 return CMD_CONTINUE; 1062 } 1063 1064 cbdata.vpeid = FIELD_EX64(cmdpkt[1], VMOVP_1, VPEID); 1065 cbdata.rdbase = FIELD_EX64(cmdpkt[2], VMOVP_2, RDBASE); 1066 1067 trace_gicv3_its_cmd_vmovp(cbdata.vpeid, cbdata.rdbase); 1068 1069 if (cbdata.rdbase >= s->gicv3->num_cpu) { 1070 return CMD_CONTINUE; 1071 } 1072 1073 /* 1074 * Our ITS implementation reports GITS_TYPER.VMOVP == 1, which means 1075 * that when the VMOVP command is executed on an ITS to change the 1076 * VPEID field in a VPE table entry the change must be propagated 1077 * to all the ITSes connected to the same GIC. 1078 */ 1079 cbdata.result = CMD_CONTINUE_OK; 1080 gicv3_foreach_its(s->gicv3, vmovp_callback, &cbdata); 1081 return cbdata.result; 1082 } 1083 1084 static ItsCmdResult process_vmovi(GICv3ITSState *s, const uint64_t *cmdpkt) 1085 { 1086 uint32_t devid, eventid, vpeid, doorbell; 1087 bool doorbell_valid; 1088 DTEntry dte; 1089 ITEntry ite; 1090 VTEntry old_vte, new_vte; 1091 ItsCmdResult cmdres; 1092 1093 if (!its_feature_virtual(s)) { 1094 return CMD_CONTINUE; 1095 } 1096 1097 devid = FIELD_EX64(cmdpkt[0], VMOVI_0, DEVICEID); 1098 eventid = FIELD_EX64(cmdpkt[1], VMOVI_1, EVENTID); 1099 vpeid = FIELD_EX64(cmdpkt[1], VMOVI_1, VPEID); 1100 doorbell_valid = FIELD_EX64(cmdpkt[2], VMOVI_2, D); 1101 doorbell = FIELD_EX64(cmdpkt[2], VMOVI_2, DOORBELL); 1102 1103 trace_gicv3_its_cmd_vmovi(devid, eventid, vpeid, doorbell_valid, doorbell); 1104 1105 if (doorbell_valid && !valid_doorbell(doorbell)) { 1106 qemu_log_mask(LOG_GUEST_ERROR, 1107 "%s: invalid doorbell 0x%x\n", __func__, doorbell); 1108 return CMD_CONTINUE; 1109 } 1110 1111 cmdres = lookup_ite(s, __func__, devid, eventid, &ite, &dte); 1112 if (cmdres != CMD_CONTINUE_OK) { 1113 return cmdres; 1114 } 1115 1116 if (ite.inttype != ITE_INTTYPE_VIRTUAL) { 1117 qemu_log_mask(LOG_GUEST_ERROR, "%s: ITE is not for virtual interrupt\n", 1118 __func__); 1119 return CMD_CONTINUE; 1120 } 1121 1122 cmdres = lookup_vte(s, __func__, ite.vpeid, &old_vte); 1123 if (cmdres != CMD_CONTINUE_OK) { 1124 return cmdres; 1125 } 1126 cmdres = lookup_vte(s, __func__, vpeid, &new_vte); 1127 if (cmdres != CMD_CONTINUE_OK) { 1128 return cmdres; 1129 } 1130 1131 if (!intid_in_lpi_range(ite.intid) || 1132 ite.intid >= (1ULL << (old_vte.vptsize + 1)) || 1133 ite.intid >= (1ULL << (new_vte.vptsize + 1))) { 1134 qemu_log_mask(LOG_GUEST_ERROR, 1135 "%s: ITE intid 0x%x out of range\n", 1136 __func__, ite.intid); 1137 return CMD_CONTINUE; 1138 } 1139 1140 ite.vpeid = vpeid; 1141 if (doorbell_valid) { 1142 ite.doorbell = doorbell; 1143 } 1144 1145 /* 1146 * Move the LPI from the old redistributor to the new one. We don't 1147 * need to do anything if the guest somehow specified the 1148 * same pending table for source and destination. 1149 */ 1150 if (old_vte.vptaddr != new_vte.vptaddr) { 1151 gicv3_redist_mov_vlpi(&s->gicv3->cpu[old_vte.rdbase], 1152 old_vte.vptaddr << 16, 1153 &s->gicv3->cpu[new_vte.rdbase], 1154 new_vte.vptaddr << 16, 1155 ite.intid, 1156 ite.doorbell); 1157 } 1158 1159 /* Update the ITE to the new VPEID and possibly doorbell values */ 1160 return update_ite(s, eventid, &dte, &ite) ? CMD_CONTINUE_OK : CMD_STALL; 1161 } 1162 1163 static ItsCmdResult process_vinvall(GICv3ITSState *s, const uint64_t *cmdpkt) 1164 { 1165 VTEntry vte; 1166 uint32_t vpeid; 1167 ItsCmdResult cmdres; 1168 1169 if (!its_feature_virtual(s)) { 1170 return CMD_CONTINUE; 1171 } 1172 1173 vpeid = FIELD_EX64(cmdpkt[1], VINVALL_1, VPEID); 1174 1175 trace_gicv3_its_cmd_vinvall(vpeid); 1176 1177 cmdres = lookup_vte(s, __func__, vpeid, &vte); 1178 if (cmdres != CMD_CONTINUE_OK) { 1179 return cmdres; 1180 } 1181 1182 gicv3_redist_vinvall(&s->gicv3->cpu[vte.rdbase], vte.vptaddr << 16); 1183 return CMD_CONTINUE_OK; 1184 } 1185 1186 static ItsCmdResult process_inv(GICv3ITSState *s, const uint64_t *cmdpkt) 1187 { 1188 uint32_t devid, eventid; 1189 ITEntry ite; 1190 DTEntry dte; 1191 CTEntry cte; 1192 VTEntry vte; 1193 ItsCmdResult cmdres; 1194 1195 devid = FIELD_EX64(cmdpkt[0], INV_0, DEVICEID); 1196 eventid = FIELD_EX64(cmdpkt[1], INV_1, EVENTID); 1197 1198 trace_gicv3_its_cmd_inv(devid, eventid); 1199 1200 cmdres = lookup_ite(s, __func__, devid, eventid, &ite, &dte); 1201 if (cmdres != CMD_CONTINUE_OK) { 1202 return cmdres; 1203 } 1204 1205 switch (ite.inttype) { 1206 case ITE_INTTYPE_PHYSICAL: 1207 cmdres = lookup_cte(s, __func__, ite.icid, &cte); 1208 if (cmdres != CMD_CONTINUE_OK) { 1209 return cmdres; 1210 } 1211 gicv3_redist_inv_lpi(&s->gicv3->cpu[cte.rdbase], ite.intid); 1212 break; 1213 case ITE_INTTYPE_VIRTUAL: 1214 if (!its_feature_virtual(s)) { 1215 /* Can't happen unless guest is illegally writing to table memory */ 1216 qemu_log_mask(LOG_GUEST_ERROR, 1217 "%s: invalid type %d in ITE (table corrupted?)\n", 1218 __func__, ite.inttype); 1219 return CMD_CONTINUE; 1220 } 1221 1222 cmdres = lookup_vte(s, __func__, ite.vpeid, &vte); 1223 if (cmdres != CMD_CONTINUE_OK) { 1224 return cmdres; 1225 } 1226 if (!intid_in_lpi_range(ite.intid) || 1227 ite.intid >= (1ULL << (vte.vptsize + 1))) { 1228 qemu_log_mask(LOG_GUEST_ERROR, "%s: intid 0x%x out of range\n", 1229 __func__, ite.intid); 1230 return CMD_CONTINUE; 1231 } 1232 gicv3_redist_inv_vlpi(&s->gicv3->cpu[vte.rdbase], ite.intid, 1233 vte.vptaddr << 16); 1234 break; 1235 default: 1236 g_assert_not_reached(); 1237 } 1238 1239 return CMD_CONTINUE_OK; 1240 } 1241 1242 /* 1243 * Current implementation blocks until all 1244 * commands are processed 1245 */ 1246 static void process_cmdq(GICv3ITSState *s) 1247 { 1248 uint32_t wr_offset = 0; 1249 uint32_t rd_offset = 0; 1250 uint32_t cq_offset = 0; 1251 AddressSpace *as = &s->gicv3->dma_as; 1252 uint8_t cmd; 1253 int i; 1254 1255 if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) { 1256 return; 1257 } 1258 1259 wr_offset = FIELD_EX64(s->cwriter, GITS_CWRITER, OFFSET); 1260 1261 if (wr_offset >= s->cq.num_entries) { 1262 qemu_log_mask(LOG_GUEST_ERROR, 1263 "%s: invalid write offset " 1264 "%d\n", __func__, wr_offset); 1265 return; 1266 } 1267 1268 rd_offset = FIELD_EX64(s->creadr, GITS_CREADR, OFFSET); 1269 1270 if (rd_offset >= s->cq.num_entries) { 1271 qemu_log_mask(LOG_GUEST_ERROR, 1272 "%s: invalid read offset " 1273 "%d\n", __func__, rd_offset); 1274 return; 1275 } 1276 1277 while (wr_offset != rd_offset) { 1278 ItsCmdResult result = CMD_CONTINUE_OK; 1279 void *hostmem; 1280 hwaddr buflen; 1281 uint64_t cmdpkt[GITS_CMDQ_ENTRY_WORDS]; 1282 1283 cq_offset = (rd_offset * GITS_CMDQ_ENTRY_SIZE); 1284 1285 buflen = GITS_CMDQ_ENTRY_SIZE; 1286 hostmem = address_space_map(as, s->cq.base_addr + cq_offset, 1287 &buflen, false, MEMTXATTRS_UNSPECIFIED); 1288 if (!hostmem || buflen != GITS_CMDQ_ENTRY_SIZE) { 1289 if (hostmem) { 1290 address_space_unmap(as, hostmem, buflen, false, 0); 1291 } 1292 s->creadr = FIELD_DP64(s->creadr, GITS_CREADR, STALLED, 1); 1293 qemu_log_mask(LOG_GUEST_ERROR, 1294 "%s: could not read command at 0x%" PRIx64 "\n", 1295 __func__, s->cq.base_addr + cq_offset); 1296 break; 1297 } 1298 for (i = 0; i < ARRAY_SIZE(cmdpkt); i++) { 1299 cmdpkt[i] = ldq_le_p(hostmem + i * sizeof(uint64_t)); 1300 } 1301 address_space_unmap(as, hostmem, buflen, false, 0); 1302 1303 cmd = cmdpkt[0] & CMD_MASK; 1304 1305 trace_gicv3_its_process_command(rd_offset, cmd); 1306 1307 switch (cmd) { 1308 case GITS_CMD_INT: 1309 result = process_its_cmd(s, cmdpkt, INTERRUPT); 1310 break; 1311 case GITS_CMD_CLEAR: 1312 result = process_its_cmd(s, cmdpkt, CLEAR); 1313 break; 1314 case GITS_CMD_SYNC: 1315 /* 1316 * Current implementation makes a blocking synchronous call 1317 * for every command issued earlier, hence the internal state 1318 * is already consistent by the time SYNC command is executed. 1319 * Hence no further processing is required for SYNC command. 1320 */ 1321 trace_gicv3_its_cmd_sync(); 1322 break; 1323 case GITS_CMD_VSYNC: 1324 /* 1325 * VSYNC also is a nop, because our implementation is always 1326 * in sync. 1327 */ 1328 if (!its_feature_virtual(s)) { 1329 result = CMD_CONTINUE; 1330 break; 1331 } 1332 trace_gicv3_its_cmd_vsync(); 1333 break; 1334 case GITS_CMD_MAPD: 1335 result = process_mapd(s, cmdpkt); 1336 break; 1337 case GITS_CMD_MAPC: 1338 result = process_mapc(s, cmdpkt); 1339 break; 1340 case GITS_CMD_MAPTI: 1341 result = process_mapti(s, cmdpkt, false); 1342 break; 1343 case GITS_CMD_MAPI: 1344 result = process_mapti(s, cmdpkt, true); 1345 break; 1346 case GITS_CMD_DISCARD: 1347 result = process_its_cmd(s, cmdpkt, DISCARD); 1348 break; 1349 case GITS_CMD_INV: 1350 result = process_inv(s, cmdpkt); 1351 break; 1352 case GITS_CMD_INVALL: 1353 /* 1354 * Current implementation doesn't cache any ITS tables, 1355 * but the calculated lpi priority information. We only 1356 * need to trigger lpi priority re-calculation to be in 1357 * sync with LPI config table or pending table changes. 1358 * INVALL operates on a collection specified by ICID so 1359 * it only affects physical LPIs. 1360 */ 1361 trace_gicv3_its_cmd_invall(); 1362 for (i = 0; i < s->gicv3->num_cpu; i++) { 1363 gicv3_redist_update_lpi(&s->gicv3->cpu[i]); 1364 } 1365 break; 1366 case GITS_CMD_MOVI: 1367 result = process_movi(s, cmdpkt); 1368 break; 1369 case GITS_CMD_MOVALL: 1370 result = process_movall(s, cmdpkt); 1371 break; 1372 case GITS_CMD_VMAPTI: 1373 result = process_vmapti(s, cmdpkt, false); 1374 break; 1375 case GITS_CMD_VMAPI: 1376 result = process_vmapti(s, cmdpkt, true); 1377 break; 1378 case GITS_CMD_VMAPP: 1379 result = process_vmapp(s, cmdpkt); 1380 break; 1381 case GITS_CMD_VMOVP: 1382 result = process_vmovp(s, cmdpkt); 1383 break; 1384 case GITS_CMD_VMOVI: 1385 result = process_vmovi(s, cmdpkt); 1386 break; 1387 case GITS_CMD_VINVALL: 1388 result = process_vinvall(s, cmdpkt); 1389 break; 1390 default: 1391 trace_gicv3_its_cmd_unknown(cmd); 1392 break; 1393 } 1394 if (result != CMD_STALL) { 1395 /* CMD_CONTINUE or CMD_CONTINUE_OK */ 1396 rd_offset++; 1397 rd_offset %= s->cq.num_entries; 1398 s->creadr = FIELD_DP64(s->creadr, GITS_CREADR, OFFSET, rd_offset); 1399 } else { 1400 /* CMD_STALL */ 1401 s->creadr = FIELD_DP64(s->creadr, GITS_CREADR, STALLED, 1); 1402 qemu_log_mask(LOG_GUEST_ERROR, 1403 "%s: 0x%x cmd processing failed, stalling\n", 1404 __func__, cmd); 1405 break; 1406 } 1407 } 1408 } 1409 1410 /* 1411 * This function extracts the ITS Device and Collection table specific 1412 * parameters (like base_addr, size etc) from GITS_BASER register. 1413 * It is called during ITS enable and also during post_load migration 1414 */ 1415 static void extract_table_params(GICv3ITSState *s) 1416 { 1417 uint16_t num_pages = 0; 1418 uint8_t page_sz_type; 1419 uint8_t type; 1420 uint32_t page_sz = 0; 1421 uint64_t value; 1422 1423 for (int i = 0; i < 8; i++) { 1424 TableDesc *td; 1425 int idbits; 1426 1427 value = s->baser[i]; 1428 1429 if (!value) { 1430 continue; 1431 } 1432 1433 page_sz_type = FIELD_EX64(value, GITS_BASER, PAGESIZE); 1434 1435 switch (page_sz_type) { 1436 case 0: 1437 page_sz = GITS_PAGE_SIZE_4K; 1438 break; 1439 1440 case 1: 1441 page_sz = GITS_PAGE_SIZE_16K; 1442 break; 1443 1444 case 2: 1445 case 3: 1446 page_sz = GITS_PAGE_SIZE_64K; 1447 break; 1448 1449 default: 1450 g_assert_not_reached(); 1451 } 1452 1453 num_pages = FIELD_EX64(value, GITS_BASER, SIZE) + 1; 1454 1455 type = FIELD_EX64(value, GITS_BASER, TYPE); 1456 1457 switch (type) { 1458 case GITS_BASER_TYPE_DEVICE: 1459 td = &s->dt; 1460 idbits = FIELD_EX64(s->typer, GITS_TYPER, DEVBITS) + 1; 1461 break; 1462 case GITS_BASER_TYPE_COLLECTION: 1463 td = &s->ct; 1464 if (FIELD_EX64(s->typer, GITS_TYPER, CIL)) { 1465 idbits = FIELD_EX64(s->typer, GITS_TYPER, CIDBITS) + 1; 1466 } else { 1467 /* 16-bit CollectionId supported when CIL == 0 */ 1468 idbits = 16; 1469 } 1470 break; 1471 case GITS_BASER_TYPE_VPE: 1472 td = &s->vpet; 1473 /* 1474 * For QEMU vPEIDs are always 16 bits. (GICv4.1 allows an 1475 * implementation to implement fewer bits and report this 1476 * via GICD_TYPER2.) 1477 */ 1478 idbits = 16; 1479 break; 1480 default: 1481 /* 1482 * GITS_BASER<n>.TYPE is read-only, so GITS_BASER_RO_MASK 1483 * ensures we will only see type values corresponding to 1484 * the values set up in gicv3_its_reset(). 1485 */ 1486 g_assert_not_reached(); 1487 } 1488 1489 memset(td, 0, sizeof(*td)); 1490 /* 1491 * If GITS_BASER<n>.Valid is 0 for any <n> then we will not process 1492 * interrupts. (GITS_TYPER.HCC is 0 for this implementation, so we 1493 * do not have a special case where the GITS_BASER<n>.Valid bit is 0 1494 * for the register corresponding to the Collection table but we 1495 * still have to process interrupts using non-memory-backed 1496 * Collection table entries.) 1497 * The specification makes it UNPREDICTABLE to enable the ITS without 1498 * marking each BASER<n> as valid. We choose to handle these as if 1499 * the table was zero-sized, so commands using the table will fail 1500 * and interrupts requested via GITS_TRANSLATER writes will be ignored. 1501 * This happens automatically by leaving the num_entries field at 1502 * zero, which will be caught by the bounds checks we have before 1503 * every table lookup anyway. 1504 */ 1505 if (!FIELD_EX64(value, GITS_BASER, VALID)) { 1506 continue; 1507 } 1508 td->page_sz = page_sz; 1509 td->indirect = FIELD_EX64(value, GITS_BASER, INDIRECT); 1510 td->entry_sz = FIELD_EX64(value, GITS_BASER, ENTRYSIZE) + 1; 1511 td->base_addr = baser_base_addr(value, page_sz); 1512 if (!td->indirect) { 1513 td->num_entries = (num_pages * page_sz) / td->entry_sz; 1514 } else { 1515 td->num_entries = (((num_pages * page_sz) / 1516 L1TABLE_ENTRY_SIZE) * 1517 (page_sz / td->entry_sz)); 1518 } 1519 td->num_entries = MIN(td->num_entries, 1ULL << idbits); 1520 } 1521 } 1522 1523 static void extract_cmdq_params(GICv3ITSState *s) 1524 { 1525 uint16_t num_pages = 0; 1526 uint64_t value = s->cbaser; 1527 1528 num_pages = FIELD_EX64(value, GITS_CBASER, SIZE) + 1; 1529 1530 memset(&s->cq, 0 , sizeof(s->cq)); 1531 1532 if (FIELD_EX64(value, GITS_CBASER, VALID)) { 1533 s->cq.num_entries = (num_pages * GITS_PAGE_SIZE_4K) / 1534 GITS_CMDQ_ENTRY_SIZE; 1535 s->cq.base_addr = FIELD_EX64(value, GITS_CBASER, PHYADDR); 1536 s->cq.base_addr <<= R_GITS_CBASER_PHYADDR_SHIFT; 1537 } 1538 } 1539 1540 static MemTxResult gicv3_its_translation_read(void *opaque, hwaddr offset, 1541 uint64_t *data, unsigned size, 1542 MemTxAttrs attrs) 1543 { 1544 /* 1545 * GITS_TRANSLATER is write-only, and all other addresses 1546 * in the interrupt translation space frame are RES0. 1547 */ 1548 *data = 0; 1549 return MEMTX_OK; 1550 } 1551 1552 static MemTxResult gicv3_its_translation_write(void *opaque, hwaddr offset, 1553 uint64_t data, unsigned size, 1554 MemTxAttrs attrs) 1555 { 1556 GICv3ITSState *s = (GICv3ITSState *)opaque; 1557 bool result = true; 1558 1559 trace_gicv3_its_translation_write(offset, data, size, attrs.requester_id); 1560 1561 switch (offset) { 1562 case GITS_TRANSLATER: 1563 if (s->ctlr & R_GITS_CTLR_ENABLED_MASK) { 1564 result = do_process_its_cmd(s, attrs.requester_id, data, NONE); 1565 } 1566 break; 1567 default: 1568 break; 1569 } 1570 1571 if (result) { 1572 return MEMTX_OK; 1573 } else { 1574 return MEMTX_ERROR; 1575 } 1576 } 1577 1578 static bool its_writel(GICv3ITSState *s, hwaddr offset, 1579 uint64_t value, MemTxAttrs attrs) 1580 { 1581 bool result = true; 1582 int index; 1583 1584 switch (offset) { 1585 case GITS_CTLR: 1586 if (value & R_GITS_CTLR_ENABLED_MASK) { 1587 s->ctlr |= R_GITS_CTLR_ENABLED_MASK; 1588 extract_table_params(s); 1589 extract_cmdq_params(s); 1590 process_cmdq(s); 1591 } else { 1592 s->ctlr &= ~R_GITS_CTLR_ENABLED_MASK; 1593 } 1594 break; 1595 case GITS_CBASER: 1596 /* 1597 * IMPDEF choice:- GITS_CBASER register becomes RO if ITS is 1598 * already enabled 1599 */ 1600 if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) { 1601 s->cbaser = deposit64(s->cbaser, 0, 32, value); 1602 s->creadr = 0; 1603 } 1604 break; 1605 case GITS_CBASER + 4: 1606 /* 1607 * IMPDEF choice:- GITS_CBASER register becomes RO if ITS is 1608 * already enabled 1609 */ 1610 if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) { 1611 s->cbaser = deposit64(s->cbaser, 32, 32, value); 1612 s->creadr = 0; 1613 } 1614 break; 1615 case GITS_CWRITER: 1616 s->cwriter = deposit64(s->cwriter, 0, 32, 1617 (value & ~R_GITS_CWRITER_RETRY_MASK)); 1618 if (s->cwriter != s->creadr) { 1619 process_cmdq(s); 1620 } 1621 break; 1622 case GITS_CWRITER + 4: 1623 s->cwriter = deposit64(s->cwriter, 32, 32, value); 1624 break; 1625 case GITS_CREADR: 1626 if (s->gicv3->gicd_ctlr & GICD_CTLR_DS) { 1627 s->creadr = deposit64(s->creadr, 0, 32, 1628 (value & ~R_GITS_CREADR_STALLED_MASK)); 1629 } else { 1630 /* RO register, ignore the write */ 1631 qemu_log_mask(LOG_GUEST_ERROR, 1632 "%s: invalid guest write to RO register at offset " 1633 HWADDR_FMT_plx "\n", __func__, offset); 1634 } 1635 break; 1636 case GITS_CREADR + 4: 1637 if (s->gicv3->gicd_ctlr & GICD_CTLR_DS) { 1638 s->creadr = deposit64(s->creadr, 32, 32, value); 1639 } else { 1640 /* RO register, ignore the write */ 1641 qemu_log_mask(LOG_GUEST_ERROR, 1642 "%s: invalid guest write to RO register at offset " 1643 HWADDR_FMT_plx "\n", __func__, offset); 1644 } 1645 break; 1646 case GITS_BASER ... GITS_BASER + 0x3f: 1647 /* 1648 * IMPDEF choice:- GITS_BASERn register becomes RO if ITS is 1649 * already enabled 1650 */ 1651 if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) { 1652 index = (offset - GITS_BASER) / 8; 1653 1654 if (s->baser[index] == 0) { 1655 /* Unimplemented GITS_BASERn: RAZ/WI */ 1656 break; 1657 } 1658 if (offset & 7) { 1659 value <<= 32; 1660 value &= ~GITS_BASER_RO_MASK; 1661 s->baser[index] &= GITS_BASER_RO_MASK | MAKE_64BIT_MASK(0, 32); 1662 s->baser[index] |= value; 1663 } else { 1664 value &= ~GITS_BASER_RO_MASK; 1665 s->baser[index] &= GITS_BASER_RO_MASK | MAKE_64BIT_MASK(32, 32); 1666 s->baser[index] |= value; 1667 } 1668 } 1669 break; 1670 case GITS_IIDR: 1671 case GITS_IDREGS ... GITS_IDREGS + 0x2f: 1672 /* RO registers, ignore the write */ 1673 qemu_log_mask(LOG_GUEST_ERROR, 1674 "%s: invalid guest write to RO register at offset " 1675 HWADDR_FMT_plx "\n", __func__, offset); 1676 break; 1677 default: 1678 result = false; 1679 break; 1680 } 1681 return result; 1682 } 1683 1684 static bool its_readl(GICv3ITSState *s, hwaddr offset, 1685 uint64_t *data, MemTxAttrs attrs) 1686 { 1687 bool result = true; 1688 int index; 1689 1690 switch (offset) { 1691 case GITS_CTLR: 1692 *data = s->ctlr; 1693 break; 1694 case GITS_IIDR: 1695 *data = gicv3_iidr(); 1696 break; 1697 case GITS_IDREGS ... GITS_IDREGS + 0x2f: 1698 /* ID registers */ 1699 *data = gicv3_idreg(s->gicv3, offset - GITS_IDREGS, GICV3_PIDR0_ITS); 1700 break; 1701 case GITS_TYPER: 1702 *data = extract64(s->typer, 0, 32); 1703 break; 1704 case GITS_TYPER + 4: 1705 *data = extract64(s->typer, 32, 32); 1706 break; 1707 case GITS_CBASER: 1708 *data = extract64(s->cbaser, 0, 32); 1709 break; 1710 case GITS_CBASER + 4: 1711 *data = extract64(s->cbaser, 32, 32); 1712 break; 1713 case GITS_CREADR: 1714 *data = extract64(s->creadr, 0, 32); 1715 break; 1716 case GITS_CREADR + 4: 1717 *data = extract64(s->creadr, 32, 32); 1718 break; 1719 case GITS_CWRITER: 1720 *data = extract64(s->cwriter, 0, 32); 1721 break; 1722 case GITS_CWRITER + 4: 1723 *data = extract64(s->cwriter, 32, 32); 1724 break; 1725 case GITS_BASER ... GITS_BASER + 0x3f: 1726 index = (offset - GITS_BASER) / 8; 1727 if (offset & 7) { 1728 *data = extract64(s->baser[index], 32, 32); 1729 } else { 1730 *data = extract64(s->baser[index], 0, 32); 1731 } 1732 break; 1733 default: 1734 result = false; 1735 break; 1736 } 1737 return result; 1738 } 1739 1740 static bool its_writell(GICv3ITSState *s, hwaddr offset, 1741 uint64_t value, MemTxAttrs attrs) 1742 { 1743 bool result = true; 1744 int index; 1745 1746 switch (offset) { 1747 case GITS_BASER ... GITS_BASER + 0x3f: 1748 /* 1749 * IMPDEF choice:- GITS_BASERn register becomes RO if ITS is 1750 * already enabled 1751 */ 1752 if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) { 1753 index = (offset - GITS_BASER) / 8; 1754 if (s->baser[index] == 0) { 1755 /* Unimplemented GITS_BASERn: RAZ/WI */ 1756 break; 1757 } 1758 s->baser[index] &= GITS_BASER_RO_MASK; 1759 s->baser[index] |= (value & ~GITS_BASER_RO_MASK); 1760 } 1761 break; 1762 case GITS_CBASER: 1763 /* 1764 * IMPDEF choice:- GITS_CBASER register becomes RO if ITS is 1765 * already enabled 1766 */ 1767 if (!(s->ctlr & R_GITS_CTLR_ENABLED_MASK)) { 1768 s->cbaser = value; 1769 s->creadr = 0; 1770 } 1771 break; 1772 case GITS_CWRITER: 1773 s->cwriter = value & ~R_GITS_CWRITER_RETRY_MASK; 1774 if (s->cwriter != s->creadr) { 1775 process_cmdq(s); 1776 } 1777 break; 1778 case GITS_CREADR: 1779 if (s->gicv3->gicd_ctlr & GICD_CTLR_DS) { 1780 s->creadr = value & ~R_GITS_CREADR_STALLED_MASK; 1781 } else { 1782 /* RO register, ignore the write */ 1783 qemu_log_mask(LOG_GUEST_ERROR, 1784 "%s: invalid guest write to RO register at offset " 1785 HWADDR_FMT_plx "\n", __func__, offset); 1786 } 1787 break; 1788 case GITS_TYPER: 1789 /* RO registers, ignore the write */ 1790 qemu_log_mask(LOG_GUEST_ERROR, 1791 "%s: invalid guest write to RO register at offset " 1792 HWADDR_FMT_plx "\n", __func__, offset); 1793 break; 1794 default: 1795 result = false; 1796 break; 1797 } 1798 return result; 1799 } 1800 1801 static bool its_readll(GICv3ITSState *s, hwaddr offset, 1802 uint64_t *data, MemTxAttrs attrs) 1803 { 1804 bool result = true; 1805 int index; 1806 1807 switch (offset) { 1808 case GITS_TYPER: 1809 *data = s->typer; 1810 break; 1811 case GITS_BASER ... GITS_BASER + 0x3f: 1812 index = (offset - GITS_BASER) / 8; 1813 *data = s->baser[index]; 1814 break; 1815 case GITS_CBASER: 1816 *data = s->cbaser; 1817 break; 1818 case GITS_CREADR: 1819 *data = s->creadr; 1820 break; 1821 case GITS_CWRITER: 1822 *data = s->cwriter; 1823 break; 1824 default: 1825 result = false; 1826 break; 1827 } 1828 return result; 1829 } 1830 1831 static MemTxResult gicv3_its_read(void *opaque, hwaddr offset, uint64_t *data, 1832 unsigned size, MemTxAttrs attrs) 1833 { 1834 GICv3ITSState *s = (GICv3ITSState *)opaque; 1835 bool result; 1836 1837 switch (size) { 1838 case 4: 1839 result = its_readl(s, offset, data, attrs); 1840 break; 1841 case 8: 1842 result = its_readll(s, offset, data, attrs); 1843 break; 1844 default: 1845 result = false; 1846 break; 1847 } 1848 1849 if (!result) { 1850 qemu_log_mask(LOG_GUEST_ERROR, 1851 "%s: invalid guest read at offset " HWADDR_FMT_plx 1852 " size %u\n", __func__, offset, size); 1853 trace_gicv3_its_badread(offset, size); 1854 /* 1855 * The spec requires that reserved registers are RAZ/WI; 1856 * so use false returns from leaf functions as a way to 1857 * trigger the guest-error logging but don't return it to 1858 * the caller, or we'll cause a spurious guest data abort. 1859 */ 1860 *data = 0; 1861 } else { 1862 trace_gicv3_its_read(offset, *data, size); 1863 } 1864 return MEMTX_OK; 1865 } 1866 1867 static MemTxResult gicv3_its_write(void *opaque, hwaddr offset, uint64_t data, 1868 unsigned size, MemTxAttrs attrs) 1869 { 1870 GICv3ITSState *s = (GICv3ITSState *)opaque; 1871 bool result; 1872 1873 switch (size) { 1874 case 4: 1875 result = its_writel(s, offset, data, attrs); 1876 break; 1877 case 8: 1878 result = its_writell(s, offset, data, attrs); 1879 break; 1880 default: 1881 result = false; 1882 break; 1883 } 1884 1885 if (!result) { 1886 qemu_log_mask(LOG_GUEST_ERROR, 1887 "%s: invalid guest write at offset " HWADDR_FMT_plx 1888 " size %u\n", __func__, offset, size); 1889 trace_gicv3_its_badwrite(offset, data, size); 1890 /* 1891 * The spec requires that reserved registers are RAZ/WI; 1892 * so use false returns from leaf functions as a way to 1893 * trigger the guest-error logging but don't return it to 1894 * the caller, or we'll cause a spurious guest data abort. 1895 */ 1896 } else { 1897 trace_gicv3_its_write(offset, data, size); 1898 } 1899 return MEMTX_OK; 1900 } 1901 1902 static const MemoryRegionOps gicv3_its_control_ops = { 1903 .read_with_attrs = gicv3_its_read, 1904 .write_with_attrs = gicv3_its_write, 1905 .valid.min_access_size = 4, 1906 .valid.max_access_size = 8, 1907 .impl.min_access_size = 4, 1908 .impl.max_access_size = 8, 1909 .endianness = DEVICE_NATIVE_ENDIAN, 1910 }; 1911 1912 static const MemoryRegionOps gicv3_its_translation_ops = { 1913 .read_with_attrs = gicv3_its_translation_read, 1914 .write_with_attrs = gicv3_its_translation_write, 1915 .valid.min_access_size = 2, 1916 .valid.max_access_size = 4, 1917 .impl.min_access_size = 2, 1918 .impl.max_access_size = 4, 1919 .endianness = DEVICE_NATIVE_ENDIAN, 1920 }; 1921 1922 static void gicv3_arm_its_realize(DeviceState *dev, Error **errp) 1923 { 1924 GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev); 1925 int i; 1926 1927 for (i = 0; i < s->gicv3->num_cpu; i++) { 1928 if (!(s->gicv3->cpu[i].gicr_typer & GICR_TYPER_PLPIS)) { 1929 error_setg(errp, "Physical LPI not supported by CPU %d", i); 1930 return; 1931 } 1932 } 1933 1934 gicv3_add_its(s->gicv3, dev); 1935 1936 gicv3_its_init_mmio(s, &gicv3_its_control_ops, &gicv3_its_translation_ops); 1937 1938 /* set the ITS default features supported */ 1939 s->typer = FIELD_DP64(s->typer, GITS_TYPER, PHYSICAL, 1); 1940 s->typer = FIELD_DP64(s->typer, GITS_TYPER, ITT_ENTRY_SIZE, 1941 ITS_ITT_ENTRY_SIZE - 1); 1942 s->typer = FIELD_DP64(s->typer, GITS_TYPER, IDBITS, ITS_IDBITS); 1943 s->typer = FIELD_DP64(s->typer, GITS_TYPER, DEVBITS, ITS_DEVBITS); 1944 s->typer = FIELD_DP64(s->typer, GITS_TYPER, CIL, 1); 1945 s->typer = FIELD_DP64(s->typer, GITS_TYPER, CIDBITS, ITS_CIDBITS); 1946 if (s->gicv3->revision >= 4) { 1947 /* Our VMOVP handles cross-ITS synchronization itself */ 1948 s->typer = FIELD_DP64(s->typer, GITS_TYPER, VMOVP, 1); 1949 s->typer = FIELD_DP64(s->typer, GITS_TYPER, VIRTUAL, 1); 1950 } 1951 } 1952 1953 static void gicv3_its_reset_hold(Object *obj, ResetType type) 1954 { 1955 GICv3ITSState *s = ARM_GICV3_ITS_COMMON(obj); 1956 GICv3ITSClass *c = ARM_GICV3_ITS_GET_CLASS(s); 1957 1958 if (c->parent_phases.hold) { 1959 c->parent_phases.hold(obj, type); 1960 } 1961 1962 /* Quiescent bit reset to 1 */ 1963 s->ctlr = FIELD_DP32(s->ctlr, GITS_CTLR, QUIESCENT, 1); 1964 1965 /* 1966 * setting GITS_BASER0.Type = 0b001 (Device) 1967 * GITS_BASER1.Type = 0b100 (Collection Table) 1968 * GITS_BASER2.Type = 0b010 (vPE) for GICv4 and later 1969 * GITS_BASER<n>.Type,where n = 3 to 7 are 0b00 (Unimplemented) 1970 * GITS_BASER<0,1>.Page_Size = 64KB 1971 * and default translation table entry size to 16 bytes 1972 */ 1973 s->baser[0] = FIELD_DP64(s->baser[0], GITS_BASER, TYPE, 1974 GITS_BASER_TYPE_DEVICE); 1975 s->baser[0] = FIELD_DP64(s->baser[0], GITS_BASER, PAGESIZE, 1976 GITS_BASER_PAGESIZE_64K); 1977 s->baser[0] = FIELD_DP64(s->baser[0], GITS_BASER, ENTRYSIZE, 1978 GITS_DTE_SIZE - 1); 1979 1980 s->baser[1] = FIELD_DP64(s->baser[1], GITS_BASER, TYPE, 1981 GITS_BASER_TYPE_COLLECTION); 1982 s->baser[1] = FIELD_DP64(s->baser[1], GITS_BASER, PAGESIZE, 1983 GITS_BASER_PAGESIZE_64K); 1984 s->baser[1] = FIELD_DP64(s->baser[1], GITS_BASER, ENTRYSIZE, 1985 GITS_CTE_SIZE - 1); 1986 1987 if (its_feature_virtual(s)) { 1988 s->baser[2] = FIELD_DP64(s->baser[2], GITS_BASER, TYPE, 1989 GITS_BASER_TYPE_VPE); 1990 s->baser[2] = FIELD_DP64(s->baser[2], GITS_BASER, PAGESIZE, 1991 GITS_BASER_PAGESIZE_64K); 1992 s->baser[2] = FIELD_DP64(s->baser[2], GITS_BASER, ENTRYSIZE, 1993 GITS_VPE_SIZE - 1); 1994 } 1995 } 1996 1997 static void gicv3_its_post_load(GICv3ITSState *s) 1998 { 1999 if (s->ctlr & R_GITS_CTLR_ENABLED_MASK) { 2000 extract_table_params(s); 2001 extract_cmdq_params(s); 2002 } 2003 } 2004 2005 static Property gicv3_its_props[] = { 2006 DEFINE_PROP_LINK("parent-gicv3", GICv3ITSState, gicv3, "arm-gicv3", 2007 GICv3State *), 2008 DEFINE_PROP_END_OF_LIST(), 2009 }; 2010 2011 static void gicv3_its_class_init(ObjectClass *klass, void *data) 2012 { 2013 DeviceClass *dc = DEVICE_CLASS(klass); 2014 ResettableClass *rc = RESETTABLE_CLASS(klass); 2015 GICv3ITSClass *ic = ARM_GICV3_ITS_CLASS(klass); 2016 GICv3ITSCommonClass *icc = ARM_GICV3_ITS_COMMON_CLASS(klass); 2017 2018 dc->realize = gicv3_arm_its_realize; 2019 device_class_set_props(dc, gicv3_its_props); 2020 resettable_class_set_parent_phases(rc, NULL, gicv3_its_reset_hold, NULL, 2021 &ic->parent_phases); 2022 icc->post_load = gicv3_its_post_load; 2023 } 2024 2025 static const TypeInfo gicv3_its_info = { 2026 .name = TYPE_ARM_GICV3_ITS, 2027 .parent = TYPE_ARM_GICV3_ITS_COMMON, 2028 .instance_size = sizeof(GICv3ITSState), 2029 .class_init = gicv3_its_class_init, 2030 .class_size = sizeof(GICv3ITSClass), 2031 }; 2032 2033 static void gicv3_its_register_types(void) 2034 { 2035 type_register_static(&gicv3_its_info); 2036 } 2037 2038 type_init(gicv3_its_register_types) 2039