@@ -72,13 +72,13 @@ static uint64_t addr_pte(struct kvm_vm *vm, uint64_t pa, uint64_t attrs)
72
72
uint64_t pte ;
73
73
74
74
if (use_lpa2_pte_format (vm )) {
75
- pte = pa & GENMASK ( 49 , vm -> page_shift );
76
- pte |= FIELD_GET (GENMASK (51 , 50 ), pa ) << 8 ;
77
- attrs &= ~GENMASK ( 9 , 8 ) ;
75
+ pte = pa & PTE_ADDR_MASK_LPA2 ( vm -> page_shift );
76
+ pte |= FIELD_GET (GENMASK (51 , 50 ), pa ) << PTE_ADDR_51_50_LPA2_SHIFT ;
77
+ attrs &= ~PTE_ADDR_51_50_LPA2 ;
78
78
} else {
79
- pte = pa & GENMASK ( 47 , vm -> page_shift );
79
+ pte = pa & PTE_ADDR_MASK ( vm -> page_shift );
80
80
if (vm -> page_shift == 16 )
81
- pte |= FIELD_GET (GENMASK (51 , 48 ), pa ) << 12 ;
81
+ pte |= FIELD_GET (GENMASK (51 , 48 ), pa ) << PTE_ADDR_51_48_SHIFT ;
82
82
}
83
83
pte |= attrs ;
84
84
@@ -90,12 +90,12 @@ static uint64_t pte_addr(struct kvm_vm *vm, uint64_t pte)
90
90
uint64_t pa ;
91
91
92
92
if (use_lpa2_pte_format (vm )) {
93
- pa = pte & GENMASK ( 49 , vm -> page_shift );
94
- pa |= FIELD_GET (GENMASK ( 9 , 8 ) , pte ) << 50 ;
93
+ pa = pte & PTE_ADDR_MASK_LPA2 ( vm -> page_shift );
94
+ pa |= FIELD_GET (PTE_ADDR_51_50_LPA2 , pte ) << 50 ;
95
95
} else {
96
- pa = pte & GENMASK ( 47 , vm -> page_shift );
96
+ pa = pte & PTE_ADDR_MASK ( vm -> page_shift );
97
97
if (vm -> page_shift == 16 )
98
- pa |= FIELD_GET (GENMASK ( 15 , 12 ) , pte ) << 48 ;
98
+ pa |= FIELD_GET (PTE_ADDR_51_48 , pte ) << 48 ;
99
99
}
100
100
101
101
return pa ;
@@ -128,7 +128,8 @@ void virt_arch_pgd_alloc(struct kvm_vm *vm)
128
128
static void _virt_pg_map (struct kvm_vm * vm , uint64_t vaddr , uint64_t paddr ,
129
129
uint64_t flags )
130
130
{
131
- uint8_t attr_idx = flags & 7 ;
131
+ uint8_t attr_idx = flags & (PTE_ATTRINDX_MASK >> PTE_ATTRINDX_SHIFT );
132
+ uint64_t pg_attr ;
132
133
uint64_t * ptep ;
133
134
134
135
TEST_ASSERT ((vaddr % vm -> page_size ) == 0 ,
@@ -147,18 +148,21 @@ static void _virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
147
148
148
149
ptep = addr_gpa2hva (vm , vm -> pgd ) + pgd_index (vm , vaddr ) * 8 ;
149
150
if (!* ptep )
150
- * ptep = addr_pte (vm , vm_alloc_page_table (vm ), 3 );
151
+ * ptep = addr_pte (vm , vm_alloc_page_table (vm ),
152
+ PGD_TYPE_TABLE | PTE_VALID );
151
153
152
154
switch (vm -> pgtable_levels ) {
153
155
case 4 :
154
156
ptep = addr_gpa2hva (vm , pte_addr (vm , * ptep )) + pud_index (vm , vaddr ) * 8 ;
155
157
if (!* ptep )
156
- * ptep = addr_pte (vm , vm_alloc_page_table (vm ), 3 );
158
+ * ptep = addr_pte (vm , vm_alloc_page_table (vm ),
159
+ PUD_TYPE_TABLE | PTE_VALID );
157
160
/* fall through */
158
161
case 3 :
159
162
ptep = addr_gpa2hva (vm , pte_addr (vm , * ptep )) + pmd_index (vm , vaddr ) * 8 ;
160
163
if (!* ptep )
161
- * ptep = addr_pte (vm , vm_alloc_page_table (vm ), 3 );
164
+ * ptep = addr_pte (vm , vm_alloc_page_table (vm ),
165
+ PMD_TYPE_TABLE | PTE_VALID );
162
166
/* fall through */
163
167
case 2 :
164
168
ptep = addr_gpa2hva (vm , pte_addr (vm , * ptep )) + pte_index (vm , vaddr ) * 8 ;
@@ -167,7 +171,8 @@ static void _virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
167
171
TEST_FAIL ("Page table levels must be 2, 3, or 4" );
168
172
}
169
173
170
- * ptep = addr_pte (vm , paddr , (attr_idx << 2 ) | (1 << 10 ) | 3 ); /* AF */
174
+ pg_attr = PTE_AF | PTE_ATTRINDX (attr_idx ) | PTE_TYPE_PAGE | PTE_VALID ;
175
+ * ptep = addr_pte (vm , paddr , pg_attr );
171
176
}
172
177
173
178
void virt_arch_pg_map (struct kvm_vm * vm , uint64_t vaddr , uint64_t paddr )
@@ -293,20 +298,20 @@ void aarch64_vcpu_setup(struct kvm_vcpu *vcpu, struct kvm_vcpu_init *init)
293
298
case VM_MODE_P48V48_64K :
294
299
case VM_MODE_P40V48_64K :
295
300
case VM_MODE_P36V48_64K :
296
- tcr_el1 |= 1ul << 14 ; /* TG0 = 64KB */
301
+ tcr_el1 |= TCR_TG0_64K ;
297
302
break ;
298
303
case VM_MODE_P52V48_16K :
299
304
case VM_MODE_P48V48_16K :
300
305
case VM_MODE_P40V48_16K :
301
306
case VM_MODE_P36V48_16K :
302
307
case VM_MODE_P36V47_16K :
303
- tcr_el1 |= 2ul << 14 ; /* TG0 = 16KB */
308
+ tcr_el1 |= TCR_TG0_16K ;
304
309
break ;
305
310
case VM_MODE_P52V48_4K :
306
311
case VM_MODE_P48V48_4K :
307
312
case VM_MODE_P40V48_4K :
308
313
case VM_MODE_P36V48_4K :
309
- tcr_el1 |= 0ul << 14 ; /* TG0 = 4KB */
314
+ tcr_el1 |= TCR_TG0_4K ;
310
315
break ;
311
316
default :
312
317
TEST_FAIL ("Unknown guest mode, mode: 0x%x" , vm -> mode );
@@ -319,35 +324,35 @@ void aarch64_vcpu_setup(struct kvm_vcpu *vcpu, struct kvm_vcpu_init *init)
319
324
case VM_MODE_P52V48_4K :
320
325
case VM_MODE_P52V48_16K :
321
326
case VM_MODE_P52V48_64K :
322
- tcr_el1 |= 6ul << 32 ; /* IPS = 52 bits */
327
+ tcr_el1 |= TCR_IPS_52_BITS ;
323
328
ttbr0_el1 |= FIELD_GET (GENMASK (51 , 48 ), vm -> pgd ) << 2 ;
324
329
break ;
325
330
case VM_MODE_P48V48_4K :
326
331
case VM_MODE_P48V48_16K :
327
332
case VM_MODE_P48V48_64K :
328
- tcr_el1 |= 5ul << 32 ; /* IPS = 48 bits */
333
+ tcr_el1 |= TCR_IPS_48_BITS ;
329
334
break ;
330
335
case VM_MODE_P40V48_4K :
331
336
case VM_MODE_P40V48_16K :
332
337
case VM_MODE_P40V48_64K :
333
- tcr_el1 |= 2ul << 32 ; /* IPS = 40 bits */
338
+ tcr_el1 |= TCR_IPS_40_BITS ;
334
339
break ;
335
340
case VM_MODE_P36V48_4K :
336
341
case VM_MODE_P36V48_16K :
337
342
case VM_MODE_P36V48_64K :
338
343
case VM_MODE_P36V47_16K :
339
- tcr_el1 |= 1ul << 32 ; /* IPS = 36 bits */
344
+ tcr_el1 |= TCR_IPS_36_BITS ;
340
345
break ;
341
346
default :
342
347
TEST_FAIL ("Unknown guest mode, mode: 0x%x" , vm -> mode );
343
348
}
344
349
345
- sctlr_el1 |= ( 1 << 0 ) | ( 1 << 2 ) | ( 1 << 12 ) /* M | C | I */ ;
346
- /* TCR_EL1 |= IRGN0:WBWA | ORGN0:WBWA | SH0:Inner-Shareable */ ;
347
- tcr_el1 |= ( 1 << 8 ) | ( 1 << 10 ) | ( 3 << 12 ) ;
348
- tcr_el1 |= ( 64 - vm -> va_bits ) /* T0SZ */ ;
350
+ sctlr_el1 |= SCTLR_ELx_M | SCTLR_ELx_C | SCTLR_ELx_I ;
351
+
352
+ tcr_el1 |= TCR_IRGN0_WBWA | TCR_ORGN0_WBWA | TCR_SH0_INNER ;
353
+ tcr_el1 |= TCR_T0SZ ( vm -> va_bits );
349
354
if (use_lpa2_pte_format (vm ))
350
- tcr_el1 |= ( 1ul << 59 ) /* DS */ ;
355
+ tcr_el1 |= TCR_DS ;
351
356
352
357
vcpu_set_reg (vcpu , KVM_ARM64_SYS_REG (SYS_SCTLR_EL1 ), sctlr_el1 );
353
358
vcpu_set_reg (vcpu , KVM_ARM64_SYS_REG (SYS_TCR_EL1 ), tcr_el1 );
0 commit comments