pkvm.c (38e961097e04e7adfe1d3335e3371e97c1723064) pkvm.c (e5ecedcd7cc231a115c11cfed79635583ef4f882)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2021 Google LLC
4 * Author: Fuad Tabba <tabba@google.com>
5 */
6
7#include <linux/kvm_host.h>
8#include <linux/mm.h>

--- 54 unchanged lines hidden (view full) ---

63 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_AMU), feature_ids)) {
64 hcr_clear |= HCR_AMVOFFEN;
65 cptr_set |= CPTR_EL2_TAM;
66 }
67
68 /* Trap SVE */
69 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_SVE), feature_ids)) {
70 if (has_hvhe())
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2021 Google LLC
4 * Author: Fuad Tabba <tabba@google.com>
5 */
6
7#include <linux/kvm_host.h>
8#include <linux/mm.h>

--- 54 unchanged lines hidden (view full) ---

63 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_AMU), feature_ids)) {
64 hcr_clear |= HCR_AMVOFFEN;
65 cptr_set |= CPTR_EL2_TAM;
66 }
67
68 /* Trap SVE */
69 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_SVE), feature_ids)) {
70 if (has_hvhe())
71 cptr_clear |= CPACR_ELx_ZEN;
71 cptr_clear |= CPACR_EL1_ZEN;
72 else
73 cptr_set |= CPTR_EL2_TZ;
74 }
75
76 vcpu->arch.hcr_el2 |= hcr_set;
77 vcpu->arch.hcr_el2 &= ~hcr_clear;
78 vcpu->arch.cptr_el2 |= cptr_set;
79 vcpu->arch.cptr_el2 &= ~cptr_clear;

--- 41 unchanged lines hidden (view full) ---

121
122 /* Trap OS Double Lock */
123 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_DoubleLock), feature_ids))
124 mdcr_set |= MDCR_EL2_TDOSA;
125
126 /* Trap SPE */
127 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMSVer), feature_ids)) {
128 mdcr_set |= MDCR_EL2_TPMS;
72 else
73 cptr_set |= CPTR_EL2_TZ;
74 }
75
76 vcpu->arch.hcr_el2 |= hcr_set;
77 vcpu->arch.hcr_el2 &= ~hcr_clear;
78 vcpu->arch.cptr_el2 |= cptr_set;
79 vcpu->arch.cptr_el2 &= ~cptr_clear;

--- 41 unchanged lines hidden (view full) ---

121
122 /* Trap OS Double Lock */
123 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_DoubleLock), feature_ids))
124 mdcr_set |= MDCR_EL2_TDOSA;
125
126 /* Trap SPE */
127 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMSVer), feature_ids)) {
128 mdcr_set |= MDCR_EL2_TPMS;
129 mdcr_clear |= MDCR_EL2_E2PB_MASK;
129 mdcr_clear |= MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT;
130 }
131
132 /* Trap Trace Filter */
133 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_TraceFilt), feature_ids))
134 mdcr_set |= MDCR_EL2_TTRF;
135
136 /* Trap Trace */
137 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_TraceVer), feature_ids)) {
138 if (has_hvhe())
139 cptr_set |= CPACR_EL1_TTA;
140 else
141 cptr_set |= CPTR_EL2_TTA;
142 }
143
144 /* Trap External Trace */
145 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_ExtTrcBuff), feature_ids))
130 }
131
132 /* Trap Trace Filter */
133 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_TraceFilt), feature_ids))
134 mdcr_set |= MDCR_EL2_TTRF;
135
136 /* Trap Trace */
137 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_TraceVer), feature_ids)) {
138 if (has_hvhe())
139 cptr_set |= CPACR_EL1_TTA;
140 else
141 cptr_set |= CPTR_EL2_TTA;
142 }
143
144 /* Trap External Trace */
145 if (!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_ExtTrcBuff), feature_ids))
146 mdcr_clear |= MDCR_EL2_E2TB_MASK;
146 mdcr_clear |= MDCR_EL2_E2TB_MASK << MDCR_EL2_E2TB_SHIFT;
147
148 vcpu->arch.mdcr_el2 |= mdcr_set;
149 vcpu->arch.mdcr_el2 &= ~mdcr_clear;
150 vcpu->arch.cptr_el2 |= cptr_set;
151}
152
153/*
154 * Set trap register values based on features in ID_AA64MMFR0.

--- 607 unchanged lines hidden ---
147
148 vcpu->arch.mdcr_el2 |= mdcr_set;
149 vcpu->arch.mdcr_el2 &= ~mdcr_clear;
150 vcpu->arch.cptr_el2 |= cptr_set;
151}
152
153/*
154 * Set trap register values based on features in ID_AA64MMFR0.

--- 607 unchanged lines hidden ---