1 // Copyright (c) 2012- PPSSPP Project.
2
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, version 2.0 or later versions.
6
7 // This program is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 // GNU General Public License 2.0 for more details.
11
12 // A copy of the GPL 2.0 should have been included with the program.
13 // If not, see http://www.gnu.org/licenses/
14
15 // Official git repository and contact information can be found at
16 // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
17
18 #include "Core/HLE/HLE.h"
19 #include "Core/HLE/HLETables.h"
20 #include "Core/HLE/FunctionWrappers.h"
21
22 #include "sceAtrac.h"
23 #include "sceAudio.h"
24 #include "sceAudiocodec.h"
25 #include "sceAudioRouting.h"
26 #include "sceCcc.h"
27 #include "sceChnnlsv.h"
28 #include "sceCtrl.h"
29 #include "sceDeflt.h"
30 #include "sceDisplay.h"
31 #include "sceDmac.h"
32 #include "sceFont.h"
33 #include "sceGameUpdate.h"
34 #include "sceGe.h"
35 #include "sceHeap.h"
36 #include "sceHprm.h"
37 #include "sceHttp.h"
38 #include "sceImpose.h"
39 #include "sceIo.h"
40 #include "sceJpeg.h"
41 #include "sceKernel.h"
42 #include "sceKernelEventFlag.h"
43 #include "sceKernelHeap.h"
44 #include "sceKernelMemory.h"
45 #include "sceKernelInterrupt.h"
46 #include "sceKernelModule.h"
47 #include "sceKernelSemaphore.h"
48 #include "sceKernelThread.h"
49 #include "sceKernelTime.h"
50 #include "sceMd5.h"
51 #include "sceMp4.h"
52 #include "sceMp3.h"
53 #include "sceNet.h"
54 #include "sceNetAdhoc.h"
55 #include "sceNp.h"
56 #include "sceMpeg.h"
57 #include "sceOpenPSID.h"
58 #include "sceP3da.h"
59 #include "sceParseHttp.h"
60 #include "sceParseUri.h"
61 #include "scePauth.h"
62 #include "scePower.h"
63 #include "scePspNpDrm_user.h"
64 #include "scePsmf.h"
65 #include "sceRtc.h"
66 #include "sceSas.h"
67 #include "sceSsl.h"
68 #include "sceUmd.h"
69 #include "sceUsb.h"
70 #include "sceUsbAcc.h"
71 #include "sceUsbCam.h"
72 #include "sceUsbGps.h"
73 #include "sceUsbMic.h"
74 #include "sceUtility.h"
75 #include "sceVaudio.h"
76 #include "sceMt19937.h"
77 #include "sceSha256.h"
78 #include "sceAdler.h"
79 #include "sceSfmt19937.h"
80 #include "sceG729.h"
81 #include "KUBridge.h"
82
83 #define N(s) s
84
85 //\*\*\ found\:\ {[a-zA-Z]*}\ {0x[a-zA-Z0-9]*}\ \*\*
86 //{FID(\2),0,N("\1")},
87
88 //Metal Gear Acid modules:
89 //kjfs
90 //sound
91 //zlibdec
92 const HLEFunction FakeSysCalls[] = {
93 {NID_THREADRETURN, __KernelReturnFromThread, "__KernelReturnFromThread", 'x', ""},
94 {NID_CALLBACKRETURN, __KernelReturnFromMipsCall, "__KernelReturnFromMipsCall", 'x', ""},
95 {NID_INTERRUPTRETURN, __KernelReturnFromInterrupt, "__KernelReturnFromInterrupt", 'x', ""},
96 {NID_EXTENDRETURN, __KernelReturnFromExtendStack, "__KernelReturnFromExtendStack", 'x', ""},
97 {NID_MODULERETURN, __KernelReturnFromModuleFunc, "__KernelReturnFromModuleFunc", 'x', ""},
98 {NID_IDLE, __KernelIdle, "_sceKernelIdle", 'x', ""},
99 {NID_GPUREPLAY, __KernelGPUReplay, "__KernelGPUReplay", 'x', ""},
100 {NID_HLECALLRETURN, HLEReturnFromMipsCall, "HLEReturnFromMipsCall", 'x', ""},
101 };
102
103 const HLEFunction UtilsForUser[] =
104 {
105 {0X91E4F6A7, &WrapU_V<sceKernelLibcClock>, "sceKernelLibcClock", 'x', "" },
106 {0X27CC57F0, &WrapU_U<sceKernelLibcTime>, "sceKernelLibcTime", 'x', "x" },
107 {0X71EC4271, &WrapU_UU<sceKernelLibcGettimeofday>, "sceKernelLibcGettimeofday", 'x', "xx" },
108 {0XBFA98062, &WrapI_UI<sceKernelDcacheInvalidateRange>, "sceKernelDcacheInvalidateRange", 'i', "xi" },
109 {0XC8186A58, &WrapI_UIU<sceKernelUtilsMd5Digest>, "sceKernelUtilsMd5Digest", 'i', "xix"},
110 {0X9E5C5086, &WrapI_U<sceKernelUtilsMd5BlockInit>, "sceKernelUtilsMd5BlockInit", 'i', "x" },
111 {0X61E1E525, &WrapI_UUI<sceKernelUtilsMd5BlockUpdate>, "sceKernelUtilsMd5BlockUpdate", 'i', "xxi"},
112 {0XB8D24E78, &WrapI_UU<sceKernelUtilsMd5BlockResult>, "sceKernelUtilsMd5BlockResult", 'i', "xx" },
113 {0X840259F1, &WrapI_UIU<sceKernelUtilsSha1Digest>, "sceKernelUtilsSha1Digest", 'i', "xix"},
114 {0XF8FCD5BA, &WrapI_U<sceKernelUtilsSha1BlockInit>, "sceKernelUtilsSha1BlockInit", 'i', "x" },
115 {0X346F6DA8, &WrapI_UUI<sceKernelUtilsSha1BlockUpdate>, "sceKernelUtilsSha1BlockUpdate", 'i', "xxi"},
116 {0X585F1C09, &WrapI_UU<sceKernelUtilsSha1BlockResult>, "sceKernelUtilsSha1BlockResult", 'i', "xx" },
117 {0XE860E75E, &WrapU_UU<sceKernelUtilsMt19937Init>, "sceKernelUtilsMt19937Init", 'x', "xx" },
118 {0X06FB8A63, &WrapU_U<sceKernelUtilsMt19937UInt>, "sceKernelUtilsMt19937UInt", 'x', "x" },
119 {0X37FB5C42, &WrapU_V<sceKernelGetGPI>, "sceKernelGetGPI", 'x', "" },
120 {0X6AD345D7, &WrapV_U<sceKernelSetGPO>, "sceKernelSetGPO", 'v', "x" },
121 {0X79D1C3FA, &WrapI_V<sceKernelDcacheWritebackAll>, "sceKernelDcacheWritebackAll", 'i', "" },
122 {0XB435DEC5, &WrapI_V<sceKernelDcacheWritebackInvalidateAll>, "sceKernelDcacheWritebackInvalidateAll", 'i', "" },
123 {0X3EE30821, &WrapI_UI<sceKernelDcacheWritebackRange>, "sceKernelDcacheWritebackRange", 'i', "xi" },
124 {0X34B9FA9E, &WrapI_UI<sceKernelDcacheWritebackInvalidateRange>, "sceKernelDcacheWritebackInvalidateRange", 'i', "xi" },
125 {0XC2DF770E, &WrapI_UI<sceKernelIcacheInvalidateRange>, "sceKernelIcacheInvalidateRange", 'i', "xi" },
126 {0X80001C4C, nullptr, "sceKernelDcacheProbe", '?', "" },
127 {0X16641D70, nullptr, "sceKernelDcacheReadTag", '?', "" },
128 {0X4FD31C9D, nullptr, "sceKernelIcacheProbe", '?', "" },
129 {0XFB05FAD0, nullptr, "sceKernelIcacheReadTag", '?', "" },
130 {0X920F104A, &WrapU_V<sceKernelIcacheInvalidateAll>, "sceKernelIcacheInvalidateAll", 'x', "" }
131 };
132
133 const HLEFunction LoadCoreForKernel[] =
134 {
135 {0XACE23476, nullptr, "sceKernelCheckPspConfig", '?', "" },
136 {0X7BE1421C, nullptr, "sceKernelCheckExecFile", '?', "" },
137 {0XBF983EF2, nullptr, "sceKernelProbeExecutableObject", '?', "" },
138 {0X7068E6BA, nullptr, "sceKernelLoadExecutableObject", '?', "" },
139 {0XB4D6FECC, nullptr, "sceKernelApplyElfRelSection", '?', "" },
140 {0X54AB2675, nullptr, "sceKernelApplyPspRelSection", '?', "" },
141 {0X2952F5AC, nullptr, "sceKernelDcacheWBinvAll", '?', "" },
142 {0xD8779AC6, &WrapU_V<sceKernelIcacheClearAll>, "sceKernelIcacheClearAll", 'x', "", HLE_KERNEL_SYSCALL },
143 {0X99A695F0, nullptr, "sceKernelRegisterLibrary", '?', "" },
144 {0X5873A31F, nullptr, "sceKernelRegisterLibraryForUser", '?', "" },
145 {0X0B464512, nullptr, "sceKernelReleaseLibrary", '?', "" },
146 {0X9BAF90F6, nullptr, "sceKernelCanReleaseLibrary", '?', "" },
147 {0X0E760DBA, nullptr, "sceKernelLinkLibraryEntries", '?', "" },
148 {0X0DE1F600, nullptr, "sceKernelLinkLibraryEntriesForUser", '?', "" },
149 {0XDA1B09AA, nullptr, "sceKernelUnLinkLibraryEntries", '?', "" },
150 {0XC99DD47A, nullptr, "sceKernelQueryLoadCoreCB", '?', "" },
151 {0X616FCCCD, nullptr, "sceKernelSetBootCallbackLevel", '?', "" },
152 {0XF32A2940, nullptr, "sceKernelModuleFromUID", '?', "" },
153 {0XCD0F3BAC, nullptr, "sceKernelCreateModule", '?', "" },
154 {0X6B2371C2, nullptr, "sceKernelDeleteModule", '?', "" },
155 {0X7320D964, nullptr, "sceKernelModuleAssign", '?', "" },
156 {0X44B292AB, nullptr, "sceKernelAllocModule", '?', "" },
157 {0XBD61D4D5, nullptr, "sceKernelFreeModule", '?', "" },
158 {0XAE7C6E76, nullptr, "sceKernelRegisterModule", '?', "" },
159 {0X74CF001A, nullptr, "sceKernelReleaseModule", '?', "" },
160 {0XFB8AE27D, nullptr, "sceKernelFindModuleByAddress", '?', "" },
161 {0XCCE4A157, &WrapU_U<sceKernelFindModuleByUID>, "sceKernelFindModuleByUID", 'x', "x" , HLE_KERNEL_SYSCALL },
162 {0X82CE54ED, nullptr, "sceKernelModuleCount", '?', "" },
163 {0XC0584F0C, nullptr, "sceKernelGetModuleList", '?', "" },
164 {0XCF8A41B1, &WrapU_C<sceKernelFindModuleByName>, "sceKernelFindModuleByName", 'x', "s", HLE_KERNEL_SYSCALL },
165 {0XB95FA50D, nullptr, "LoadCoreForKernel_B95FA50D", '?', "" },
166 };
167
168
169 const HLEFunction KDebugForKernel[] =
170 {
171 {0XE7A3874D, nullptr, "sceKernelRegisterAssertHandler", '?', "" },
172 {0X2FF4E9F9, nullptr, "sceKernelAssert", '?', "" },
173 {0X9B868276, nullptr, "sceKernelGetDebugPutchar", '?', "" },
174 {0XE146606D, nullptr, "sceKernelRegisterDebugPutchar", '?', "" },
175 {0X7CEB2C09, &WrapU_V<sceKernelRegisterKprintfHandler>, "sceKernelRegisterKprintfHandler", 'x', "", HLE_KERNEL_SYSCALL },
176 {0X84F370BC, nullptr, "Kprintf", '?', "" },
177 {0X5CE9838B, nullptr, "sceKernelDebugWrite", '?', "" },
178 {0X66253C4E, nullptr, "sceKernelRegisterDebugWrite", '?', "" },
179 {0XDBB5597F, nullptr, "sceKernelDebugRead", '?', "" },
180 {0XE6554FDA, nullptr, "sceKernelRegisterDebugRead", '?', "" },
181 {0XB9C643C9, nullptr, "sceKernelDebugEcho", '?', "" },
182 {0X7D1C74F0, nullptr, "sceKernelDebugEchoSet", '?', "" },
183 {0X24C32559, nullptr, "sceKernelDipsw", '?', "" },
184 {0XD636B827, nullptr, "sceKernelRemoveByDebugSection", '?', "" },
185 {0X5282DD5E, nullptr, "sceKernelDipswSet", '?', "" },
186 {0X9F8703E4, nullptr, "KDebugForKernel_9F8703E4", '?', "" },
187 {0X333DCEC7, nullptr, "KDebugForKernel_333DCEC7", '?', "" },
188 {0XE892D9A1, nullptr, "KDebugForKernel_E892D9A1", '?', "" },
189 {0XA126F497, nullptr, "KDebugForKernel_A126F497", '?', "" },
190 {0XB7251823, nullptr, "sceKernelAcceptMbogoSig", '?', "" },
191 };
192
193 const HLEFunction pspeDebug[] =
194 {
195 {0XDEADBEAF, nullptr, "pspeDebugWrite", '?', "" },
196 };
197
198
199 const HLEModule moduleList[] =
200 {
201 {"FakeSysCalls", ARRAY_SIZE(FakeSysCalls), FakeSysCalls},
202 {"UtilsForUser", ARRAY_SIZE(UtilsForUser), UtilsForUser},
203 {"KDebugForKernel", ARRAY_SIZE(KDebugForKernel), KDebugForKernel},
204 {"sceSAScore"},
205 {"SceBase64_Library"},
206 {"sceCert_Loader"},
207 {"SceFont_Library"},
208 {"sceNetApctl"},
209 {"sceSIRCS_IrDA_Driver"},
210 {"Pspnet_Scan"},
211 {"Pspnet_Show_MacAddr"},
212 {"pspeDebug", ARRAY_SIZE(pspeDebug), pspeDebug},
213 };
214
215 static const int numModules = ARRAY_SIZE(moduleList);
216
RegisterAllModules()217 void RegisterAllModules() {
218 Register_Kernel_Library();
219 Register_ThreadManForUser();
220 Register_ThreadManForKernel();
221 Register_LoadExecForUser();
222 Register_UtilsForKernel();
223 Register_SysMemUserForUser();
224 Register_InterruptManager();
225 Register_IoFileMgrForUser();
226 Register_ModuleMgrForUser();
227 Register_ModuleMgrForKernel();
228 Register_StdioForUser();
229
230 Register_sceHprm();
231 Register_sceCcc();
232 Register_sceCtrl();
233 Register_sceDisplay();
234 Register_sceAudio();
235 Register_sceSasCore();
236 Register_sceFont();
237 Register_sceNet();
238 Register_sceNetAdhoc();
239 Register_sceRtc();
240 Register_sceWlanDrv();
241 Register_sceMpeg();
242 Register_sceMp3();
243 Register_sceHttp();
244 Register_scePower();
245 Register_sceImpose();
246 Register_sceSuspendForUser();
247 Register_sceGe_user();
248 Register_sceUmdUser();
249 Register_sceDmac();
250 Register_sceUtility();
251 Register_sceAtrac3plus();
252 Register_scePsmf();
253 Register_scePsmfPlayer();
254 Register_sceOpenPSID();
255 Register_sceParseUri();
256 Register_sceSsl();
257 Register_sceParseHttp();
258 Register_sceVaudio();
259 Register_sceUsb();
260 Register_sceChnnlsv();
261 Register_sceNpDrm();
262 Register_sceP3da();
263 Register_sceGameUpdate();
264 Register_sceDeflt();
265 Register_sceMp4();
266 Register_scePauth();
267 Register_sceNp();
268 Register_sceNpCommerce2();
269 Register_sceNpService();
270 Register_sceNpAuth();
271 Register_sceMd5();
272 Register_sceJpeg();
273 Register_sceAudiocodec();
274 Register_sceHeap();
275
276 for (int i = 0; i < numModules; i++) {
277 RegisterModule(moduleList[i].name, moduleList[i].numFunctions, moduleList[i].funcTable);
278 }
279
280 // IMPORTANT: New modules have to be added at the end, or they will break savestates.
281
282 Register_StdioForKernel();
283 RegisterModule("LoadCoreForKernel", ARRAY_SIZE(LoadCoreForKernel), LoadCoreForKernel);
284 Register_IoFileMgrForKernel();
285 Register_LoadExecForKernel();
286 Register_SysMemForKernel();
287 Register_sceMt19937();
288 Register_SysclibForKernel();
289 Register_sceCtrl_driver();
290 Register_sceDisplay_driver();
291 Register_sceMpegbase();
292 Register_sceUsbGps();
293 Register_sceLibFttt();
294 Register_sceSha256();
295 Register_sceAdler();
296 Register_sceSfmt19937();
297 Register_sceAudioRouting();
298 Register_sceUsbCam();
299 Register_sceG729();
300 Register_sceNetUpnp();
301 Register_sceNetIfhandle();
302 Register_KUBridge();
303 Register_sceUsbAcc();
304 Register_sceUsbMic();
305 Register_sceOpenPSID_driver();
306 Register_semaphore();
307 Register_sceDdrdb();
308 // add new modules here.
309 }
310
311