Skip to content
  • Peter Maydell's avatar
    32bd322a
    hw/timer/armv7m_systick: Rewrite to use ptimers · 32bd322a
    Peter Maydell authored
    The armv7m systick timer is a 24-bit decrementing, wrap-on-zero,
    clear-on-write counter. Our current implementation has various
    bugs and dubious workarounds in it (for instance see
    https://bugs.launchpad.net/qemu/+bug/1872237).
    
    We have an implementation of a simple decrementing counter
    and we put a lot of effort into making sure it handles the
    interesting corner cases (like "spend a cycle at 0 before
    reloading") -- ptimer.
    
    Rewrite the systick timer to use a ptimer rather than
    a raw QEMU timer.
    
    Unfortunately this is a migration compatibility break,
    which will affect all M-profile boards.
    
    Among other bugs, this fixes
    https://bugs.launchpad.net/qemu/+bug/1872237
    
     :
    now writes to SYST_CVR when the timer is enabled correctly
    do nothing; when the timer is enabled via SYST_CSR.ENABLE,
    the ptimer code will (because of POLICY_NO_IMMEDIATE_RELOAD)
    arrange that after one timer tick the counter is reloaded
    from SYST_RVR and then counts down from there, as the
    architecture requires.
    
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
    Message-id: 20201015151829.14656-3-peter.maydell@linaro.org
    32bd322a
    hw/timer/armv7m_systick: Rewrite to use ptimers
    Peter Maydell authored
    The armv7m systick timer is a 24-bit decrementing, wrap-on-zero,
    clear-on-write counter. Our current implementation has various
    bugs and dubious workarounds in it (for instance see
    https://bugs.launchpad.net/qemu/+bug/1872237).
    
    We have an implementation of a simple decrementing counter
    and we put a lot of effort into making sure it handles the
    interesting corner cases (like "spend a cycle at 0 before
    reloading") -- ptimer.
    
    Rewrite the systick timer to use a ptimer rather than
    a raw QEMU timer.
    
    Unfortunately this is a migration compatibility break,
    which will affect all M-profile boards.
    
    Among other bugs, this fixes
    https://bugs.launchpad.net/qemu/+bug/1872237
    
     :
    now writes to SYST_CVR when the timer is enabled correctly
    do nothing; when the timer is enabled via SYST_CSR.ENABLE,
    the ptimer code will (because of POLICY_NO_IMMEDIATE_RELOAD)
    arrange that after one timer tick the counter is reloaded
    from SYST_RVR and then counts down from there, as the
    architecture requires.
    
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
    Message-id: 20201015151829.14656-3-peter.maydell@linaro.org
Loading