pub trait Architecture {
type Endian: Endianness;
type Registers: Into<Registers>;
type SpecialRegisters: Into<SpecialRegisters>;
type OtherRegisters: Into<OtherRegisters>;
// Required methods
fn into_runtime(self) -> Architecture;
fn endianness(&self) -> Self::Endian;
fn virtual_to_physical<M: Memory + ?Sized>(
&self,
memory: &M,
mmu_addr: PhysicalAddress,
addr: VirtualAddress,
) -> TranslationResult<PhysicalAddress>;
fn find_kernel_pgd<M: Memory + ?Sized>(
&self,
memory: &M,
vcpus: &(impl HasVcpus<Arch = Self> + ?Sized),
use_per_cpu: bool,
additional: &[VirtualAddress],
) -> VmResult<Option<PhysicalAddress>>;
fn find_in_kernel_memory_raw<M: Memory + ?Sized>(
&self,
memory: &M,
mmu_addr: PhysicalAddress,
base_search_addr: VirtualAddress,
finder: &Finder<'_>,
buf: &mut [u8],
) -> MemoryAccessResult<Option<VirtualAddress>>;
fn find_in_kernel_memory<M: Memory + ?Sized>(
&self,
memory: &M,
mmu_addr: PhysicalAddress,
needle: &[u8],
) -> MemoryAccessResult<Option<VirtualAddress>>;
fn kernel_base(&self) -> VirtualAddress;
fn instruction_pointer<Vcpus: HasVcpus<Arch = Self> + ?Sized>(
&self,
vcpus: &Vcpus,
vcpu: VcpuId,
) -> VcpuResult<VirtualAddress>;
fn stack_pointer<Vcpus: HasVcpus<Arch = Self> + ?Sized>(
&self,
vcpus: &Vcpus,
vcpu: VcpuId,
) -> VcpuResult<VirtualAddress>;
fn base_pointer<Vcpus: HasVcpus<Arch = Self> + ?Sized>(
&self,
vcpus: &Vcpus,
vcpu: VcpuId,
) -> VcpuResult<Option<VirtualAddress>>;
fn pgd<Vcpus: HasVcpus<Arch = Self> + ?Sized>(
&self,
vcpus: &Vcpus,
vcpu: VcpuId,
) -> VcpuResult<PhysicalAddress>;
fn kernel_per_cpu<Vcpus: HasVcpus<Arch = Self> + ?Sized>(
&self,
vcpus: &Vcpus,
vcpu: VcpuId,
) -> VcpuResult<Option<VirtualAddress>>;
}Expand description
A hardware architecture
This trait has a lifetime, which will be removed when GAT are stable
Required Associated Types§
type Endian: Endianness
type Registers: Into<Registers>
type SpecialRegisters: Into<SpecialRegisters>
type OtherRegisters: Into<OtherRegisters>
Required Methods§
fn into_runtime(self) -> Architecture
fn endianness(&self) -> Self::Endian
fn virtual_to_physical<M: Memory + ?Sized>( &self, memory: &M, mmu_addr: PhysicalAddress, addr: VirtualAddress, ) -> TranslationResult<PhysicalAddress>
fn find_kernel_pgd<M: Memory + ?Sized>( &self, memory: &M, vcpus: &(impl HasVcpus<Arch = Self> + ?Sized), use_per_cpu: bool, additional: &[VirtualAddress], ) -> VmResult<Option<PhysicalAddress>>
fn find_in_kernel_memory_raw<M: Memory + ?Sized>( &self, memory: &M, mmu_addr: PhysicalAddress, base_search_addr: VirtualAddress, finder: &Finder<'_>, buf: &mut [u8], ) -> MemoryAccessResult<Option<VirtualAddress>>
fn find_in_kernel_memory<M: Memory + ?Sized>( &self, memory: &M, mmu_addr: PhysicalAddress, needle: &[u8], ) -> MemoryAccessResult<Option<VirtualAddress>>
fn kernel_base(&self) -> VirtualAddress
fn instruction_pointer<Vcpus: HasVcpus<Arch = Self> + ?Sized>( &self, vcpus: &Vcpus, vcpu: VcpuId, ) -> VcpuResult<VirtualAddress>
fn stack_pointer<Vcpus: HasVcpus<Arch = Self> + ?Sized>( &self, vcpus: &Vcpus, vcpu: VcpuId, ) -> VcpuResult<VirtualAddress>
fn base_pointer<Vcpus: HasVcpus<Arch = Self> + ?Sized>( &self, vcpus: &Vcpus, vcpu: VcpuId, ) -> VcpuResult<Option<VirtualAddress>>
fn pgd<Vcpus: HasVcpus<Arch = Self> + ?Sized>( &self, vcpus: &Vcpus, vcpu: VcpuId, ) -> VcpuResult<PhysicalAddress>
fn kernel_per_cpu<Vcpus: HasVcpus<Arch = Self> + ?Sized>( &self, vcpus: &Vcpus, vcpu: VcpuId, ) -> VcpuResult<Option<VirtualAddress>>
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.