krata: more work on arm64 support

This commit is contained in:
Alex Zenla
2024-03-13 07:48:20 -07:00
parent f4af71cb2f
commit 5c7f81a261
2 changed files with 20 additions and 14 deletions

View File

@ -99,11 +99,11 @@ pub const HYPERVISOR_XC_RESERVED_OP: c_ulong = 39;
pub const HYPERVISOR_XENPMU_OP: c_ulong = 40; pub const HYPERVISOR_XENPMU_OP: c_ulong = 40;
pub const HYPERVISOR_DM_OP: c_ulong = 41; pub const HYPERVISOR_DM_OP: c_ulong = 41;
pub const XEN_DOMCTL_CDF_HVM_GUEST: u32 = 1 << 0; pub const XEN_DOMCTL_CDF_HVM_GUEST: u32 = 1u32 << 0;
pub const XEN_DOMCTL_CDF_HAP: u32 = 1 << 1; pub const XEN_DOMCTL_CDF_HAP: u32 = 1u32 << 1;
pub const XEN_DOMCTL_CDF_S3_INTEGRITY: u32 = 1 << 2; pub const XEN_DOMCTL_CDF_S3_INTEGRITY: u32 = 1u32 << 2;
pub const XEN_DOMCTL_CDF_OOS_OFF: u32 = 1 << 3; pub const XEN_DOMCTL_CDF_OOS_OFF: u32 = 1u32 << 3;
pub const XEN_DOMCTL_CDF_XS_DOMAIN: u32 = 1 << 4; pub const XEN_DOMCTL_CDF_XS_DOMAIN: u32 = 1u32 << 4;
pub const XEN_X86_EMU_LAPIC: u32 = 1 << 0; pub const XEN_X86_EMU_LAPIC: u32 = 1 << 0;
pub const XEN_X86_EMU_HPET: u32 = 1 << 1; pub const XEN_X86_EMU_HPET: u32 = 1 << 1;
@ -323,8 +323,8 @@ pub struct ArchDomainConfig {
pub struct ArchDomainConfig { pub struct ArchDomainConfig {
pub gic_version: u8, pub gic_version: u8,
pub sve_v1: u8, pub sve_v1: u8,
pub tee_type: u8, pub tee_type: u16,
pub nr_spis: u8, pub nr_spis: u32,
pub clock_frequency: u32, pub clock_frequency: u32,
} }

View File

@ -7,11 +7,15 @@ pub mod sys;
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
pub mod x86; pub mod x86;
#[cfg(target_arch = "x86_64")]
use crate::x86::X86BootSetup;
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
pub mod arm64; pub mod arm64;
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
use crate::arm64::Arm64BootSetup; use crate::arm64::Arm64BootSetup;
use crate::boot::BootSetup; use crate::boot::BootSetup;
use crate::elfloader::ElfImageLoader; use crate::elfloader::ElfImageLoader;
use crate::error::{Error, Result}; use crate::error::{Error, Result};
@ -23,7 +27,7 @@ use std::str::FromStr;
use std::thread; use std::thread;
use std::time::Duration; use std::time::Duration;
use uuid::Uuid; use uuid::Uuid;
use xencall::sys::{CreateDomain, XEN_DOMCTL_CDF_HVM_GUEST}; use xencall::sys::{CreateDomain, XEN_DOMCTL_CDF_HAP, XEN_DOMCTL_CDF_HVM_GUEST};
use xencall::XenCall; use xencall::XenCall;
use xenstore::{ use xenstore::{
XsPermission, XsdClient, XsdInterface, XS_PERM_NONE, XS_PERM_READ, XS_PERM_READ_WRITE, XsPermission, XsdClient, XsdInterface, XS_PERM_NONE, XS_PERM_READ, XS_PERM_READ_WRITE,
@ -96,13 +100,15 @@ impl XenClient {
} }
pub async fn create(&mut self, config: &DomainConfig<'_>) -> Result<u32> { pub async fn create(&mut self, config: &DomainConfig<'_>) -> Result<u32> {
let domain = CreateDomain { let mut domain = CreateDomain {
max_vcpus: config.max_vcpus, max_vcpus: config.max_vcpus,
#[cfg(target_arch = "aarch64")]
flags: XEN_DOMCTL_CDF_HVM_GUEST,
..Default::default() ..Default::default()
}; };
if cfg!(target_arch = "aarch64") {
domain.flags = XEN_DOMCTL_CDF_HVM_GUEST | XEN_DOMCTL_CDF_HAP;
}
let domid = self.call.create_domain(domain)?; let domid = self.call.create_domain(domain)?;
match self.init(domid, &domain, config).await { match self.init(domid, &domain, config).await {
Ok(_) => Ok(domid), Ok(_) => Ok(domid),
@ -460,7 +466,7 @@ impl XenClient {
domid: u32, domid: u32,
index: usize, index: usize,
port: Option<u32>, port: Option<u32>,
mfn: Option<u64>, ring: Option<u64>,
) -> Result<()> { ) -> Result<()> {
let mut backend_entries = vec![ let mut backend_entries = vec![
("frontend-id", domid.to_string()), ("frontend-id", domid.to_string()),
@ -484,10 +490,10 @@ impl XenClient {
backend_entries.push(("output", "pty".to_string())); backend_entries.push(("output", "pty".to_string()));
} }
if port.is_some() && mfn.is_some() { if port.is_some() && ring.is_some() {
frontend_entries.extend_from_slice(&[ frontend_entries.extend_from_slice(&[
("port", port.unwrap().to_string()), ("port", port.unwrap().to_string()),
("ring-ref", mfn.unwrap().to_string()), ("ring-ref", ring.unwrap().to_string()),
]); ]);
} else { } else {
frontend_entries.extend_from_slice(&[ frontend_entries.extend_from_slice(&[