31extern SifRpcClientData_t _lf_cd;
33int _SifLoadElfPart(
const char *path,
const char *secname,
t_ExecData *data,
int fno);
34int _SifLoadModuleBuffer(
void *ptr,
int arg_len,
const char *args,
int *modres);
36SifRpcClientData_t _lf_cd;
42 if (HasIopRebootedSinceLastCall())
50 while ((res = sceSifBindRpc(&_lf_cd, 0x80000006, 0)) >= 0 && !_lf_cd.server)
61 memset(&_lf_cd, 0,
sizeof _lf_cd);
64int _SifLoadModule(
const char *path,
int arg_len,
const char *args,
int *modres,
65 int fno,
int dontwait)
72 memset(arg, 0,
sizeof *arg);
74 strlcpy(arg->path, path,
sizeof(arg->path));
76 if (args && arg_len) {
77 arg->p.arg_len = arg_len > LF_ARG_MAX ? LF_ARG_MAX : arg_len;
78 memcpy(arg->args, args, arg->p.arg_len);
83 if (sceSifCallRpc(&_lf_cd, fno, dontwait, arg,
sizeof *arg, arg, 8, NULL, NULL) < 0)
87 *modres = arg->modres;
94 return _SifLoadModule(path, arg_len, args, NULL, LF_F_MOD_LOAD, 0);
99 return _SifLoadModule(path, arg_len, args, mod_res, LF_F_MOD_LOAD, 0);
104 return _SifLoadModule(path, arg_len, args, NULL, LF_F_MG_MOD_LOAD, 0);
107int SifStopModule(
int id,
int arg_len,
const char *args,
int *mod_res)
116 if (args && arg_len) {
117 arg->q.arg_len = arg_len > LF_ARG_MAX ? LF_ARG_MAX : arg_len;
118 memcpy(arg->args, args, arg->q.arg_len);
123 if (sceSifCallRpc(&_lf_cd, LF_F_MOD_STOP, 0, arg,
sizeof *arg, arg, 8, NULL, NULL) < 0)
127 *mod_res = arg->q.modres;
129 return arg->p.result;
132int SifUnloadModule(
int id)
141 if (sceSifCallRpc(&_lf_cd, LF_F_MOD_UNLOAD, 0, arg,
sizeof *arg, arg, 4, NULL, NULL) < 0)
147int SifSearchModuleByName(
const char *name)
153 strlcpy(arg->name, name,
sizeof(arg->name));
155 if (sceSifCallRpc(&_lf_cd, LF_F_SEARCH_MOD_BY_NAME, 0, arg,
sizeof *arg, arg, 4, NULL, NULL) < 0)
161int SifSearchModuleByAddress(
const void *ptr)
169 if (sceSifCallRpc(&_lf_cd, LF_F_SEARCH_MOD_BY_ADDRESS, 0, arg,
sizeof *arg, arg, 4, NULL, NULL) < 0)
175int _SifLoadElfPart(
const char *path,
const char *secname,
t_ExecData *data,
int fno)
182 strlcpy(arg->path, path,
sizeof(arg->path));
183 strlcpy(arg->secname, secname,
sizeof(arg->secname));
185 if (sceSifCallRpc(&_lf_cd, fno, 0, arg,
sizeof *arg, arg,
190 data->epc = arg->epc;
200 return _SifLoadElfPart(path, secname, data, LF_F_ELF_LOAD);
205 u32 secname = 0x6c6c61;
206 return _SifLoadElfPart(path, (
char *)&secname, data, LF_F_ELF_LOAD);
211 u32 secname = 0x6c6c61;
212 return _SifLoadElfPart(path, (
char *)&secname, data, LF_F_MG_ELF_LOAD);
224 arg->val.b = (u8)(val & 0xff);
227 arg->val.s = (u16)(val & 0xffff);
236 arg->p.iop_addr = iop_addr;
239 if (sceSifCallRpc(&_lf_cd, LF_F_SET_ADDR, 0, arg,
sizeof *arg, arg, 4,
243 return arg->p.result;
253 arg->p.iop_addr = iop_addr;
256 if (sceSifCallRpc(&_lf_cd, LF_F_GET_ADDR, 0, arg,
sizeof *arg, arg, 4,
263 *(u8 *)val = (u8)arg->p.result & 0xff;
266 *(u16 *)val = (u16)arg->p.result & 0xffff;
269 *(u32 *)val = arg->p.result;
277int _SifLoadModuleBuffer(
void *ptr,
int arg_len,
const char *args,
int *modres)
284 memset(arg, 0,
sizeof *arg);
287 if (args && arg_len) {
288 arg->q.arg_len = arg_len > LF_ARG_MAX ? LF_ARG_MAX : arg_len;
289 memcpy(arg->args, args, arg->q.arg_len);
294 if (sceSifCallRpc(&_lf_cd, LF_F_MOD_BUF_LOAD, 0, arg,
sizeof *arg, arg, 8,
299 *modres = arg->q.modres;
301 return arg->p.result;
306 return _SifLoadModuleBuffer(ptr, arg_len, args, NULL);
311 return _SifLoadModuleBuffer(ptr, arg_len, args, mod_res);
316 SifDmaTransfer_t dmat;
322 size = (size + 15) & -16;
324 if (!(iop_addr = SifAllocIopHeap(size)))
328 dmat.dest = iop_addr;
331 sceSifWriteBackDCache(ptr, size);
332 qid = sceSifSetDma(&dmat, 1);
337 while (sceSifDmaStat(qid) >= 0)
340 res = _SifLoadModuleBuffer(iop_addr, arg_len, args, mod_res);
341 SifFreeIopHeap(iop_addr);
351 if ((fd = open(path, O_RDONLY)) < 0)
354 if ((size = lseek(fd, 0, SEEK_END)) < 0)
359 if (!(iop_addr = SifAllocIopHeap(size)))
362 if ((res = SifLoadIopHeap(path, iop_addr)) < 0) {
363 SifFreeIopHeap(iop_addr);
367 res = _SifLoadModuleBuffer(iop_addr, arg_len, args, mod_res);
368 SifFreeIopHeap(iop_addr);
int SifLoadModuleEncrypted(const char *path, int arg_len, const char *args)
int SifLoadModule(const char *path, int arg_len, const char *args)
int SifLoadStartModuleBuffer(void *ptr, int arg_len, const char *args, int *mod_res)
void SifLoadFileExit(void)
int SifLoadElf(const char *path, t_ExecData *data)
int SifLoadElfPart(const char *path, const char *secname, t_ExecData *data)
int SifLoadElfEncrypted(const char *path, t_ExecData *data)
int SifExecModuleBuffer(void *ptr, u32 size, u32 arg_len, const char *args, int *mod_res)
int SifLoadFileInit(void)
int SifIopSetVal(u32 iop_addr, int val, int type)
int SifExecModuleFile(const char *path, u32 arg_len, const char *args, int *mod_res)
int _SifLoadModule(const char *path, int arg_len, const char *args, int *modres, int fno, int dontwait)
int SifIopGetVal(u32 iop_addr, void *val, int type)
int SifLoadModuleBuffer(void *ptr, int arg_len, const char *args)
int SifLoadStartModule(const char *path, int arg_len, const char *args, int *mod_res)