mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2024-11-29 03:00:19 +00:00
569a58490e
When creating shared memory, 'name' can have one of two meanings. It could either be a debugging tag with no semantic meaning, or it could uniquely identify a shared memory object within some namespace. Linux memfd uses name in the first meaning, whereas Windows (and Linux shm) uses it in the second meaning. Currently, crosvm has no use cases for the named shared memory of the second type, so it is not supported. Make it clear that the SharedMemory APIs treats name as a debugging-only name. Remove the "anon" and "named" constructors, since they had no semantic meaning. Also require a name when constructing a SharedMemory, since there's no reason not to provide one to make debugging easier. The only semantic change is setting the name of GuestMemory's underlying shmem to "crosvm_guest", which it was until recently. This fixes some ManaTEE tests which use the name to determine CrOS guest memory usage. BUG=None TEST=compiles Change-Id: I78d5046df04d6f19640abbbc67af6bd433a177b0 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3676695 Commit-Queue: David Stevens <stevensd@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
77 lines
2.5 KiB
Rust
77 lines
2.5 KiB
Rust
// Copyright 2017 The Chromium OS Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#![cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
|
|
|
use base::{MemoryMappingBuilder, SharedMemory};
|
|
use kvm::*;
|
|
use kvm_sys::kvm_regs;
|
|
use vm_memory::{GuestAddress, GuestMemory};
|
|
|
|
#[test]
|
|
fn test_run() {
|
|
/*
|
|
0000 881C mov [si],bl
|
|
0002 F4 hlt
|
|
*/
|
|
let code = [0x88, 0x1c, 0xf4];
|
|
let mem_size = 0x10000;
|
|
let load_addr = GuestAddress(0x1000);
|
|
let guest_mem = GuestMemory::new(&[]).unwrap();
|
|
let mem = SharedMemory::new("test", mem_size).expect("failed to create shared memory");
|
|
let mmap = MemoryMappingBuilder::new(mem_size as usize)
|
|
.from_shared_memory(&mem)
|
|
.build()
|
|
.expect("failed to create memory mapping");
|
|
|
|
mmap.write_slice(&code[..], load_addr.offset() as usize)
|
|
.expect("Writing code to memory failed.");
|
|
|
|
let kvm = Kvm::new().expect("new kvm failed");
|
|
let mut vm = Vm::new(&kvm, guest_mem).expect("new vm failed");
|
|
let vcpu = Vcpu::new(0, &kvm, &vm).expect("new vcpu failed");
|
|
let mut vcpu_sregs = vcpu.get_sregs().expect("get sregs failed");
|
|
vcpu_sregs.cs.base = 0;
|
|
vcpu_sregs.cs.selector = 0;
|
|
vcpu.set_sregs(&vcpu_sregs).expect("set sregs failed");
|
|
|
|
let mut vcpu_regs: kvm_regs = unsafe { std::mem::zeroed() };
|
|
vcpu_regs.rip = load_addr.offset() as u64;
|
|
vcpu_regs.rflags = 2;
|
|
// Write 0x12 to the beginning of the 9th page.
|
|
vcpu_regs.rsi = 0x8000;
|
|
vcpu_regs.rbx = 0x12;
|
|
vcpu.set_regs(&vcpu_regs).expect("set regs failed");
|
|
let slot = vm
|
|
.add_memory_region(
|
|
GuestAddress(0),
|
|
Box::new(
|
|
MemoryMappingBuilder::new(mem_size as usize)
|
|
.from_shared_memory(&mem)
|
|
.build()
|
|
.expect("failed to create memory mapping"),
|
|
),
|
|
false,
|
|
true,
|
|
)
|
|
.expect("failed to register memory");
|
|
|
|
let runnable_vcpu = vcpu.to_runnable(None).unwrap();
|
|
loop {
|
|
match runnable_vcpu.run().expect("run failed") {
|
|
VcpuExit::Hlt => break,
|
|
r => panic!("unexpected exit reason: {:?}", r),
|
|
}
|
|
}
|
|
|
|
let mut dirty_log = [0x0, 0x0];
|
|
vm.get_dirty_log(slot, &mut dirty_log[..])
|
|
.expect("failed to get dirty log");
|
|
// Tests the 9th page was written to.
|
|
assert_eq!(dirty_log[1], 0x1);
|
|
assert_eq!(
|
|
mmap.read_obj::<u64>(vcpu_regs.rsi as usize).unwrap(),
|
|
vcpu_regs.rbx
|
|
);
|
|
}
|