| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -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;
 | 
					 | 
					 | 
					 | 
					            occupied[handle - HANDLE_OFFSET] = false;
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            delete pool[handle - handleOffset];
 | 
					 | 
					 | 
					 | 
					            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);
 | 
					 | 
					 | 
					 | 
					                WARN_LOG(KERNEL, "Kernel: Wrong object type for %i (%08x)", handle, handle);
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                outError = T::GetMissingErrorCode();
 | 
					 | 
					 | 
					 | 
					                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;
 | 
					 | 
					 | 
					 | 
					        const UID realHandle = handle - HANDLE_OFFSET;
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        _dbg_assert_(SCEKERNEL, realHandle >= 0 && realHandle < maxCount && occupied[realHandle]);
 | 
					 | 
					 | 
					 | 
					        _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);
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					 | 
					
 
 |