1 #ifndef _PSPBIOS_H_ 2 #define _PSPBIOS_H_ 3 4 #include <map> 5 #include "MIPSAssembler.h" 6 #include "Types.h" 7 #include "ELF.h" 8 #include "MIPS.h" 9 #include "BiosDebugInfoProvider.h" 10 #include "OsStructManager.h" 11 #include "PspModule.h" 12 #include "Psp_IoFileMgrForUser.h" 13 #include "Psp_SasCore.h" 14 #include "Psp_Audio.h" 15 16 namespace Psp 17 { 18 class CBios : public CBiosDebugInfoProvider 19 { 20 public: 21 CBios(CMIPS&, uint8*, uint32); 22 virtual ~CBios(); 23 24 void Reset(); 25 void LoadModule(const char*); 26 27 void HandleException(); 28 29 uint32 CreateThread(const char*, uint32, uint32, uint32, uint32, uint32); 30 void StartThread(uint32, uint32, uint8*); 31 void ExitCurrentThread(uint32); 32 33 uint32 CreateMbx(const char*, uint32, uint32); 34 uint32 SendMbx(uint32, uint32); 35 uint32 PollMbx(uint32, uint32); 36 37 uint32 Heap_AllocateMemory(uint32); 38 uint32 Heap_FreeMemory(uint32); 39 uint32 Heap_GetBlockId(uint32); 40 uint32 Heap_GetBlockAddress(uint32); 41 42 CIoFileMgrForUser* GetIoFileMgr(); 43 CSasCore* GetSasCore(); 44 CAudio* GetAudio(); 45 46 #ifdef DEBUGGER_INCLUDED 47 BiosDebugModuleInfoArray GetModulesDebugInfo() const override; 48 BiosDebugThreadInfoArray GetThreadsDebugInfo() const override; 49 #endif 50 51 private: 52 enum CONTROL_BLOCK 53 { 54 CONTROL_BLOCK_START = 0x10, 55 CONTROL_BLOCK_END = 0x10000, 56 }; 57 58 struct HEAPBLOCK 59 { 60 uint32 isValid; 61 uint32 nextBlock; 62 uint32 address; 63 uint32 size; 64 }; 65 66 struct THREADCONTEXT 67 { 68 uint32 gpr[0x20]; 69 uint32 epc; 70 uint32 delayJump; 71 }; 72 73 struct THREAD 74 { 75 uint32 isValid; 76 uint32 id; 77 char name[0x20]; 78 uint32 priority; 79 THREADCONTEXT context; 80 uint32 status; 81 uint32 waitSemaphore; 82 uint32 wakeupCount; 83 uint32 stackBase; 84 uint32 stackSize; 85 uint32 nextThreadId; 86 uint64 nextActivateTime; 87 }; 88 89 struct MESSAGE 90 { 91 uint32 isValid; 92 uint32 id; 93 uint32 mbxId; 94 uint32 value; 95 }; 96 97 struct MESSAGEBOX 98 { 99 uint32 isValid; 100 char name[0x20]; 101 uint32 attr; 102 }; 103 104 struct MEMORYBLOCK 105 { 106 uint32 isValid; 107 uint32 id; 108 uint32 ptr; 109 }; 110 111 enum 112 { 113 MAX_HEAPBLOCKS = 256, 114 MIN_HEAPBLOCK_SIZE = 0x20, 115 }; 116 117 enum 118 { 119 MAX_MODULETRAMPOLINES = 128, 120 }; 121 122 enum 123 { 124 MAX_THREADS = 32, 125 }; 126 127 enum 128 { 129 MAX_MESSAGEBOXES = 8, 130 }; 131 132 enum 133 { 134 MAX_MESSAGES = 128, 135 }; 136 137 enum DEFAULT_STACKSIZE 138 { 139 DEFAULT_STACKSIZE = 0x10000, 140 }; 141 142 enum THREAD_STATUS 143 { 144 THREAD_STATUS_CREATED, 145 THREAD_STATUS_RUNNING, 146 THREAD_STATUS_ZOMBIE, 147 }; 148 149 struct LIBRARYENTRY 150 { 151 uint32 libraryAddress; 152 uint16 version; 153 uint16 attributes; 154 uint8 exportEntryCount; 155 uint8 variableCount; 156 uint16 functionCount; 157 uint32 entryTableAddress; 158 }; 159 160 struct LIBRARYSTUB 161 { 162 uint32 moduleStrAddr; 163 uint16 importFlags; 164 uint16 libraryVersion; 165 uint16 stubCount; 166 uint16 stubSize; 167 uint32 stubNidTableAddr; 168 uint32 stubAddress; 169 }; 170 171 struct MODULEINFO 172 { 173 uint16 attributes; 174 uint16 version; 175 uint8 name[28]; 176 uint32 gp; 177 uint32 libEntAddr; 178 uint32 libEntBtmAddr; 179 uint32 libStubAddr; 180 uint32 libStubBtmAddr; 181 }; 182 183 struct MODULEFUNCTION 184 { 185 uint32 id; 186 const char* name; 187 }; 188 189 struct MODULE 190 { 191 const char* name; 192 MODULEFUNCTION* functions; 193 }; 194 195 struct MODULETRAMPOLINE 196 { 197 uint32 isValid; 198 uint32 code0; 199 uint32 code1; 200 uint32 code2; 201 uint32 code3; 202 uint32 libStubAddr; 203 }; 204 205 typedef std::shared_ptr<CModule> ModulePtr; 206 typedef std::map<std::string, ModulePtr> ModuleMapType; 207 typedef COsStructManager<HEAPBLOCK> HeapBlockListType; 208 typedef COsStructManager<MODULETRAMPOLINE> ModuleTrampolineListType; 209 typedef COsStructManager<THREAD> ThreadListType; 210 typedef COsStructManager<MESSAGEBOX> MessageBoxListType; 211 typedef COsStructManager<MESSAGE> MessageListType; 212 213 uint32 AssembleThreadFinish(CMIPSAssembler&); 214 uint32 AssembleReturnFromException(CMIPSAssembler&); 215 uint32 AssembleIdleFunction(CMIPSAssembler&); 216 217 void InsertModule(const ModulePtr&); 218 void HandleLinkedModuleCall(); 219 220 MODULE* FindModule(const char*); 221 MODULEFUNCTION* FindModuleFunction(MODULE*, uint32); 222 void RelocateElf(CELF&); 223 uint32 FindNextRelocationTarget(CELF&, const uint32*, const uint32*); 224 #ifdef _DEBUG 225 uint32 FindRelocationAt(CELF&, uint32, uint32); 226 #endif 227 228 void LinkThread(uint32); 229 void UnlinkThread(uint32); 230 THREAD& GetThread(uint32); 231 void LoadThreadContext(uint32); 232 void SaveThreadContext(uint32); 233 void Reschedule(); 234 uint32 GetNextReadyThread(); 235 236 uint32& ThreadLinkHead() const; 237 uint32& CurrentThreadId() const; 238 239 void Heap_Init(); 240 241 CELF* m_module; 242 uint8* m_ram; 243 uint32 m_ramSize; 244 CMIPS& m_cpu; 245 246 ModuleMapType m_modules; 247 BiosDebugModuleInfoArray m_moduleTags; 248 249 HeapBlockListType m_heapBlocks; 250 uint32 m_heapBegin; 251 uint32 m_heapEnd; 252 uint32 m_heapSize; 253 uint32 m_heapHeadBlockId; 254 255 uint32 m_threadFinishAddress; 256 uint32 m_idleFunctionAddress; 257 258 ModuleTrampolineListType m_moduleTrampolines; 259 ThreadListType m_threads; 260 MessageBoxListType m_messageBoxes; 261 MessageListType m_messages; 262 263 IoFileMgrForUserModulePtr m_ioFileMgrForUserModule; 264 SasCoreModulePtr m_sasCoreModule; 265 AudioModulePtr m_audioModule; 266 267 static MODULEFUNCTION g_IoFileMgrForUserFunctions[]; 268 static MODULEFUNCTION g_SysMemUserForUserFunctions[]; 269 static MODULEFUNCTION g_ThreadManForUserFunctions[]; 270 static MODULEFUNCTION g_LoadExecForUserFunctions[]; 271 static MODULEFUNCTION g_UtilsForUserFunctions[]; 272 static MODULEFUNCTION g_SasCoreFunctions[]; 273 static MODULEFUNCTION g_WaveFunctions[]; 274 static MODULEFUNCTION g_UmdUserFunctions[]; 275 static MODULEFUNCTION g_UtilityFunctions[]; 276 static MODULEFUNCTION g_KernelLibraryFunctions[]; 277 static MODULEFUNCTION g_ModuleMgrForUserFunctions[]; 278 static MODULEFUNCTION g_StdioForUserFunctions[]; 279 static MODULE g_modules[]; 280 281 bool m_rescheduleNeeded; 282 }; 283 } 284 285 #endif 286