@@ -125,7 +125,7 @@ static void modify_or_del_pde(const uint64_t *pdpte, uint64_t vaddr_start, uint6
125
125
panic ("invalid op, pde not present" );
126
126
}
127
127
if (pde_large (* pde ) != 0UL ) {
128
- if (vaddr_next > vaddr_end || !mem_aligned_check (vaddr , PDE_SIZE )) {
128
+ if (( vaddr_next > vaddr_end ) || ( !mem_aligned_check (vaddr , PDE_SIZE ) )) {
129
129
split_large_page (pde , IA32E_PD , vaddr , mem_ops );
130
130
} else {
131
131
local_modify_or_del_pte (pde , prot_set , prot_clr , type );
@@ -167,8 +167,8 @@ static void modify_or_del_pdpte(const uint64_t *pml4e, uint64_t vaddr_start, uin
167
167
panic ("invalid op, pdpte not present" );
168
168
}
169
169
if (pdpte_large (* pdpte ) != 0UL ) {
170
- if (vaddr_next > vaddr_end ||
171
- !mem_aligned_check (vaddr , PDPTE_SIZE )) {
170
+ if (( vaddr_next > vaddr_end ) ||
171
+ ( !mem_aligned_check (vaddr , PDPTE_SIZE ) )) {
172
172
split_large_page (pdpte , IA32E_PDPT , vaddr , mem_ops );
173
173
} else {
174
174
local_modify_or_del_pte (pdpte , prot_set , prot_clr , type );
@@ -376,34 +376,43 @@ void mmu_add(uint64_t *pml4_page, uint64_t paddr_base, uint64_t vaddr_base, uint
376
376
*/
377
377
uint64_t * lookup_address (uint64_t * pml4_page , uint64_t addr , uint64_t * pg_size , const struct memory_ops * mem_ops )
378
378
{
379
+ uint64_t * pret = NULL ;
380
+ bool present = true;
379
381
uint64_t * pml4e , * pdpte , * pde , * pte ;
380
382
381
383
pml4e = pml4e_offset (pml4_page , addr );
382
- if (mem_ops -> pgentry_present (* pml4e ) == 0UL ) {
383
- return NULL ;
384
+ present = (mem_ops -> pgentry_present (* pml4e ) != 0UL );
385
+
386
+ if (present ) {
387
+ pdpte = pdpte_offset (pml4e , addr );
388
+ present = (mem_ops -> pgentry_present (* pdpte ) != 0UL );
389
+ if (present ) {
390
+ if (pdpte_large (* pdpte ) != 0UL ) {
391
+ * pg_size = PDPTE_SIZE ;
392
+ pret = pdpte ;
393
+ }
394
+ }
384
395
}
385
396
386
- pdpte = pdpte_offset (pml4e , addr );
387
- if (mem_ops -> pgentry_present (* pdpte ) == 0UL ) {
388
- return NULL ;
389
- } else if (pdpte_large (* pdpte ) != 0UL ) {
390
- * pg_size = PDPTE_SIZE ;
391
- return pdpte ;
397
+ if (present && (pret == NULL )) {
398
+ pde = pde_offset (pdpte , addr );
399
+ present = (mem_ops -> pgentry_present (* pde ) != 0UL );
400
+ if (present ) {
401
+ if (pde_large (* pde ) != 0UL ) {
402
+ * pg_size = PDE_SIZE ;
403
+ pret = pde ;
404
+ }
405
+ }
392
406
}
393
407
394
- pde = pde_offset (pdpte , addr );
395
- if (mem_ops -> pgentry_present (* pde ) == 0UL ) {
396
- return NULL ;
397
- } else if (pde_large (* pde ) != 0UL ) {
398
- * pg_size = PDE_SIZE ;
399
- return pde ;
408
+ if (present && (pret == NULL )) {
409
+ pte = pte_offset (pde , addr );
410
+ present = (mem_ops -> pgentry_present (* pte ) != 0UL );
411
+ if (present ) {
412
+ * pg_size = PTE_SIZE ;
413
+ pret = pte ;
414
+ }
400
415
}
401
416
402
- pte = pte_offset (pde , addr );
403
- if (mem_ops -> pgentry_present (* pte ) == 0UL ) {
404
- return NULL ;
405
- } else {
406
- * pg_size = PTE_SIZE ;
407
- return pte ;
408
- }
417
+ return pret ;
409
418
}
0 commit comments