跳转至

ACR切换

一个灵犀逻辑核(LxLC)的ACR状态可以被如下事件改变:

  1. 灵犀逻辑核(LxLC)外部中断。
  2. 灵犀逻辑核(LxLC)内部执行异常。
  3. acre指令所在块提交。
  4. acrc指令所在块提交。
  5. 系统调用块的准备和提交

这种改变通常同时会引起程序执行序列的变化。这种综合变化可以分成两类:

  • 一层(指令)级别切换
  • ACR_ENTER。这主要用于管理软件把灵犀逻辑核(LxLC)控制权主动交给被管理的软件。acre指令所在块提交属于这种类别。
  • SERVICE_REQUEST。这主要用于被管理的软件把灵犀逻辑核(LxLC)的控制权还给管理软件。灵犀逻辑核(LxLC)外部中断,内部执行异常,或者acrc指令所在块提交属于这种类别。
  • 二层(指令)级别切换
  • 系统调用块,系统调用块在调用的时候切换到目标ACR,并在提交阶段结束后恢复到切换前的ACR。

ACR_ENTER

ACR_ENTER通过acre指令请求,并在块提交的时候激发。

对于一次从ACRn发起的ACR_ENTER,其具体过程为:

  1. 灵犀逻辑核(LxLC)的ACR状态切换到系统寄存器ECSTATE_ACRn.ACR。目标ACR必须和当前ACRn可比,并且 ACRn p>= ECSTATE_ACRn.ACR。否则这个步骤本身触发E_INST(EC_PARAM)异常。
  2. SSR:ECSTATE_ACRn的内容恢复当前SSR:CSTATE的状态(即,使后者的有效域的内容和前者完全一致)。
  3. SSR:EBPC_ACRn恢复BPC的内容,并调度BPC所在的块执行。
  4. 根据ACRE.RRA参数,选择是否用SSR:EBARG_ACRn的内容恢复BARG
  5. 如果SSR:EBARG中记录的块类型是STD、SYS或FP,用SSR:ETPC_ACRn的内容恢复TPC执行;

SERVICE_REQUEST

SERVICE_REQUEST可以被三种事件驱动:

  1. 通过调用acrc指令由软件主动激发。
  2. 灵犀逻辑核(LxLC)在执行流水线上遇到同步异常。
  3. 灵犀逻辑核(LxLC)在执行流线上检测到异步中断。

acrc和异常都是同步的,称为SYNC_SERVICE_REQUEST。中断是异步的,称为ASYNC_SERVICE_REQUEST

SYNC_SERVICE_REQUESTASYNC_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_ACRmSSR:TRAPARG0_ACRm
  • 对于ASYNC_SERVICE_REQUEST,
  • TRAPNO_ACRm.E置0;
  • 根据中断类型设置SSR:TRAPNO_ACRmSSR: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。