SMMU架构手册之HTTU(译)

        HTTU(Hardware Translation Table Udate)即硬件更新转换表。

        SMMU可以支持硬件更新转换表的AF和dirty状态,该功能可选。

        一些PE可能支持HTTU(Hardware Transation Table Update)。SMMU支持的HTTU可以与PE软件和硬件更新标志可以共存。SMMU更新描述符部分与ARM用户手册一致,SMMU特别的部分在章节HTTU behavior summary中描述,虽然配置方法不一样。

        HTTU提升在转换表中维护AF和dirty状态的效率。一个转换表可以被软件更新标志的agent和硬件更新标志(HTTU)的agent共享。支持HTTU的agent自动更新标志。而当页表项与支持HTTU的agent共享时,软件必须用原子语义来做更新。

        NOTE: 在系统里AF和dirty状态的更新通常与动态页的使用/DMA目标页内存等相关。ARM不希望与DMA访问静态/PINNED或无页的映射来要求更新AF和dircty状态。

        HTTU的支持是由SMMU_IDR0.HTTU决定的,可以设置为如下:

  1. 都不支持;
  2. 仅支持AF的更新;
  3. AF和dircty状态更新都支持

        若HTTU支持,CD和STE中分开的使能位决定了是否stage 1或stage2以此方式更新,以及更新的范围。

        NOTE:多个CD可能指向同一转换表,多STE也可能指向同一CD。转换表被多个CD共享的情况(他们使用同一ASID),CD HA和HD域也是完全相同的。

        NOTE: Accessed表示已经做过一次访问。软件可以会检测一种状态:清除Access标志并观察其再次被设置。Dirty状态表示一个写转换或修改已执行。当回收或对张页调正用途,软件可能会保存修改。Clean表示没有做任何写修改。当回收或张页重新调整用途,软件只需要简单的放弃页的内容。

1. 软件更新标志

       若PE不支持HTTU,软件需要维护AF和dirty状态如下:

  1. 若AFFD==0(Access Flag Fault Disable),读或写获取AF=0的TTD时会产生Access Fault。在异常处理里会将TTD设为AF=1,且重试造成access fault的指令。不允许agent将这些页表项缓存在TLB中。当设置AF=1时不需要TLB无效化命令。
  2. 通常在软件中用写保护转换实现dirty标志。当写访问这种转换时会产生permission fault,在异常处理里会重写TTD,让其变为可写。异常处理通常会使用额外的软件结构或软件定义的TTD标志来区分是真正的不可写还是暂时的不可写(用来产生permission fault)。在这种情况下,有写权限的TTD被认为是writable, dirty,而没有写权限的TTD但只是暂时不可写被认为是writable,clean。
  3. 对真正不可写的页做写操作是错误。对writable clean(暂时不可写)的页做写操作可以导致页变成writable dirty。对writable dirty也做写不会导致状态的变化。
  4. Access fault的优先级比permission fault高。如当对writable clean且AF=0页做写操作时会产生access fault,只有在AF=1时permission fault才会产生。

        当SMMU使用PIN住的DMA转换时,软件可以根据预期的访问更新转换标志。ARM不希望在使用PIN住的转换时会产生fault,因为这代表编程错误。ARM期望软件来使用终端模式来阻止这种场景,所以错误的转换可以停止。

        当使用unpinned DMA转换时SMMU可以和PE类似,使得SMMU产生的转换的错误被记录,SMMU驱动软件可以设置TTD状态来响应这些记录。

        有一个例子,ARM建议使用stall mode。ARM希望SMMU驱动通过如下步骤维护软件的AF和dirty状态:

  1. 在TTD中将AF设置为1来响应F_ACCESS错误;
  2. 将页设置为writable dirty来响应由于写writable clean页导致的F_PERMISSION错误;
  3. 最后发送CMD_RESUME来让SMMU由于错误而挂起的指令或事务;

        NOTE:stage1和stage2的AFFD域的配置会修改TTD的AF标志的行为。AFFD=1的TTD,AF=0不会造成F_ACCESS错误。

        若所有的agent使用同样的语义来更新AF和dirty状态来区分真正不可写的TTD和暂时不可写的TTD,页表可以被多个agent共享。通常软件会定义BIT来标志区分暂时不可写和真正不可写。

        HTTU会移除fault记录和软件处理转换表标志。允许agent支持HTTU,同时另一个agent通过软件对共享的页做更新标志。ARMv8.1-A增加DSM域(Dirty Bit Modifier field)来区分不可写和writable clean状态。假如PE不支持HTTU,软件应该提供软件更新TTD标志,当共享的TTD也被另一个agent共享时,此agent支持HTTU,因此必须使用DBM,并进行原子更新。

2. 硬件更新Acess标志

        当HTTU使能时,一次转换(让SMMU获取AF=0的描述符)会导致access fault,并将描述符中的AF设置为1。SMMU不会清AF标志。

        若继续访问已经出现permision fault的描述符,无法确定AF标志是否会更新为1。

        当HTTU不使能时,访问AF=0且AFFD=0的页表会导致F_ACCESS。

3. 硬件更新dirty标志

        为了与不采用硬件更新的agent共存,HTTU定义了一个新的bit[51],DBM(Dirty Bit Modifier)。DBM位最终意图是为了让转换可写,与软件机制来维护一样,区分不可写页和writable clean页。

        NOTE: ARMv8-a stage1 AP[2:1]域不存在bit[0]。Stage2为S2AP[1:0]。

        当HTTU支持页的dirty状态更新时,当写转换产生时,non-writable页表项(DBM=1)自动被SMMU设置为可写。Permission fault不会产生,转换继续。

        具体来说,若在stage1的页表项AP[2:1]=0b1x或在stage2的页表项S2AP[1:0]=0b0x,该页表项只读,如果DBM=1同时写转换产生,SMMU会自动将AP[2]设置为1。若DBM=0,页没有写权限,写转换会导致permission fault。

        NOTE:HTTU页dirty状态更新不适用于因为使用APTable而进行分层访问控制的只读页表项。这部分对page或block的访问都认为是可访问的,不会产生permission fault。如PAN或APTABLE被移除访问,页变为只读。

当APTable不移除写访问时:

(1)stage1只读的TTD中DBM=0且AP[2:1]=0b1x。Stage2不可写的TTD中DBM=0且S2AP[1:0]=0b0x。

        写会导致permission fault因为页没有写权限。

        软件的fault处理涉及错误处理路径。因为DBM=0,软件处理中决定此页是否允许写。比如SMMU的stall fault,软件可以使用CMD_RESUME来终止转换。

(2)writable clean TTD中DBM=1且AP[2:1]=0b1x/S2AP[1:0]=0b0x

           当不支持HTTU,TTD不可写,写会导致permission fault。因为DBM=1,页将会变为可写,软件fault处理可以将页设置为dirty(将AP[2]=0/S2AP[1]=1)并发送TLB无效化命令。页会被设置为writable dirty。若SMMU的stall fault,软件可以使用CMD_RESUME来重试转换(再次重试可能没有错误)。

当HTTU使能时,写转换会让SMMU自动设置AP[2]=0/S2AP[1]=1,允许写转换被处理。

(3)writable dirty TTD中AP[2]=0/S2AP[1]=0

        是否使能HTTU,页都是可写的且不会因为写而产生permission fault。

NOTE: 虽然在这种状态写,硬件会忽略DBM,但在页AP[2]或HAP[2]从不可写到可写,它对软件有用。这允许使用DBM位来表示此页将被写无论当前是clean还是dirty状态。

(4)SMMU不设置或清除DBM

(5)SMMU不清楚S2AP[1]

(6)SMMU不设置AP[2]。

4. HTTU行为总结

        SMMU HTTU操作与ARMv8.1-A架构中描述的一样。

        下面是对SMMU特有的:

  1. 由于ATOS转换对要求的shareability domain可见,且被TTW属性指定(在ATOS转换开始后发送CMD_SYNC完成),TTD进行更新;
  2. 由于将要进行的转换对要求的shareability domain可见,且被TTW属性指定(在将要进行的转换开始后发送CMD_SYNC完成),TTD进行更新;

        另外,TLB无效化命令的完成使TTD更新(TTD更新是由转换引发的,最终由TLB无效化让其可见)。Broadcast 和explicit CMD_TLBI_*无效化命令都有此作用。

        NOTE: SMMU HTTU行为遵守ARMv8.1-A的要求,包括让HTTU可见的VMSA的所有无效化完成要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值