mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-04 22:19:02 +00:00
[orbis-kernel] implement pipe kevents
This commit is contained in:
parent
0f86008b9b
commit
0a957b8785
12 changed files with 262 additions and 122 deletions
|
|
@ -1,117 +1,12 @@
|
|||
#pragma once
|
||||
|
||||
#include "file.hpp"
|
||||
#include "orbis-config.hpp"
|
||||
#include "note.hpp"
|
||||
#include "utils/SharedCV.hpp"
|
||||
#include "utils/SharedMutex.hpp"
|
||||
#include <list>
|
||||
#include <mutex>
|
||||
#include <set>
|
||||
|
||||
namespace orbis {
|
||||
static constexpr auto kEvFiltRead = -1;
|
||||
static constexpr auto kEvFiltWrite = -2;
|
||||
static constexpr auto kEvFiltAio = -3;
|
||||
static constexpr auto kEvFiltVnode = -4;
|
||||
static constexpr auto kEvFiltProc = -5;
|
||||
static constexpr auto kEvFiltSignal = -6;
|
||||
static constexpr auto kEvFiltTimer = -7;
|
||||
static constexpr auto kEvFiltFs = -9;
|
||||
static constexpr auto kEvFiltLio = -10;
|
||||
static constexpr auto kEvFiltUser = -11;
|
||||
static constexpr auto kEvFiltPolling = -12;
|
||||
static constexpr auto kEvFiltDisplay = -13;
|
||||
static constexpr auto kEvFiltGraphicsCore = -14;
|
||||
static constexpr auto kEvFiltHrTimer = -15;
|
||||
static constexpr auto kEvFiltUvdTrap = -16;
|
||||
static constexpr auto kEvFiltVceTrap = -17;
|
||||
static constexpr auto kEvFiltSdmaTrap = -18;
|
||||
static constexpr auto kEvFiltRegEv = -19;
|
||||
static constexpr auto kEvFiltGpuException = -20;
|
||||
static constexpr auto kEvFiltGpuSystemException = -21;
|
||||
static constexpr auto kEvFiltGpuDbgGcEv = -22;
|
||||
static constexpr auto kEvFiltSysCount = 22;
|
||||
|
||||
// actions
|
||||
static constexpr auto kEvAdd = 0x0001;
|
||||
static constexpr auto kEvDelete = 0x0002;
|
||||
static constexpr auto kEvEnable = 0x0004;
|
||||
static constexpr auto kEvDisable = 0x0008;
|
||||
|
||||
// flags
|
||||
static constexpr auto kEvOneshot = 0x0010;
|
||||
static constexpr auto kEvClear = 0x0020;
|
||||
static constexpr auto kEvReceipt = 0x0040;
|
||||
static constexpr auto kEvDispatch = 0x0080;
|
||||
static constexpr auto kEvSysFlags = 0xf000;
|
||||
static constexpr auto kEvFlag1 = 0x2000;
|
||||
|
||||
static constexpr auto kEvEof = 0x8000;
|
||||
static constexpr auto kEvError = 0x4000;
|
||||
|
||||
// kEvFiltUser
|
||||
static constexpr auto kNoteFFNop = 0x00000000;
|
||||
static constexpr auto kNoteFFAnd = 0x40000000;
|
||||
static constexpr auto kNoteFFOr = 0x80000000;
|
||||
static constexpr auto kNoteFFCopy = 0xc0000000;
|
||||
static constexpr auto kNoteFFCtrlMask = 0xc0000000;
|
||||
static constexpr auto kNoteFFlagsMask = 0x00ffffff;
|
||||
static constexpr auto kNoteTrigger = 0x01000000;
|
||||
|
||||
// kEvFiltProc
|
||||
static constexpr auto kNoteExit = 0x80000000;
|
||||
static constexpr auto kNoteFork = 0x40000000;
|
||||
static constexpr auto kNoteExec = 0x20000000;
|
||||
|
||||
struct KEvent {
|
||||
uintptr_t ident;
|
||||
sshort filter;
|
||||
ushort flags;
|
||||
uint fflags;
|
||||
intptr_t data;
|
||||
ptr<void> udata;
|
||||
};
|
||||
|
||||
struct KQueue;
|
||||
|
||||
struct KNote {
|
||||
shared_mutex mutex;
|
||||
Ref<KQueue> queue;
|
||||
KEvent event{};
|
||||
bool enabled = true;
|
||||
bool triggered = false;
|
||||
void *linked = nullptr; // TODO: use Ref<>
|
||||
|
||||
~KNote();
|
||||
};
|
||||
|
||||
struct KQueue : orbis::File {
|
||||
shared_cv cv;
|
||||
std::list<KNote, kallocator<KNote>> notes;
|
||||
};
|
||||
|
||||
struct EventEmitter {
|
||||
shared_mutex mutex;
|
||||
std::set<KNote *, std::less<>, kallocator<KNote *>> notes;
|
||||
|
||||
void emit(uint noteId, intptr_t data = 0) {
|
||||
std::lock_guard lock(mutex);
|
||||
|
||||
for (auto note : notes) {
|
||||
if ((note->event.fflags & noteId) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
std::lock_guard lock(note->mutex);
|
||||
|
||||
if (note->triggered) {
|
||||
continue;
|
||||
}
|
||||
|
||||
note->triggered = true;
|
||||
note->event.data = data;
|
||||
note->queue->cv.notify_all(note->queue->mtx);
|
||||
}
|
||||
}
|
||||
};
|
||||
} // namespace orbis
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "KernelAllocator.hpp"
|
||||
#include "error/ErrorCode.hpp"
|
||||
#include "note.hpp"
|
||||
#include "stat.hpp"
|
||||
#include "utils/Rc.hpp"
|
||||
#include "utils/SharedMutex.hpp"
|
||||
|
|
@ -44,6 +45,7 @@ struct FileOps {
|
|||
|
||||
struct File : RcBase {
|
||||
shared_mutex mtx;
|
||||
EventEmitter event;
|
||||
const FileOps *ops = nullptr;
|
||||
Ref<RcBase> device;
|
||||
std::uint64_t nextOff = 0;
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ struct IpmiSession : RcBase {
|
|||
EventFlag evf{0, 0};
|
||||
shared_cv connectCv;
|
||||
bool expectedOutput = false; // TODO: verify
|
||||
bool connected = false; // TODO: implement more states
|
||||
bool connected = false; // TODO: implement more states
|
||||
sint connectionStatus{0};
|
||||
};
|
||||
|
||||
|
|
@ -121,9 +121,8 @@ SysResult sysIpmiDestroySession(Thread *thread, ptr<uint> result, uint kid,
|
|||
|
||||
SysResult sysIpmiServerReceivePacket(Thread *thread, ptr<uint> result, uint kid,
|
||||
ptr<void> params, uint64_t paramsSz);
|
||||
SysResult sysIpmiSendConnectResult(Thread *thread, ptr<uint> result,
|
||||
uint kid, ptr<void> params,
|
||||
uint64_t paramsSz);
|
||||
SysResult sysIpmiSendConnectResult(Thread *thread, ptr<uint> result, uint kid,
|
||||
ptr<void> params, uint64_t paramsSz);
|
||||
SysResult sysIpmiSessionRespondSync(Thread *thread, ptr<uint> result, uint kid,
|
||||
ptr<void> params, uint64_t paramsSz);
|
||||
SysResult sysIpmiSessionGetClientPid(Thread *thread, ptr<uint> result, uint kid,
|
||||
|
|
@ -137,4 +136,13 @@ SysResult sysIpmiSessionGetUserData(Thread *thread, ptr<uint> result, uint kid,
|
|||
ptr<void> params, uint64_t paramsSz);
|
||||
SysResult sysIpmiServerGetName(Thread *thread, ptr<uint> result, uint kid,
|
||||
ptr<void> params, uint64_t paramsSz);
|
||||
SysResult sysIpmiClientPollEventFlag(Thread *thread, ptr<uint> result,
|
||||
uint kid, ptr<void> params,
|
||||
uint64_t paramsSz);
|
||||
SysResult sysIpmiSessionWaitEventFlag(Thread *thread, ptr<uint> result,
|
||||
uint kid, ptr<void> params,
|
||||
uint64_t paramsSz);
|
||||
SysResult sysIpmiSessionSetEventFlag(Thread *thread, ptr<uint> result, uint kid,
|
||||
ptr<void> params, uint64_t paramsSz);
|
||||
|
||||
} // namespace orbis
|
||||
|
|
|
|||
92
orbis-kernel/include/orbis/note.hpp
Normal file
92
orbis-kernel/include/orbis/note.hpp
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
#pragma once
|
||||
|
||||
#include "KernelAllocator.hpp"
|
||||
#include "orbis-config.hpp"
|
||||
#include "utils/SharedMutex.hpp"
|
||||
#include <mutex>
|
||||
#include <set>
|
||||
|
||||
namespace orbis {
|
||||
|
||||
static constexpr auto kEvFiltRead = -1;
|
||||
static constexpr auto kEvFiltWrite = -2;
|
||||
static constexpr auto kEvFiltAio = -3;
|
||||
static constexpr auto kEvFiltVnode = -4;
|
||||
static constexpr auto kEvFiltProc = -5;
|
||||
static constexpr auto kEvFiltSignal = -6;
|
||||
static constexpr auto kEvFiltTimer = -7;
|
||||
static constexpr auto kEvFiltFs = -9;
|
||||
static constexpr auto kEvFiltLio = -10;
|
||||
static constexpr auto kEvFiltUser = -11;
|
||||
static constexpr auto kEvFiltPolling = -12;
|
||||
static constexpr auto kEvFiltDisplay = -13;
|
||||
static constexpr auto kEvFiltGraphicsCore = -14;
|
||||
static constexpr auto kEvFiltHrTimer = -15;
|
||||
static constexpr auto kEvFiltUvdTrap = -16;
|
||||
static constexpr auto kEvFiltVceTrap = -17;
|
||||
static constexpr auto kEvFiltSdmaTrap = -18;
|
||||
static constexpr auto kEvFiltRegEv = -19;
|
||||
static constexpr auto kEvFiltGpuException = -20;
|
||||
static constexpr auto kEvFiltGpuSystemException = -21;
|
||||
static constexpr auto kEvFiltGpuDbgGcEv = -22;
|
||||
static constexpr auto kEvFiltSysCount = 22;
|
||||
|
||||
// actions
|
||||
static constexpr auto kEvAdd = 0x0001;
|
||||
static constexpr auto kEvDelete = 0x0002;
|
||||
static constexpr auto kEvEnable = 0x0004;
|
||||
static constexpr auto kEvDisable = 0x0008;
|
||||
|
||||
// flags
|
||||
static constexpr auto kEvOneshot = 0x0010;
|
||||
static constexpr auto kEvClear = 0x0020;
|
||||
static constexpr auto kEvReceipt = 0x0040;
|
||||
static constexpr auto kEvDispatch = 0x0080;
|
||||
static constexpr auto kEvSysFlags = 0xf000;
|
||||
static constexpr auto kEvFlag1 = 0x2000;
|
||||
|
||||
static constexpr auto kEvEof = 0x8000;
|
||||
static constexpr auto kEvError = 0x4000;
|
||||
|
||||
// kEvFiltUser
|
||||
static constexpr auto kNoteFFNop = 0x00000000;
|
||||
static constexpr auto kNoteFFAnd = 0x40000000;
|
||||
static constexpr auto kNoteFFOr = 0x80000000;
|
||||
static constexpr auto kNoteFFCopy = 0xc0000000;
|
||||
static constexpr auto kNoteFFCtrlMask = 0xc0000000;
|
||||
static constexpr auto kNoteFFlagsMask = 0x00ffffff;
|
||||
static constexpr auto kNoteTrigger = 0x01000000;
|
||||
|
||||
// kEvFiltProc
|
||||
static constexpr auto kNoteExit = 0x80000000;
|
||||
static constexpr auto kNoteFork = 0x40000000;
|
||||
static constexpr auto kNoteExec = 0x20000000;
|
||||
|
||||
struct KEvent {
|
||||
uintptr_t ident;
|
||||
sshort filter;
|
||||
ushort flags;
|
||||
uint fflags;
|
||||
intptr_t data;
|
||||
ptr<void> udata;
|
||||
};
|
||||
|
||||
struct KQueue;
|
||||
struct KNote {
|
||||
shared_mutex mutex;
|
||||
Ref<KQueue> queue;
|
||||
KEvent event{};
|
||||
bool enabled = true;
|
||||
bool triggered = false;
|
||||
void *linked = nullptr; // TODO: use Ref<>
|
||||
|
||||
~KNote();
|
||||
};
|
||||
|
||||
struct EventEmitter {
|
||||
shared_mutex mutex;
|
||||
std::set<KNote *, std::less<>, kallocator<KNote *>> notes;
|
||||
|
||||
void emit(uint filter, uint fflags = 0, intptr_t data = 0);
|
||||
};
|
||||
} // namespace orbis
|
||||
|
|
@ -3,9 +3,12 @@
|
|||
#include "KernelAllocator.hpp"
|
||||
#include "file.hpp"
|
||||
#include "utils/Rc.hpp"
|
||||
#include "utils/SharedCV.hpp"
|
||||
#include "utils/SharedMutex.hpp"
|
||||
|
||||
namespace orbis {
|
||||
struct Pipe final : File {
|
||||
shared_cv cv;
|
||||
kvector<std::byte> data;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue