pr 2.5
This commit is contained in:
parent
24e7a3b083
commit
8ce12d9a71
@ -2907,6 +2907,128 @@ mod tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_loader_patching_propagates_missing_capability() {
|
||||||
|
let mut vm = VirtualMachine::default();
|
||||||
|
vm.set_capabilities(prometeu_hal::syscalls::caps::NONE);
|
||||||
|
|
||||||
|
let code = assemble("HOSTCALL 0\nHALT").expect("assemble");
|
||||||
|
let bytes = serialized_single_function_module(
|
||||||
|
code,
|
||||||
|
vec![SyscallDecl {
|
||||||
|
module: "gfx".into(),
|
||||||
|
name: "clear".into(),
|
||||||
|
version: 1,
|
||||||
|
arg_slots: 1,
|
||||||
|
ret_slots: 0,
|
||||||
|
}],
|
||||||
|
);
|
||||||
|
|
||||||
|
let res = vm.initialize(bytes, "");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
res,
|
||||||
|
Err(VmInitError::LoaderPatchFailed(
|
||||||
|
crate::vm_init_error::LoaderPatchError::ResolveFailed(
|
||||||
|
prometeu_hal::syscalls::DeclaredLoadError::MissingCapability {
|
||||||
|
required: prometeu_hal::syscalls::caps::GFX,
|
||||||
|
provided: prometeu_hal::syscalls::caps::NONE,
|
||||||
|
module: "gfx".into(),
|
||||||
|
name: "clear".into(),
|
||||||
|
version: 1,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_loader_patching_propagates_abi_mismatch() {
|
||||||
|
let mut vm = VirtualMachine::default();
|
||||||
|
vm.set_capabilities(prometeu_hal::syscalls::caps::GFX);
|
||||||
|
|
||||||
|
let code = assemble("HOSTCALL 0\nHALT").expect("assemble");
|
||||||
|
let bytes = serialized_single_function_module(
|
||||||
|
code,
|
||||||
|
vec![SyscallDecl {
|
||||||
|
module: "gfx".into(),
|
||||||
|
name: "draw_line".into(),
|
||||||
|
version: 1,
|
||||||
|
arg_slots: 4,
|
||||||
|
ret_slots: 0,
|
||||||
|
}],
|
||||||
|
);
|
||||||
|
|
||||||
|
let res = vm.initialize(bytes, "");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
res,
|
||||||
|
Err(VmInitError::LoaderPatchFailed(
|
||||||
|
crate::vm_init_error::LoaderPatchError::ResolveFailed(
|
||||||
|
prometeu_hal::syscalls::DeclaredLoadError::AbiMismatch {
|
||||||
|
module: "gfx".into(),
|
||||||
|
name: "draw_line".into(),
|
||||||
|
version: 1,
|
||||||
|
declared_arg_slots: 4,
|
||||||
|
declared_ret_slots: 0,
|
||||||
|
expected_arg_slots: 5,
|
||||||
|
expected_ret_slots: 0,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_loader_hardening_missing_sysc_section() {
|
||||||
|
let mut vm = VirtualMachine::default();
|
||||||
|
let mut header = vec![0u8; 32];
|
||||||
|
header[0..4].copy_from_slice(b"PBS\0");
|
||||||
|
|
||||||
|
let res = vm.initialize(header, "");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
res,
|
||||||
|
Err(VmInitError::ImageLoadFailed(
|
||||||
|
prometeu_bytecode::LoadError::MissingSyscallSection
|
||||||
|
))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_loader_hardening_duplicate_sysc_identity() {
|
||||||
|
let mut vm = VirtualMachine::default();
|
||||||
|
|
||||||
|
let bytes = serialized_single_function_module(
|
||||||
|
vec![],
|
||||||
|
vec![
|
||||||
|
SyscallDecl {
|
||||||
|
module: "system".into(),
|
||||||
|
name: "has_cart".into(),
|
||||||
|
version: 1,
|
||||||
|
arg_slots: 0,
|
||||||
|
ret_slots: 1,
|
||||||
|
},
|
||||||
|
SyscallDecl {
|
||||||
|
module: "system".into(),
|
||||||
|
name: "has_cart".into(),
|
||||||
|
version: 1,
|
||||||
|
arg_slots: 0,
|
||||||
|
ret_slots: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
let res = vm.initialize(bytes, "");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
res,
|
||||||
|
Err(VmInitError::ImageLoadFailed(
|
||||||
|
prometeu_bytecode::LoadError::DuplicateSyscallIdentity
|
||||||
|
))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_calling_convention_add() {
|
fn test_calling_convention_add() {
|
||||||
let mut native = MockNative;
|
let mut native = MockNative;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user