@@ -45,37 +45,37 @@ static void split_large_page(uint64_t *pte, enum _page_table_level level,
45
45
46
46
paddr = ref_paddr ;
47
47
for (i = 0UL ; i < PTRS_PER_PTE ; i ++ ) {
48
- set_pgentry (pbase + i , paddr | ref_prot );
48
+ set_pgentry (pbase + i , paddr | ref_prot , mem_ops );
49
49
paddr += paddrinc ;
50
50
}
51
51
52
52
ref_prot = mem_ops -> get_default_access_right ();
53
- set_pgentry (pte , hva2hpa ((void * )pbase ) | ref_prot );
53
+ set_pgentry (pte , hva2hpa ((void * )pbase ) | ref_prot , mem_ops );
54
54
55
55
/* TODO: flush the TLB */
56
56
}
57
57
58
58
static inline void local_modify_or_del_pte (uint64_t * pte ,
59
- uint64_t prot_set , uint64_t prot_clr , uint32_t type )
59
+ uint64_t prot_set , uint64_t prot_clr , uint32_t type , const struct memory_ops * mem_ops )
60
60
{
61
61
if (type == MR_MODIFY ) {
62
62
uint64_t new_pte = * pte ;
63
63
new_pte &= ~prot_clr ;
64
64
new_pte |= prot_set ;
65
- set_pgentry (pte , new_pte );
65
+ set_pgentry (pte , new_pte , mem_ops );
66
66
} else {
67
- sanitize_pte_entry (pte );
67
+ sanitize_pte_entry (pte , mem_ops );
68
68
}
69
69
}
70
70
71
71
/*
72
72
* pgentry may means pml4e/pdpte/pde
73
73
*/
74
- static inline void construct_pgentry (uint64_t * pde , void * pd_page , uint64_t prot )
74
+ static inline void construct_pgentry (uint64_t * pde , void * pd_page , uint64_t prot , const struct memory_ops * mem_ops )
75
75
{
76
- sanitize_pte ((uint64_t * )pd_page );
76
+ sanitize_pte ((uint64_t * )pd_page , mem_ops );
77
77
78
- set_pgentry (pde , hva2hpa (pd_page ) | prot );
78
+ set_pgentry (pde , hva2hpa (pd_page ) | prot , mem_ops );
79
79
}
80
80
81
81
/*
@@ -106,7 +106,7 @@ static void modify_or_del_pte(const uint64_t *pde, uint64_t vaddr_start, uint64_
106
106
pr_warn ("%s, vaddr: 0x%lx pte is not present.\n" , __func__ , vaddr );
107
107
}
108
108
} else {
109
- local_modify_or_del_pte (pte , prot_set , prot_clr , type );
109
+ local_modify_or_del_pte (pte , prot_set , prot_clr , type , mem_ops );
110
110
}
111
111
112
112
vaddr += PTE_SIZE ;
@@ -142,7 +142,7 @@ static void modify_or_del_pde(const uint64_t *pdpte, uint64_t vaddr_start, uint6
142
142
if ((vaddr_next > vaddr_end ) || (!mem_aligned_check (vaddr , PDE_SIZE ))) {
143
143
split_large_page (pde , IA32E_PD , vaddr , mem_ops );
144
144
} else {
145
- local_modify_or_del_pte (pde , prot_set , prot_clr , type );
145
+ local_modify_or_del_pte (pde , prot_set , prot_clr , type , mem_ops );
146
146
if (vaddr_next < vaddr_end ) {
147
147
vaddr = vaddr_next ;
148
148
continue ;
@@ -187,7 +187,7 @@ static void modify_or_del_pdpte(const uint64_t *pml4e, uint64_t vaddr_start, uin
187
187
(!mem_aligned_check (vaddr , PDPTE_SIZE ))) {
188
188
split_large_page (pdpte , IA32E_PDPT , vaddr , mem_ops );
189
189
} else {
190
- local_modify_or_del_pte (pdpte , prot_set , prot_clr , type );
190
+ local_modify_or_del_pte (pdpte , prot_set , prot_clr , type , mem_ops );
191
191
if (vaddr_next < vaddr_end ) {
192
192
vaddr = vaddr_next ;
193
193
continue ;
@@ -261,7 +261,7 @@ static void add_pte(const uint64_t *pde, uint64_t paddr_start, uint64_t vaddr_st
261
261
if (mem_ops -> pgentry_present (* pte ) != 0UL ) {
262
262
ASSERT (false, "invalid op, pte present" );
263
263
} else {
264
- set_pgentry (pte , paddr | prot );
264
+ set_pgentry (pte , paddr | prot , mem_ops );
265
265
paddr += PTE_SIZE ;
266
266
vaddr += PTE_SIZE ;
267
267
@@ -294,7 +294,7 @@ static void add_pde(const uint64_t *pdpte, uint64_t paddr_start, uint64_t vaddr_
294
294
if (mem_aligned_check (paddr , PDE_SIZE ) &&
295
295
mem_aligned_check (vaddr , PDE_SIZE ) &&
296
296
(vaddr_next <= vaddr_end )) {
297
- set_pgentry (pde , paddr | (prot | PAGE_PSE ));
297
+ set_pgentry (pde , paddr | (prot | PAGE_PSE ), mem_ops );
298
298
if (vaddr_next < vaddr_end ) {
299
299
paddr += (vaddr_next - vaddr );
300
300
vaddr = vaddr_next ;
@@ -303,7 +303,7 @@ static void add_pde(const uint64_t *pdpte, uint64_t paddr_start, uint64_t vaddr_
303
303
break ; /* done */
304
304
} else {
305
305
void * pt_page = mem_ops -> get_pt_page (mem_ops -> info , vaddr );
306
- construct_pgentry (pde , pt_page , mem_ops -> get_default_access_right ());
306
+ construct_pgentry (pde , pt_page , mem_ops -> get_default_access_right (), mem_ops );
307
307
}
308
308
}
309
309
add_pte (pde , paddr , vaddr , vaddr_end , prot , mem_ops );
@@ -336,7 +336,7 @@ static void add_pdpte(const uint64_t *pml4e, uint64_t paddr_start, uint64_t vadd
336
336
if (mem_aligned_check (paddr , PDPTE_SIZE ) &&
337
337
mem_aligned_check (vaddr , PDPTE_SIZE ) &&
338
338
(vaddr_next <= vaddr_end )) {
339
- set_pgentry (pdpte , paddr | (prot | PAGE_PSE ));
339
+ set_pgentry (pdpte , paddr | (prot | PAGE_PSE ), mem_ops );
340
340
if (vaddr_next < vaddr_end ) {
341
341
paddr += (vaddr_next - vaddr );
342
342
vaddr = vaddr_next ;
@@ -345,7 +345,7 @@ static void add_pdpte(const uint64_t *pml4e, uint64_t paddr_start, uint64_t vadd
345
345
break ; /* done */
346
346
} else {
347
347
void * pd_page = mem_ops -> get_pd_page (mem_ops -> info , vaddr );
348
- construct_pgentry (pdpte , pd_page , mem_ops -> get_default_access_right ());
348
+ construct_pgentry (pdpte , pd_page , mem_ops -> get_default_access_right (), mem_ops );
349
349
}
350
350
}
351
351
add_pde (pdpte , paddr , vaddr , vaddr_end , prot , mem_ops );
@@ -381,7 +381,7 @@ void mmu_add(uint64_t *pml4_page, uint64_t paddr_base, uint64_t vaddr_base, uint
381
381
pml4e = pml4e_offset (pml4_page , vaddr );
382
382
if (mem_ops -> pgentry_present (* pml4e ) == 0UL ) {
383
383
void * pdpt_page = mem_ops -> get_pdpt_page (mem_ops -> info , vaddr );
384
- construct_pgentry (pml4e , pdpt_page , mem_ops -> get_default_access_right ());
384
+ construct_pgentry (pml4e , pdpt_page , mem_ops -> get_default_access_right (), mem_ops );
385
385
}
386
386
add_pdpte (pml4e , paddr , vaddr , vaddr_end , prot , mem_ops );
387
387
0 commit comments