Skip to content
  • Peter Maydell's avatar
    da4680ce
    hw/intc/arm_gicv3_its: Drop TableDesc and CmdQDesc valid fields · da4680ce
    Peter Maydell authored
    
    
    Currently we track in the TableDesc and CmdQDesc structs the state of
    the GITS_BASER<n> and GITS_CBASER Valid bits.  However we aren't very
    consistent abut checking the valid field: we test it in update_cte()
    and update_dte(), but not anywhere else we look things up in tables.
    
    The GIC specification says that it is UNPREDICTABLE if a guest fails
    to set any of these Valid bits before enabling the ITS via
    GITS_CTLR.Enabled.  So we can choose to handle Valid == 0 as
    equivalent to a zero-length table.  This is in fact how we're already
    catching this case in most of the table-access paths: when Valid is 0
    we leave the num_entries fields in TableDesc or CmdQDesc set to zero,
    and then the out-of-bounds check "index >= num_entries" that we have
    to do anyway before doing any of these table lookups will always be
    true, catching the no-valid-table case without any extra code.
    
    So we can remove the checks on the valid field from update_cte()
    and update_dte(): since these happen after the bounds check there
    was never any case when the test could fail. That means the valid
    fields would be entirely unused, so just remove them.
    
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Message-id: 20220201193207.2771604-11-peter.maydell@linaro.org
    da4680ce
    hw/intc/arm_gicv3_its: Drop TableDesc and CmdQDesc valid fields
    Peter Maydell authored
    
    
    Currently we track in the TableDesc and CmdQDesc structs the state of
    the GITS_BASER<n> and GITS_CBASER Valid bits.  However we aren't very
    consistent abut checking the valid field: we test it in update_cte()
    and update_dte(), but not anywhere else we look things up in tables.
    
    The GIC specification says that it is UNPREDICTABLE if a guest fails
    to set any of these Valid bits before enabling the ITS via
    GITS_CTLR.Enabled.  So we can choose to handle Valid == 0 as
    equivalent to a zero-length table.  This is in fact how we're already
    catching this case in most of the table-access paths: when Valid is 0
    we leave the num_entries fields in TableDesc or CmdQDesc set to zero,
    and then the out-of-bounds check "index >= num_entries" that we have
    to do anyway before doing any of these table lookups will always be
    true, catching the no-valid-table case without any extra code.
    
    So we can remove the checks on the valid field from update_cte()
    and update_dte(): since these happen after the bounds check there
    was never any case when the test could fail. That means the valid
    fields would be entirely unused, so just remove them.
    
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Message-id: 20220201193207.2771604-11-peter.maydell@linaro.org
Loading