mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-04 05:31:32 +00:00
wip hvm
This commit is contained in:
@ -346,6 +346,8 @@ pub struct ArchDomainConfig {
|
|||||||
pub misc_flags: u32,
|
pub misc_flags: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub const X86_EMU_LAPIC: u32 = 1 << 0;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Copy, Clone, Debug, Default)]
|
#[derive(Copy, Clone, Debug, Default)]
|
||||||
#[cfg(target_arch = "aarch64")]
|
#[cfg(target_arch = "aarch64")]
|
||||||
|
@ -91,7 +91,6 @@ impl BootSetup<'_> {
|
|||||||
kernel_segment: &Option<DomainSegment>,
|
kernel_segment: &Option<DomainSegment>,
|
||||||
initrd_segment: &Option<DomainSegment>,
|
initrd_segment: &Option<DomainSegment>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
self.call.set_address_size(self.domid, 64).await?;
|
|
||||||
arch.meminit(self, total_pages, kernel_segment, initrd_segment)
|
arch.meminit(self, total_pages, kernel_segment, initrd_segment)
|
||||||
.await?;
|
.await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -31,8 +31,7 @@ use std::str::FromStr;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
use xencall::sys::{
|
use xencall::sys::{
|
||||||
CreateDomain, DOMCTL_DEV_RDM_RELAXED, XEN_DOMCTL_CDF_HAP, XEN_DOMCTL_CDF_HVM_GUEST,
|
CreateDomain, DOMCTL_DEV_RDM_RELAXED, X86_EMU_LAPIC, XEN_DOMCTL_CDF_HAP, XEN_DOMCTL_CDF_HVM_GUEST, XEN_DOMCTL_CDF_IOMMU
|
||||||
XEN_DOMCTL_CDF_IOMMU,
|
|
||||||
};
|
};
|
||||||
use xencall::XenCall;
|
use xencall::XenCall;
|
||||||
use xenstore::{
|
use xenstore::{
|
||||||
@ -155,15 +154,14 @@ impl XenClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn create(&self, config: &DomainConfig) -> Result<CreatedDomain> {
|
pub async fn create(&self, config: &DomainConfig) -> Result<CreatedDomain> {
|
||||||
let mut domain = CreateDomain {
|
let mut domain = CreateDomain::default();
|
||||||
..Default::default()
|
|
||||||
};
|
|
||||||
domain.max_vcpus = config.max_vcpus;
|
domain.max_vcpus = config.max_vcpus;
|
||||||
|
|
||||||
if cfg!(target_arch = "aarch64") {
|
if cfg!(target_arch = "aarch64") {
|
||||||
domain.flags = XEN_DOMCTL_CDF_HVM_GUEST | XEN_DOMCTL_CDF_HAP;
|
domain.flags = XEN_DOMCTL_CDF_HVM_GUEST | XEN_DOMCTL_CDF_HAP;
|
||||||
} else {
|
} else {
|
||||||
domain.flags = XEN_DOMCTL_CDF_IOMMU;
|
domain.flags = XEN_DOMCTL_CDF_HVM_GUEST | XEN_DOMCTL_CDF_HAP | XEN_DOMCTL_CDF_IOMMU;
|
||||||
|
domain.arch_domain_config.emulation_flags = X86_EMU_LAPIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
let domid = self.call.create_domain(domain).await?;
|
let domid = self.call.create_domain(domain).await?;
|
||||||
|
@ -762,7 +762,6 @@ impl ArchBootSetup for X86BootSetup {
|
|||||||
.as_ref()
|
.as_ref()
|
||||||
.ok_or(Error::MemorySetupFailed("page_table_segment missing"))?;
|
.ok_or(Error::MemorySetupFailed("page_table_segment missing"))?;
|
||||||
let pg_pfn = page_table_segment.pfn;
|
let pg_pfn = page_table_segment.pfn;
|
||||||
let pg_mfn = setup.phys.p2m[pg_pfn as usize];
|
|
||||||
setup.phys.unmap(pg_pfn)?;
|
setup.phys.unmap(pg_pfn)?;
|
||||||
setup.phys.unmap(p2m_segment.pfn)?;
|
setup.phys.unmap(p2m_segment.pfn)?;
|
||||||
|
|
||||||
@ -772,10 +771,10 @@ impl ArchBootSetup for X86BootSetup {
|
|||||||
let e820 = self.e820_sanitize(map, mem_kb, 0)?;
|
let e820 = self.e820_sanitize(map, mem_kb, 0)?;
|
||||||
setup.call.set_memory_map(setup.domid, e820).await?;
|
setup.call.set_memory_map(setup.domid, e820).await?;
|
||||||
|
|
||||||
setup
|
// setup
|
||||||
.call
|
// .call
|
||||||
.mmuext(setup.domid, MMUEXT_PIN_L4_TABLE, pg_mfn, 0)
|
// .mmuext(setup.domid, MMUEXT_PIN_L4_TABLE, pg_mfn, 0)
|
||||||
.await?;
|
// .await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user