香山里的page table walker
ptw里的l1,l2,l3
PTW module里的参数,page cache发给ptw的请求。
output io_req_ready,
input io_req_valid,
input [37:0] io_req_bits_req_info_vpn,
input [1:0] io_req_bits_req_info_s2xlate,
input [1:0] io_req_bits_req_info_source,
input io_req_bits_l3Hit,
input io_req_bits_l2Hit,
input [43:0] io_req_bits_ppn,
input io_req_bits_stage1Hit,
其中有l3Hit和l2Hit。
从代码里看,l3Hit是支持Sv48时,根页表(level 3)tlb hit。(这个不好说是不是叫level3页表,香山文档里的叫法和代码里好像不一致)
l3Hit在Sv39时不用。l2Hit在Sv39里是根页表(level 2)tlb hit。
以Sv39为例,l2,l1,l0三级分页,l0是leaf pte。
对于ptw来说,只处理l2,l1的page walk,l0 leaf pte是由llptw(Last Level Page Table Walker)处理。
所以只可能有l2Hit,不可能同时l2Hit,l1Hit,因为这样的情况就发给llptw了。
对于Sv48来说,最多可能有同时l3Hit,l2Hit。
这也是为什么ptw的参数里面没有l1Hit。
ptw里有内部信号level,af_level(access fault level)表示当前要处理的page table是几级的。这里还没仔细看,大概是这个意思。
一开始比较乱的地方是文档里对l1 l2 l3 sp的解释,这里给出的是l1是根页表,l2是下一级,l3是leaf pte,sp是大页。l1 l2 l3和ptw里的顺序是反的。但这个是page cache的,需要看下代码才能知道是文档写错了,还是page cache里就这样命名的。
stage1Hit是在支持虚拟扩展后才用的,stage1是指guest va到guest pa阶段,stage2是指虚拟化里guest pa到host pa,相当于intel x86 vtv里的EPT。
s2xlate(stage 2 translate)
00 noS2xlate, 01 onlyStage1, 10 onlyStage2, 11 allStage
不考虑虚拟化的时候,就用00 noS2xlate。