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