Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: arm64: vgic-v3: Convert userspace accessors over to FIELD_GET/FIELD_PREP

The GICv3 userspace accessors are all about dealing with conversion
between fields from architectural registers and internal representations.

However, and owing to the age of this code, the accessors use
a combination of shift/mask that is hard to read. It is nonetheless
easy to make it better by using the FIELD_{GET,PREP} macros that solely
rely on a mask.

This results in somewhat nicer looking code, and is probably easier
to maintain.

Reviewed-by: Reiji Watanabe <reijiw@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>

+27 -33
+27 -33
arch/arm64/kvm/vgic-sys-reg-v3.c
··· 23 23 * Disallow restoring VM state if not supported by this 24 24 * hardware. 25 25 */ 26 - host_pri_bits = ((val & ICC_CTLR_EL1_PRI_BITS_MASK) >> 27 - ICC_CTLR_EL1_PRI_BITS_SHIFT) + 1; 26 + host_pri_bits = FIELD_GET(ICC_CTLR_EL1_PRI_BITS_MASK, val) + 1; 28 27 if (host_pri_bits > vgic_v3_cpu->num_pri_bits) 29 28 return -EINVAL; 30 29 31 30 vgic_v3_cpu->num_pri_bits = host_pri_bits; 32 31 33 - host_id_bits = (val & ICC_CTLR_EL1_ID_BITS_MASK) >> 34 - ICC_CTLR_EL1_ID_BITS_SHIFT; 32 + host_id_bits = FIELD_GET(ICC_CTLR_EL1_ID_BITS_MASK, val); 35 33 if (host_id_bits > vgic_v3_cpu->num_id_bits) 36 34 return -EINVAL; 37 35 38 36 vgic_v3_cpu->num_id_bits = host_id_bits; 39 37 40 - host_seis = ((kvm_vgic_global_state.ich_vtr_el2 & 41 - ICH_VTR_SEIS_MASK) >> ICH_VTR_SEIS_SHIFT); 42 - seis = (val & ICC_CTLR_EL1_SEIS_MASK) >> 43 - ICC_CTLR_EL1_SEIS_SHIFT; 38 + host_seis = FIELD_GET(ICH_VTR_SEIS_MASK, kvm_vgic_global_state.ich_vtr_el2); 39 + seis = FIELD_GET(ICC_CTLR_EL1_SEIS_MASK, val); 44 40 if (host_seis != seis) 45 41 return -EINVAL; 46 42 47 - host_a3v = ((kvm_vgic_global_state.ich_vtr_el2 & 48 - ICH_VTR_A3V_MASK) >> ICH_VTR_A3V_SHIFT); 49 - a3v = (val & ICC_CTLR_EL1_A3V_MASK) >> ICC_CTLR_EL1_A3V_SHIFT; 43 + host_a3v = FIELD_GET(ICH_VTR_A3V_MASK, kvm_vgic_global_state.ich_vtr_el2); 44 + a3v = FIELD_GET(ICC_CTLR_EL1_A3V_MASK, val); 50 45 if (host_a3v != a3v) 51 46 return -EINVAL; 52 47 ··· 49 54 * Here set VMCR.CTLR in ICC_CTLR_EL1 layout. 50 55 * The vgic_set_vmcr() will convert to ICH_VMCR layout. 51 56 */ 52 - vmcr.cbpr = (val & ICC_CTLR_EL1_CBPR_MASK) >> ICC_CTLR_EL1_CBPR_SHIFT; 53 - vmcr.eoim = (val & ICC_CTLR_EL1_EOImode_MASK) >> ICC_CTLR_EL1_EOImode_SHIFT; 57 + vmcr.cbpr = FIELD_GET(ICC_CTLR_EL1_CBPR_MASK, val); 58 + vmcr.eoim = FIELD_GET(ICC_CTLR_EL1_EOImode_MASK, val); 54 59 vgic_set_vmcr(vcpu, &vmcr); 55 60 56 61 return 0; ··· 65 70 66 71 vgic_get_vmcr(vcpu, &vmcr); 67 72 val = 0; 68 - val |= (vgic_v3_cpu->num_pri_bits - 1) << ICC_CTLR_EL1_PRI_BITS_SHIFT; 69 - val |= vgic_v3_cpu->num_id_bits << ICC_CTLR_EL1_ID_BITS_SHIFT; 70 - val |= ((kvm_vgic_global_state.ich_vtr_el2 & 71 - ICH_VTR_SEIS_MASK) >> ICH_VTR_SEIS_SHIFT) << 72 - ICC_CTLR_EL1_SEIS_SHIFT; 73 - val |= ((kvm_vgic_global_state.ich_vtr_el2 & 74 - ICH_VTR_A3V_MASK) >> ICH_VTR_A3V_SHIFT) << 75 - ICC_CTLR_EL1_A3V_SHIFT; 73 + val |= FIELD_PREP(ICC_CTLR_EL1_PRI_BITS_MASK, vgic_v3_cpu->num_pri_bits - 1); 74 + val |= FIELD_PREP(ICC_CTLR_EL1_ID_BITS_MASK, vgic_v3_cpu->num_id_bits); 75 + val |= FIELD_PREP(ICC_CTLR_EL1_SEIS_MASK, 76 + FIELD_GET(ICH_VTR_SEIS_MASK, 77 + kvm_vgic_global_state.ich_vtr_el2)); 78 + val |= FIELD_PREP(ICC_CTLR_EL1_A3V_MASK, 79 + FIELD_GET(ICH_VTR_A3V_MASK, kvm_vgic_global_state.ich_vtr_el2)); 76 80 /* 77 81 * The VMCR.CTLR value is in ICC_CTLR_EL1 layout. 78 82 * Extract it directly using ICC_CTLR_EL1 reg definitions. 79 83 */ 80 - val |= (vmcr.cbpr << ICC_CTLR_EL1_CBPR_SHIFT) & ICC_CTLR_EL1_CBPR_MASK; 81 - val |= (vmcr.eoim << ICC_CTLR_EL1_EOImode_SHIFT) & ICC_CTLR_EL1_EOImode_MASK; 84 + val |= FIELD_PREP(ICC_CTLR_EL1_CBPR_MASK, vmcr.cbpr); 85 + val |= FIELD_PREP(ICC_CTLR_EL1_EOImode_MASK, vmcr.eoim); 82 86 83 87 *valp = val; 84 88 ··· 90 96 struct vgic_vmcr vmcr; 91 97 92 98 vgic_get_vmcr(vcpu, &vmcr); 93 - vmcr.pmr = (val & ICC_PMR_EL1_MASK) >> ICC_PMR_EL1_SHIFT; 99 + vmcr.pmr = FIELD_GET(ICC_PMR_EL1_MASK, val); 94 100 vgic_set_vmcr(vcpu, &vmcr); 95 101 96 102 return 0; ··· 102 108 struct vgic_vmcr vmcr; 103 109 104 110 vgic_get_vmcr(vcpu, &vmcr); 105 - *val = (vmcr.pmr << ICC_PMR_EL1_SHIFT) & ICC_PMR_EL1_MASK; 111 + *val = FIELD_PREP(ICC_PMR_EL1_MASK, vmcr.pmr); 106 112 107 113 return 0; 108 114 } ··· 113 119 struct vgic_vmcr vmcr; 114 120 115 121 vgic_get_vmcr(vcpu, &vmcr); 116 - vmcr.bpr = (val & ICC_BPR0_EL1_MASK) >> ICC_BPR0_EL1_SHIFT; 122 + vmcr.bpr = FIELD_GET(ICC_BPR0_EL1_MASK, val); 117 123 vgic_set_vmcr(vcpu, &vmcr); 118 124 119 125 return 0; ··· 125 131 struct vgic_vmcr vmcr; 126 132 127 133 vgic_get_vmcr(vcpu, &vmcr); 128 - *val = (vmcr.bpr << ICC_BPR0_EL1_SHIFT) & ICC_BPR0_EL1_MASK; 134 + *val = FIELD_PREP(ICC_BPR0_EL1_MASK, vmcr.bpr); 129 135 130 136 return 0; 131 137 } ··· 137 143 138 144 vgic_get_vmcr(vcpu, &vmcr); 139 145 if (!vmcr.cbpr) { 140 - vmcr.abpr = (val & ICC_BPR1_EL1_MASK) >> ICC_BPR1_EL1_SHIFT; 146 + vmcr.abpr = FIELD_GET(ICC_BPR1_EL1_MASK, val); 141 147 vgic_set_vmcr(vcpu, &vmcr); 142 148 } 143 149 ··· 151 157 152 158 vgic_get_vmcr(vcpu, &vmcr); 153 159 if (!vmcr.cbpr) 154 - *val = (vmcr.abpr << ICC_BPR1_EL1_SHIFT) & ICC_BPR1_EL1_MASK; 160 + *val = FIELD_PREP(ICC_BPR1_EL1_MASK, vmcr.abpr); 155 161 else 156 162 *val = min((vmcr.bpr + 1), 7U); 157 163 ··· 165 171 struct vgic_vmcr vmcr; 166 172 167 173 vgic_get_vmcr(vcpu, &vmcr); 168 - vmcr.grpen0 = (val & ICC_IGRPEN0_EL1_MASK) >> ICC_IGRPEN0_EL1_SHIFT; 174 + vmcr.grpen0 = FIELD_GET(ICC_IGRPEN0_EL1_MASK, val); 169 175 vgic_set_vmcr(vcpu, &vmcr); 170 176 171 177 return 0; ··· 177 183 struct vgic_vmcr vmcr; 178 184 179 185 vgic_get_vmcr(vcpu, &vmcr); 180 - *val = (vmcr.grpen0 << ICC_IGRPEN0_EL1_SHIFT) & ICC_IGRPEN0_EL1_MASK; 186 + *val = FIELD_PREP(ICC_IGRPEN0_EL1_MASK, vmcr.grpen0); 181 187 182 188 return 0; 183 189 } ··· 188 194 struct vgic_vmcr vmcr; 189 195 190 196 vgic_get_vmcr(vcpu, &vmcr); 191 - vmcr.grpen1 = (val & ICC_IGRPEN1_EL1_MASK) >> ICC_IGRPEN1_EL1_SHIFT; 197 + vmcr.grpen1 = FIELD_GET(ICC_IGRPEN1_EL1_MASK, val); 192 198 vgic_set_vmcr(vcpu, &vmcr); 193 199 194 200 return 0; ··· 200 206 struct vgic_vmcr vmcr; 201 207 202 208 vgic_get_vmcr(vcpu, &vmcr); 203 - *val = (vmcr.grpen1 << ICC_IGRPEN1_EL1_SHIFT) & ICC_IGRPEN1_EL1_MASK; 209 + *val = FIELD_GET(ICC_IGRPEN1_EL1_MASK, vmcr.grpen1); 204 210 205 211 return 0; 206 212 }