pr1.2
This commit is contained in:
parent
73dc0c4cb2
commit
29056ce0ad
@ -1,19 +1,17 @@
|
|||||||
//! This module defines the Application Binary Interface (ABI) of the Prometeu Virtual Machine.
|
//! This module defines the Application Binary Interface (ABI) of the Prometeu Virtual Machine.
|
||||||
//! It specifies how instructions are encoded in bytes and how they interact with memory.
|
//! It specifies how instructions are encoded in bytes and how they interact with memory.
|
||||||
|
|
||||||
// --- HIP Trap Codes ---
|
// --- Runtime Trap Codes (post-HIP reset) ---
|
||||||
|
|
||||||
/// Attempted to access a gate that does not exist or has been recycled incorrectly.
|
/// Attempted to execute an unknown or invalid opcode.
|
||||||
pub const TRAP_INVALID_GATE: u32 = 0x01;
|
pub const TRAP_ILLEGAL_INSTRUCTION: u32 = 0x0000_0001;
|
||||||
/// Attempted to access a gate that has been explicitly released (RC=0).
|
/// Out-of-bounds access (e.g., stack/heap/local index out of range).
|
||||||
pub const TRAP_DEAD_GATE: u32 = 0x02;
|
pub const TRAP_OOB: u32 = 0x0000_0003;
|
||||||
/// Attempted to access a field or index beyond the allocated slots for a gate.
|
/// Type mismatch for the attempted operation (e.g., wrong operand type or syscall argument type).
|
||||||
pub const TRAP_OOB: u32 = 0x03;
|
pub const TRAP_TYPE: u32 = 0x0000_0004;
|
||||||
/// Attempted a typed operation on a gate whose storage type does not match.
|
|
||||||
pub const TRAP_TYPE: u32 = 0x04;
|
|
||||||
/// The syscall ID provided is not recognized by the system.
|
/// The syscall ID provided is not recognized by the system.
|
||||||
pub const TRAP_INVALID_SYSCALL: u32 = 0x0000_0007;
|
pub const TRAP_INVALID_SYSCALL: u32 = 0x0000_0007;
|
||||||
/// Not enough arguments on the stack for the requested syscall.
|
/// Not enough values on the operand stack for the requested operation/syscall.
|
||||||
pub const TRAP_STACK_UNDERFLOW: u32 = 0x0000_0008;
|
pub const TRAP_STACK_UNDERFLOW: u32 = 0x0000_0008;
|
||||||
/// Attempted to access a local slot that is out of bounds for the current frame.
|
/// Attempted to access a local slot that is out of bounds for the current frame.
|
||||||
pub const TRAP_INVALID_LOCAL: u32 = 0x0000_0009;
|
pub const TRAP_INVALID_LOCAL: u32 = 0x0000_0009;
|
||||||
|
|||||||
@ -8,9 +8,8 @@ mod program_image;
|
|||||||
mod value;
|
mod value;
|
||||||
|
|
||||||
pub use abi::{
|
pub use abi::{
|
||||||
TrapInfo, TRAP_BAD_RET_SLOTS, TRAP_DEAD_GATE, TRAP_DIV_ZERO, TRAP_INVALID_FUNC,
|
TrapInfo, TRAP_BAD_RET_SLOTS, TRAP_DIV_ZERO, TRAP_ILLEGAL_INSTRUCTION, TRAP_INVALID_FUNC,
|
||||||
TRAP_INVALID_GATE, TRAP_INVALID_LOCAL, TRAP_INVALID_SYSCALL, TRAP_OOB, TRAP_STACK_UNDERFLOW,
|
TRAP_INVALID_LOCAL, TRAP_INVALID_SYSCALL, TRAP_OOB, TRAP_STACK_UNDERFLOW, TRAP_TYPE,
|
||||||
TRAP_TYPE,
|
|
||||||
};
|
};
|
||||||
pub use decoder::{decode_next, DecodeError};
|
pub use decoder::{decode_next, DecodeError};
|
||||||
pub use layout::{compute_function_layouts, FunctionLayout};
|
pub use layout::{compute_function_layouts, FunctionLayout};
|
||||||
|
|||||||
@ -7,8 +7,8 @@ use prometeu_bytecode::OpCode;
|
|||||||
use prometeu_bytecode::ProgramImage;
|
use prometeu_bytecode::ProgramImage;
|
||||||
use prometeu_bytecode::Value;
|
use prometeu_bytecode::Value;
|
||||||
use prometeu_bytecode::{
|
use prometeu_bytecode::{
|
||||||
TRAP_BAD_RET_SLOTS, TRAP_DEAD_GATE, TRAP_DIV_ZERO, TRAP_INVALID_FUNC, TRAP_INVALID_GATE,
|
TRAP_BAD_RET_SLOTS, TRAP_DIV_ZERO, TRAP_INVALID_FUNC, TRAP_INVALID_SYSCALL, TRAP_OOB,
|
||||||
TRAP_INVALID_SYSCALL, TRAP_OOB, TRAP_STACK_UNDERFLOW, TRAP_TYPE, TrapInfo,
|
TRAP_STACK_UNDERFLOW, TRAP_TYPE, TrapInfo,
|
||||||
};
|
};
|
||||||
use prometeu_hal::vm_fault::VmFault;
|
use prometeu_hal::vm_fault::VmFault;
|
||||||
|
|
||||||
@ -1156,11 +1156,11 @@ impl VirtualMachine {
|
|||||||
) -> Result<&GateEntry, LogicalFrameEndingReason> {
|
) -> Result<&GateEntry, LogicalFrameEndingReason> {
|
||||||
let idx = gate_id as usize;
|
let idx = gate_id as usize;
|
||||||
let entry = self.gate_pool.get(idx).ok_or_else(|| {
|
let entry = self.gate_pool.get(idx).ok_or_else(|| {
|
||||||
self.trap(TRAP_INVALID_GATE, opcode, format!("Invalid gate id: {}", gate_id), pc)
|
self.trap(TRAP_OOB, opcode, format!("Invalid gate id: {}", gate_id), pc)
|
||||||
})?;
|
})?;
|
||||||
if !entry.alive {
|
if !entry.alive {
|
||||||
return Err(self.trap(
|
return Err(self.trap(
|
||||||
TRAP_DEAD_GATE,
|
TRAP_OOB,
|
||||||
opcode,
|
opcode,
|
||||||
format!("Dead gate id: {}", gate_id),
|
format!("Dead gate id: {}", gate_id),
|
||||||
pc,
|
pc,
|
||||||
@ -2034,7 +2034,7 @@ mod tests {
|
|||||||
let report = vm.run_budget(100, &mut native, &mut ctx).unwrap();
|
let report = vm.run_budget(100, &mut native, &mut ctx).unwrap();
|
||||||
match report.reason {
|
match report.reason {
|
||||||
LogicalFrameEndingReason::Trap(trap) => {
|
LogicalFrameEndingReason::Trap(trap) => {
|
||||||
assert_eq!(trap.code, TRAP_INVALID_GATE);
|
assert_eq!(trap.code, TRAP_OOB);
|
||||||
assert_eq!(trap.opcode, OpCode::GateLoad as u16);
|
assert_eq!(trap.opcode, OpCode::GateLoad as u16);
|
||||||
}
|
}
|
||||||
_ => panic!("Expected Trap, got {:?}", report.reason),
|
_ => panic!("Expected Trap, got {:?}", report.reason),
|
||||||
|
|||||||
@ -25,10 +25,10 @@ grep -RIn --exclude-dir target \
|
|||||||
# Scope-related (inventory only; not necessarily to delete)
|
# Scope-related (inventory only; not necessarily to delete)
|
||||||
grep -RIn --exclude-dir target -e 'PushScope' -e 'PopScope' crates/console
|
grep -RIn --exclude-dir target -e 'PushScope' -e 'PopScope' crates/console
|
||||||
|
|
||||||
# Trap codes with HIP/RC semantics
|
# Trap codes inventory (post-reset, check for any lingering gate-specific traps)
|
||||||
grep -RIn --exclude-dir target \
|
grep -RIn --exclude-dir target \
|
||||||
-e 'TRAP_INVALID_GATE' -e 'TRAP_DEAD_GATE' -e 'TRAP_TYPE' \
|
-e '\bTRAP_\w\+' \
|
||||||
crates/console/prometeu-bytecode crates/console/prometeu-vm
|
crates/console/prometeu-bytecode crates/console/prometeu-vm | grep -Ei 'gate|heap|hip' -n || true
|
||||||
|
|
||||||
# Value::Gate usages
|
# Value::Gate usages
|
||||||
grep -RIn --exclude-dir target -e 'Value::Gate' crates/console
|
grep -RIn --exclude-dir target -e 'Value::Gate' crates/console
|
||||||
@ -88,11 +88,9 @@ Remove — OpCode variants (definitions and all references)
|
|||||||
|
|
||||||
2) Trap codes (RC/HIP)
|
2) Trap codes (RC/HIP)
|
||||||
|
|
||||||
Remove — HIP-specific traps (delete constants and all usages)
|
Remove — gate-specific traps (delete constants and all usages)
|
||||||
- crates/console/prometeu-bytecode/src/abi.rs
|
- crates/console/prometeu-bytecode/src/abi.rs
|
||||||
- TRAP_INVALID_GATE (0x01)
|
- Remove identifiers tied to HIP/gate semantics
|
||||||
- TRAP_DEAD_GATE (0x02)
|
|
||||||
- TRAP_TYPE (0x04) — typed storage/gate mismatch (legacy)
|
|
||||||
|
|
||||||
Keep — still meaningful under GC model (names may be revised later, but remain functionally)
|
Keep — still meaningful under GC model (names may be revised later, but remain functionally)
|
||||||
- crates/console/prometeu-bytecode/src/abi.rs
|
- crates/console/prometeu-bytecode/src/abi.rs
|
||||||
@ -103,10 +101,11 @@ Keep — still meaningful under GC model (names may be revised later, but remain
|
|||||||
- TRAP_DIV_ZERO (0x0000_000A)
|
- TRAP_DIV_ZERO (0x0000_000A)
|
||||||
- TRAP_INVALID_FUNC (0x0000_000B)
|
- TRAP_INVALID_FUNC (0x0000_000B)
|
||||||
- TRAP_BAD_RET_SLOTS (0x0000_000C)
|
- TRAP_BAD_RET_SLOTS (0x0000_000C)
|
||||||
|
- TRAP_TYPE — retained; semantics generalized to non-HIP type mismatches
|
||||||
|
|
||||||
Usages to edit alongside removal
|
Usages to edit alongside removal
|
||||||
- crates/console/prometeu-vm/src/virtual_machine.rs
|
- crates/console/prometeu-vm/src/virtual_machine.rs
|
||||||
- Imports: TRAP_INVALID_GATE, TRAP_DEAD_GATE, TRAP_TYPE
|
- Imports: remove any gate-specific trap imports
|
||||||
- resolve_gate() and gate handlers construct TrapInfo with those codes
|
- resolve_gate() and gate handlers construct TrapInfo with those codes
|
||||||
- Tests asserting these trap codes
|
- Tests asserting these trap codes
|
||||||
|
|
||||||
@ -144,7 +143,7 @@ Will be removed outright (symbols or blocks)
|
|||||||
- prometeu-bytecode
|
- prometeu-bytecode
|
||||||
- opcode.rs: all Gate* variants and Alloc variant; TryFrom/encoding IDs and cycles for those
|
- opcode.rs: all Gate* variants and Alloc variant; TryFrom/encoding IDs and cycles for those
|
||||||
- opcode_spec.rs: corresponding spec arms (GATE_*, ALLOC)
|
- opcode_spec.rs: corresponding spec arms (GATE_*, ALLOC)
|
||||||
- abi.rs: TRAP_INVALID_GATE, TRAP_DEAD_GATE, TRAP_TYPE constants
|
- abi.rs: gate-specific trap constants
|
||||||
- prometeu-vm
|
- prometeu-vm
|
||||||
- virtual_machine.rs: handlers for Alloc and all Gate* opcodes; GateEntry/GateId data structures; resolve_gate(); HIP-focused unit tests listed above
|
- virtual_machine.rs: handlers for Alloc and all Gate* opcodes; GateEntry/GateId data structures; resolve_gate(); HIP-focused unit tests listed above
|
||||||
|
|
||||||
|
|||||||
@ -81,13 +81,15 @@ TrapInfo {
|
|||||||
| `TRAP_OOB` | Out of bounds | Access beyond allowed bounds |
|
| `TRAP_OOB` | Out of bounds | Access beyond allowed bounds |
|
||||||
| `TRAP_INVALID_LOCAL` | Invalid local | Local slot index out of bounds |
|
| `TRAP_INVALID_LOCAL` | Invalid local | Local slot index out of bounds |
|
||||||
|
|
||||||
### 5.2 Heap / Gate
|
### 5.2 Execution & Types
|
||||||
|
|
||||||
| Code | Name | Meaning |
|
| Code | Name | Meaning |
|
||||||
| ------------------- | -------------- | -------------------------- |
|
| ------------------------- | -------------------- | ------------------------------------------------------ |
|
||||||
| `TRAP_INVALID_GATE` | Invalid gate | Non-existent gate handle |
|
| `TRAP_ILLEGAL_INSTRUCTION`| Illegal instruction | Unknown/invalid opcode encountered |
|
||||||
| `TRAP_DEAD_GATE` | Dead gate | Gate with refcount = 0 |
|
| `TRAP_TYPE` | Type violation | Type mismatch for operation or syscall argument types |
|
||||||
| `TRAP_TYPE` | Type violation | Heap or gate type mismatch |
|
| `TRAP_DIV_ZERO` | Divide by zero | Division/modulo by zero |
|
||||||
|
| `TRAP_INVALID_FUNC` | Invalid function | Function index not present in function table |
|
||||||
|
| `TRAP_BAD_RET_SLOTS` | Bad return slots | Stack height mismatch at return |
|
||||||
|
|
||||||
### 5.3 System
|
### 5.3 System
|
||||||
|
|
||||||
|
|||||||
@ -1,37 +1,3 @@
|
|||||||
# PR-1.2 — Remove HIP/RC Trap Codes From ABI
|
|
||||||
|
|
||||||
### Briefing
|
|
||||||
|
|
||||||
The new architecture removes HIP/RC completely. Any ABI surface describing HIP traps or gate-related traps must be deleted.
|
|
||||||
|
|
||||||
### Target
|
|
||||||
|
|
||||||
* Delete HIP/RC trap codes from bytecode ABI.
|
|
||||||
* Replace with a minimal, architecture-aligned trap/error taxonomy.
|
|
||||||
|
|
||||||
### Work items
|
|
||||||
|
|
||||||
* Remove HIP trap constants/enums (e.g., anything like `TRAP_INVALID_GATE`, `TRAP_DEAD_GATE`, and related HIP trap identifiers).
|
|
||||||
* If there is a shared trap enum used by VM/tooling:
|
|
||||||
|
|
||||||
* Keep only traps that remain meaningful in the GC stack+heap model (e.g., OOB, illegal instruction, stack underflow), as specified.
|
|
||||||
* Rename/restructure as needed to reflect the reset.
|
|
||||||
* Update any match arms / formatting / disasm text that referenced HIP traps.
|
|
||||||
* Update tests and fixtures accordingly.
|
|
||||||
|
|
||||||
### Acceptance checklist
|
|
||||||
|
|
||||||
* [ ] No HIP/gate trap identifiers remain in the codebase.
|
|
||||||
* [ ] Bytecode crates compile.
|
|
||||||
* [ ] Disassembler / printers compile and produce readable output for remaining traps.
|
|
||||||
* [ ] `cargo test` passes.
|
|
||||||
|
|
||||||
### Tests
|
|
||||||
|
|
||||||
* Update/adjust any trap-related unit tests.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# PR-1.3 — Remove RC/HIP Opcodes From `opcode` and Decode/Encode Paths
|
# PR-1.3 — Remove RC/HIP Opcodes From `opcode` and Decode/Encode Paths
|
||||||
|
|
||||||
### Briefing
|
### Briefing
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user