• Mark Rutland's avatar
    arm64: initialize all of CNTHCTL_EL2 · bde8fff8
    Mark Rutland authored
    In __init_el2_timers we initialize CNTHCTL_EL2.{EL1PCEN,EL1PCTEN} with a
    RMW sequence, leaving all other bits UNKNOWN.
    
    In general, we should initialize all bits in a register rather than
    using an RMW sequence, since most bits are UNKNOWN out of reset, and as
    new bits are added to the reigster their reset value might not result in
    expected behaviour.
    
    In the case of CNTHCTL_EL2, FEAT_ECV added a number of new control bits
    in previously RES0 bits, which reset to UNKNOWN values, and may cause
    issues for EL1 and EL0:
    
    * CNTHCTL_EL2.ECV enables the CNTPOFF_EL2 offset (which itself resets to
      an UNKNOWN value) at EL0 and EL1. Since the offset could reset to
      distinct values across CPUs, when the control bit resets to 1 this
      could break timekeeping generally.
    
    * CNTHCTL_EL2.{EL1TVT,EL1TVCT} trap EL0 and EL1 accesses to the EL1
      virtual timer/counter registers to EL2. When reset to 1, this could
      cause unexpected traps to EL2.
    
    Initializing these bits to zero avoids these problems, and all other
    bits in CNTHCTL_EL2 other than EL1PCEN and EL1PCTEN can safely be reset
    to zero.
    
    This patch ensures we initialize CNTHCTL_EL2 accordingly, only setting
    EL1PCEN and EL1PCTEN, and setting all other bits to zero.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Marc Zyngier <maz@kernel.org>
    Cc: Oliver Upton <oupton@google.com>
    Cc: Will Deacon <will@kernel.org>
    Reviewed-by: default avatarOliver Upton <oupton@google.com>
    Acked-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210818161535.52786-1-mark.rutland@arm.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    bde8fff8
el2_setup.h 5.03 KB