Sync push

This commit is contained in:
OmniaX-Dev 2026-05-22 06:38:32 +02:00
parent 2c93d6e2f2
commit ad190f9f4f
6 changed files with 64 additions and 16 deletions

View file

@ -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
)
#-----------------------------------------------------------------------------------------

View file

@ -1 +1 @@
12
13

View file

@ -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 };

View file

@ -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)
{
}
}
}

View file

@ -30,6 +30,36 @@ namespace dragon
class BUS;
class CPU
{
public: struct Core
{
MMU m_mmu;
bool m_halted { true };
std::array<u32, 32> 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 };
};
}
}

View file

@ -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);