File tree Expand file tree Collapse file tree 1 file changed +17
-7
lines changed Expand file tree Collapse file tree 1 file changed +17
-7
lines changed Original file line number Diff line number Diff line change @@ -414,18 +414,28 @@ pmd_t *lookup_pmd_address(unsigned long address)
414
414
phys_addr_t slow_virt_to_phys (void * __virt_addr )
415
415
{
416
416
unsigned long virt_addr = (unsigned long )__virt_addr ;
417
- phys_addr_t phys_addr ;
418
- unsigned long offset ;
417
+ unsigned long phys_addr , offset ;
419
418
enum pg_level level ;
420
- unsigned long pmask ;
421
419
pte_t * pte ;
422
420
423
421
pte = lookup_address (virt_addr , & level );
424
422
BUG_ON (!pte );
425
- pmask = page_level_mask (level );
426
- offset = virt_addr & ~pmask ;
427
- phys_addr = (phys_addr_t )pte_pfn (* pte ) << PAGE_SHIFT ;
428
- return (phys_addr | offset );
423
+
424
+ switch (level ) {
425
+ case PG_LEVEL_1G :
426
+ phys_addr = pud_pfn (* (pud_t * )pte ) << PAGE_SHIFT ;
427
+ offset = virt_addr & ~PUD_PAGE_MASK ;
428
+ break ;
429
+ case PG_LEVEL_2M :
430
+ phys_addr = pmd_pfn (* (pmd_t * )pte ) << PAGE_SHIFT ;
431
+ offset = virt_addr & ~PMD_PAGE_MASK ;
432
+ break ;
433
+ default :
434
+ phys_addr = pte_pfn (* pte ) << PAGE_SHIFT ;
435
+ offset = virt_addr & ~PAGE_MASK ;
436
+ }
437
+
438
+ return (phys_addr_t )(phys_addr | offset );
429
439
}
430
440
EXPORT_SYMBOL_GPL (slow_virt_to_phys );
431
441
You can’t perform that action at this time.
0 commit comments