RISCV获取物理地址

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值