46 lines
1.5 KiB
Rust
46 lines
1.5 KiB
Rust
//! Regression test: input is no longer exposed through the syscall registry.
|
|
use prometeu_bytecode::isa::core::CoreOpCode as OpCode;
|
|
use prometeu_hal::vm_fault::VmFault;
|
|
use prometeu_vm::{HostContext, HostReturn, NativeInterface, VirtualMachine};
|
|
|
|
fn enc_op(op: OpCode) -> [u8; 2] {
|
|
(op as u16).to_le_bytes()
|
|
}
|
|
|
|
#[test]
|
|
fn vm_rejects_legacy_input_syscall_id() {
|
|
// Legacy input syscall id (PadGetUp) must now be rejected as unknown syscall.
|
|
let mut rom = Vec::new();
|
|
rom.extend_from_slice(&enc_op(OpCode::Syscall));
|
|
rom.extend_from_slice(&0x2200u32.to_le_bytes());
|
|
rom.extend_from_slice(&enc_op(OpCode::Halt));
|
|
|
|
struct NoopNative;
|
|
impl NativeInterface for NoopNative {
|
|
fn syscall(
|
|
&mut self,
|
|
_id: u32,
|
|
_args: &[prometeu_bytecode::Value],
|
|
_ret: &mut HostReturn,
|
|
_ctx: &mut HostContext,
|
|
) -> Result<(), VmFault> {
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
let mut vm = VirtualMachine::new(rom, vec![]);
|
|
let mut native = NoopNative;
|
|
let mut ctx = HostContext::new(None);
|
|
vm.prepare_call("0");
|
|
vm.set_capabilities(prometeu_hal::syscalls::caps::ALL);
|
|
|
|
let report = vm.run_budget(100, &mut native, &mut ctx).expect("VM run failed");
|
|
match report.reason {
|
|
prometeu_vm::LogicalFrameEndingReason::Trap(trap) => {
|
|
assert_eq!(trap.code, prometeu_bytecode::TRAP_INVALID_SYSCALL);
|
|
assert!(trap.message.contains("Unknown syscall"));
|
|
}
|
|
other => panic!("Expected invalid syscall trap, got {:?}", other),
|
|
}
|
|
}
|