xref: /DragonOS/kernel/src/virt/kvm/mod.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a)
140314b30SXiaoye Zheng use self::kvm_dev::LockedKvmInode;
240314b30SXiaoye Zheng use crate::arch::KVMArch;
340314b30SXiaoye Zheng use crate::filesystem::devfs::devfs_register;
4*2eab6dd7S曾俊 
540314b30SXiaoye Zheng use crate::libs::mutex::Mutex;
640314b30SXiaoye Zheng use alloc::vec::Vec;
7*2eab6dd7S曾俊 use log::debug;
840314b30SXiaoye Zheng use vm::Vm;
940314b30SXiaoye Zheng 
1040314b30SXiaoye Zheng pub mod host_mem;
1140314b30SXiaoye Zheng mod kvm_dev;
1240314b30SXiaoye Zheng pub mod vcpu;
1340314b30SXiaoye Zheng mod vcpu_dev;
1440314b30SXiaoye Zheng pub mod vm;
1540314b30SXiaoye Zheng mod vm_dev;
1640314b30SXiaoye Zheng 
1740314b30SXiaoye Zheng // pub const KVM_MAX_VCPUS:u32 = 255;
1840314b30SXiaoye Zheng // pub const GUEST_STACK_SIZE:usize = 1024;
1940314b30SXiaoye Zheng // pub const HOST_STACK_SIZE:usize = 0x1000 * 6;
2040314b30SXiaoye Zheng 
2140314b30SXiaoye Zheng /// @brief 获取全局的VM list
2240314b30SXiaoye Zheng pub static VM_LIST: Mutex<Vec<Vm>> = Mutex::new(Vec::new());
2340314b30SXiaoye Zheng 
push_vm(id: usize) -> Result<(), ()>2440314b30SXiaoye Zheng pub fn push_vm(id: usize) -> Result<(), ()> {
2540314b30SXiaoye Zheng     let mut vm_list = VM_LIST.lock();
2640314b30SXiaoye Zheng     if vm_list.iter().any(|x| x.id == id) {
27*2eab6dd7S曾俊         debug!("push_vm: vm {} already exists", id);
2840314b30SXiaoye Zheng         Err(())
2940314b30SXiaoye Zheng     } else {
3040314b30SXiaoye Zheng         vm_list.push(Vm::new(id).unwrap());
3140314b30SXiaoye Zheng         Ok(())
3240314b30SXiaoye Zheng     }
3340314b30SXiaoye Zheng }
3440314b30SXiaoye Zheng 
remove_vm(id: usize) -> Vm3540314b30SXiaoye Zheng pub fn remove_vm(id: usize) -> Vm {
3640314b30SXiaoye Zheng     let mut vm_list = VM_LIST.lock();
3740314b30SXiaoye Zheng     match vm_list.iter().position(|x| x.id == id) {
3840314b30SXiaoye Zheng         None => {
3940314b30SXiaoye Zheng             panic!("VM[{}] not exist in VM LIST", id);
4040314b30SXiaoye Zheng         }
4140314b30SXiaoye Zheng         Some(idx) => vm_list.remove(idx),
4240314b30SXiaoye Zheng     }
4340314b30SXiaoye Zheng }
4440314b30SXiaoye Zheng 
update_vm(id: usize, new_vm: Vm)4540314b30SXiaoye Zheng pub fn update_vm(id: usize, new_vm: Vm) {
4640314b30SXiaoye Zheng     remove_vm(id);
4740314b30SXiaoye Zheng     let mut vm_list = VM_LIST.lock();
4840314b30SXiaoye Zheng     vm_list.push(new_vm);
4940314b30SXiaoye Zheng }
5040314b30SXiaoye Zheng 
vm(id: usize) -> Option<Vm>5140314b30SXiaoye Zheng pub fn vm(id: usize) -> Option<Vm> {
5240314b30SXiaoye Zheng     let vm_list = VM_LIST.lock();
5340314b30SXiaoye Zheng     vm_list.iter().find(|&x| x.id == id).cloned()
5440314b30SXiaoye Zheng }
5540314b30SXiaoye Zheng 
565b59005fSLoGin #[inline(never)]
kvm_init()575b59005fSLoGin pub fn kvm_init() {
58*2eab6dd7S曾俊     debug!("kvm init");
5940314b30SXiaoye Zheng 
6040314b30SXiaoye Zheng     match KVMArch::kvm_arch_cpu_supports_vm() {
6140314b30SXiaoye Zheng         Ok(_) => {
62*2eab6dd7S曾俊             debug!("[+] CPU supports Intel VMX");
6340314b30SXiaoye Zheng         }
6440314b30SXiaoye Zheng         Err(e) => {
65*2eab6dd7S曾俊             debug!("[-] CPU does not support Intel VMX: {:?}", e);
6640314b30SXiaoye Zheng         }
6740314b30SXiaoye Zheng     };
6840314b30SXiaoye Zheng 
6940314b30SXiaoye Zheng     KVMArch::kvm_arch_init().expect("kvm arch init");
7040314b30SXiaoye Zheng 
7140314b30SXiaoye Zheng     devfs_register("kvm", LockedKvmInode::new()).expect("Failed to register /dev/kvm");
7240314b30SXiaoye Zheng     // let r = devfs_register("kvm", LockedKvmInode::new());
7340314b30SXiaoye Zheng     // if r.is_err() {
7440314b30SXiaoye Zheng     //     panic!("Failed to register /dev/kvm");
7540314b30SXiaoye Zheng     // }
7640314b30SXiaoye Zheng     // let guest_stack = vec![0xCC; GUEST_STACK_SIZE];
7740314b30SXiaoye Zheng     // let host_stack = vec![0xCC; HOST_STACK_SIZE];
7840314b30SXiaoye Zheng     // let guest_rsp = guest_stack.as_ptr() as u64 + GUEST_STACK_SIZE as u64;
7940314b30SXiaoye Zheng     // let host_rsp = (host_stack.as_ptr() as u64) + HOST_STACK_SIZE  as u64;
80*2eab6dd7S曾俊     // debug!("guest rsp: {:x}", guest_rsp);
81*2eab6dd7S曾俊     // debug!("guest rip: {:x}", guest_code as *const () as u64);
82*2eab6dd7S曾俊     // debug!("host rsp: {:x}", host_rsp);
8340314b30SXiaoye Zheng     // let hypervisor = Hypervisor::new(1, host_rsp, 0).expect("Cannot create hypervisor");
8440314b30SXiaoye Zheng     // let vcpu = VmxVcpu::new(1, Arc::new(Mutex::new(hypervisor)), host_rsp, guest_rsp,  guest_code as *const () as u64).expect("Cannot create VcpuData");
8540314b30SXiaoye Zheng     // vcpu.virtualize_cpu().expect("Cannot virtualize cpu");
8640314b30SXiaoye Zheng }
87