lkml.org 
[lkml]   [2023]   [Nov]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH v7 15/39] arm64/gcs: Allow GCS usage at EL0 and EL1
    There is a control HCRX_EL2.GCSEn which must be set to allow GCS
    features to take effect at lower ELs and also fine grained traps for GCS
    usage at EL0 and EL1. Configure all these to allow GCS usage by EL0 and
    EL1.

    Signed-off-by: Mark Brown <broonie@kernel.org>
    ---
    arch/arm64/include/asm/el2_setup.h | 17 +++++++++++++++++
    arch/arm64/include/asm/kvm_arm.h | 4 ++--
    2 files changed, 19 insertions(+), 2 deletions(-)

    diff --git a/arch/arm64/include/asm/el2_setup.h b/arch/arm64/include/asm/el2_setup.h
    index b7afaa026842..17672563e333 100644
    --- a/arch/arm64/include/asm/el2_setup.h
    +++ b/arch/arm64/include/asm/el2_setup.h
    @@ -27,6 +27,14 @@
    ubfx x0, x0, #ID_AA64MMFR1_EL1_HCX_SHIFT, #4
    cbz x0, .Lskip_hcrx_\@
    mov_q x0, HCRX_HOST_FLAGS
    +
    + /* Enable GCS if supported */
    + mrs_s x1, SYS_ID_AA64PFR1_EL1
    + ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4
    + cbz x1, .Lset_hcrx_\@
    + orr x0, x0, #HCRX_EL2_GCSEn
    +
    +.Lset_hcrx_\@:
    msr_s SYS_HCRX_EL2, x0
    .Lskip_hcrx_\@:
    .endm
    @@ -190,6 +198,15 @@
    orr x0, x0, #HFGxTR_EL2_nPIR_EL1
    orr x0, x0, #HFGxTR_EL2_nPIRE0_EL1

    + /* GCS depends on PIE so we don't check it if PIE is absent */
    + mrs_s x1, SYS_ID_AA64PFR1_EL1
    + ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4
    + cbz x1, .Lset_fgt_\@
    +
    + /* Disable traps of access to GCS registers at EL0 and EL1 */
    + orr x0, x0, #HFGxTR_EL2_nGCS_EL1_MASK
    + orr x0, x0, #HFGxTR_EL2_nGCS_EL0_MASK
    +
    .Lset_fgt_\@:
    msr_s SYS_HFGRTR_EL2, x0
    msr_s SYS_HFGWTR_EL2, x0
    diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
    index b85f46a73e21..e4b6a29879b7 100644
    --- a/arch/arm64/include/asm/kvm_arm.h
    +++ b/arch/arm64/include/asm/kvm_arm.h
    @@ -103,9 +103,9 @@
    #define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)

    #define HCRX_GUEST_FLAGS \
    - (HCRX_EL2_SMPME | HCRX_EL2_TCR2En | \
    + (HCRX_EL2_SMPME | HCRX_EL2_TCR2En | HCRX_EL2_GCSEn |\
    (cpus_have_final_cap(ARM64_HAS_MOPS) ? (HCRX_EL2_MSCEn | HCRX_EL2_MCE2) : 0))
    -#define HCRX_HOST_FLAGS (HCRX_EL2_MSCEn | HCRX_EL2_TCR2En)
    +#define HCRX_HOST_FLAGS (HCRX_EL2_MSCEn | HCRX_EL2_TCR2En | HCRX_EL2_GCSEn)

    /* TCR_EL2 Registers bits */
    #define TCR_EL2_RES1 ((1U << 31) | (1 << 23))
    --
    2.39.2

    \
     
     \ /
      Last update: 2023-11-22 10:46    [W:4.024 / U:0.820 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site