mirror of
https://github.com/shadergz/cosmic-station.git
synced 2024-11-23 06:09:40 +00:00
IOP
: We will use an abstraction to validate the caches
This commit is contained in:
parent
7a30ff87f0
commit
c186ce0675
@ -1,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BuildAttributionWarningsFilter">
|
||||
<option name="noGCSettingWarning" value="true" />
|
||||
@ -48,7 +49,7 @@
|
||||
</value>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
|
263
.idea/other.xml
Normal file
263
.idea/other.xml
Normal file
@ -0,0 +1,263 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="direct_access_persist.xml">
|
||||
<option name="deviceSelectionList">
|
||||
<list>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="27" />
|
||||
<option name="brand" value="DOCOMO" />
|
||||
<option name="codename" value="F01L" />
|
||||
<option name="id" value="F01L" />
|
||||
<option name="manufacturer" value="FUJITSU" />
|
||||
<option name="name" value="F-01L" />
|
||||
<option name="screenDensity" value="360" />
|
||||
<option name="screenX" value="720" />
|
||||
<option name="screenY" value="1280" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="28" />
|
||||
<option name="brand" value="DOCOMO" />
|
||||
<option name="codename" value="SH-01L" />
|
||||
<option name="id" value="SH-01L" />
|
||||
<option name="manufacturer" value="SHARP" />
|
||||
<option name="name" value="AQUOS sense2 SH-01L" />
|
||||
<option name="screenDensity" value="480" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2160" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="31" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="a51" />
|
||||
<option name="id" value="a51" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy A51" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2400" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="34" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="akita" />
|
||||
<option name="id" value="akita" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel 8a" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2400" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="33" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="b0q" />
|
||||
<option name="id" value="b0q" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy S22 Ultra" />
|
||||
<option name="screenDensity" value="600" />
|
||||
<option name="screenX" value="1440" />
|
||||
<option name="screenY" value="3088" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="32" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="bluejay" />
|
||||
<option name="id" value="bluejay" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel 6a" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2400" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="29" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="crownqlteue" />
|
||||
<option name="id" value="crownqlteue" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy Note9" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="2220" />
|
||||
<option name="screenY" value="1080" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="34" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="dm3q" />
|
||||
<option name="id" value="dm3q" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy S23 Ultra" />
|
||||
<option name="screenDensity" value="600" />
|
||||
<option name="screenX" value="1440" />
|
||||
<option name="screenY" value="3088" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="33" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="felix" />
|
||||
<option name="id" value="felix" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel Fold" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="2208" />
|
||||
<option name="screenY" value="1840" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="33" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="felix_camera" />
|
||||
<option name="id" value="felix_camera" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel Fold (Camera-enabled)" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="2208" />
|
||||
<option name="screenY" value="1840" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="33" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="gts8uwifi" />
|
||||
<option name="id" value="gts8uwifi" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy Tab S8 Ultra" />
|
||||
<option name="screenDensity" value="320" />
|
||||
<option name="screenX" value="1848" />
|
||||
<option name="screenY" value="2960" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="34" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="husky" />
|
||||
<option name="id" value="husky" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel 8 Pro" />
|
||||
<option name="screenDensity" value="390" />
|
||||
<option name="screenX" value="1008" />
|
||||
<option name="screenY" value="2244" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="30" />
|
||||
<option name="brand" value="motorola" />
|
||||
<option name="codename" value="java" />
|
||||
<option name="id" value="java" />
|
||||
<option name="manufacturer" value="Motorola" />
|
||||
<option name="name" value="G20" />
|
||||
<option name="screenDensity" value="280" />
|
||||
<option name="screenX" value="720" />
|
||||
<option name="screenY" value="1600" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="33" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="lynx" />
|
||||
<option name="id" value="lynx" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel 7a" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2400" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="31" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="oriole" />
|
||||
<option name="id" value="oriole" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel 6" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2400" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="33" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="panther" />
|
||||
<option name="id" value="panther" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel 7" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2400" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="31" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="q2q" />
|
||||
<option name="id" value="q2q" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy Z Fold3" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1768" />
|
||||
<option name="screenY" value="2208" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="34" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="q5q" />
|
||||
<option name="id" value="q5q" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy Z Fold5" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1812" />
|
||||
<option name="screenY" value="2176" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="30" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="r11" />
|
||||
<option name="id" value="r11" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel Watch" />
|
||||
<option name="screenDensity" value="320" />
|
||||
<option name="screenX" value="384" />
|
||||
<option name="screenY" value="384" />
|
||||
<option name="type" value="WEAR_OS" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="30" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="redfin" />
|
||||
<option name="id" value="redfin" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel 5" />
|
||||
<option name="screenDensity" value="440" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2340" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="34" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="shiba" />
|
||||
<option name="id" value="shiba" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel 8" />
|
||||
<option name="screenDensity" value="420" />
|
||||
<option name="screenX" value="1080" />
|
||||
<option name="screenY" value="2400" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="33" />
|
||||
<option name="brand" value="google" />
|
||||
<option name="codename" value="tangorpro" />
|
||||
<option name="id" value="tangorpro" />
|
||||
<option name="manufacturer" value="Google" />
|
||||
<option name="name" value="Pixel Tablet" />
|
||||
<option name="screenDensity" value="320" />
|
||||
<option name="screenX" value="1600" />
|
||||
<option name="screenY" value="2560" />
|
||||
</PersistentDeviceSelectionData>
|
||||
<PersistentDeviceSelectionData>
|
||||
<option name="api" value="29" />
|
||||
<option name="brand" value="samsung" />
|
||||
<option name="codename" value="x1q" />
|
||||
<option name="id" value="x1q" />
|
||||
<option name="manufacturer" value="Samsung" />
|
||||
<option name="name" value="Galaxy S20" />
|
||||
<option name="screenDensity" value="480" />
|
||||
<option name="screenX" value="1440" />
|
||||
<option name="screenY" value="3200" />
|
||||
</PersistentDeviceSelectionData>
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
@ -24,7 +24,7 @@ namespace cosmic::gs {
|
||||
bool GsEngine::isStalled() {
|
||||
return {};
|
||||
}
|
||||
u32 GsEngine::privileged(GsRegisters gsr) {
|
||||
u32 GsEngine::privileged(GsRegisters gsr) const {
|
||||
if (gsr == GsBusDir) {
|
||||
return gsPrivateRegs.busDir;
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ namespace cosmic::gs {
|
||||
void resetGraphics();
|
||||
std::tuple<bool, os::vec> readGsData();
|
||||
bool isStalled();
|
||||
u32 privileged(GsRegisters gsr);
|
||||
u32 privileged(GsRegisters gsr) const;
|
||||
|
||||
bool isSoftwareMode{};
|
||||
void gsWrite(u32 addr, u64 data);
|
||||
|
@ -10,7 +10,7 @@ namespace cosmic::iop {
|
||||
status.iep = status.ieo;
|
||||
}
|
||||
static const u8 mask{0xff};
|
||||
u32 IopCop::mfc(u8 copId) {
|
||||
u32 IopCop::mfc(u8 copId) const {
|
||||
u32 mcVar{};
|
||||
switch (copId) {
|
||||
case 12: {
|
||||
@ -38,6 +38,8 @@ namespace cosmic::iop {
|
||||
mcVar = ePC; break;
|
||||
case 15:
|
||||
mcVar = c0id; break;
|
||||
default:
|
||||
mcVar = {};
|
||||
}
|
||||
return mcVar;
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ namespace cosmic::iop {
|
||||
u32 ePC;
|
||||
u32 c0id;
|
||||
|
||||
u32 mfc(u8 copId);
|
||||
u32 mfc(u8 copId) const;
|
||||
void mtc(u8 copId, u32 regVal);
|
||||
// Return from exception (COP0)
|
||||
void rfe();
|
||||
|
@ -15,10 +15,11 @@ namespace cosmic::iop {
|
||||
|
||||
IoMipsCore::IoMipsCore(std::shared_ptr<mio::MemoryPipe>& pipe) :
|
||||
iopMem(pipe) {
|
||||
interpreter = std::make_unique<creeper::psx::IopInterpreter>(*this);
|
||||
for (auto& ic : instCache) {
|
||||
ic.data = ic.tag = {};
|
||||
ic.isValid = {};
|
||||
interpreter = std::make_unique<creeper::psx::IopInterpreter>(*this);
|
||||
for (auto& cache : instCache) {
|
||||
cache.data = {};
|
||||
cache.tag = {};
|
||||
// cache.isValid = {};
|
||||
}
|
||||
}
|
||||
u32 IoMipsCore::iopPrivateAddrSolver(u32 address) {
|
||||
@ -55,6 +56,10 @@ namespace cosmic::iop {
|
||||
cacheCtrl = 0;
|
||||
mathDelay = branchDelay = 0;
|
||||
onBranch = false;
|
||||
ranges::for_each(instCache, [](auto& validLine) {
|
||||
validLine.isValid = {};
|
||||
});
|
||||
|
||||
user->info("(IOP): Reset finished, IOP->PC: {}", ioPc);
|
||||
}
|
||||
void IoMipsCore::pulse(u32 cycles) {
|
||||
@ -67,26 +72,27 @@ namespace cosmic::iop {
|
||||
}
|
||||
}
|
||||
u32 IoMipsCore::fetchByPc() {
|
||||
lastPc = ioPc;
|
||||
if (isPcUncached(ioPc)) {
|
||||
// Reading directly from IO RAM incurs a penalty of 4 machine cycles
|
||||
cyclesToIo -= 4;
|
||||
mathDelay = std::max(mathDelay - 4, 0);
|
||||
return iopRead<u32>(incPc());
|
||||
}
|
||||
const u32 tag{((ioPc & 0xffff'f000) >> 0xc) | 1};
|
||||
const u32 tag{(ioPc & 0xffff'f000) >> 0xc};
|
||||
const u32 index{(ioPc & 0xffc) >> 2};
|
||||
if (index > instCache.size()) {
|
||||
}
|
||||
auto ioc{std::addressof(instCache.at(index))};
|
||||
if (ioc->tag == tag) {
|
||||
if (ioc->tag == tag && ioc->isValid) {
|
||||
cacheHit++;
|
||||
incPc();
|
||||
return ioc->data;
|
||||
}
|
||||
cacheMiss++;
|
||||
|
||||
const u32 ioOpcode{iopRead<u32>(incPc())};
|
||||
ioc->data = ioOpcode;
|
||||
ioc->isValid = true;
|
||||
return ioOpcode;
|
||||
}
|
||||
u32 IoMipsCore::incPc() {
|
||||
@ -109,8 +115,8 @@ namespace cosmic::iop {
|
||||
if (code == busError) {
|
||||
// R2-R3 or v0-v1 -> Subroutine return values, may be changed by subroutines
|
||||
if (!(ioPc & 0x3 || ioGPRs[2] & 0x1 || ioGPRs[3] & 0x1))
|
||||
if (!(ioGPRs[28] & 0x1 || ioGPRs[29] & 0x1))
|
||||
;
|
||||
if (!(ioGPRs[28] & 0x1 || ioGPRs[29] & 0x1)) {
|
||||
}
|
||||
}
|
||||
// There are only two exception handler addresses,
|
||||
// and we can decide by looking the bootstrap status
|
||||
@ -132,7 +138,7 @@ namespace cosmic::iop {
|
||||
// KUSeg, KSeg2
|
||||
return address;
|
||||
}
|
||||
bool IoMipsCore::isPcUncached(u32 pc) {
|
||||
bool IoMipsCore::isPcUncached(u32 pc) const {
|
||||
return pc >= 0xa0000000 || !(cacheCtrl & (1 << 11));
|
||||
}
|
||||
bool IoMipsCore::isRoRegion(u32 address) {
|
||||
|
@ -26,14 +26,14 @@ namespace cosmic::iop {
|
||||
|
||||
std::array<u32, 32> ioGPRs;
|
||||
std::array<u8, 1024 * 1> ioScratch;
|
||||
std::array<IoCache, 1024> instCache;
|
||||
std::array<IoCache, 0x400> instCache;
|
||||
u32 cacheCtrl;
|
||||
u32 cacheHit, cacheMiss;
|
||||
std::shared_ptr<mio::MemoryPipe> iopMem;
|
||||
|
||||
u32 translateAddr(u32 address);
|
||||
bool isPcUncached(u32 pc);
|
||||
bool isRoRegion(u32 address);
|
||||
static u32 translateAddr(u32 address);
|
||||
bool isPcUncached(u32 pc) const;
|
||||
static bool isRoRegion(u32 address);
|
||||
|
||||
template <typename T>
|
||||
T iopRead(u32 address) {
|
||||
@ -70,7 +70,7 @@ namespace cosmic::iop {
|
||||
void takeBranchIf(bool take, i32 pcAddr);
|
||||
u8 irqSpawned;
|
||||
private:
|
||||
u32 iopPrivateAddrSolver(u32 address);
|
||||
static u32 iopPrivateAddrSolver(u32 address);
|
||||
|
||||
std::unique_ptr<IopExecVe> interpreter;
|
||||
};
|
||||
|
@ -4,9 +4,9 @@
|
||||
namespace cosmic::iop {
|
||||
void IopDma::resetIoDma() {
|
||||
activeChannel.reset();
|
||||
for (u8 chan{}; chan < channels.size(); chan++) {
|
||||
for (u64 chan{}; chan < channels.size(); chan++) {
|
||||
channels[chan] = {};
|
||||
channels[chan].index = chan;
|
||||
channels[chan].index = static_cast<u8>(chan);
|
||||
}
|
||||
}
|
||||
void IopDma::pulse(u32 cycles) {
|
||||
@ -24,7 +24,7 @@ namespace cosmic::iop {
|
||||
// When true, it means that we will write into the SPU2 device
|
||||
bool write2Spu;
|
||||
Ref<IopChan> channel;
|
||||
std::array<u32, 2> packet;
|
||||
std::array<u32, 2> packet{};
|
||||
|
||||
channel = std::ref(channels[IopSpu2]);
|
||||
write2Spu = channel->status.isFrom2Device;
|
||||
|
Loading…
Reference in New Issue
Block a user