25 #define IOPBTCONF_IOP_MAX_SIZE 0x400
27 extern int _iop_reboot_count;
29 extern u8 iopbtconf_img[IOPBTCONF_IOP_MAX_SIZE];
31 extern int send_romdrv_rom1_payloads(
void *payload1,
int payload1_size,
void *payload2,
int payload2_size);
48 EXTINFO_TYPE_DATE = 1,
51 EXTINFO_TYPE_FIXED = 0x7F
54 #ifdef F__iopcontrol_special_internals
62 static const struct payload_img g_payload_img_base = {
70 int send_romdrv_rom1_payloads(
void *payload1,
int payload1_size,
void *payload2,
int payload2_size)
73 unsigned int size_total;
74 struct payload_img cur_payload_img
__attribute__((__aligned__(64)));
78 cur_payload_img = g_payload_img_base;
79 dmat[0].src = &cur_payload_img;
80 dmat[0].size =
sizeof(cur_payload_img);
81 dmat[1].src = payload1;
82 dmat[1].size = (payload1_size + 15) & -16;
83 dmat[2].src = payload2;
84 dmat[2].size = (payload2_size + 15) & -16;
85 for (i = 0; i < (
sizeof(dmat)/
sizeof(dmat[0])); i += 1)
87 cur_payload_img.romdir[1].size = dmat[0].size;
88 cur_payload_img.romdir[2].size = dmat[1].size;
89 cur_payload_img.romdir[3].size = dmat[2].size;
91 for (i = 0; i < (
sizeof(dmat)/
sizeof(dmat[0])); i += 1)
92 size_total += dmat[i].size;
93 dmat[0].dest = SifAllocIopHeap(size_total);
96 for (i = 1; i < (
sizeof(dmat)/
sizeof(dmat[0])); i += 1)
97 dmat[i].dest = ((u8 *)dmat[i - 1].dest) + dmat[i - 1].size;
98 for (i = 0; i < (
sizeof(dmat)/
sizeof(dmat[0])); i += 1)
99 sceSifWriteBackDCache(dmat[i].src, dmat[i].size);
100 while (!(trid = sceSifSetDma(dmat,
sizeof(dmat) /
sizeof(dmat[0]))));
101 while (sceSifDmaStat(trid) >= 0);
107 #define SifLoadModuleSpecial(path, arg_len, args, dontwait) \
108 _SifLoadModule(path, arg_len, args, NULL, LF_F_MOD_LOAD, dontwait)
110 #define SifLoadModuleEncryptedSpecial(path, arg_len, args, dontwait) \
111 _SifLoadModule(path, arg_len, args, NULL, LF_F_MG_MOD_LOAD, dontwait)
113 #ifdef F_SifIopRebootBufferEncrypted
116 int iopbtconf_img_size;
124 iopbtconf_img_size = 0;
127 if (send_romdrv_rom1_payloads((
void *)udnl, size, iopbtconf_img, iopbtconf_img_size))
132 (void)((((u32 *)udnl)[0] == 0x464c457f) ? SifLoadModuleSpecial(
"rom1:0", 0, NULL, 1) : SifLoadModuleEncryptedSpecial(
"rom1:0", 0, NULL, 1));
140 sceSifSetReg(SIF_SYSREG_RPCINIT, 0);
141 sceSifSetReg(SIF_SYSREG_SUBADDR, 0);
149 #ifdef F_SifIopRebootBuffer
150 static int generateIOPBTCONF_img(
void *output,
void *ioprp);
154 int iopbtconf_img_size;
162 iopbtconf_img_size = generateIOPBTCONF_img(iopbtconf_img, ioprp);
165 if (send_romdrv_rom1_payloads((
void *)ioprp, size, iopbtconf_img, iopbtconf_img_size))
169 SifLoadModuleSpecial(
"rom:UDNL", 13,
"rom1:0\x00rom1:1", 1);
177 sceSifSetReg(SIF_SYSREG_RPCINIT, 0);
178 sceSifSetReg(SIF_SYSREG_SUBADDR, 0);
191 static const struct iopbtconf_img iopbtconf_img_base = {
194 {
"EXTINFO", 0, 0x10},
195 {
"IOPBTCONF", 8, -1},
206 static int generateIOPBTCONF_img(
void *output,
void *ioprp)
208 int offset, fsize_rounded;
214 if (strcmp(
romdir[0].name,
"RESET") || strcmp(
romdir[1].name,
"ROMDIR"))
218 for (offset = 0;
romdir->name[0] !=
'\0';
romdir++, offset += fsize_rounded) {
219 fsize_rounded = (
romdir->size + 15) & ~15;
221 if (!strcmp(
romdir->name,
"IOPBTCONF") || !strcmp(
romdir->name,
"XOPBTCONF")) {
224 ptr_out = (u8 *)output;
225 ptr_in = (u8 *)ioprp;
226 memcpy(ptr_out, &iopbtconf_img_base,
sizeof(iopbtconf_img_base));
227 memcpy(ptr_out +
sizeof(iopbtconf_img_base), &ptr_in[offset],
romdir->size);
229 return romdir->size +
sizeof(iopbtconf_img_base);