ACR切换¶
一个灵犀逻辑核(LxLC)的ACR状态可以被如下事件改变:
这种改变通常同时会引起程序执行序列的变化。这种综合变化可以分成两类:
- 一层(指令)级别切换
ACR_ENTER。这主要用于管理软件把灵犀逻辑核(LxLC)控制权主动交给被管理的软件。acre指令所在块提交属于这种类别。SERVICE_REQUEST。这主要用于被管理的软件把灵犀逻辑核(LxLC)的控制权还给管理软件。灵犀逻辑核(LxLC)外部中断,内部执行异常,或者acrc指令所在块提交属于这种类别。- 二层(指令)级别切换
系统调用块,系统调用块在调用的时候切换到目标ACR,并在提交阶段结束后恢复到切换前的ACR。
ACR_ENTER¶
ACR_ENTER通过acre指令请求,并在块提交的时候激发。
对于一次从ACRn发起的ACR_ENTER,其具体过程为:
- 灵犀逻辑核(LxLC)的ACR状态切换到系统寄存器ECSTATE_ACRn.ACR。目标ACR必须和当前ACRn可比,并且 ACRn p>= ECSTATE_ACRn.ACR。否则这个步骤本身触发E_INST(EC_PARAM)异常。
- 用
SSR:ECSTATE_ACRn的内容恢复当前SSR:CSTATE的状态(即,使后者的有效域的内容和前者完全一致)。 - 用
SSR:EBPC_ACRn恢复BPC的内容,并调度BPC所在的块执行。 - 根据
ACRE.RRA参数,选择是否用SSR:EBARG_ACRn的内容恢复BARG。 - 如果
SSR:EBARG中记录的块类型是STD、SYS或FP,用SSR:ETPC_ACRn的内容恢复TPC执行;
SERVICE_REQUEST¶
SERVICE_REQUEST可以被三种事件驱动:
- 通过调用
acrc指令由软件主动激发。 - 灵犀逻辑核(LxLC)在执行流水线上遇到同步异常。
- 灵犀逻辑核(LxLC)在执行流线上检测到异步中断。
acrc和异常都是同步的,称为SYNC_SERVICE_REQUEST。中断是异步的,称为ASYNC_SERVICE_REQUEST。
SYNC_SERVICE_REQUEST和ASYNC_SERVICE_REQUEST在本文中统称陷阱,进入陷阱的过程,称为陷入。
当发生陷入的时候,引起陷入的原因通过参数陷入代号(Trap Number,或者Trap No)和陷入原因代号表示。这两个参数的具体定义,
- 对于中断,请具体参考每个
Xproxy的定义。 - 对于异常,请参考
s_exception_trap_no。
如果一个异常的陷入代号为t,原因代号为c,本文会把该异常简单表述为“t©”的异常。
部分陷阱包含更多的信息说明原因,这些参数称为陷入参数(TrapArgs),由每个具体的陷阱具体决定。
发生陷入的时候,陷入代号和原因代号保存在SSR:TRAPNO_ACRn中,陷入参数保存在SSR:TRAPARG0_ACRn中。
SERVICE_REQUEST总是从某个指令位置激发的,这个位置由BPC和TPC共同定义。这个BPC和TPC共同指定的信息称为这个SERVICE_REQUEST的陷阱源指令,或者简称源指令。
需要注意的是:并非所有的异常都会触发SERVICE_REQUEST流程,如果异常发生在未被接管的主动修复块中,该异常按主动修复块的定义处理。
SERVICE_REQUEST流程¶
对于任意从ACRn到ACRm的SERVICE_REQUEST,其具体行为为,
- 如果是浮点运算产生的相关异常,设置CSTATE.flags中的对应标志位。
- 当前
SSR:CSTATE保存到SSR:ECSTATE_ACRm。如果触发指令是块头指令,设置SSR:ECSTATE_ACRm.BI为0,否则设置为1;; - 异常块的BPC保存至
SSR:EBPC_ACRm; - 异常块的BARG内容保存到
SSR:EBARG_ACRm,设置EBARG_ACRm.BlockType为触发块类型。 - 如果异常块是STD、SYS或FP块,保存触发异常指令的TPC到
SSR:ETPC; - 如果异常块是MPAR、MSEQ、VPAR或VSEQ块,保存触发异常的GroupID至
EBARG.GroupID字段。 - CSTATE.I设置为0; # 中断使能位
- CSTATE.ACR位置为m;
- BARG复位到初值;
- BPC设置为EVBASE_ACRm;
- 对于SYNC_SERVICE_REQUEST,
- TRAPNO_ACRm.E置1;
- 根据陷入代号和参数,设置
SSR:TRAPNO_ACRm和SSR:TRAPARG0_ACRm。 - 对于ASYNC_SERVICE_REQUEST,
- TRAPNO_ACRm.E置0;
- 根据中断类型设置
SSR:TRAPNO_ACRm和SSR:TRAPARG0_ACRm。具体取值参考对应的Xproxy定义。
以上行为在灵犀逻辑核(LxLC)内部一次完成,中间不会有其他改变灵犀逻辑核(LxLC)状态的行为介入。
BSTATE和EBSTATE¶
一个块执行单元的内部状态称为BSTATE,不同块执行单元可能使用不同格式的BSTATE。
注意!
请注意:CSTATE不是BSTATE的一部分,它是第一层架构的状态。
而EBSTATE (Exception Block State) 是用于保存和恢复状态的存储空间。这个空间的实现根据块类型的不同可能不同。
STD、SYS、FP块¶
对于 STD、SYS、FP 类型的块指令,其用于标量运算或系统级控制,块内状态相对简单。其 EBSTATE 由系统寄存器与内存共同实现。
当触发异常或中断时,硬件需将 BSTATE 的相关内容保存至系统寄存器,具体为:
- 将 BARG.BPC 写入 SSR:EBPC;
- 将 BARG.BPCN 写入 SSR:EBPCN;
- 将 BARG 的其余字段写入 SSR:EBARG;
- 将 TPC 写入 SSR:ETPC。
在异常恢复时,硬件需将上述系统寄存器内容加载回对应的块内寄存器,保证块指令从异常触发点正确继续执行。
BSTATE 中其他 T/U 等标量寄存器是否保存至内存及是否恢复,由操作系统自行决定。
VPAR、VSEQ、MPAR、MSEQ块¶
对于 VPAR、VSEQ、MPAR、MSEQ 等类型的块指令而言,块内状态相对复杂,并且需要非常大的空间来保存EBSTATE。其 EBSTATE 由系统寄存器与Tile寄存器共同实现。
当触发异常或中断时,硬件需将 BSTATE 的相关内容保存至系统寄存器,具体为:
- 将 BARG.BPC 写入 SSR:EBPC;
- 将 BARG.BPCN 写入 SSR:EBPCN;
- 将 BARG 的其余字段写入 SSR:EBARG;
- 将 触发异常的Group的ID记录在 SSR:EBARG。
在异常恢复时,硬件需将上述系统寄存器内容加载回对应的块内寄存器,保证块指令从异常触发点正确继续执行。
BSTATE 中其他寄存器状态是否保存至Tile寄存器或内存及是否恢复,由操作系统自行决定。其中包括:
- 可以通过调用 TSTORE 指令将所有或某一类Tile寄存器保存至内存;
- 可以通过调用 ESAVE 模版块保存Group的TPC和LPR至Tile寄存器;
- 可以通过调用 TSTORE 指令将ESAVE输出的Tile寄存器内容保存至内存。
如果块执行单元在执行中被SERVICE_REQUEST打断,而它的BSTATE已经改变且未提交,则这个BSTATE的状态称为脏(dirty)的,反之,它的状态称为干净(clean)
的。
如果某个块在执行中被SERVICE_REQUEST打断,而对应的BSTATE状态是脏的,该BSTATE的内容会被保存在EBSTATEP指定的EBSTATE中,同时,SSR:CSTATE.ebv域设置为1。反之,如果某个块在执行中被SERVICE_REQUEST打断,而对应的BSTATE状态是干净的,EBSTATEP指定的EBSTATE维持不变,同时,SSR:CSTATE.ebv域设置为0。
系统调用块ACR切换¶
系统调用块用于快速(一个块之内)完成对高特权级ACR软件的服务请求。
系统调用块的调用通过XB发起调用,基于调用时的ACR进行特权级检查后,当前ACR直接切换为所指定的目标ACR。此后的系统调用块的准备阶段,执行和提交阶段皆以目标ACR特权级执行,在提交完成后,该指令自动重新切换回XB执行时的ACR。
本文把XB调用时的ACR称为该系统调用块的调用者ACR,而准备、执行和提交阶段使用的ACR称为该系统调用块的被调用方ACR。
上述过程不影响EBSTATE的内容。如果在系统调用块的准备,执行和提交阶段发生中断或者异常,或者执行阶段执行acrc,按SERVICE_REQUEST流程执行。
这种情况下,EBSTATE中保存块的内部状态和调用者BPC的地址,通过该状态调用ACR_ENTER恢复块的运行时,首先恢复到该系统调用块的被调用方ACR,然后完成块的未完成指令(包括提交隐式指令),再恢复到该系统调用块的调用者ACR。