//! 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), } }