SV39
define get_phyaddr
set $ppn = $satp & 0xfffffffffff
printf "satp: 0x%llx satp.ppn:0x%llx\n", $satp, $ppn
set $vaddr = $arg0
printf "vaddr: 0x%llx\n", $vaddr
set $vpn2 = ($vaddr >> 30) & 0x1ff
set $vpn1 = ($vaddr >> 21) & 0x1ff
set $vpn0 = ($vaddr >> 12) & 0x1ff
printf "vpn2: 0x%llx vpn1: 0x%llx vpn0: 0x%llx\n", $vpn2, $vpn1, $vpn0
set $pte_addr = (($ppn << 12)) + $vpn2 * 8
set $pte = *(unsigned long long*)$pte_addr
set $pte1_ppn = (($pte >> 10) << 12) & 0xfffffffffff
set $paddr1 = $pte1_ppn + ($vaddr & ((1 << 30) - 1))
printf "pte1:0x%llx:0x%llx phy addr1:0x%llx pte1.ppn:0x%llx\n", $pte_addr, $pte, $paddr1, $pte1_ppn
set $pte_addr = $pte1_ppn + $vpn1 * 8
set $pte = *(unsigned long long*)$pte_addr
set $pte2_ppn = (($pte >> 10) << 12) & 0xfffffffffff
set $paddr2 = $pte2_ppn + ($vaddr & ((1 << 21) - 1))
printf "pte2:0x%llx:0x%llx phy addr2:0x%llx pte2.ppn:0x%llx\n", $pte_addr, $pte, $paddr2, $pte2_ppn
set $pte_addr = $pte2_ppn + $vpn0 * 8
set $pte = *(unsigned long long*)$pte_addr
set $pte3_ppn = (($pte >> 10) << 12) & 0xfffffffffff
set $paddr3 = $pte3_ppn + ($vaddr & ((1 << 12) - 1))
printf "pte3:0x%llx:0x%llx phy addr3:0x%llx pte3.ppn:0x%llx\n", $pte_addr, $pte, $paddr3, $pte3_ppn
SV48
define get_phyaddr
set $ppn = $satp & 0xfffffffffff
printf "satp: 0x%llx satp.ppn: 0x%llx\n", $satp, $ppn
set $vaddr = $arg0
printf "vaddr: 0x%llx\n", $vaddr
set $vpn3 = ($vaddr >> 39) & 0x1ff
set $vpn2 = ($vaddr >> 30) & 0x1ff
set $vpn1 = ($vaddr >> 21) & 0x1ff
set $vpn0 = ($vaddr >> 12) & 0x1ff
printf "vpn3: 0x%llx vpn2: 0x%llx vpn1: 0x%llx vpn0: 0x%llx\n", $vpn3, $vpn2, $vpn1, $vpn0
set $pte_addr = ($ppn << 12) + $vpn3 * 8
set $pte = *(unsigned long long*)$pte_addr
set $pte2_ppn = (($pte >> 10) << 12) & 0xffffffffffffff
set $paddr2 = $pte2_ppn + ($vaddr & ((1 << 39) - 1))
printf "pte2: 0x%llx: 0x%llx phy addr2: 0x%llx pte2.ppn: 0x%llx\n", $pte_addr, $pte, $paddr2, $pte2_ppn
set $pte_addr = $pte2_ppn + $vpn2 * 8
set $pte = *(unsigned long long*)$pte_addr
set $pte1_ppn = (($pte >> 10) << 12) & 0xffffffffffffff
set $paddr1 = $pte1_ppn + ($vaddr & ((1 << 30) - 1))
printf "pte1: 0x%llx: 0x%llx phy addr1: 0x%llx pte1.ppn: 0x%llx\n", $pte_addr, $pte, $paddr1, $pte1_ppn
set $pte_addr = $pte1_ppn + $vpn1 * 8
set $pte = *(unsigned long long*)$pte_addr
set $pte0_ppn = (($pte >> 10) << 12) & 0xffffffffffffff
set $paddr0 = $pte0_ppn + ($vaddr & ((1 << 21) - 1))
printf "pte0: 0x%llx: 0x%llx phy addr0: 0x%llx pte0.ppn: 0x%llx\n", $pte_addr, $pte, $paddr0, $pte0_ppn
set $pte_addr = $pte0_ppn + $vpn0 * 8
set $pte = *(unsigned long long*)$pte_addr
set $pte3_ppn = (($pte >> 10) << 12) & 0xffffffffffffff
set $paddr3 = $pte3_ppn + ($vaddr & ((1 << 12) - 1))
printf "pte3: 0x%llx: 0x%llx phy addr3: 0x%llx pte3.ppn: 0x%llx\n", $pte_addr, $pte, $paddr3, $pte3_ppn