From 45cf2115da8063cf07a85a8f85ea403aa7c28432 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Mon, 19 Jun 2023 22:57:08 -0700 Subject: [PATCH] [denali] Add a stub client for denali --- lib/mammoth/include/mammoth/memory_region.h | 2 ++ lib/mammoth/src/memory_region.cpp | 8 ++++++++ sys/denali/CMakeLists.txt | 18 +++++++++++++++++- sys/denali/client/denali_client.cpp | 21 +++++++++++++++++++++ sys/denali/include/denali/denali_client.h | 15 +++++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 sys/denali/client/denali_client.cpp create mode 100644 sys/denali/include/denali/denali_client.h diff --git a/lib/mammoth/include/mammoth/memory_region.h b/lib/mammoth/include/mammoth/memory_region.h index 215e0b8..1dbe6f8 100644 --- a/lib/mammoth/include/mammoth/memory_region.h +++ b/lib/mammoth/include/mammoth/memory_region.h @@ -1,6 +1,7 @@ #pragma once #include +#include class MappedMemoryRegion { public: @@ -8,6 +9,7 @@ class MappedMemoryRegion { static MappedMemoryRegion DirectPhysical(uint64_t phys_addr, uint64_t size); static MappedMemoryRegion ContiguousPhysical(uint64_t size); static MappedMemoryRegion Default(uint64_t size); + static MappedMemoryRegion FromCapability(z_cap_t vmmo_cap); MappedMemoryRegion() {} // TODO: Disallow copy before doing any cleanup here. diff --git a/lib/mammoth/src/memory_region.cpp b/lib/mammoth/src/memory_region.cpp index 9d32718..5490a4c 100644 --- a/lib/mammoth/src/memory_region.cpp +++ b/lib/mammoth/src/memory_region.cpp @@ -35,3 +35,11 @@ MappedMemoryRegion MappedMemoryRegion::Default(uint64_t size) { return MappedMemoryRegion(vmmo_cap, 0, vaddr, size); } + +MappedMemoryRegion MappedMemoryRegion::FromCapability(z_cap_t vmmo_cap) { + uint64_t vaddr; + check(ZAddressSpaceMap(gSelfVmasCap, 0, vmmo_cap, &vaddr)); + + // FIXME: get the size here. + return MappedMemoryRegion(vmmo_cap, 0, vaddr, 0); +} diff --git a/sys/denali/CMakeLists.txt b/sys/denali/CMakeLists.txt index 6a0f268..3d5064d 100644 --- a/sys/denali/CMakeLists.txt +++ b/sys/denali/CMakeLists.txt @@ -9,7 +9,7 @@ add_executable(denali target_include_directories(denali PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") + "${CMAKE_CURRENT_SOURCE_DIR}/include") target_link_libraries(denali cxx @@ -20,3 +20,19 @@ set_target_properties(denali PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BASE_COMPILE_FLAGS}" LINK_FLAGS "${CMAKE_EXE_LINK_FLAGS} ${BASE_LINK_FLAGS}" ) + +add_library(libdenali + client/denali_client.cpp + ) + +target_include_directories(libdenali + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") + + target_link_libraries(libdenali + mammoth_lib) + +set_target_properties(libdenali PROPERTIES + COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BASE_COMPILE_FLAGS}" + LINK_FLAGS "${CMAKE_EXE_LINK_FLAGS} ${BASE_LINK_FLAGS}" + ) diff --git a/sys/denali/client/denali_client.cpp b/sys/denali/client/denali_client.cpp new file mode 100644 index 0000000..fcda77d --- /dev/null +++ b/sys/denali/client/denali_client.cpp @@ -0,0 +1,21 @@ +#include "denali/denali_client.h" + +#include + +#include "denali/denali.h" + +MappedMemoryRegion DenaliClient::ReadSectors(uint64_t device_id, uint64_t lba, + uint64_t num_sectors) { + DenaliRead read{ + .device_id = device_id, + .lba = lba, + .size = num_sectors, + }; + check(channel_.WriteStruct(&read)); + + DenaliReadResponse resp; + uint64_t mem_cap; + check(channel_.ReadStructAndCap(&resp, &mem_cap)); + + return MappedMemoryRegion::FromCapability(mem_cap); +} diff --git a/sys/denali/include/denali/denali_client.h b/sys/denali/include/denali/denali_client.h new file mode 100644 index 0000000..7a91403 --- /dev/null +++ b/sys/denali/include/denali/denali_client.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +class DenaliClient { + public: + DenaliClient(const Channel& channel) : channel_(channel) {} + + MappedMemoryRegion ReadSectors(uint64_t device_id, uint64_t lba, + uint64_t num_sectors); + + private: + Channel channel_; +};