Skip to content

Commit 6cbab87

Browse files
Kernel.Event: Implement kqueue and kevent (#4065)
* Remove dead code from EqueueInternal::WaitForEvents No longer necessary now that we avoid using small timers when falling back on equeue logic. * Refactor type names Might as well * Properly define OrbisKernelEqueue as a handle Most of the functions using an "OrbisKernelEqueue" call directly into kevent. Therefore, OrbisKernelEqueue should be a equeue handle. * Clang * Widen OrbisKernelEqueue type On real hardware, it's some value that contains the handle, as opposed to just the handle itself. * kqueue implementation The easy part * Hardware-accurate timer data Needed to make kevent simpler for these uses. * Move callback scheduling to EqueueInternal::AddEvent kevent would become excessively bloated if I needed to deal with that in there. * posix_kevent kevent is a bit of a pain, for now I've implemented as much as libkernel actually uses for it's wrappers, and left error logs to skip behavior when necessary. * Log calls * Apple, why are you calling fstat on an equeue?
1 parent 607d704 commit 6cbab87

File tree

10 files changed

+366
-197
lines changed

10 files changed

+366
-197
lines changed

src/core/file_sys/fs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ enum class FileType {
8585
Device,
8686
Socket,
8787
Epoll,
88-
Resolver
88+
Resolver,
89+
Equeue
8990
};
9091

9192
struct File {

src/core/libraries/gnmdriver/gnmdriver.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,23 @@ static inline bool IsValidEventType(Platform::InterruptId id) {
123123
static_cast<u32>(id) == static_cast<u32>(Platform::InterruptId::GfxEop);
124124
}
125125

126-
s32 PS4_SYSV_ABI sceGnmAddEqEvent(SceKernelEqueue eq, u64 id, void* udata) {
126+
s32 PS4_SYSV_ABI sceGnmAddEqEvent(OrbisKernelEqueue eq, u64 id, void* udata) {
127127
LOG_TRACE(Lib_GnmDriver, "called");
128128

129-
if (!eq) {
129+
auto equeue = GetEqueue(eq);
130+
if (!equeue) {
130131
return ORBIS_KERNEL_ERROR_EBADF;
131132
}
132133

133134
EqueueEvent kernel_event{};
134135
kernel_event.event.ident = id;
135-
kernel_event.event.filter = SceKernelEvent::Filter::GraphicsCore;
136-
kernel_event.event.flags = SceKernelEvent::Flags::Add;
136+
kernel_event.event.filter = OrbisKernelEvent::Filter::GraphicsCore;
137+
kernel_event.event.flags = OrbisKernelEvent::Flags::Add;
137138
kernel_event.event.fflags = 0;
138139
kernel_event.event.data = id;
139140
kernel_event.event.udata = udata;
140-
eq->AddEvent(kernel_event);
141+
142+
equeue->AddEvent(kernel_event);
141143

142144
Platform::IrqC::Instance()->Register(
143145
static_cast<Platform::InterruptId>(id),
@@ -149,10 +151,11 @@ s32 PS4_SYSV_ABI sceGnmAddEqEvent(SceKernelEqueue eq, u64 id, void* udata) {
149151
return;
150152

151153
// Event data is expected to be an event type as per sceGnmGetEqEventType.
152-
eq->TriggerEvent(static_cast<GnmEventType>(id), SceKernelEvent::Filter::GraphicsCore,
153-
reinterpret_cast<void*>(id));
154+
equeue->TriggerEvent(static_cast<GnmEventType>(id),
155+
OrbisKernelEvent::Filter::GraphicsCore,
156+
reinterpret_cast<void*>(id));
154157
},
155-
eq);
158+
equeue);
156159
return ORBIS_OK;
157160
}
158161

@@ -267,16 +270,17 @@ int PS4_SYSV_ABI sceGnmDebugHardwareStatus() {
267270
return ORBIS_OK;
268271
}
269272

270-
s32 PS4_SYSV_ABI sceGnmDeleteEqEvent(SceKernelEqueue eq, u64 id) {
273+
s32 PS4_SYSV_ABI sceGnmDeleteEqEvent(OrbisKernelEqueue eq, u64 id) {
271274
LOG_TRACE(Lib_GnmDriver, "called");
272275

273-
if (!eq) {
276+
auto equeue = GetEqueue(eq);
277+
if (!equeue) {
274278
return ORBIS_KERNEL_ERROR_EBADF;
275279
}
276280

277-
eq->RemoveEvent(id, SceKernelEvent::Filter::GraphicsCore);
281+
equeue->RemoveEvent(id, OrbisKernelEvent::Filter::GraphicsCore);
278282

279-
Platform::IrqC::Instance()->Unregister(static_cast<Platform::InterruptId>(id), eq);
283+
Platform::IrqC::Instance()->Unregister(static_cast<Platform::InterruptId>(id), equeue);
280284
return ORBIS_OK;
281285
}
282286

@@ -895,7 +899,7 @@ int PS4_SYSV_ABI sceGnmGetDebugTimestamp() {
895899
return ORBIS_OK;
896900
}
897901

898-
int PS4_SYSV_ABI sceGnmGetEqEventType(const SceKernelEvent* ev) {
902+
int PS4_SYSV_ABI sceGnmGetEqEventType(const OrbisKernelEvent* ev) {
899903
LOG_TRACE(Lib_GnmDriver, "called");
900904
return sceKernelGetEventData(ev);
901905
}

src/core/libraries/gnmdriver/gnmdriver.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Libraries::GnmDriver {
1414

1515
using namespace Kernel;
1616

17-
s32 PS4_SYSV_ABI sceGnmAddEqEvent(SceKernelEqueue eq, u64 id, void* udata);
17+
s32 PS4_SYSV_ABI sceGnmAddEqEvent(OrbisKernelEqueue eq, u64 id, void* udata);
1818
int PS4_SYSV_ABI sceGnmAreSubmitsAllowed();
1919
int PS4_SYSV_ABI sceGnmBeginWorkload(u32 workload_stream, u64* workload);
2020
s32 PS4_SYSV_ABI sceGnmComputeWaitOnAddress(u32* cmdbuf, u32 size, uintptr_t addr, u32 mask,
@@ -31,7 +31,7 @@ int PS4_SYSV_ABI sceGnmDebuggerSetAddressWatch();
3131
int PS4_SYSV_ABI sceGnmDebuggerWriteGds();
3232
int PS4_SYSV_ABI sceGnmDebuggerWriteSqIndirectRegister();
3333
int PS4_SYSV_ABI sceGnmDebugHardwareStatus();
34-
s32 PS4_SYSV_ABI sceGnmDeleteEqEvent(SceKernelEqueue eq, u64 id);
34+
s32 PS4_SYSV_ABI sceGnmDeleteEqEvent(OrbisKernelEqueue eq, u64 id);
3535
int PS4_SYSV_ABI sceGnmDestroyWorkloadStream();
3636
void PS4_SYSV_ABI sceGnmDingDong(u32 gnm_vqid, u32 next_offs_dw);
3737
void PS4_SYSV_ABI sceGnmDingDongForWorkload(u32 gnm_vqid, u32 next_offs_dw, u64 workload_id);
@@ -87,7 +87,7 @@ int PS4_SYSV_ABI sceGnmGetCoredumpMode();
8787
int PS4_SYSV_ABI sceGnmGetCoredumpProtectionFaultTimestamp();
8888
int PS4_SYSV_ABI sceGnmGetDbgGcHandle();
8989
int PS4_SYSV_ABI sceGnmGetDebugTimestamp();
90-
int PS4_SYSV_ABI sceGnmGetEqEventType(const SceKernelEvent* ev);
90+
int PS4_SYSV_ABI sceGnmGetEqEventType(const OrbisKernelEvent* ev);
9191
int PS4_SYSV_ABI sceGnmGetEqTimeStamp();
9292
int PS4_SYSV_ABI sceGnmGetGpuBlockStatus();
9393
u32 PS4_SYSV_ABI sceGnmGetGpuCoreClockFrequency();

0 commit comments

Comments
 (0)