|
|
@ -8,6 +8,15 @@ |
|
|
|
|
|
|
|
|
typedef u32 UID; |
|
|
typedef u32 UID; |
|
|
|
|
|
|
|
|
|
|
|
enum KernelIDType { |
|
|
|
|
|
KERNEL_ID_TYPE_THREAD = 1, |
|
|
|
|
|
KERNEL_ID_TYPE_SEMAPHORE = 2, |
|
|
|
|
|
KERNEL_ID_TYPE_MUTEX = 3, |
|
|
|
|
|
KERNEL_ID_TYPE_EVENT = 4, |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
#define KERNELOBJECT_MAX_NAME_LENGTH 31 |
|
|
|
|
|
|
|
|
class KernelObjectPool; |
|
|
class KernelObjectPool; |
|
|
|
|
|
|
|
|
class KernelObject { |
|
|
class KernelObject { |
|
|
@ -18,7 +27,7 @@ public: |
|
|
UID GetUID() const { return uid; } |
|
|
UID GetUID() const { return uid; } |
|
|
virtual const char *GetTypeName() { return "[BAD KERNEL OBJECT TYPE]"; } |
|
|
virtual const char *GetTypeName() { return "[BAD KERNEL OBJECT TYPE]"; } |
|
|
virtual const char *GetName() { return "[UNKNOWN KERNEL OBJECT]"; } |
|
|
virtual const char *GetName() { return "[UNKNOWN KERNEL OBJECT]"; } |
|
|
virtual int GetIDType() const = 0; |
|
|
|
|
|
|
|
|
virtual KernelIDType GetIDType() const = 0; |
|
|
//virtual void GetQuickInfo(char *ptr, int size); |
|
|
//virtual void GetQuickInfo(char *ptr, int size); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
@ -36,8 +45,8 @@ public: |
|
|
u32 Destroy(UID handle) { |
|
|
u32 Destroy(UID handle) { |
|
|
u32 error; |
|
|
u32 error; |
|
|
if (Get<T>(handle, error)) { |
|
|
if (Get<T>(handle, error)) { |
|
|
occupied[handle - handleOffset] = false; |
|
|
|
|
|
delete pool[handle - handleOffset]; |
|
|
|
|
|
|
|
|
occupied[handle - HANDLE_OFFSET] = false; |
|
|
|
|
|
delete pool[handle - HANDLE_OFFSET]; |
|
|
} |
|
|
} |
|
|
return error; |
|
|
return error; |
|
|
}; |
|
|
}; |
|
|
@ -46,24 +55,24 @@ public: |
|
|
|
|
|
|
|
|
template <class T> |
|
|
template <class T> |
|
|
T* Get(UID handle, u32& outError) { |
|
|
T* Get(UID handle, u32& outError) { |
|
|
if (handle < handleOffset || handle >= handleOffset + maxCount || !occupied[handle - handleOffset]) { |
|
|
|
|
|
|
|
|
if (handle < HANDLE_OFFSET || handle >= HANDLE_OFFSET + MAX_COUNT || !occupied[handle - HANDLE_OFFSET]) { |
|
|
// Tekken 6 spams 0x80020001 gets wrong with no ill effects, also on the real PSP |
|
|
// Tekken 6 spams 0x80020001 gets wrong with no ill effects, also on the real PSP |
|
|
if (handle != 0 && (u32)handle != 0x80020001) { |
|
|
if (handle != 0 && (u32)handle != 0x80020001) { |
|
|
WARN_LOG(SCEKERNEL, "Kernel: Bad object handle %i (%08x)", handle, handle); |
|
|
|
|
|
|
|
|
WARN_LOG(KERNEL, "Kernel: Bad object handle %i (%08x)", handle, handle); |
|
|
} |
|
|
} |
|
|
outError = T::GetMissingErrorCode(); |
|
|
|
|
|
|
|
|
outError = 0;//T::GetMissingErrorCode(); |
|
|
return 0; |
|
|
return 0; |
|
|
} else { |
|
|
} else { |
|
|
// Previously we had a dynamic_cast here, but since RTTI was disabled traditionally, |
|
|
// Previously we had a dynamic_cast here, but since RTTI was disabled traditionally, |
|
|
// it just acted as a static case and everything worked. This means that we will never |
|
|
// it just acted as a static case and everything worked. This means that we will never |
|
|
// see the Wrong type object error below, but we'll just have to live with that danger. |
|
|
// see the Wrong type object error below, but we'll just have to live with that danger. |
|
|
T* t = static_cast<T*>(pool[handle - handleOffset]); |
|
|
|
|
|
|
|
|
T* t = static_cast<T*>(pool[handle - HANDLE_OFFSET]); |
|
|
if (t == 0 || t->GetIDType() != T::GetStaticIDType()) { |
|
|
if (t == 0 || t->GetIDType() != T::GetStaticIDType()) { |
|
|
WARN_LOG(SCEKERNEL, "Kernel: Wrong object type for %i (%08x)", handle, handle); |
|
|
|
|
|
outError = T::GetMissingErrorCode(); |
|
|
|
|
|
|
|
|
WARN_LOG(KERNEL, "Kernel: Wrong object type for %i (%08x)", handle, handle); |
|
|
|
|
|
outError = 0;//T::GetMissingErrorCode(); |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
outError = SCE_KERNEL_ERROR_OK; |
|
|
|
|
|
|
|
|
outError = 0;//SCE_KERNEL_ERROR_OK; |
|
|
return t; |
|
|
return t; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -71,15 +80,15 @@ public: |
|
|
// ONLY use this when you know the handle is valid. |
|
|
// ONLY use this when you know the handle is valid. |
|
|
template <class T> |
|
|
template <class T> |
|
|
T *GetFast(UID handle) { |
|
|
T *GetFast(UID handle) { |
|
|
const UID realHandle = handle - handleOffset; |
|
|
|
|
|
_dbg_assert_(SCEKERNEL, realHandle >= 0 && realHandle < maxCount && occupied[realHandle]); |
|
|
|
|
|
|
|
|
const UID realHandle = handle - HANDLE_OFFSET; |
|
|
|
|
|
_dbg_assert_(KERNEL, realHandle >= 0 && realHandle < MAX_COUNT && occupied[realHandle]); |
|
|
return static_cast<T *>(pool[realHandle]); |
|
|
return static_cast<T *>(pool[realHandle]); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <class T, typename ArgT> |
|
|
template <class T, typename ArgT> |
|
|
void Iterate(bool func(T *, ArgT), ArgT arg) { |
|
|
void Iterate(bool func(T *, ArgT), ArgT arg) { |
|
|
int type = T::GetStaticIDType(); |
|
|
int type = T::GetStaticIDType(); |
|
|
for (int i = 0; i < maxCount; i++) |
|
|
|
|
|
|
|
|
for (int i = 0; i < MAX_COUNT; i++) |
|
|
{ |
|
|
{ |
|
|
if (!occupied[i]) |
|
|
if (!occupied[i]) |
|
|
continue; |
|
|
continue; |
|
|
@ -119,3 +128,5 @@ private: |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
extern KernelObjectPool g_kernel_objects; |
|
|
extern KernelObjectPool g_kernel_objects; |
|
|
|
|
|
|
|
|
|
|
|
bool __KernelLoadExec(u32 entry_point); |