32 int _SifLoadElfPart(
const char *path,
const char *secname,
t_ExecData *data,
int fno);
33 int _SifLoadModuleBuffer(
void *ptr,
int arg_len,
const char *args,
int *modres);
35 #if defined(F_SifLoadFileInit)
50 while ((res = sceSifBindRpc(&_lf_cd, 0x80000006, 0)) >= 0 && !_lf_cd.server)
60 #if defined(F_SifLoadFileExit)
63 memset(&_lf_cd, 0,
sizeof _lf_cd);
67 #ifdef F__SifLoadModule
68 int _SifLoadModule(
const char *path,
int arg_len,
const char *args,
int *modres,
69 int fno,
int dontwait)
76 memset(&arg, 0,
sizeof arg);
78 strlcpy(arg.path, path,
sizeof(arg.path));
80 if (args && arg_len) {
81 arg.p.arg_len = arg_len > LF_ARG_MAX ? LF_ARG_MAX : arg_len;
82 memcpy(arg.args, args, arg.p.arg_len);
87 if (sceSifCallRpc(&_lf_cd, fno, dontwait, &arg,
sizeof arg, &arg, 8, NULL, NULL) < 0)
97 #if defined(F_SifLoadModule)
98 int SifLoadModule(
const char *path,
int arg_len,
const char *args)
100 return _SifLoadModule(path, arg_len, args, NULL, LF_F_MOD_LOAD, 0);
104 #if defined(F_SifLoadStartModule)
107 return _SifLoadModule(path, arg_len, args, mod_res, LF_F_MOD_LOAD, 0);
111 #if defined(F_SifLoadModuleEncrypted)
114 return _SifLoadModule(path, arg_len, args, NULL, LF_F_MG_MOD_LOAD, 0);
118 #ifdef F_SifStopModule
119 int SifStopModule(
int id,
int arg_len,
const char *args,
int *mod_res)
128 if (args && arg_len) {
129 arg.q.arg_len = arg_len > LF_ARG_MAX ? LF_ARG_MAX : arg_len;
130 memcpy(arg.args, args, arg.q.arg_len);
135 if (sceSifCallRpc(&_lf_cd, LF_F_MOD_STOP, 0, &arg,
sizeof arg, &arg, 8, NULL, NULL) < 0)
139 *mod_res = arg.q.modres;
145 #ifdef F_SifUnloadModule
146 int SifUnloadModule(
int id)
155 if (sceSifCallRpc(&_lf_cd, LF_F_MOD_UNLOAD, 0, &arg,
sizeof arg, &arg, 4, NULL, NULL) < 0)
162 #ifdef F_SifSearchModuleByName
163 int SifSearchModuleByName(
const char *name)
169 strlcpy(arg.name, name,
sizeof(arg.name));
171 if (sceSifCallRpc(&_lf_cd, LF_F_SEARCH_MOD_BY_NAME, 0, &arg,
sizeof arg, &arg, 4, NULL, NULL) < 0)
178 #ifdef F_SifSearchModuleByAddress
179 int SifSearchModuleByAddress(
const void *ptr)
187 if (sceSifCallRpc(&_lf_cd, LF_F_SEARCH_MOD_BY_ADDRESS, 0, &arg,
sizeof arg, &arg, 4, NULL, NULL) < 0)
194 #ifdef F__SifLoadElfPart
195 int _SifLoadElfPart(
const char *path,
const char *secname,
t_ExecData *data,
int fno)
202 strlcpy(arg.path, path,
sizeof(arg.path));
203 strlcpy(arg.secname, secname,
sizeof(arg.secname));
205 if (sceSifCallRpc(&_lf_cd, fno, 0, &arg,
sizeof arg, &arg,
219 #if defined(F_SifLoadElfPart)
222 return _SifLoadElfPart(path, secname, data, LF_F_ELF_LOAD);
226 #if defined(F_SifLoadElf)
229 u32 secname = 0x6c6c61;
230 return _SifLoadElfPart(path, (
char *)&secname, data, LF_F_ELF_LOAD);
234 #if defined(F_SifLoadElfEncrypted)
237 u32 secname = 0x6c6c61;
238 return _SifLoadElfPart(path, (
char *)&secname, data, LF_F_MG_ELF_LOAD);
242 #if defined(F_SifIopSetVal)
252 arg.val.b = (u8)(val & 0xff);
255 arg.val.s = (u16)(val & 0xffff);
264 arg.p.iop_addr = iop_addr;
267 if (sceSifCallRpc(&_lf_cd, LF_F_SET_ADDR, 0, &arg,
sizeof arg, &arg, 4,
275 #if defined(F_SifIopGetVal)
283 arg.p.iop_addr = iop_addr;
286 if (sceSifCallRpc(&_lf_cd, LF_F_GET_ADDR, 0, &arg,
sizeof arg, &arg, 4,
293 *(u8 *)val = (u8)arg.p.result & 0xff;
296 *(u16 *)val = (u16)arg.p.result & 0xffff;
299 *(u32 *)val = arg.p.result;
308 #ifdef F__SifLoadModuleBuffer
309 int _SifLoadModuleBuffer(
void *ptr,
int arg_len,
const char *args,
int *modres)
316 memset(&arg, 0,
sizeof arg);
319 if (args && arg_len) {
320 arg.q.arg_len = arg_len > LF_ARG_MAX ? LF_ARG_MAX : arg_len;
321 memcpy(arg.args, args, arg.q.arg_len);
326 if (sceSifCallRpc(&_lf_cd, LF_F_MOD_BUF_LOAD, 0, &arg,
sizeof arg, &arg, 8,
331 *modres = arg.q.modres;
337 #if defined(F_SifLoadModuleBuffer)
340 return _SifLoadModuleBuffer(ptr, arg_len, args, NULL);
344 #if defined(F_SifLoadStartModuleBuffer)
347 return _SifLoadModuleBuffer(ptr, arg_len, args, mod_res);
351 #if defined(F_SifExecModuleBuffer)
360 size = (size + 15) & -16;
362 if (!(iop_addr = SifAllocIopHeap(size)))
366 dmat.dest = iop_addr;
369 sceSifWriteBackDCache(ptr, size);
370 qid = sceSifSetDma(&dmat, 1);
375 while (sceSifDmaStat(qid) >= 0)
378 res = _SifLoadModuleBuffer(iop_addr, arg_len, args, mod_res);
379 SifFreeIopHeap(iop_addr);
385 #if defined(F_SifExecModuleFile)
386 int SifExecModuleFile(
const char *path, u32 arg_len,
const char *args,
int *mod_res)
391 if ((fd = open(path, O_RDONLY)) < 0)
394 if ((size = lseek(fd, 0, SEEK_END)) < 0)
399 if (!(iop_addr = SifAllocIopHeap(size)))
402 if ((res = SifLoadIopHeap(path, iop_addr)) < 0) {
403 SifFreeIopHeap(iop_addr);
407 res = _SifLoadModuleBuffer(iop_addr, arg_len, args, mod_res);
408 SifFreeIopHeap(iop_addr);