diff --git a/kernel/src/arch/aarch64/asm.rs b/kernel/src/arch/aarch64/asm.rs new file mode 100644 index 0000000..9e5a82a --- /dev/null +++ b/kernel/src/arch/aarch64/asm.rs @@ -0,0 +1,48 @@ +//! Assembly intrinsics for AArch64 platform +#![allow(missing_docs)] + +use tock_registers::{ + interfaces::{Readable, Writeable}, + register_bitfields +}; + +register_bitfields! { + u64, + pub CPACR_EL1 [ + FPEN OFFSET(20) NUMBITS(2) [ + TrapAll = 0, + TrapEl0 = 1, + TrapNone = 3 + ] + ] +} + +pub struct Reg; + +impl Readable for Reg { + type T = u64; + type R = CPACR_EL1::Register; + + #[inline(always)] + fn get(&self) -> Self::T { + let mut tmp; + unsafe { + asm!("mrs {}, cpacr_el1", out(reg) tmp); + } + tmp + } +} + +impl Writeable for Reg { + type T = u64; + type R = CPACR_EL1::Register; + + #[inline(always)] + fn set(&self, value: Self::T) { + unsafe { + asm!("msr cpacr_el1, {}", in(reg) value); + } + } +} + +pub const CPACR_EL1: Reg = Reg; diff --git a/kernel/src/arch/aarch64/boot/mod.rs b/kernel/src/arch/aarch64/boot/mod.rs index e1127cf..d6b6fd0 100644 --- a/kernel/src/arch/aarch64/boot/mod.rs +++ b/kernel/src/arch/aarch64/boot/mod.rs @@ -1,8 +1,12 @@ //! aarch64 common boot logic +use crate::arch::aarch64::asm::CPACR_EL1; +use tock_registers::interfaces::Writeable; #[no_mangle] fn __aa64_bsp_main() { - debugln!("Test"); + // Disable FP instruction trapping + CPACR_EL1.write(CPACR_EL1::FPEN::TrapNone); + use crate::arch::machine; use crate::dev::{serial::SerialDevice, timer::TimestampSource, Device}; diff --git a/kernel/src/arch/aarch64/mod.rs b/kernel/src/arch/aarch64/mod.rs index 98491af..4583f57 100644 --- a/kernel/src/arch/aarch64/mod.rs +++ b/kernel/src/arch/aarch64/mod.rs @@ -2,6 +2,7 @@ pub mod boot; pub mod timer; +pub mod asm; cfg_if! { if #[cfg(feature = "mach_qemu")] { diff --git a/kernel/src/main.rs b/kernel/src/main.rs index bcca466..1141829 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -1,5 +1,6 @@ //! osdve5 crate (lol) #![feature( + asm, global_asm, const_for, const_mut_refs, diff --git a/kernel/src/mem/mod.rs b/kernel/src/mem/mod.rs index 01e0bbe..8f0871d 100644 --- a/kernel/src/mem/mod.rs +++ b/kernel/src/mem/mod.rs @@ -34,3 +34,18 @@ pub unsafe extern "C" fn memcmp(a: *mut u8, b: *mut u8, mut len: usize) -> isize } 0 } + +/// See memset(3p) +/// +/// # Safety +/// +/// Unsafe: writes to arbitrary memory locations, performs no pointer +/// validation. +#[no_mangle] +pub unsafe extern "C" fn memset(buf: *mut u8, val: u8, mut len: usize) -> *mut u8 { + while len != 0 { + len -= 1; + *buf.add(len) = val; + } + buf +}