• Peter Collingbourne's avatar
    arm64: Implement prctl(PR_{G,S}ET_TSC) · 3e9e67e1
    Peter Collingbourne authored
    On arm64, this prctl controls access to CNTVCT_EL0, CNTVCTSS_EL0 and
    CNTFRQ_EL0 via CNTKCTL_EL1.EL0VCTEN. Since this bit is also used to
    implement various erratum workarounds, check whether the CPU needs
    a workaround whenever we potentially need to change it.
    
    This is needed for a correct implementation of non-instrumenting
    record-replay debugging on arm64 (i.e. rr; https://rr-project.org/).
    rr must trap and record any sources of non-determinism from the
    userspace program's perspective so it can be replayed later. This
    includes the results of syscalls as well as the results of access
    to architected timers exposed directly to the program. This prctl
    was originally added for x86 by commit 8fb402bc ("generic, x86:
    add prctl commands PR_GET_TSC and PR_SET_TSC"), and rr uses it to
    trap RDTSC on x86 for the same reason.
    
    We also considered exposing this as a PTRACE_EVENT. However, prctl
    seems like a better choice for these reasons:
    
    1) In general an in-process control seems more useful than an
       out-of-process control, since anything that you would be able to
       do with ptrace could also be done with prctl (tracer can inject a
       call to the prctl and handle signal-delivery-stops), and it avoids
       needing an additional process (which will complicate debugging
       of the ptraced process since it cannot have more than one tracer,
       and will be incompatible with ptrace_scope=3) in cases where that
       is not otherwise necessary.
    
    2) Consistency with x86_64. Note that on x86_64, RDTSC has been there
       since the start, so it's the same situation as on arm64.
    Signed-off-by: default avatarPeter Collingbourne <pcc@google.com>
    Link: https://linux-review.googlesource.com/id/I233a1867d1ccebe2933a347552e7eae862344421
    Link: https://lore.kernel.org/r/20240824015415.488474-1-pcc@google.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    3e9e67e1
process.c 20.5 KB