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