Sync push
This commit is contained in:
parent
2c93d6e2f2
commit
ad190f9f4f
6 changed files with 64 additions and 16 deletions
|
|
@ -34,6 +34,7 @@ list(APPEND RUNTIME_SOURCE_FILES
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/hardware/CPU.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/CPU.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/MMU.cpp
|
||||||
)
|
)
|
||||||
list(APPEND DEBUGGER_SOURCE_FILES
|
list(APPEND DEBUGGER_SOURCE_FILES
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/debugger/debugger_main.cpp
|
${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/CPU.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/MMU.cpp
|
||||||
)
|
)
|
||||||
list(APPEND ASSEMBLER_SOURCE_FILES
|
list(APPEND ASSEMBLER_SOURCE_FILES
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/assembler/assembler_main.cpp
|
${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/RAM_test.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/RAM.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/BUS.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/src/hardware/MMU.cpp
|
||||||
)
|
)
|
||||||
#-----------------------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
12
|
13
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,13 @@ namespace dragon
|
||||||
using PhysicalAddress = AddressType;
|
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 MMUAccessType : u8 { Read, Write, Execute };
|
||||||
enum class MMUAccessMode : u8 { Privileged, User };
|
enum class MMUAccessMode : u8 { Privileged, User };
|
||||||
enum class MMUFaultKind : u8 { PageFault, PrivPageFault, Bounds, Misalignment };
|
enum class MMUFaultKind : u8 { PageFault, PrivPageFault, Bounds, Misalignment };
|
||||||
|
|
|
||||||
|
|
@ -24,23 +24,24 @@ namespace dragon
|
||||||
{
|
{
|
||||||
namespace hw
|
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)
|
bool CPU::run(void)
|
||||||
{
|
{
|
||||||
while (!m_halted)
|
// Should probably be moved to Core?
|
||||||
{
|
// while (!m_halted)
|
||||||
try
|
// {
|
||||||
{
|
// try
|
||||||
step(); // fetch + decode + execute one instruction
|
// {
|
||||||
}
|
// step(); // fetch + decode + execute one instruction
|
||||||
catch (const GuestException& e)
|
// }
|
||||||
{
|
// catch (const GuestException& e)
|
||||||
take_exception(e.cause, e.fault_addr);
|
// {
|
||||||
}
|
// take_exception(e.cause, e.fault_addr);
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -54,5 +55,10 @@ namespace dragon
|
||||||
// set_interrupts_enabled(false);
|
// set_interrupts_enabled(false);
|
||||||
// m_pc = m_iv; // jump to single entry point
|
// m_pc = m_iv; // jump to single entry point
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CPU::step(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,36 @@ namespace dragon
|
||||||
class BUS;
|
class BUS;
|
||||||
class CPU
|
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:
|
public:
|
||||||
CPU(BUS& bus);
|
CPU(BUS& bus);
|
||||||
bool run(void);
|
bool run(void);
|
||||||
|
|
@ -39,10 +69,12 @@ namespace dragon
|
||||||
void step(void);
|
void step(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_halted { true };
|
|
||||||
MMUAccessMode m_accessMode { MMUAccessMode::Privileged };
|
MMUAccessMode m_accessMode { MMUAccessMode::Privileged };
|
||||||
BUS& m_bus;
|
BUS& m_bus;
|
||||||
MMU m_mmu;
|
Core m_core0 { *this };
|
||||||
|
Core m_core1 { *this };
|
||||||
|
Core m_core2 { *this };
|
||||||
|
Core m_core3 { *this };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ namespace dragon
|
||||||
class MMU : public MemoryDevice
|
class MMU : public MemoryDevice
|
||||||
{
|
{
|
||||||
public:
|
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;
|
PhysicalAddress translate(VirtualAddress va, MMUAccessType type, MMUAccessMode mode) const;
|
||||||
void enable(bool value = true);
|
void enable(bool value = true);
|
||||||
void setPtb(PhysicalAddress ptb);
|
void setPtb(PhysicalAddress ptb);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue