From 39f9eac9c35e7d38a739607cf72f91a380bbcecc Mon Sep 17 00:00:00 2001 From: Adam Jesionowski Date: Mon, 8 Nov 2021 12:38:22 -0800 Subject: [PATCH] Unify DTCM and mem sections. Move getting the return code and fault registers into Rust and out from the C driver. This means extending the DTCM to cover memory previously covered by `mem`. Change-Id: I9d1ad8e9823445ad7dd476ef05f128a29567999b GitOrigin-RevId: 21bc1ee544d39d6b4a2ff963aaae7c145fdd7fa9 --- .../MlCoordinator/MlCoordinator.camkes | 2 +- .../kata-ml-coordinator/src/mlcore.rs | 31 ++++++++++++------ .../kata-ml-coordinator/src/run.rs | 32 +++++++++++++------ .../VectorCoreDriver/VectorCoreDriver.camkes | 1 - .../components/VectorCoreDriver/src/driver.c | 12 +------ .../VectorCoreReturnInterface.camkes | 2 +- apps/system/system.camkes | 9 ++---- 7 files changed, 50 insertions(+), 39 deletions(-) diff --git a/apps/system/components/MlCoordinator/MlCoordinator.camkes b/apps/system/components/MlCoordinator/MlCoordinator.camkes index 1102b17..a3778f1 100644 --- a/apps/system/components/MlCoordinator/MlCoordinator.camkes +++ b/apps/system/components/MlCoordinator/MlCoordinator.camkes @@ -8,7 +8,7 @@ component MlCoordinator { dataport Buf(0x300000) elf_file; dataport Buf(0x40000) itcm; - dataport Buf(0xfff000) dtcm; + dataport Buf(0x1000000) dtcm; uses LoggerInterface logger; uses SecurityCoordinatorInterface security; diff --git a/apps/system/components/MlCoordinator/kata-ml-coordinator/src/mlcore.rs b/apps/system/components/MlCoordinator/kata-ml-coordinator/src/mlcore.rs index c62a3fc..8cf3335 100644 --- a/apps/system/components/MlCoordinator/kata-ml-coordinator/src/mlcore.rs +++ b/apps/system/components/MlCoordinator/kata-ml-coordinator/src/mlcore.rs @@ -11,19 +11,19 @@ const DTCM_SIZE: usize = 0x1000000; const DTCM_PADDR: usize = 0x34000000; extern "C" { - static elf_file: *const u8; + static elf_file: *const u32; } extern "C" { - static itcm: *mut u8; + static itcm: *mut u32; } extern "C" { - static dtcm: *mut u8; + static dtcm: *mut u32; } pub fn loadelf() -> Result<(), &'static str> { - let elf_slice = unsafe { slice::from_raw_parts(elf_file, ELF_SIZE) }; - let itcm_slice = unsafe { slice::from_raw_parts_mut(itcm, ITCM_SIZE) }; - let dtcm_slice = unsafe { slice::from_raw_parts_mut(dtcm, DTCM_SIZE) }; + let elf_slice = unsafe { slice::from_raw_parts(elf_file as *const u8, ELF_SIZE) }; + let itcm_slice = unsafe { slice::from_raw_parts_mut(itcm as *mut u8, ITCM_SIZE) }; + let dtcm_slice = unsafe { slice::from_raw_parts_mut(dtcm as *mut u8, DTCM_SIZE) }; let elf = ElfFile::new(&elf_slice)?; @@ -47,10 +47,8 @@ pub fn loadelf() -> Result<(), &'static str> { itcm_slice[..fsize].copy_from_slice(&bytes); } } else if seg.virtual_addr() as usize == DTCM_PADDR { - // TODO(jesionowski): Change to msize. Will currently fail as a portion - // of the memory is mapped to the vctop driver for getting return information. assert!( - fsize <= DTCM_SIZE, + msize <= DTCM_SIZE, "Elf's DTCM section is larger than than DTCM_SIZE" ); @@ -67,3 +65,18 @@ pub fn loadelf() -> Result<(), &'static str> { Ok(()) } + +fn get_dtcm_slice() -> &'static mut [u32] { + unsafe { slice::from_raw_parts_mut(dtcm, DTCM_SIZE / 4) } +} + +// TODO(jesionowski): Read these from CSRs when available. +pub fn get_return_code() -> u32 { + const RC_OFFSET: usize = 0x3FFFEE; + get_dtcm_slice()[RC_OFFSET] +} + +pub fn get_fault_register() -> u32 { + const FAULT_OFFSET: usize = 0x3FFFEF; + get_dtcm_slice()[FAULT_OFFSET] +} diff --git a/apps/system/components/MlCoordinator/kata-ml-coordinator/src/run.rs b/apps/system/components/MlCoordinator/kata-ml-coordinator/src/run.rs index 1ee026f..2788a65 100644 --- a/apps/system/components/MlCoordinator/kata-ml-coordinator/src/run.rs +++ b/apps/system/components/MlCoordinator/kata-ml-coordinator/src/run.rs @@ -16,6 +16,22 @@ pub struct MLCoordinator { pub static mut ML_COORD: MLCoordinator = MLCoordinator { is_loaded: false }; +impl MLCoordinator { + fn handle_return_interrupt(&self) { + // TODO(hcindyl): check the return code and fault registers, move the result + // from TCM to SRAM, update the input/model, and call mlcoord_execute again. + let return_code = mlcore::get_return_code(); + let fault = mlcore::get_fault_register(); + + if return_code != 0 { + error!( + "vctop execution failed with code {}, fault pc: {:#010X}", + return_code, fault + ); + } + } +} + impl MlCoordinatorInterface for MLCoordinator { fn execute(&mut self) { extern "C" { @@ -63,16 +79,14 @@ fn vctop_ctrl(freeze: u32, vc_reset: u32, pc_start: u32) -> u32 { // TODO: Once multiple model support is in start by name. #[no_mangle] pub extern "C" fn mlcoord_execute() { - unsafe { ML_COORD.execute() }; + unsafe { + ML_COORD.execute(); + } } #[no_mangle] -pub extern "C" fn vctop_return_update_result(return_code: u32, fault: u32) { - // TODO(hcindyl): check the return code and fault registers, move the result - // from TCM to SRAM, update the input/model, and call mlcoord_execute again. - trace!( - "vctop execution done with code {}, fault pc: {:#010X}", - return_code, - fault - ); +pub extern "C" fn vctop_return_update_result() { + unsafe { + ML_COORD.handle_return_interrupt(); + } } diff --git a/apps/system/components/VectorCoreDriver/VectorCoreDriver.camkes b/apps/system/components/VectorCoreDriver/VectorCoreDriver.camkes index a709760..eb24692 100644 --- a/apps/system/components/VectorCoreDriver/VectorCoreDriver.camkes +++ b/apps/system/components/VectorCoreDriver/VectorCoreDriver.camkes @@ -1,6 +1,5 @@ component VectorCoreDriver { dataport Buf csr; - dataport Buf mem; consumes Interrupt host_req; consumes Interrupt finish; consumes Interrupt instruction_fault; diff --git a/apps/system/components/VectorCoreDriver/src/driver.c b/apps/system/components/VectorCoreDriver/src/driver.c index 48d492a..9d99430 100644 --- a/apps/system/components/VectorCoreDriver/src/driver.c +++ b/apps/system/components/VectorCoreDriver/src/driver.c @@ -8,16 +8,6 @@ #define VCTOP_REG(name) \ *((volatile uint32_t *)(CSR_OFFSET + VC_TOP_##name##_REG_OFFSET)) -static inline uint32_t get_return_code() { - const uint32_t kReturnCodeOffset = 0xfb8; - return *((volatile uint32_t *)((void *)mem + kReturnCodeOffset)); -} - -static inline uint32_t get_fault_register() { - const uint32_t kFaultRegOffset = 0xfbc; - return *((volatile uint32_t *)((void *)mem + kFaultRegOffset)); -} - // CAmkES initialization hook. // // Enables Interrupts. @@ -42,7 +32,7 @@ void host_req_handle(void) { void finish_handle(void) { // Read main() return code and machine exception PC. - vctop_return_update_result(get_return_code(), get_fault_register()); + vctop_return_update_result(); // Also need to clear the INTR_STATE (write-1-to-clear). VCTOP_REG(INTR_STATE) = BIT(VC_TOP_INTR_STATE_FINISH_BIT); seL4_Assert(finish_acknowledge() == 0); diff --git a/apps/system/interfaces/VectorCoreReturnInterface.camkes b/apps/system/interfaces/VectorCoreReturnInterface.camkes index b723b0c..59d6095 100644 --- a/apps/system/interfaces/VectorCoreReturnInterface.camkes +++ b/apps/system/interfaces/VectorCoreReturnInterface.camkes @@ -1,3 +1,3 @@ procedure VectorCoreReturnInterface { - void update_result(in uint32_t return_code, in uint32_t fault); + void update_result(); }; diff --git a/apps/system/system.camkes b/apps/system/system.camkes index 13640e9..d325915 100644 --- a/apps/system/system.camkes +++ b/apps/system/system.camkes @@ -35,9 +35,8 @@ component OpenTitanUART { component VectorCoreHw { hardware; dataport Buf csr; - dataport Buf mem; dataport Buf(0x40000) itcm; - dataport Buf(0xfff000) dtcm; + dataport Buf(0x1000000) dtcm; emits Interrupt host_req; emits Interrupt finish; @@ -77,7 +76,6 @@ assembly { // VectorCoreDriver connection seL4HardwareMMIO vc_csr(from vc_drv.csr, to vctop.csr); - connection seL4HardwareMMIO vc_mem(from vc_drv.mem, to vctop.mem); connection seL4RPCCall ml_coord_to_driver(from ml_coordinator.vctop, to vc_drv.vctop); connection seL4RPCCall vc_driver_to_ml_coord(from vc_drv.vctop_return, @@ -148,13 +146,10 @@ assembly { vctop.csr_paddr = 0x48000000; vctop.csr_size = 0x1000; - // TODO(jesionowski): Merge mem and dtcm - vctop.mem_paddr = 0x34fff000; - vctop.mem_size = 0x1000; vctop.itcm_paddr = 0x30000000; vctop.itcm_size = 0x40000; vctop.dtcm_paddr = 0x34000000; - vctop.dtcm_size = 0xfff000; + vctop.dtcm_size = 0x1000000; vctop.host_req_irq_number = 179; vctop.finish_irq_number = 180; vctop.instruction_fault_irq_number = 181;