目的与范围
用途与范围
本单元集中处理故障、服务请求、中断入口以及陷阱状态打包。对于同步 SetFaultWithCause,只有故障代码不是 Fault_None 时才会保存上下文并重定向到目标 AccessControlRing。
PTO-ARCH-MEMORY-MODEL-FAULT-PRECISION下面直接显示完整的 ASL 所有者。
// PTO-UNIT: {"id":"PTO-ARCH-MEMORY-MODEL-FAULT-PRECISION","surface":"arch","classification":["memory-model","fault-precision"],"depends_on":["PTO-ARCH-STATE-TRAP-CONTEXT"]}func SetFaultWithCause(code: FaultCode, address: Word, cause: bits(24))begin let source_ring = CurrentACR(); let ring = if code == Fault_None then source_ring else TrapTargetForFault(source_ring); if code != Fault_None then SaveTrapContext(ring, source_ring); end; _LastFault = code; _FaultAddress = address; _ACRTrapAsynchronous[[ring]] = FALSE; _ACRTrapArgumentValid[[ring]] = code != Fault_None; _ACRTrapCause[[ring]] = cause; case code of when Fault_None => _ACRTrapNumber[[ring]] = Zeros{6}; when Fault_ExecutionStateCheck => _ACRTrapNumber[[ring]] = Zeros{6}; when Fault_IllegalInstruction => _ACRTrapNumber[[ring]] = Zeros{6} + 4; when Fault_InstructionPC => _ACRTrapNumber[[ring]] = Zeros{6} + 32; when Fault_InstructionPage => _ACRTrapNumber[[ring]] = Zeros{6} + 33; when Fault_DataAlignment => _ACRTrapNumber[[ring]] = Zeros{6} + 34; when Fault_DataPage => _ACRTrapNumber[[ring]] = Zeros{6} + 35; when Fault_HardwareBreakpoint => _ACRTrapNumber[[ring]] = Zeros{6} + 49; when Fault_SoftwareBreakpoint => _ACRTrapNumber[[ring]] = Zeros{6} + 50; when Fault_HardwareWatchpoint => _ACRTrapNumber[[ring]] = Zeros{6} + 51; when Fault_Assert => _ACRTrapNumber[[ring]] = Zeros{6} + 52; when Fault_TileLegality => _ACRTrapNumber[[ring]] = Zeros{6} + 5; when Fault_TileAllocation => _ACRTrapNumber[[ring]] = Zeros{6} + 5; when Fault_BundleControl => _ACRTrapNumber[[ring]] = Zeros{6} + 5; // B.CATR.trap is a successful-commit boundary trap, not a failed // instruction. It uses the bundle exception class while preserving // the already selected continuation in the saved clean context. when Fault_BundlePostCommit => _ACRTrapNumber[[ring]] = Zeros{6} + 5; when Fault_ServiceRequest => _ACRTrapNumber[[ring]] = Zeros{6} + 6; end; _ACRTrapArgument0[[ring]] = address; if code != Fault_None then SetCurrentACR(ring); WriteTPC(TrapVectorEntry(ring, address)); end;end;
func SetFault(code: FaultCode, address: Word)begin SetFaultWithCause(code, address, Zeros{24});end;
func RaiseServiceRequest(request_type: bits(4)) => booleanbegin let source_ring = CurrentACR(); if !ServiceRequestPermitted(source_ring, request_type) then SetFault(Fault_IllegalInstruction, ReadTPC()); return FALSE; end;
let source_tpc = ReadTPC(); let resume_tpc = source_tpc + (Zeros{PTO_XLEN} + 4); let target_ring = ServiceRequestTarget(source_ring, request_type); SaveTrapContext(target_ring, source_ring); _TrapContexts[[target_ring]].tpc = resume_tpc; let ebarg_tpc_index = ((target_ring * 4096) + 0x0f43) as SystemRegisterFileIndex; _ExtendedSystemRegisters[[ebarg_tpc_index]] = resume_tpc;
_LastFault = Fault_ServiceRequest; _FaultAddress = source_tpc; _ACRTrapAsynchronous[[target_ring]] = FALSE; _ACRTrapArgumentValid[[target_ring]] = TRUE; _ACRTrapCause[[target_ring]] = ZeroExtend{24}(request_type); _ACRTrapNumber[[target_ring]] = Zeros{6} + 6; _ACRTrapArgument0[[target_ring]] = source_tpc; SetCurrentACR(target_ring); WriteTPC(TrapVectorEntry(target_ring, source_tpc)); return TRUE;end;
func ClearFault()begin let ring = CurrentACR(); _LastFault = Fault_None; _FaultAddress = Zeros{PTO_XLEN}; _ACRTrapAsynchronous[[ring]] = FALSE; _ACRTrapArgumentValid[[ring]] = FALSE; _ACRTrapCause[[ring]] = Zeros{24}; _ACRTrapNumber[[ring]] = Zeros{6}; _ACRTrapArgument0[[ring]] = Zeros{PTO_XLEN};end;
func RaiseInterrupt(interrupt_id: InterruptID, cause: bits(24))begin let source_ring = CurrentACR(); let ring = TrapTargetForInterrupt(source_ring); SetInterruptPending(ring, interrupt_id); if !InterruptEnabled(ring, interrupt_id) then return; end; SaveTrapContext(ring, source_ring); _LastFault = Fault_None; _FaultAddress = Zeros{PTO_XLEN}; _ACRTrapAsynchronous[[ring]] = TRUE; _ACRTrapArgumentValid[[ring]] = TRUE; _ACRTrapCause[[ring]] = cause; _ACRTrapNumber[[ring]] = Zeros{6} + 44; _ACRTrapArgument0[[ring]] = NaturalToWord(interrupt_id as integer {0..262144}); SetCurrentACR(ring); WriteTPC(TrapVectorEntry(ring, ReadTPC()));end;
readonly func PackTrapStatus(ring: AccessControlRing) => Wordbegin var value: Word = Zeros{PTO_XLEN}; value[63] = if _ACRTrapAsynchronous[[ring]] then '1' else '0'; value[62] = if _ACRTrapArgumentValid[[ring]] then '1' else '0'; value[24 +: 24] = _ACRTrapCause[[ring]]; value[0 +: 6] = _ACRTrapNumber[[ring]]; return value;end;
func UnpackTrapStatus(ring: AccessControlRing, value: Word)begin _ACRTrapAsynchronous[[ring]] = value[63] == '1'; _ACRTrapArgumentValid[[ring]] = value[62] == '1'; _ACRTrapCause[[ring]] = value[24 +: 24]; _ACRTrapNumber[[ring]] = value[0 +: 6];end;
本单元集中处理故障、服务请求、中断入口以及陷阱状态打包。对于同步 SetFaultWithCause,只有故障代码不是 Fault_None 时才会保存上下文并重定向到目标 AccessControlRing。
SetFaultWithCause 对每个输入故障代码记录故障代码、地址、原因和陷阱状态。Fault_None 时,它保存上下文、把目标 AccessControlRing 设为当前层级并重定向 TPC。对于 Fault_None,它保留源 ACR 层级,既不保存上下文也不重定向。RaiseServiceRequest 检查权限,保存位于源 TPC 之后四字节的恢复 TPC,再进入服务目标。RaiseInterrupt 先标记中断待处理状态,并且只在该中断已启用时进入。44,并把 InterruptID 放入参数 0。ClearFault 清除当前 ACR 层级的故障报告,但不会重建较早上下文。PackTrapStatus 与 UnpackTrapStatus 映射异步位、参数有效位、24 位原因字段和 6 位编号字段。Fault_BundlePostCommit 被表示为成功提交边界陷阱:保存上下文时后继位置已经选定。被拒绝的服务请求则会引发 Fault_IllegalInstruction 并返回假。
本示例块只用于帮助阅读:先应用上文规则,再到规范 ASL 所有者中确认结果。它不会增加任何架构契约。
PTO-ARCH-STATE-TRAP-CONTEXT 拥有保存上下文的表示。正文来自 owning ASL。拖拽或按钮只临时改变当前页面显示顺序。
No NDF clause is attached to this unit.
8 matching entries
PTO-AVS-ARCH-MEMORY-MODEL-FAULT-PRECISION-STATIC-001tests/asl/arch/memory-model/fault-precision/arch-static-fault-precision-contract-001.asl39d43ace5ca58e8c5bd335cd727dad9e83262f40f61f95edf6ed0ac002b4a298PTO-EVIDENCE-RELEASE-TRACEABILITYPTO-EVIDENCE-RELEASE-TRACEABILITYspec/evidence/release-traceability-readiness.jsonc7327021d39dc67ac5564bc55073b3870a397d79ac8d9648284d56e33bc14a3ePTO-EVIDENCE-INSTRUCTION-CONTRACT-CLOSUREPTO-EVIDENCE-INSTRUCTION-CONTRACT-CLOSUREspec/evidence/instruction-contract-closure.json3ef2bb62421c79dff8fa77a1c7983923b523244b8090812883ef81286ca8106aPTO-EVIDENCE-ARCHITECTURE-READINESSPTO-EVIDENCE-ARCHITECTURE-READINESSspec/evidence/architecture-readiness.json4b0b85199101251bea744e0f3591cc31906909dc80d5ab651c417a936036a004PTO-EVIDENCE-RELEASE-GATE-READINESSPTO-EVIDENCE-RELEASE-GATE-READINESSspec/evidence/release-gate-readiness.jsona0f4d2b6920c08981ea55fd8ef820708a40d4feb5402c5150e8e9ab532d84ce0PTO-EVIDENCE-RELEASE-MANIFESTPTO-EVIDENCE-RELEASE-MANIFESTspec/release-manifest.json1a64c109ed7a90351c41e2a418b3c0ebaf8ad975838986d2101385186b85c0d8Loading ADR-0006…
ADR-0006docs/status/decisions/0006-pto-total-store-order.mdb80d8782e4587d4023edf02df9d2ba4d3cb2b2999fdc8991e49a2af4f9817735Loading ADR-0020…
ADR-0020docs/status/decisions/0020-production-memory-events-and-atomic-corners.md215b18f05d0b53120949373fce6a5ce22f7ab534fb22df24743a9b2b4beb2dec{
"classification": [
"memory-model",
"fault-precision"
],
"documentation": "docs/arch/memory-model/fault-precision.md",
"id": "PTO-ARCH-MEMORY-MODEL-FAULT-PRECISION",
"mnemonic": null,
"readiness_subjects": [
"ADR-0006",
"ADR-0020"
],
"semantic_tests": [],
"source": "asl/arch/memory-model/fault-precision.asl",
"surface": "arch",
"tests": [
"PTO-AVS-ARCH-MEMORY-MODEL-FAULT-PRECISION-STATIC-001"
]
}0.58.5 · 候选发布7dc8b7e5b121d2b2499a2273bebff29e2cd86812b6118998eef77d70e5aec9fffbf56c3ea02bf6d817b713e30b9dc543d68adf477c6bba5df0053a719b124b84f3ea3dddf7626ac4925acd81f225783104539c86asl/arch/memory-model/fault-precision.asl