mirror of https://github.com/xemu-project/xemu.git
hw/intc/arm_gicv3_its: Implement INV for virtual interrupts
Implement the ITS side of the handling of the INV command for virtual interrupts; as usual this calls into a redistributor function which we leave as a stub to fill in later. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220408141550.1271295-20-peter.maydell@linaro.org
This commit is contained in:
parent
a686e85d2b
commit
d4014320a4
|
@ -1090,6 +1090,7 @@ static ItsCmdResult process_inv(GICv3ITSState *s, const uint64_t *cmdpkt)
|
|||
ITEntry ite;
|
||||
DTEntry dte;
|
||||
CTEntry cte;
|
||||
VTEntry vte;
|
||||
ItsCmdResult cmdres;
|
||||
|
||||
devid = FIELD_EX64(cmdpkt[0], INV_0, DEVICEID);
|
||||
|
@ -1118,8 +1119,19 @@ static ItsCmdResult process_inv(GICv3ITSState *s, const uint64_t *cmdpkt)
|
|||
__func__, ite.inttype);
|
||||
return CMD_CONTINUE;
|
||||
}
|
||||
/* We will implement the vLPI invalidation in a later commit */
|
||||
g_assert_not_reached();
|
||||
|
||||
cmdres = lookup_vte(s, __func__, ite.vpeid, &vte);
|
||||
if (cmdres != CMD_CONTINUE_OK) {
|
||||
return cmdres;
|
||||
}
|
||||
if (!intid_in_lpi_range(ite.intid) ||
|
||||
ite.intid >= (1ULL << (vte.vptsize + 1))) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: intid 0x%x out of range\n",
|
||||
__func__, ite.intid);
|
||||
return CMD_CONTINUE;
|
||||
}
|
||||
gicv3_redist_inv_vlpi(&s->gicv3->cpu[vte.rdbase], ite.intid,
|
||||
vte.vptaddr << 16);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
|
|
|
@ -808,6 +808,14 @@ void gicv3_redist_process_vlpi(GICv3CPUState *cs, int irq, uint64_t vptaddr,
|
|||
*/
|
||||
}
|
||||
|
||||
void gicv3_redist_inv_vlpi(GICv3CPUState *cs, int irq, uint64_t vptaddr)
|
||||
{
|
||||
/*
|
||||
* The redistributor handling for invalidating cached information
|
||||
* about a VLPI will be added in a subsequent commit.
|
||||
*/
|
||||
}
|
||||
|
||||
void gicv3_redist_set_irq(GICv3CPUState *cs, int irq, int level)
|
||||
{
|
||||
/* Update redistributor state for a change in an external PPI input line */
|
||||
|
|
|
@ -585,6 +585,15 @@ void gicv3_redist_update_lpi_only(GICv3CPUState *cs);
|
|||
* Forget or update any cached information associated with this LPI.
|
||||
*/
|
||||
void gicv3_redist_inv_lpi(GICv3CPUState *cs, int irq);
|
||||
/**
|
||||
* gicv3_redist_inv_vlpi:
|
||||
* @cs: GICv3CPUState
|
||||
* @irq: vLPI to invalidate cached information for
|
||||
* @vptaddr: (guest) address of vLPI table
|
||||
*
|
||||
* Forget or update any cached information associated with this vLPI.
|
||||
*/
|
||||
void gicv3_redist_inv_vlpi(GICv3CPUState *cs, int irq, uint64_t vptaddr);
|
||||
/**
|
||||
* gicv3_redist_mov_lpi:
|
||||
* @src: source redistributor
|
||||
|
|
Loading…
Reference in New Issue