From ad190f9f4fe42bde774b5b34fa2a80f35b8a32cd Mon Sep 17 00:00:00 2001 From: OmniaX-Dev Date: Fri, 22 May 2026 06:38:32 +0200 Subject: [PATCH] Sync push --- CMakeLists.txt | 3 +++ other/build.nr | 2 +- src/common/Data.hpp | 7 +++++++ src/hardware/CPU.cpp | 30 ++++++++++++++++++------------ src/hardware/CPU.hpp | 36 ++++++++++++++++++++++++++++++++++-- src/hardware/MMU.hpp | 2 +- 6 files changed, 64 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eb89f72..68ba209 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ list(APPEND RUNTIME_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/src/hardware/CPU.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/hardware/MMU.cpp ) list(APPEND DEBUGGER_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/src/debugger/debugger_main.cpp @@ -41,6 +42,7 @@ list(APPEND DEBUGGER_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/src/hardware/CPU.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/hardware/MMU.cpp ) list(APPEND ASSEMBLER_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/src/assembler/assembler_main.cpp @@ -52,6 +54,7 @@ list(APPEND TEST_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/src/RAM_test.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/hardware/MMU.cpp ) #----------------------------------------------------------------------------------------- diff --git a/other/build.nr b/other/build.nr index 48082f7..b1bd38b 100644 --- a/other/build.nr +++ b/other/build.nr @@ -1 +1 @@ -12 +13 diff --git a/src/common/Data.hpp b/src/common/Data.hpp index 3e47e6a..d3a3de4 100644 --- a/src/common/Data.hpp +++ b/src/common/Data.hpp @@ -31,6 +31,13 @@ namespace dragon using PhysicalAddress = AddressType; // -------------------------------- + enum class RegAccess { + UserReadWrite, // FL (if you split out I) + UserReadOnly, // CORE_ID, CYCLE + SupervisorReadWrite, // IV, EPC, CAUSE, PTB, ASID, etc. + SupervisorReadOnly // (none currently, but reserved) + }; + enum class MMUAccessType : u8 { Read, Write, Execute }; enum class MMUAccessMode : u8 { Privileged, User }; enum class MMUFaultKind : u8 { PageFault, PrivPageFault, Bounds, Misalignment }; diff --git a/src/hardware/CPU.cpp b/src/hardware/CPU.cpp index 8162db7..2bfdbec 100644 --- a/src/hardware/CPU.cpp +++ b/src/hardware/CPU.cpp @@ -24,23 +24,24 @@ namespace dragon { namespace hw { - CPU::CPU(BUS& bus) : m_bus(bus), m_mmu(m_bus, &m_accessMode) + CPU::CPU(BUS& bus) : m_bus(bus) { } bool CPU::run(void) { - while (!m_halted) - { - try - { - step(); // fetch + decode + execute one instruction - } - catch (const GuestException& e) - { - take_exception(e.cause, e.fault_addr); - } - } + // Should probably be moved to Core? + // while (!m_halted) + // { + // try + // { + // step(); // fetch + decode + execute one instruction + // } + // catch (const GuestException& e) + // { + // take_exception(e.cause, e.fault_addr); + // } + // } return true; } @@ -54,5 +55,10 @@ namespace dragon // set_interrupts_enabled(false); // m_pc = m_iv; // jump to single entry point } + + void CPU::step(void) + { + + } } } diff --git a/src/hardware/CPU.hpp b/src/hardware/CPU.hpp index 3163b98..239b2c3 100644 --- a/src/hardware/CPU.hpp +++ b/src/hardware/CPU.hpp @@ -30,6 +30,36 @@ namespace dragon class BUS; class CPU { + public: struct Core + { + MMU m_mmu; + bool m_halted { true }; + + std::array m_gpr; + u32 m_pc; + u32 m_sp; + u32 m_fl; + u32 m_mode; + u32 m_iv; + u32 m_epc; + u32 m_cause; + u32 m_badaddr; + u32 m_estatus; + u32 m_scratch; + u32 m_ptb; + u32 m_asid; + u32 m_coreid; + u32 m_cycle; + u32 m_timer_deadline; + + inline Core(CPU& cpu) : m_mmu(cpu.m_bus, &(cpu.m_accessMode)) + { + + } + + private: + }; + public: CPU(BUS& bus); bool run(void); @@ -39,10 +69,12 @@ namespace dragon void step(void); private: - bool m_halted { true }; MMUAccessMode m_accessMode { MMUAccessMode::Privileged }; BUS& m_bus; - MMU m_mmu; + Core m_core0 { *this }; + Core m_core1 { *this }; + Core m_core2 { *this }; + Core m_core3 { *this }; }; } } diff --git a/src/hardware/MMU.hpp b/src/hardware/MMU.hpp index 984ff9d..ebcafbf 100644 --- a/src/hardware/MMU.hpp +++ b/src/hardware/MMU.hpp @@ -29,7 +29,7 @@ namespace dragon class MMU : public MemoryDevice { public: - explicit MMU(BUS& bus, const MMUAccessMode* mode_ptr); + MMU(BUS& bus, const MMUAccessMode* mode_ptr); PhysicalAddress translate(VirtualAddress va, MMUAccessType type, MMUAccessMode mode) const; void enable(bool value = true); void setPtb(PhysicalAddress ptb);