25#define IMGDRV_IRX_SIZE ((size__imgdrv_irx + 15) & ~15)
26#define IOPBTCONF_IOP_MAX_SIZE 0x400
28extern int _iop_reboot_count;
30extern u8 iopbtconf_img[IOPBTCONF_IOP_MAX_SIZE];
31extern unsigned char _imgdrv_irx[];
32extern unsigned int size__imgdrv_irx;
34extern int imgdrv_offset_ioprpimg;
35extern int imgdrv_offset_ioprpsiz;
37extern void init_imgdrv_offsets(
void);
39#ifdef F__iopcontrol_special_internals
41int imgdrv_offset_ioprpimg = 0;
42int imgdrv_offset_ioprpsiz = 0;
44void init_imgdrv_offsets(
void)
46 if (imgdrv_offset_ioprpimg == 0 || imgdrv_offset_ioprpsiz == 0) {
49 for (i = 0; (
unsigned int)i < size__imgdrv_irx; i += 4) {
50 if (*(u32 *)((&((
unsigned char *)_imgdrv_irx)[i])) == 0xDEC1DEC1) {
51 imgdrv_offset_ioprpimg = i;
53 if (*(u32 *)((&((
unsigned char *)_imgdrv_irx)[i])) == 0xDEC2DEC2) {
54 imgdrv_offset_ioprpsiz = i;
62#define SifLoadModuleSpecial(path, arg_len, args, dontwait) \
63 _SifLoadModule(path, arg_len, args, NULL, LF_F_MOD_LOAD, dontwait);
65#define SifLoadModuleEncryptedSpecial(path, arg_len, args, dontwait) \
66 _SifLoadModule(path, arg_len, args, NULL, LF_F_MG_MOD_LOAD, dontwait);
68#ifdef F_SifIopRebootBufferEncrypted
71 int iopbtconf_img_size;
72 void *imgdrv_iop, *udnl_iop, *iopbtconf_img_iop;
86 imgdrv_iop = SifAllocIopHeap(IMGDRV_IRX_SIZE);
87 udnl_iop = SifAllocIopHeap(size);
88 iopbtconf_img_iop = SifAllocIopHeap(IOPBTCONF_IOP_MAX_SIZE);
90 if (imgdrv_iop == NULL || udnl_iop == NULL || iopbtconf_img_iop == NULL)
93 iopbtconf_img_size = 0;
95 init_imgdrv_offsets();
96 imgdrv_img = (
void **)&_imgdrv_irx[imgdrv_offset_ioprpimg];
97 imgdrv_img_size = (
int *)&_imgdrv_irx[imgdrv_offset_ioprpsiz];
98 dmat[0].src = _imgdrv_irx;
99 dmat[0].dest = imgdrv_iop;
100 dmat[0].size = IMGDRV_IRX_SIZE;
102 dmat[1].src = (
void *)udnl;
103 dmat[1].dest = udnl_iop;
106 dmat[2].src = iopbtconf_img;
107 dmat[2].dest = iopbtconf_img_iop;
108 dmat[2].size = iopbtconf_img_size;
110 imgdrv_img[0] = udnl_iop;
111 imgdrv_img[1] = iopbtconf_img_iop;
112 imgdrv_img_size[0] = size;
113 imgdrv_img_size[1] = iopbtconf_img_size;
115 sceSifSetDma(dmat, 3);
121 SifLoadModuleEncryptedSpecial(
"img0:", 0, NULL, 1);
129 sceSifSetReg(SIF_SYSREG_RPCINIT, 0);
130 sceSifSetReg(SIF_SYSREG_SUBADDR, 0);
138#ifdef F_SifIopRebootBuffer
139static int generateIOPBTCONF_img(
void *output,
const void *ioprp);
143 int iopbtconf_img_size;
144 void *imgdrv_iop, *ioprp_iop, *iopbtconf_img_iop;
145 int *imgdrv_img_size;
158 imgdrv_iop = SifAllocIopHeap(IMGDRV_IRX_SIZE);
159 ioprp_iop = SifAllocIopHeap(size);
160 iopbtconf_img_iop = SifAllocIopHeap(IOPBTCONF_IOP_MAX_SIZE);
162 if (imgdrv_iop == NULL || ioprp_iop == NULL || iopbtconf_img_iop == NULL)
165 iopbtconf_img_size = generateIOPBTCONF_img(iopbtconf_img, ioprp);
167 init_imgdrv_offsets();
168 imgdrv_img = (
void **)&_imgdrv_irx[imgdrv_offset_ioprpimg];
169 imgdrv_img_size = (
int *)&_imgdrv_irx[imgdrv_offset_ioprpsiz];
170 dmat[0].src = _imgdrv_irx;
171 dmat[0].dest = imgdrv_iop;
172 dmat[0].size = IMGDRV_IRX_SIZE;
174 dmat[1].src = (
void *)ioprp;
175 dmat[1].dest = ioprp_iop;
178 dmat[2].src = iopbtconf_img;
179 dmat[2].dest = iopbtconf_img_iop;
180 dmat[2].size = iopbtconf_img_size;
182 imgdrv_img[0] = ioprp_iop;
183 imgdrv_img[1] = iopbtconf_img_iop;
184 imgdrv_img_size[0] = size;
185 imgdrv_img_size[1] = iopbtconf_img_size;
187 sceSifSetDma(dmat, 3);
193 SifLoadModuleSpecial(
"rom0:UDNL", 11,
"img0:\0img1:", 1);
201 sceSifSetReg(SIF_SYSREG_RPCINIT, 0);
202 sceSifSetReg(SIF_SYSREG_SUBADDR, 0);
212 u16 ExtInfoEntrySize;
216typedef struct extinfo
224 EXTINFO_TYPE_DATE = 1,
225 EXTINFO_TYPE_VERSION,
226 EXTINFO_TYPE_COMMENT,
227 EXTINFO_TYPE_FIXED = 0x7F
236static const struct iopbtconf_img iopbtconf_img_base = {
239 {
"EXTINFO", 0, 0x10},
240 {
"IOPBTCONF", 8, -1},
251static int generateIOPBTCONF_img(
void *output,
const void *ioprp)
253 int size, offset, fsize_rounded;
258 romdir = (romdir_t *)ioprp;
259 if (strcmp(romdir[0].name,
"RESET") || strcmp(romdir[1].name,
"ROMDIR"))
265 for (; romdir->name[0] !=
'\0'; romdir++, offset += fsize_rounded) {
266 fsize_rounded = (romdir->size + 15) & ~15;
267 if (strcmp(romdir->name,
"IOPBTCONF") == 0) {
268 romdir->name[0] =
'X';
270 size = romdir->size +
sizeof(iopbtconf_img_base);
271 ptr_out = (u8 *)output;
272 ptr_in = (
const u8 *)ioprp;
273 memcpy(ptr_out, &iopbtconf_img_base,
sizeof(iopbtconf_img_base));
274 memcpy(ptr_out +
sizeof(iopbtconf_img_base), &ptr_in[offset], romdir->size);
275 ((romdir_t *)ptr_out)[3].size = romdir->size;
int SifLoadModule(const char *path, int arg_len, const char *args)
void SifLoadFileExit(void)
int SifLoadFileInit(void)
int SifLoadModuleBuffer(void *ptr, int arg_len, const char *args)
int SifIopReset(const char *arg, int mode)
int SifIopRebootBuffer(const void *ioprp, int size)
int SifIopRebootBufferEncrypted(const void *udnl, int size)
int sbv_patch_enable_lmb(void)