11#include "irx_imports.h"
17IRX_ID(
"cdvd_ee_driver", 2, 38);
22static int cdvdfsv_init(
void);
23static void cdvdfsv_main_th(
void *arg);
24extern int *cdvdfsv_dummyentry(
int arg1);
25static void cdvdfsv_parseargs(
int ac,
char **av);
26static void cdvdfsv_poffloop(
void);
27static void cdvdfsv_rpc1_th(
void *arg);
28static void cdvdfsv_rpc3_th(
void *arg);
29static void cdvdfsv_rpc2_th(
void *arg);
30#ifdef CDVD_VARIANT_OSD
31static void cdvdfsv_rpc4_th(
void *arg);
32static void cdvdfsv_rpc5_th(
void *arg);
34extern unsigned int optimized_memcpy(
char *dst,
const char *src,
unsigned int n);
36static int g_cdvdfsv_def_pri = 81;
37static int g_verbose_level = 0;
38static int g_cdvdfsv_spinctl = -1;
40static const int g_cdvdfsv_sectors = 0x10;
42#ifdef CDVD_VARIANT_OSD
43static const int g_cdvdfsv_sectors_cdda = 0x10;
45static const int g_cdvdfsv_sectors_cdda = 8;
48static const int g_cdvdfsv_r2retry_initval = 3;
49static int g_cdvdfsv_plbreak = 0;
50static int g_cdvdfsv_nopocm = 0;
51static int g_cdvdfsv_rpc5flg = 0;
52static int g_cdvdfsv_rpc3flg = 0;
54static iop_library_t g_modload_libinfo = { NULL, NULL, 256, 0,
"modload", { NULL } };
56static int g_cdvdfsv_r2retry = 0;
57static int g_cdvdfsv_r2count = 0;
58static int g_cdvdfsv_sid_err_recover_cnt = 0;
59static int g_cdvdfsv_err_count = 0;
60static char *g_cdvdfsv_fsvrbuf[2];
61static char *g_cdvdfsv_rtocbuf;
70#ifdef CDVD_VARIANT_OSD
77static int g_cdvdman_intr_evfid;
78static int g_scmd_evfid;
79#ifdef CDVD_VARIANT_OSD
80static int g_cdvdfsv_thids[6];
82static int g_cdvdfsv_thids[4];
97static int g_cdvdfsv_readpos;
98static int g_cdvdfsv_rderror;
102static int g_rpc_buffer3[260];
103static int g_rpc_buffer5[256];
104static int g_rpc_buffer1[4];
105static int g_rpc_buffer4[76];
106static int g_rpc_buffer2[4];
107static int g_rpc_buffer2[4];
108#ifdef CDVD_VARIANT_OSD
109static char g_extra_fsvrbuf[40256];
112static int cdvdfsv_checkdmastat(
int trid)
118 return sceSifDmaStat(trid);
120 retval = sceSifDmaStat(trid);
125static int cdvdfsv_cleanuprpc(
void)
129 sceSifRemoveRpc(&g_rpc_sdata1, &g_rpc_qdata1);
130 sceSifRemoveRpc(&g_rpc_sdata2, &g_rpc_qdata1);
131 sceSifRemoveRpc(&g_rpc_sdata3, &g_rpc_qdata1);
132 sceSifRemoveRpc(&g_rpc_sdata6, &g_rpc_qdata3);
133 sceSifRemoveRpc(&g_rpc_sdata4, &g_rpc_qdata2);
134 sceSifRemoveRpc(&g_rpc_sdata5, &g_rpc_qdata2);
135 sceSifRemoveRpcQueue(&g_rpc_qdata1);
136 sceSifRemoveRpcQueue(&g_rpc_qdata2);
137 sceSifRemoveRpcQueue(&g_rpc_qdata3);
138 g_cdvdfsv_nopocm = 1;
139 g_cdvdfsv_plbreak = 1;
140 for ( i = 0; i < (
sizeof(g_cdvdfsv_thids) /
sizeof(g_cdvdfsv_thids[0])); i += 1 )
142 TerminateThread(g_cdvdfsv_thids[i]);
143 DeleteThread(g_cdvdfsv_thids[i]);
148int _start(
int ac,
char *av[],
void *startaddr,
ModuleInfo_t *mi)
151 const u16 *LibraryEntryTable;
162 if ( g_cdvdfsv_rpc5flg || g_cdvdfsv_rpc3flg || !cdvdfsv_cleanuprpc() )
164 return MODULE_REMOVABLE_END;
167 error_code = ReleaseLibraryEntries(&_exp_cdvdfsv);
169 if ( error_code && error_code != KE_LIBRARY_NOTFOUND )
171 KPRINTF(
"ReleaseLibraryEntries Error code %d\n", error_code);
172 return MODULE_REMOVABLE_END;
174 return MODULE_NO_RESIDENT_END;
176 if ( RegisterLibraryEntries(&_exp_cdvdfsv) )
178 return MODULE_NO_RESIDENT_END;
180 g_cdvdfsv_fsvrbuf[0] = (
char *)sceGetFsvRbuf();
181#ifdef CDVD_VARIANT_OSD
182 g_cdvdfsv_fsvrbuf[1] = &g_extra_fsvrbuf[0];
184 g_cdvdfsv_rtocbuf = g_cdvdfsv_fsvrbuf[0];
187 cdvdfsv_parseargs(ac, av);
191 LibraryEntryTable = (u16 *)QueryLibraryEntryTable(&g_modload_libinfo);
193 if ( !LibraryEntryTable || (*(LibraryEntryTable - 6) < 0x104) )
195 KPRINTF(
"Warning cdvdfsv.irx: Unload function can't be used.\n");
196 return MODULE_RESIDENT_END;
198 return MODULE_REMOVABLE_END;
200 if ( mi && ((mi->
newflags & 2) != 0) )
202 return MODULE_RESIDENT_END;
206static int cdvdfsv_init(
void)
212 BootMode = QueryBootMode(3);
213 if ( BootMode && (BootMode[1] & 2) )
215 PRINTF(
" No cdvd driver \n");
218 sceCdSC(0xFFFFFFF2, (
int *)&g_cdvdman_istruct_ptr);
219 g_scmd_evfid = sceCdSC(0xFFFFFFE7, &scres);
221 thparam.thread = cdvdfsv_main_th;
222 thparam.stacksize = 0x800;
224 thparam.priority = g_cdvdfsv_def_pri - 1;
225 g_cdvdfsv_thids[0] = CreateThread(&thparam);
226 if ( g_cdvdfsv_thids[0] <= 0 )
230 StartThread(g_cdvdfsv_thids[0], 0);
234static void cdvdfsv_main_th(
void *arg)
241 if ( !sceSifCheckInit() )
244 PRINTF(
"cdvd driver module version 0.1.1 (C)SCEI\n");
245 thparam2.thread = cdvdfsv_rpc1_th;
246 thparam2.attr = TH_C;
247 thparam2.stacksize = 0x1900;
249 thparam2.priority = g_cdvdfsv_def_pri;
250 g_cdvdfsv_thids[1] = CreateThread(&thparam2);
251 StartThread(g_cdvdfsv_thids[1], 0);
252 thparam1.attr = TH_C;
253 thparam1.thread = cdvdfsv_rpc2_th;
254 thparam1.stacksize = 0x1900;
256 thparam1.priority = g_cdvdfsv_def_pri;
257 g_cdvdfsv_thids[2] = CreateThread(&thparam1);
258 StartThread(g_cdvdfsv_thids[2], 0);
259 thparam1.thread = cdvdfsv_rpc3_th;
260 thparam1.attr = TH_C;
261 thparam1.stacksize = 0x800;
263 thparam1.priority = g_cdvdfsv_def_pri;
264 g_cdvdfsv_thids[3] = CreateThread(&thparam1);
265 StartThread(g_cdvdfsv_thids[3], 0);
266#ifdef CDVD_VARIANT_OSD
267 thparam1.attr = TH_C;
268 thparam1.thread = cdvdfsv_rpc4_th;
269 thparam1.stacksize = 0x800;
271 thparam1.priority = g_cdvdfsv_def_pri;
272 g_cdvdfsv_thids[4] = CreateThread(&thparam1);
273 StartThread(g_cdvdfsv_thids[4], 0);
274 thparam1.attr = TH_C;
275 thparam1.thread = cdvdfsv_rpc5_th;
276 thparam1.stacksize = 0x800;
278 thparam1.priority = g_cdvdfsv_def_pri;
279 g_cdvdfsv_thids[5] = CreateThread(&thparam1);
280 StartThread(g_cdvdfsv_thids[5], 0);
286int *cdvdfsv_dummyentry(
int arg1)
288 VERBOSE_PRINTF(1,
"Dummy Entry Called\n");
291 return &g_verbose_level;
294static void cdvdfsv_parseargs(
int ac,
char **av)
298 g_cdvdfsv_def_pri = 81;
299 for ( i = 1; i < ac; i += 1 )
301 if ( !strncmp(av[i],
"thpri=", 6) )
303 g_cdvdfsv_def_pri = strtol(av[i] + 6, 0, 10);
304 if ( (
unsigned int)(g_cdvdfsv_def_pri - 9) >= 0x73 )
306 PRINTF(
"Cdvdfsv:thpri=%d Illegal priority\n", g_cdvdfsv_def_pri);
307 g_cdvdfsv_def_pri = 81;
309 if ( g_cdvdfsv_def_pri == 9 )
310 g_cdvdfsv_def_pri = 10;
319 if ( (
unsigned int)(priority - 9) >= 0x73 )
323 ReferThreadStatus(0, &thinfo);
324 ChangeThreadPriority(0, 8);
325 ChangeThreadPriority(g_cdvdfsv_thids[0], priority - 1);
326 ChangeThreadPriority(g_cdvdfsv_thids[2], priority);
327 ChangeThreadPriority(g_cdvdfsv_thids[1], priority);
328 ChangeThreadPriority(g_cdvdfsv_thids[3], priority);
329#ifdef CDVD_VARIANT_OSD
330 ChangeThreadPriority(g_cdvdfsv_thids[4], priority);
331 ChangeThreadPriority(g_cdvdfsv_thids[5], priority);
336static void *cbrpc_rpc1_cdinit(
int fno,
void *buffer,
int length)
343 VERBOSE_PRINTF(1,
"sceCdInit call\n");
345 g_cdvdfsv_spinctl = -1;
346 g_cdvdfsv_initres.m_debug_mode = g_verbose_level ? 254 : 0;
347 g_cdvdfsv_initres.m_cdvdfsv_ver = (u16)_irx_id.v;
348 g_cdvdfsv_initres.m_cdvdman_ver = sceCdSC(0xFFFFFFF7, &scres_unused);
349 VERBOSE_PRINTF(1,
"sceCdInit end\n");
350 g_cdvdfsv_initres.m_retres = 1;
351 return (
void *)&g_cdvdfsv_initres;
359 VERBOSE_PRINTF(1,
"sceCdAbort call\n");
361 outbuf->m_retres = 1;
364static void *cbrpc_rpc4_fscall(
int fno,
void *buffer,
int length)
374 sceCdSC(0xFFFFFFF6, &scres);
375 VERBOSE_PRINTF(1,
"search file name %s call struct_siz %d\n", inbuf->m_pkt_sz12c.m_path, length);
378 case sizeof(inbuf->m_pkt_sz12c):
379 g_cdvdfsv_srchres.m_retres =
380 sceCdLayerSearchFile(&(inbuf->m_pkt_sz12c.m_fp), inbuf->m_pkt_sz12c.m_path, inbuf->m_pkt_sz12c.m_layer);
381 g_cdvdfsv_fssdd.src = buffer;
382 g_cdvdfsv_fssdd.dest = (
void *)inbuf->m_pkt_sz12c.m_eedest;
383 g_cdvdfsv_fssdd.size =
sizeof(
sceCdlFILE) + 4;
385 case sizeof(inbuf->m_pkt_sz128):
386 PRINTF(
"sceCdSearchFile: Called from Not_Dual_layer Version.\n");
387 g_cdvdfsv_srchres.m_retres =
sceCdSearchFile(&(inbuf->m_pkt_sz128.m_fp), inbuf->m_pkt_sz128.m_path);
388 g_cdvdfsv_fssdd.src = buffer;
389 g_cdvdfsv_fssdd.dest = (
void *)inbuf->m_pkt_sz128.m_eedest;
390 g_cdvdfsv_fssdd.size =
sizeof(
sceCdlFILE) + 4;
393 PRINTF(
"Warning sceCdSearchFile: Called from Old liblary.\n");
394 g_cdvdfsv_srchres.m_retres =
sceCdSearchFile(&(inbuf->m_pkt_sz124.m_fp), inbuf->m_pkt_sz124.m_path);
395 g_cdvdfsv_fssdd.src = buffer;
396 g_cdvdfsv_fssdd.dest = (
void *)inbuf->m_pkt_sz124.m_eedest;
400 g_cdvdfsv_fssdd.attr = 0;
406 trid = sceSifSetDma(&g_cdvdfsv_fssdd, 1);
413 sceCdSC(0xFFFFFFF6, &scres);
414 return (
void *)&g_cdvdfsv_srchres;
421 read_timeout = sys_clock->lo / 0x9000;
422 KPRINTF(
"Read Time Out %d(msec)\n", read_timeout);
423 sceCdSC(0xFFFFFFEE, &read_timeout);
439 g_cdvdfsv_read_timeout.hi = 0;
440 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
441 g_cdvdfsv_iomrsdd.src = &g_cdvdfsv_readpos;
442 g_cdvdfsv_iomrsdd.size =
sizeof(g_cdvdfsv_readpos);
443 g_cdvdfsv_iomrsdd.attr = 0;
444 g_cdvdfsv_iomrsdd.dest = (
void *)inbuf->m_pkt_0D.m_eedest;
447 "sceCdReadIOPm addr= 0x%08x sector= %d\n",
448 (
unsigned int)(uiptr)(inbuf->m_pkt_0D.m_buf),
449 (
int)(inbuf->m_pkt_0D.m_sectors));
451 inbuf->m_pkt_0D.m_lbn, inbuf->m_pkt_0D.m_sectors, inbuf->m_pkt_0D.m_buf, (
sceCdRMode *)&inbuf->m_pkt_0D.m_mode);
458 trid = sceSifSetDma(&g_cdvdfsv_iomrsdd, 1);
465 while ( cdvdfsv_checkdmastat(trid) >= 0 )
469 if ( error_code !=
SCECdErNO || !cmd_error )
472 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
473 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
477static u8 cdvdfsv_syncdec(
int flag,
int xorkey,
int arg2, u8 data)
479 return flag ? (((data << (arg2 % 8)) | (data >> (8 - arg2 % 8))) ^ xorkey) : data;
482static int cdvdfsv_cb_read(
void)
484 iSetEventFlag(g_cdvdman_intr_evfid, 0x20);
488static int cdvdfsv_checksid(u32 lsn, u32 sectors, u32 ps2dvd,
void *buf,
int decflag,
int decshift, u32 *syncdec_mask)
501 scret = decflag ? sceCdSC(0xFFFFFFE8, &scres) : 0;
503 for ( i = 0; i < sectors; i += 1 )
507 syncdec = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[3]);
508 syncdec += cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[2]) << 8;
509 syncdec += cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[1]) << 16;
510 syncdec_4 = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[0]);
511 if ( i && !*syncdec_mask )
513 ipi_emu = syncdec_4 & 0xC;
517 *syncdec_mask = syncdec_4 & 0xC;
519 readlsn = syncdec - 0x30000;
521 g_cdvdman_istruct_ptr->m_opo_or_para && (lsn + i) >= g_cdvdman_istruct_ptr->m_layer_1_lsn
522 && g_cdvdman_istruct_ptr->m_opo_or_para == 1 )
524 readlsn += g_cdvdman_istruct_ptr->m_layer_1_lsn;
529 rpos.
minute = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[0]);
530 rpos.
second = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[1]);
531 rpos.
sector = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[2]);
534 if ( readlsn != (lsn + i) || ipi_emu )
539 "Read_EE Sector_ID error lsn= %d readlsn= %d layer= %d layer1_start %d ipi_emu %d\n",
543 (
int)(g_cdvdman_istruct_ptr->m_layer_1_lsn),
551 1,
"Read_EE NO_Data_zone error lsn= %d layer= %d SecID %02x\n", (
int)lsn, (syncdec_4 & 1), (
int)(*syncdec_mask));
560 u32 sector_size_selection,
561 int do_multi_retries,
562 int enable_dec_shift,
586 int nsec_div_cdvdfsv_sectors;
592 sector_sizes[0] = 0x924;
593 sector_sizes[1] = 0x810;
594 g_cdvdfsv_read_timeout.hi = 0;
595 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
597 g_cdvdfsv_r2retry = 0;
598 g_cdvdfsv_r2count = 0;
599 if ( secsize != 0x924 && !fssift )
601 for ( i = 0; i < (
unsigned int)g_cdvdfsv_sectors; i += 1 )
603 g_cdvdfsv_multi_dmat[i].attr = 0;
604 g_cdvdfsv_multi_dmat[i].size = secsize;
608 VERBOSE_KPRINTF(1,
"lsn= %d nsec= %d ee_addr= %08x fssift= %d secsize= %d\n", lsn, nsec, ee_addr, fssift, secsize);
609 sector_size = sector_sizes[sector_size_selection];
614 csec = (nsec <= (u32)g_cdvdfsv_sectors) ? nsec : (u32)g_cdvdfsv_sectors;
615#ifdef CDVD_VARIANT_OSD
616 if ( !g_cdvdfsv_sectors )
619 nsec_div_cdvdfsv_sectors = (nsec / g_cdvdfsv_sectors) + (!!((nsec & 0xF)));
621 ee_addr_tmp = ee_addr;
622 dmasize_tmp = dmasize;
623 g_cdvdman_istruct_ptr->m_dec_mode_set = 1;
624 g_cdvdman_istruct_ptr->m_dec_mode_last_set = 0;
626 if ( enable_dec_shift )
628 g_cdvdman_istruct_ptr->m_dec_shift = dec_shift;
629 g_cdvdman_istruct_ptr->m_dec_state = 2;
631 if ( g_cdvdfsv_r2retry )
633 VERBOSE_KPRINTF(1,
"Rty_Read\n");
634 read_res_tmp = (sector_size_selection ?
sceCdRV : sceCdRead0)(
635 (lsn >= (u32)(6 * g_cdvdfsv_sectors)) ? (lsn - g_cdvdfsv_sectors * g_cdvdfsv_r2retry) :
636 (lsn + g_cdvdfsv_sectors * g_cdvdfsv_r2retry + 6 * g_cdvdfsv_sectors),
638 &g_cdvdfsv_rtocbuf[0x1248],
646 read_res_tmp = (sector_size_selection ?
sceCdRV : sceCdRead0)(
647 lsn, nsec, &g_cdvdfsv_rtocbuf[0x1248], mode, csec, cdvdfsv_cb_read);
651 SetAlarm(&g_cdvdfsv_read_timeout, (
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
659 g_cdvdman_istruct_ptr->m_dec_state = 0;
660 g_cdvdman_istruct_ptr->m_dec_mode_set = 0;
661 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
665 g_cdvdfsv_r2retry -= 1;
667 for ( i = 0; (int)i < nsec_div_cdvdfsv_sectors; i += 1 )
670 if ( g_cdvdman_istruct_ptr->m_dec_mode_last_set )
674 if ( cdvdfsv_checksid(
677 sector_size_selection,
678 &g_cdvdfsv_rtocbuf[0x1248],
683 if ( do_multi_retries && syncdec_mask && !i )
689 else if ( do_multi_retries )
694 if ( retry_flag1 || g_cdvdfsv_r2retry )
697 else if ( secsize == 0x924 && !sector_size_selection )
703 optimized_memcpy(&g_cdvdfsv_rtocbuf[secsize], &g_cdvdfsv_rtocbuf[fssift], secsize - fssift);
704 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[secsize + secsize * csec], secsize);
705 g_cdvdfsv_rdp2sdd.size =
706 ((int)i == nsec_div_cdvdfsv_sectors - 1) ? dmasize_tmp : (secsize * (csec - 1) + fssift);
708 &g_cdvdfsv_rtocbuf[secsize + secsize - fssift],
709 &g_cdvdfsv_rtocbuf[secsize * 2],
710 g_cdvdfsv_rdp2sdd.size);
714 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[secsize * 2 + secsize * (csec - 1)], secsize);
715 g_cdvdfsv_rdp2sdd.size = ((int)i == nsec_div_cdvdfsv_sectors - 1) ? dmasize_tmp : (secsize * (csec - 1));
717 &g_cdvdfsv_rtocbuf[secsize], &g_cdvdfsv_rtocbuf[secsize * 2 + fssift], g_cdvdfsv_rdp2sdd.size);
719 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[secsize];
723 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[secsize * 2];
724 g_cdvdfsv_rdp2sdd.size = secsize * csec;
726 g_cdvdfsv_rdp2sdd.attr = 0;
727 g_cdvdfsv_rdp2sdd.dest = ee_addr_tmp;
728 ee_addr_tmp += g_cdvdfsv_rdp2sdd.size;
729 dmasize_tmp -= g_cdvdfsv_rdp2sdd.size;
733 trid = sceSifSetDma(&g_cdvdfsv_rdp2sdd, 1);
739 while ( cdvdfsv_checkdmastat(trid) >= 0 )
744 for ( j = 0; j < csec; j += 1 )
746 g_cdvdfsv_multi_dmat[j].dest = &ee_addr[(csec_comm + j) * secsize];
747 g_cdvdfsv_multi_dmat[j].src = &g_cdvdfsv_rtocbuf[0x1248 + (j * sector_size) + 12];
752 trid = sceSifSetDma(g_cdvdfsv_multi_dmat, csec);
758 while ( cdvdfsv_checkdmastat(trid) >= 0 )
763 size_2 = ((int)i != nsec_div_cdvdfsv_sectors - 1) ? fssift : secsize;
764 g_cdvdfsv_rdp2sdd.size = dmasize_tmp;
767 optimized_memcpy(&g_cdvdfsv_rtocbuf[0x924], &g_cdvdfsv_rtocbuf[fssift + 12], secsize - fssift);
768 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[0x1248 + (csec - 1) * sector_size], sector_size);
769 for ( j = 0; j < csec - 1; j += 1 )
772 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + (j * secsize)],
773 &g_cdvdfsv_rtocbuf[0x1248 + 12 + (j * sector_size)],
777 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + ((csec - 1) * secsize)],
778 &g_cdvdfsv_rtocbuf[0x1248 + 12 + ((csec - 1) * sector_size)],
780 if ( (
int)i != nsec_div_cdvdfsv_sectors - 1 )
782 g_cdvdfsv_rdp2sdd.size = secsize * csec;
787 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[0x1248 + (csec - 1) * sector_size], sector_size);
788 optimized_memcpy(&g_cdvdfsv_rtocbuf[0x924], &g_cdvdfsv_rtocbuf[0x1248 + fssift + 12], secsize - fssift);
789 for ( j = 0; j < csec - 2; j += 1 )
792 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + (j * secsize)],
793 &g_cdvdfsv_rtocbuf[0x1248 + sector_size + 12 + (j * sector_size)],
797 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + ((csec - 2) * secsize)],
798 &g_cdvdfsv_rtocbuf[0x1248 + sector_size + 12 + ((csec - 2) * sector_size)],
800 if ( (
int)i != nsec_div_cdvdfsv_sectors - 1 )
802 g_cdvdfsv_rdp2sdd.size = secsize * (csec - 1);
805 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[0x924];
806 g_cdvdfsv_rdp2sdd.attr = 0;
807 g_cdvdfsv_rdp2sdd.dest = ee_addr_tmp;
808 ee_addr_tmp += g_cdvdfsv_rdp2sdd.size;
809 dmasize_tmp -= g_cdvdfsv_rdp2sdd.size;
813 trid = sceSifSetDma(&g_cdvdfsv_rdp2sdd, 1);
819 while ( cdvdfsv_checkdmastat(trid) >= 0 )
828 if ( (
int)i == nsec_div_cdvdfsv_sectors - 1 )
835 csec = ((
unsigned int)csec > nsec - (
unsigned int)csec_comm) ? (nsec - (
unsigned int)csec_comm) :
836 (
unsigned int)g_cdvdfsv_sectors;
837 ClearEventFlag(g_cdvdman_intr_evfid, ~0x20);
838 dmac_ch_set_chcr(3, 0);
840 g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_maddress = &g_cdvdfsv_rtocbuf[0x1248];
841 dmac_ch_set_madr(3, (uiptr)(&g_cdvdfsv_rtocbuf[0x1248]));
844 g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_blkwords
845 | ((g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_blkcount * csec) << 16));
846 dmac_ch_set_chcr(3, 0x41000200);
847 chcr = dmac_ch_get_chcr(3);
850 g_cdvdfsv_readpos += secsize * csec;
851 sceSifSetDma(post_dmat, 1);
857 CancelAlarm((
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
858 g_cdvdman_istruct_ptr->m_dec_mode_set = 0;
859 g_cdvdman_istruct_ptr->m_dec_state = 0;
861 if ( (u16)g_cdvdman_istruct_ptr->m_dec_mode_last_set )
865 mode->spindlctrl = 16;
867 if ( error_code !=
SCECdErNO || g_cdvdfsv_r2count >= 5 )
873 sceCdSC(0xFFFFFFFE, &error_code_tmp);
874 VERBOSE_KPRINTF(1,
"secid_chk_ee_trns lsn %d nsec %d IPI Err\n", lsn, nsec);
877 if ( !g_cdvdfsv_r2retry )
879 g_cdvdfsv_r2count += 1;
880 VERBOSE_PRINTF(1,
"Read_CD/DVD-ROM Error Recover Start\n");
881 g_cdvdfsv_r2retry = g_cdvdfsv_r2retry_initval;
884 if ( g_cdvdfsv_r2count >= 5 && error_code ==
SCECdErNO )
886 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
898 int dec_shift_enable,
907 g_cdvdfsv_read_timeout.hi = 0;
908 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
910 g_cdvdfsv_sid_err_recover_cnt = 0;
911 g_cdvdfsv_err_count = 0;
918 if ( dec_shift_enable )
920 g_cdvdman_istruct_ptr->m_dec_shift = dec_shift_value;
921 g_cdvdman_istruct_ptr->m_dec_state = 2;
923 cmd_error = (ps2dvd ?
sceCdRV : sceCdRead0)(
924 (lsn >= 0x30) ? (lsn - 0x10 * g_cdvdfsv_sid_err_recover_cnt) : (lsn + 0x10 * g_cdvdfsv_sid_err_recover_cnt),
932 SetAlarm(&g_cdvdfsv_read_timeout, (
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
934 CancelAlarm((
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
935 g_cdvdman_istruct_ptr->m_dec_state = 0;
937 if ( error_code !=
SCECdErNO || !cmd_error || g_cdvdfsv_err_count >= 5 )
939 VERBOSE_KPRINTF(1,
"Read error error code %x cmd error %d\n", error_code, cmd_error);
940 if ( (!cmd_error || g_cdvdfsv_err_count >= 5) && error_code ==
SCECdErNO )
942 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
946 if ( cdvdfsv_checksid(lsn, nsec, ps2dvd, retptr, dec_shift_enable, dec_shift_value, &syncdec_mask) )
948 if ( enable_retries && syncdec_mask )
952 if ( !enable_retries )
954 if ( !g_cdvdfsv_sid_err_recover_cnt )
956 g_cdvdfsv_err_count += 1;
957 VERBOSE_PRINTF(1,
"Read_CD/DVD-ROM Sector_ID Error Recover Start\n");
958 g_cdvdfsv_sid_err_recover_cnt = 3;
960 g_cdvdfsv_sid_err_recover_cnt -= 1;
964 sceCdSC(0xFFFFFFFE, &error_code_tmp);
965 VERBOSE_KPRINTF(1,
"secid_chk lsn %d nsec %d IPI Err\n", lsn, nsec);
969static void cdvdfsv_rpc5_01_readee(
972 unsigned int secsize;
974 unsigned int bsize_tmp;
984 unsigned int buf_offs_sum;
988 unsigned int len2_plus_sec2;
998 sector_sizes[0] = 0x924;
999 sector_sizes[1] = 0x810;
1000 g_cdvdfsv_rmodeee = inbuf->m_pkt_01.m_rmodeee;
1001 lsndualchg_res = inbuf->m_pkt_01.m_lbn;
1002 decval = decflag ? inbuf->m_pkt_01.m_decval : 0;
1003 g_cdvdfsv_eerpsdd.src = &g_cdvdfsv_readpos;
1004 g_cdvdfsv_eerpsdd.size =
sizeof(g_cdvdfsv_readpos);
1005 g_cdvdfsv_eerpsdd.attr = 0;
1006 g_cdvdfsv_eerpsdd.dest = (
void *)inbuf->m_pkt_01.m_eedest;
1009 if ( !sceCdSC(0xFFFFFFEA, &scres_unused) )
1012 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1022 lsndualchg_res = sceCdSC(0xFFFFFFE9, &lsndualchg_res);
1024 datapattern = SCECdSecS2048;
1031 switch ( datapattern )
1046 len2_plus_sec2 = lsndualchg_res + inbuf->m_pkt_01.m_sectors;
1051 all_sec_bytes = secsize * inbuf->m_pkt_01.m_sectors;
1052 if ( g_cdvdfsv_spinctl != -1 )
1053 g_cdvdfsv_rmodeee.
spindlctrl = g_cdvdfsv_spinctl;
1054 paddr = inbuf->m_pkt_01.m_paddr;
1055 saddr = (paddr + all_sec_bytes) & ~0x3F;
1056 psize = ((paddr & 0x3F)) ? ((paddr & ~0x3F) - (paddr - 0x40)) : 0;
1057 bsize = saddr - (paddr + psize);
1058 ssize = paddr + all_sec_bytes - saddr;
1059 VERBOSE_KPRINTF(1,
"CD/DVD-ROM lsn= %d sec= %d\n", lsndualchg_res, inbuf->m_pkt_01.m_sectors);
1060 VERBOSE_KPRINTF(1,
"f psize= %d bsize= %d ssize= %d\n", psize, bsize, ssize);
1066 sectors = (len2_plus_sec2 < lsndualchg_res + buf_offs_sum / secsize + 2) ? 1 : 2;
1069 "0 CD_READ LBN= %d sectors= %d all= %d\n",
1070 (
int)(lsndualchg_res + buf_offs_sum / secsize),
1072 (
int)inbuf->m_pkt_01.m_sectors);
1074 lsndualchg_res + buf_offs_sum / secsize,
1089 if ( datapattern != SCECdSecS2340 || ps2dvd )
1094 for ( i = 0; i < psize; i += 1 )
1096 rtoc_ind += (i && !(i % secsize)) ? (sector_sizes[ps2dvd] - secsize) : 0;
1097 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[rtoc_ind + i];
1102 for ( i = 0; i < psize; i += 1 )
1103 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[i];
1105 buf_offs_sum += psize;
1109 for ( i = 0; i < bsize; i += sizestuff )
1111 u32 offs_sector_only;
1113 bsize_tmp = bsize - i;
1114 if ( g_cdvdfsv_spinctl != -1 )
1115 g_cdvdfsv_rmodeee.
spindlctrl = g_cdvdfsv_spinctl;
1116 offs_sector_only = lsndualchg_res + buf_offs_sum / secsize;
1117 if ( (
unsigned int)(secsize << 6) >= bsize_tmp )
1119 needed_offset = (bsize_tmp / secsize) + (!!(bsize_tmp % secsize));
1120 sizestuff = bsize_tmp;
1124 needed_offset = (((offs_sector_only & 0xF)) && (!(secsize & 0xF))) ? (0x10 - (offs_sector_only & 0xF)) : 0x40;
1125 sizestuff = secsize * needed_offset;
1127 needed_offset += !!((buf_offs_sum + i) % secsize);
1128 if ( len2_plus_sec2 < offs_sector_only + needed_offset )
1129 needed_offset = len2_plus_sec2 - (lsndualchg_res + (buf_offs_sum + i) / secsize);
1130 g_cdvdfsv_readpos = buf_offs_sum + i;
1139 (
char *)(inbuf->m_pkt_01.m_paddr + psize) + i,
1140 (buf_offs_sum + i) % secsize,
1143 &g_cdvdfsv_eerpsdd) )
1149 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1152 trid = sceSifSetDma(&g_cdvdfsv_eerpsdd, 1);
1157 if ( !early_break && ssize )
1160 unsigned int buf_offs_sum_bytes_in_sector;
1162 buf_offs_sum_bytes_in_sector = buf_offs_sum % secsize;
1163 sectors_1 = (len2_plus_sec2 < lsndualchg_res + buf_offs_sum / secsize + 2) ? 1 : 2;
1165 1,
"2 CD_READ LBN= %d sectors= %d\n", (
int)(lsndualchg_res + buf_offs_sum / secsize), (
int)sectors_1);
1167 lsndualchg_res + buf_offs_sum / secsize,
1180 if ( datapattern != SCECdSecS2340 || ps2dvd )
1185 for ( i = 0; i < ssize; i += 1 )
1188 ((i + buf_offs_sum_bytes_in_sector)
1189 && (i % secsize) == (secsize - (buf_offs_sum_bytes_in_sector ? buf_offs_sum_bytes_in_sector : secsize))) ?
1190 (sector_sizes[ps2dvd] - secsize) :
1192 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[buf_offs_sum_bytes_in_sector + i2_offs + i];
1197 for ( i = 0; i < ssize; i += 1 )
1198 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[buf_offs_sum_bytes_in_sector + i];
1200 buf_offs_sum += ssize;
1203 g_cdvdfsv_eereadx.m_b1len = psize;
1204 g_cdvdfsv_eereadx.m_b2len = ssize;
1205 g_cdvdfsv_eereadx.m_b1dst = paddr;
1206 g_cdvdfsv_eereadx.m_b2dst = saddr;
1208 1,
"b psize= %d paddr= %08x bsize= %d ssize= %d saddr %08x\n", (
int)psize, paddr, (
int)bsize, (
int)ssize, saddr);
1209 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1211 g_cdvdfsv_datasdd.src = &g_cdvdfsv_eereadx;
1212 g_cdvdfsv_datasdd.size =
sizeof(g_cdvdfsv_eereadx);
1213 g_cdvdfsv_datasdd.attr = 0;
1214 g_cdvdfsv_readpos = buf_offs_sum;
1215 g_cdvdfsv_datasdd.dest = (
void *)inbuf->m_pkt_01.m_eeremaindest;
1219 trid = sceSifSetDma(&g_cdvdfsv_datasdd, 1);
1220 sceSifSetDma(&g_cdvdfsv_eerpsdd, 1);
1226 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1228 g_cdvdfsv_spinctl = -1;
1229 VERBOSE_PRINTF(1,
"read end\n");
1230 outbuf->m_retres = buf_offs_sum;
1234cdvdfsv_chreadee(
int secoffs,
int seccount,
char *ee_addr,
const sceCdRMode *in_rmode, u32 disktype_14,
int sync)
1236 unsigned int secsize;
1243 lsndualchg_res = secoffs;
1247 if ( !sceCdSC(0xFFFFFFEA, &scres_unused) )
1250 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1254 lsndualchg_res = sceCdSC(0xFFFFFFE9, &lsndualchg_res);
1274 for ( i = 0; i < (
unsigned int)(secsize * seccount); i += readsize_bytes )
1276 unsigned int bytescount;
1277 int sectors_partial;
1278 int bytescount_in_sectors;
1280 bytescount = (
unsigned int)(secsize * seccount) - i;
1281 sectors_partial = (lsndualchg_res + i / secsize) & 0xF;
1282 bytescount_in_sectors = 0x10;
1283 readsize_bytes = secsize * bytescount_in_sectors;
1284 if ( (
unsigned int)readsize_bytes >= bytescount )
1286 bytescount_in_sectors = (bytescount / secsize) + (!!(bytescount % secsize));
1287 readsize_bytes = bytescount;
1289 else if ( sectors_partial && !(secsize & 0xF) )
1291 bytescount_in_sectors -= sectors_partial;
1294 lsndualchg_res + i / secsize,
1295 bytescount_in_sectors,
1329 g_cdvdfsv_readpos = 0;
1330 g_cdvdman_istruct_ptr->m_break_cdvdfsv_readchain = 0;
1331 g_cdvdfsv_chrdsdd.src = &g_cdvdfsv_readpos;
1332 g_cdvdfsv_chrdsdd.size =
sizeof(g_cdvdfsv_readpos);
1333 g_cdvdfsv_chrdsdd.attr = 0;
1334 g_cdvdfsv_chrdsdd.dest = (
void *)inbuf->m_pkt_0F.m_eedest;
1335 switch ( inbuf->m_pkt_0F.m_mode.datapattern )
1338 sector_size = 0x918;
1341 sector_size = 0x924;
1345 sector_size = 0x800;
1348 chain = inbuf->m_pkt_0F.m_readChain;
1349 for ( i = 0; i < 0x40; i += 1 )
1351 if ( g_cdvdman_istruct_ptr->m_break_cdvdfsv_readchain )
1353 VERBOSE_PRINTF(1,
"ReadChain cnt %d on sceCdBreak()\n", (
int)i);
1356 if ( chain[i].lbn == 0xFFFFFFFF || chain[i].sectors == 0xFFFFFFFF || chain[i].buffer == 0xFFFFFFFF )
1358 if ( (chain[i].buffer & 1) )
1360 buf = (
void *)(chain[i].buffer & ~1);
1363 "ReadChain lsn= %d nsec= %d buf= %08x secsize= %d\n",
1364 (
int)(chain[i].lbn),
1365 (
int)(chain[i].sectors),
1366 (
unsigned int)(uiptr)buf,
1367 inbuf->m_pkt_0F.m_mode.datapattern);
1368 re_result =
sceCdRE(chain[i].lbn, chain[i].sectors, buf, (
sceCdRMode *)&(inbuf->m_pkt_0F.m_mode));
1369 if ( re_result == 1 )
1376 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1383 1,
"ReadChain EE\t Memory addr= 0x%08x sector= %d\n", (
unsigned int)(chain[i].lbn), (
int)(chain[i].sectors));
1385 re_result = cdvdfsv_chreadee(
1388 (
char *)chain[i].buffer,
1389 &(inbuf->m_pkt_0F.m_mode),
1391 !sceCdSC(0xFFFFFFFC, &scres_unused));
1395 VERBOSE_PRINTF(1,
"ReadChain error code= 0x%02x\n",
sceCdGetError());
1398 g_cdvdfsv_readpos += chain[i].sectors * sector_size;
1402 trid = sceSifSetDma(&g_cdvdfsv_chrdsdd, 1);
1408 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1413#ifdef CDVD_VARIANT_OSD
1417 unsigned int buf_1_toalign;
1418 unsigned int buf_offs_mod_sector_size;
1419 unsigned int buf_aligned;
1429 unsigned int buf_offs;
1430 unsigned int buf_toalign;
1431 unsigned int buf_sec_tmp;
1438 all_sec_bytes = 0x810 * inbuf->m_pkt_03.m_nsectors;
1439 buf_toalign = ((inbuf->m_pkt_03.m_buf & 0x3F)) ? (inbuf->m_pkt_03.m_buf & ~0x3F) - (inbuf->m_pkt_03.m_buf - 0x40) : 0;
1440 buf_1_toalign = (inbuf->m_pkt_03.m_buf + all_sec_bytes) & ~0x3F;
1441 buf_sec_tmp = all_sec_bytes - (buf_1_toalign - inbuf->m_pkt_03.m_buf);
1444 lbn = inbuf->m_pkt_03.m_lbn + buf_offs / 0x810;
1445 sectors = 1 + (!!((inbuf->m_pkt_03.m_lbn + inbuf->m_pkt_03.m_nsectors) >= (
unsigned int)(lbn + 2)));
1446 VERBOSE_PRINTF(1,
"0 CD_READ LBN= %d sectors= %d all= %d\n", lbn, (
int)sectors, (
int)inbuf->m_pkt_03.m_nsectors);
1447 cmd_error = sceCdReadDVDV(lbn, sectors, g_cdvdfsv_fsvrbuf[0], (
sceCdRMode *)&inbuf->m_pkt_03.m_mode);
1450 if ( error_code !=
SCECdErNO || !cmd_error )
1453 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1454 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1457 for ( i = 0; i < buf_toalign; i += 1 )
1458 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_fsvrbuf[0][i];
1459 buf_offs += buf_toalign;
1461 if ( error_code ==
SCECdErNO && cmd_error )
1464 unsigned int sector_count_in_bytes;
1466 buf_offs_mod_sector_size = 0;
1470 for ( buf_aligned = inbuf->m_pkt_03.m_buf + buf_toalign; buf_aligned < buf_1_toalign;
1471 buf_aligned += sector_count_in_bytes )
1473 unsigned int buf_align_remain;
1475 buf_align_remain = buf_1_toalign - buf_aligned;
1476 buf_offs_mod_sector_size = (buf_aligned - inbuf->m_pkt_03.m_buf) % 0x810;
1477 sector_count_in_bytes = (0x8100 >= buf_align_remain) ? buf_align_remain : 0x8100;
1478 sectors = (0x8100 >= buf_align_remain) ? (buf_align_remain / 0x810 + (!!(buf_align_remain % 0x810))) : 16;
1479 sectors += !!buf_offs_mod_sector_size;
1480 lbn = inbuf->m_pkt_03.m_lbn + (buf_aligned - inbuf->m_pkt_03.m_buf) / 0x810;
1481 if ( sectors > (inbuf->m_pkt_03.m_lbn + inbuf->m_pkt_03.m_nsectors) - lbn )
1482 sectors = (inbuf->m_pkt_03.m_lbn + inbuf->m_pkt_03.m_nsectors) - lbn;
1483 cmd_error = sceCdReadDVDV(lbn, sectors, g_cdvdfsv_fsvrbuf[readbuf], (
sceCdRMode *)&inbuf->m_pkt_03.m_mode);
1486 if ( buf_offs_mod_sector_size )
1488 g_cdvdfsv_fsvrbuf[readbuf ^ 1], &g_cdvdfsv_fsvrbuf[readbuf ^ 1][buf_offs_mod_sector_size], cpysize);
1489 g_cdvdfsv_readdvdv_dmat.dest = (
void *)(buf_aligned - cpysize);
1490 g_cdvdfsv_readdvdv_dmat.size = cpysize;
1491 g_cdvdfsv_readdvdv_dmat.attr = 0;
1492 g_cdvdfsv_readdvdv_dmat.src = g_cdvdfsv_fsvrbuf[readbuf ^ 1];
1496 trid = sceSifSetDma(&g_cdvdfsv_readdvdv_dmat, 1);
1502 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1507 if ( error_code !=
SCECdErNO || !cmd_error )
1510 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1511 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1516 cpysize = sector_count_in_bytes;
1517 buf_offs += sector_count_in_bytes;
1520 if ( error_code ==
SCECdErNO && cmd_error )
1522 if ( buf_offs_mod_sector_size )
1524 g_cdvdfsv_fsvrbuf[readbuf ^ 1], &g_cdvdfsv_fsvrbuf[readbuf ^ 1][buf_offs_mod_sector_size], cpysize);
1525 g_cdvdfsv_readdvdv_dmat.dest = (
void *)buf_aligned;
1526 g_cdvdfsv_readdvdv_dmat.size = cpysize;
1527 g_cdvdfsv_readdvdv_dmat.attr = 0;
1528 g_cdvdfsv_readdvdv_dmat.src = g_cdvdfsv_fsvrbuf[readbuf ^ 1];
1532 trid = sceSifSetDma(&g_cdvdfsv_readdvdv_dmat, 1);
1538 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1542 lbn = inbuf->m_pkt_03.m_lbn + buf_offs / 0x810;
1543 sectors = 1 + (!!((inbuf->m_pkt_03.m_lbn + inbuf->m_pkt_03.m_nsectors) >= (
unsigned int)(lbn + 2)));
1544 VERBOSE_PRINTF(1,
"2 CD_READ LBN= %d sectors= %d\n", lbn, (
int)sectors);
1545 cmd_error = sceCdReadDVDV(lbn, sectors, g_cdvdfsv_fsvrbuf[0], (
sceCdRMode *)&inbuf->m_pkt_03.m_mode);
1548 if ( error_code !=
SCECdErNO || !cmd_error )
1551 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1552 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1555 for ( i = 0; i < buf_sec_tmp; i += 1 )
1556 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_fsvrbuf[0][(buf_offs % 0x810) + i];
1557 buf_offs += buf_sec_tmp;
1560 g_cdvdfsv_eereadx.m_b1len = buf_toalign;
1561 g_cdvdfsv_eereadx.m_b2len = buf_sec_tmp;
1562 g_cdvdfsv_eereadx.m_b1dst = inbuf->m_pkt_03.m_buf;
1563 g_cdvdfsv_eereadx.m_b2dst = buf_1_toalign;
1564 g_cdvdfsv_readdvdv_dmat.src = &g_cdvdfsv_eereadx;
1565 g_cdvdfsv_readdvdv_dmat.size =
sizeof(g_cdvdfsv_eereadx);
1566 g_cdvdfsv_readdvdv_dmat.attr = 0;
1567 g_cdvdfsv_readdvdv_dmat.dest = (
void *)inbuf->m_pkt_03.m_eedest;
1571 trid = sceSifSetDma(&g_cdvdfsv_readdvdv_dmat, 1);
1577 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1579 VERBOSE_PRINTF(1,
"read end\n");
1580 outbuf->m_retres = buf_offs;
1585static void cdvdfsv_rpc5_02_readcdda(
1589 unsigned int sector_size;
1591 unsigned int buf_1_toalign;
1599 unsigned int buf_offs;
1600 unsigned int buf_toalign;
1601 unsigned int buf_sec_tmp;
1603#ifndef CDVD_VARIANT_OSD
1609 g_cdvdfsv_eereadfull_dma2.src = &g_cdvdfsv_readpos;
1610 g_cdvdfsv_eereadfull_dma2.size =
sizeof(g_cdvdfsv_readpos);
1611 g_cdvdfsv_eereadfull_dma2.attr = 0;
1612 g_cdvdfsv_eereadfull_dma2.dest = (
void *)inbuf->m_pkt_02.m_eedest;
1616 sector_size = 0x940;
1621 sector_size = 0x930;
1625 all_sec_bytes = sector_size * inbuf->m_pkt_02.m_sectors;
1627 ((inbuf->m_pkt_02.m_buf & 0x3F)) ? ((inbuf->m_pkt_02.m_buf & ~0x3F) - (inbuf->m_pkt_02.m_buf - 0x40)) : 0;
1628 buf_1_toalign = (inbuf->m_pkt_02.m_buf + all_sec_bytes) & ~0x3F;
1629 buf_sec_tmp = all_sec_bytes - (buf_1_toalign - inbuf->m_pkt_02.m_buf);
1632 unsigned int buf_offs_sectors;
1634 buf_offs_sectors = buf_offs / sector_size;
1635 lbn = inbuf->m_pkt_02.m_lbn + buf_offs_sectors;
1636 sectors = 1 + !!((inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors) >= (
unsigned int)(lbn + 2));
1638 1,
"0 CD_READ LBN= %d sectors= %d all= %d\n", (
int)lbn, (
int)sectors, (
int)inbuf->m_pkt_02.m_sectors);
1639#ifdef CDVD_VARIANT_OSD
1640 cmd_error = do_read_full ?
sceCdReadFull(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode) :
1641 sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1643 cmd_error = sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1647 if ( error_code !=
SCECdErNO || !cmd_error )
1650 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1651 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1652 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1653 error_code_tmp = error_code;
1659 if ( error_code_tmp !=
SCECdErNO && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG )
1661 for ( i = 0; i < buf_toalign; i += 1 )
1663 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[i];
1665 buf_offs += buf_toalign;
1668 if ( error_code_tmp !=
SCECdErNO && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG )
1670 unsigned int sector_count_in_bytes;
1671 unsigned int buf_aligned;
1673 for ( buf_aligned = inbuf->m_pkt_02.m_buf + buf_toalign; buf_aligned < buf_1_toalign;
1674 buf_aligned += sector_count_in_bytes )
1676 unsigned int buf_align_remain;
1677 unsigned int buf_offs_mod_sector_size;
1679 buf_align_remain = buf_1_toalign - buf_aligned;
1680 buf_offs_mod_sector_size = buf_offs % sector_size;
1681 lbn = inbuf->m_pkt_02.m_lbn + buf_offs / sector_size;
1682 sectors = (g_cdvdfsv_sectors_cdda * sector_size >= buf_align_remain) ?
1683 (buf_align_remain / sector_size) + (!!(buf_align_remain % sector_size)) :
1684 g_cdvdfsv_sectors_cdda;
1685 sectors += !!buf_offs_mod_sector_size;
1686 sector_count_in_bytes = (g_cdvdfsv_sectors_cdda * sector_size >= buf_align_remain) ?
1687 g_cdvdfsv_sectors_cdda * sector_size :
1689 if ( sectors > (inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors) - lbn )
1690 sectors = (inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors) - lbn;
1691 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1693#ifdef CDVD_VARIANT_OSD
1694 cmd_error = do_read_full ?
sceCdReadFull(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode) :
1695 sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1697 cmd_error = sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1701 if ( error_code !=
SCECdErNO || !cmd_error )
1704 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1705 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1706 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1708 error_code_tmp = error_code;
1712 if ( buf_offs_mod_sector_size )
1713 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[buf_offs_mod_sector_size], sector_count_in_bytes);
1714 g_cdvdfsv_eereadfull_dma1.src = g_cdvdfsv_rtocbuf;
1715 g_cdvdfsv_eereadfull_dma1.size = sector_count_in_bytes;
1716 g_cdvdfsv_eereadfull_dma1.attr = 0;
1717 g_cdvdfsv_eereadfull_dma1.dest = (
char *)buf_aligned;
1718 g_cdvdfsv_readpos = buf_offs;
1722 trid = sceSifSetDma(&g_cdvdfsv_eereadfull_dma1, 1);
1728 if ( (
unsigned int)buflen >= 0x19 )
1731 sceSifSetDma(&g_cdvdfsv_eereadfull_dma2, 1);
1734 buf_offs += sector_count_in_bytes;
1738 (error_code_tmp !=
SCECdErNO && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG) && buf_sec_tmp )
1740 lbn = inbuf->m_pkt_02.m_lbn + buf_offs / sector_size;
1741 sectors = 1 + !!((inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors) >= (
unsigned int)(lbn + 2));
1744 "0 CD_READ LBN= %d sectors= %d all= %d\n",
1745 (
int)(inbuf->m_pkt_02.m_lbn + buf_offs / sector_size),
1747 (
int)inbuf->m_pkt_02.m_sectors);
1748 VERBOSE_PRINTF(1,
"2 CD_READ LBN= %d sectors= %d\n", (
int)lbn, (
int)sectors);
1749#ifdef CDVD_VARIANT_OSD
1750 cmd_error = do_read_full ?
sceCdReadFull(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode) :
1751 sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1753 cmd_error = sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1757 if ( error_code !=
SCECdErNO || !cmd_error )
1760 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1761 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1762 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1763 error_code_tmp = error_code;
1767 for ( i = 0; i < buf_sec_tmp; i += 1 )
1769 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[(buf_offs % sector_size) + i];
1771 buf_offs += buf_sec_tmp;
1773 g_cdvdfsv_eereadx.m_b1len = buf_toalign;
1774 g_cdvdfsv_eereadx.m_b2len = buf_sec_tmp;
1775 g_cdvdfsv_eereadx.m_b1dst = inbuf->m_pkt_02.m_buf;
1776 g_cdvdfsv_eereadx.m_b2dst = buf_1_toalign;
1777 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1779 g_cdvdfsv_eereadfull_dma1.src = &g_cdvdfsv_eereadx;
1780 g_cdvdfsv_eereadfull_dma1.size =
sizeof(g_cdvdfsv_eereadx);
1781 g_cdvdfsv_eereadfull_dma1.attr = 0;
1782 g_cdvdfsv_readpos = buf_offs;
1783 g_cdvdfsv_eereadfull_dma1.dest = (
void *)inbuf->m_pkt_02.m_eeremaindest;
1787 trid = sceSifSetDma(&g_cdvdfsv_eereadfull_dma1, 1);
1788 if ( (
unsigned int)buflen >= 0x19 )
1789 sceSifSetDma(&g_cdvdfsv_eereadfull_dma2, 1);
1795 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1798 sceCdSC(0xFFFFFFFE, &error_code_tmp);
1799 VERBOSE_PRINTF(1,
"read end\n");
1800 outbuf->m_retres = buf_offs;
1803static void *cbrpc_rpc2_diskready(
int fno,
void *buffer,
int length)
1809 VERBOSE_KPRINTF(1,
"DISK READY call 0x%02x\n",
sceCdStatus());
1812 return (
void *)&g_diskready_res;
1822 VERBOSE_PRINTF(1,
"GET TOC call 0x%08x\n", (
int)inbuf);
1823 outbuf->m_retres =
sceCdGetToc((u8 *)g_cdvdfsv_rtocbuf);
1824 VERBOSE_PRINTF(1,
"GET TOC called\n");
1825 g_cdvdfsv_rtocsdd.src = g_cdvdfsv_rtocbuf;
1826 g_cdvdfsv_rtocsdd.size = 0x810;
1827 g_cdvdfsv_rtocsdd.attr = 0;
1828 g_cdvdfsv_rtocsdd.dest = (
void *)inbuf->m_pkt_04.m_eedest;
1832 trid = sceSifSetDma(&g_cdvdfsv_rtocsdd, 1);
1838 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1846 outbuf->m_pkt_04.m_isdvd = 1;
1849 outbuf->m_pkt_04.m_isdvd = 0;
1878 outbuf->m_retres = 0;
1879 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1881 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1882 outbuf->m_retres =
sceCdRI(outbuf->m_pkt_06.m_buffer, &outbuf->m_pkt_06.m_result);
1894 outbuf->m_retres = 0;
1895 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1897 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1898 outbuf->m_retres =
sceCdRM(outbuf->m_pkt_1A.m_buffer, &outbuf->m_pkt_1A.m_status);
1902#ifdef CDVD_VARIANT_DNAS
1911 outbuf->m_retres = 0;
1912 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1914 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1928 outbuf->m_retres = 0;
1929 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1931 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1939 if ( buflen == 4 || !inbuf->m_pkt_22.m_char4 )
1941 outbuf->m_retres =
sceCdMmode(inbuf->m_pkt_22.m_media);
1945#ifdef CDVD_VARIANT_XOSD
1949 VERBOSE_KPRINTF(1,
"EE call recv sceCdChgSys %d %08x\n", inbuf->m_pkt_2D.m_arg1, inbuf);
1950 outbuf->m_retres =
sceCdChgSys(inbuf->m_pkt_2D.m_arg1);
1962#ifdef CDVD_VARIANT_OSD
1970 outbuf->m_retres = 0;
1971 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1973 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1974 outbuf->m_retres =
sceCdWI(inbuf->m_pkt_07.m_buffer, &outbuf->m_pkt_07.m_status);
1979#ifdef CDVD_VARIANT_OSD
1987 outbuf->m_retres = 0;
1988 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1990 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1991 outbuf->m_retres =
sceCdWM(inbuf->m_pkt_1B.m_buffer, &outbuf->m_pkt_1B.m_status);
1996#ifdef CDVD_VARIANT_OSD
2005 outbuf->m_retres = 0;
2006 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2008 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2009 outbuf->m_retres =
sceCdReadConsoleID(outbuf->m_pkt_12.m_buffer, &outbuf->m_pkt_12.m_status);
2014#ifdef CDVD_VARIANT_OSD
2023 outbuf->m_retres = 0;
2024 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2026 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2027 outbuf->m_retres =
sceCdWriteConsoleID(inbuf->m_pkt_13.m_buffer, &outbuf->m_pkt_13.m_status);
2032#ifdef CDVD_VARIANT_OSD
2041 outbuf->m_retres = 0;
2042 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2044 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2045 outbuf->m_retres =
sceCdMV(outbuf->m_pkt_14.m_buffer, &outbuf->m_pkt_14.m_status);
2050#ifdef CDVD_VARIANT_OSD
2058 outbuf->m_retres = 0;
2059 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2061 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2062 outbuf->m_retres =
sceCdReadSUBQ(outbuf->m_pkt_17.m_buffer, &outbuf->m_pkt_17.m_status);
2067#ifdef CDVD_VARIANT_OSD
2076 outbuf->m_retres = 0;
2077 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2079 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2085#ifdef CDVD_VARIANT_OSD
2094 outbuf->m_retres = 0;
2095 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2097 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2103#ifdef CDVD_VARIANT_OSD
2111 outbuf->m_retres = 0;
2112 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2114 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2120#ifdef CDVD_VARIANT_OSD
2129 outbuf->m_retres = 0;
2130 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2132 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2146 outbuf->m_retres = 0;
2147 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2149 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2150 outbuf->m_retres =
sceCdPowerOff(&outbuf->m_pkt_21.m_result);
2154#ifdef CDVD_VARIANT_OSD
2162 outbuf->m_retres = 0;
2163 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2165 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2166 outbuf->m_retres =
sceCdBlueLEDCtl(inbuf->m_pkt_20.m_control, &outbuf->m_pkt_20.m_status);
2171#ifdef CDVD_VARIANT_OSD
2176 g_cdvdfsv_spinctl = inbuf->m_pkt_1D.m_spinctl;
2177 outbuf->m_retres = sceCdSC(0xFFFFFFF8, &g_cdvdfsv_spinctl);
2189 outbuf->m_retres = 0;
2190 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2192 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2193 outbuf->m_retres =
sceCdCtrlADout(inbuf->m_pkt_15.m_mode, &outbuf->m_pkt_15.m_status);
2197#ifdef CDVD_VARIANT_OSD
2205 outbuf->m_retres = 0;
2206 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2208 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2209 outbuf->m_retres =
sceCdAutoAdjustCtrl(inbuf->m_pkt_19.m_mode, &outbuf->m_pkt_19.m_status);
2214#ifdef CDVD_VARIANT_OSD
2223 outbuf->m_retres = 0;
2224 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2226 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2228 &outbuf->m_pkt_29.m_clock,
2229 &outbuf->m_pkt_29.m_userdata,
2230 &outbuf->m_pkt_29.m_wakeupreason,
2231 &outbuf->m_pkt_29.m_flags);
2236#ifdef CDVD_VARIANT_OSD
2244 outbuf->m_retres = 0;
2245 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2248 memcpy(&outbuf->m_pkt_28.m_clock, &inbuf->m_pkt_28.m_clock,
sizeof(
sceCdCLOCK));
2249 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2251 sceCdWriteWakeUpTime(&outbuf->m_pkt_28.m_clock, inbuf->m_pkt_28.m_userdata, inbuf->m_pkt_28.m_flags);
2256#ifdef CDVD_VARIANT_OSD
2264 outbuf->m_retres = 0;
2265 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2267 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2268 outbuf->m_retres =
sceCdRcBypassCtl(inbuf->m_pkt_30.m_mode, &outbuf->m_pkt_30.m_status);
2273#ifdef CDVD_VARIANT_OSD
2282 outbuf->m_retres = 0;
2283 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2285 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2287 (
int *)&outbuf->m_pkt_32.m_arg1, &outbuf->m_pkt_32.m_arg2, &outbuf->m_pkt_32.m_arg3, &outbuf->m_pkt_32.m_arg4);
2292#ifdef CDVD_VARIANT_OSD
2300 outbuf->m_retres = 0;
2301 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2303 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2304 outbuf->m_retres =
sceRemote2_7(inbuf->m_pkt_31.m_param, &outbuf->m_pkt_31.m_status);
2309#ifdef CDVD_VARIANT_OSD
2318 outbuf->m_retres = 0;
2319 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2321 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2322 outbuf->m_retres =
sceRemote2_7Get(&outbuf->m_pkt_38.m_param, &outbuf->m_pkt_38.m_status);
2327#ifdef CDVD_VARIANT_OSD
2336 outbuf->m_retres = 0;
2337 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2339 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2345#ifdef CDVD_VARIANT_OSD
2353 outbuf->m_retres = 0;
2354 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2356 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2357 outbuf->m_retres =
sceCdSetFanProfile(inbuf->m_pkt_2B.m_param, &outbuf->m_pkt_2B.m_status);
2362#ifdef CDVD_VARIANT_OSD
2370 outbuf->m_retres = 0;
2371 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2373 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2376 outbuf->m_retres = cdvdman_152(&outbuf->m_pkt_2C.m_arg1, &outbuf->m_pkt_2C.m_arg2);
2378 outbuf->m_retres = 1;
2384#ifdef CDVD_VARIANT_OSD
2393 outbuf->m_retres = 0;
2394 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2396 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2402#ifdef CDVD_VARIANT_OSD
2410 outbuf->m_retres = 0;
2411 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2413 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2415 inbuf->m_pkt_44.m_arg1, (u32 *)inbuf->m_pkt_44.m_arg2, (u8 *)inbuf->m_pkt_44.m_arg3, &outbuf->m_pkt_44.m_status);
2420#ifdef CDVD_VARIANT_XOSD
2428 outbuf->m_retres = 0;
2429 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2431 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2437#ifdef CDVD_VARIANT_OSD
2445 outbuf->m_retres = 0;
2446 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2448 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2449 outbuf->m_retres =
sceCdSetLEDsMode(inbuf->m_pkt_35.m_param, &outbuf->m_pkt_35.m_status);
2463 outbuf->m_retres = 0;
2464 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2466 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2471#ifdef CDVD_VARIANT_OSD
2480 outbuf->m_retres = 0;
2481 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2484 memcpy(&outbuf->m_pkt_02.m_clock, &inbuf->m_pkt_02.m_clock,
sizeof(
sceCdCLOCK));
2485 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2491#ifdef CDVD_VARIANT_OSD
2498 outbuf->m_retres = 0;
2499 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2501 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2503 outbuf->m_retres =
sceCdReadNVM(inbuf->m_pkt_08.m_address, &outbuf->m_pkt_08.m_data, &outbuf->m_pkt_08.m_status);
2505 outbuf->m_pkt_08.m_address = inbuf->m_pkt_08.m_address;
2509#ifdef CDVD_VARIANT_OSD
2516 outbuf->m_retres = 0;
2517 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2519 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2520 outbuf->m_retres =
sceCdWriteNVM(inbuf->m_pkt_09.m_address, inbuf->m_pkt_09.m_data, &outbuf->m_pkt_09.m_status);
2522 outbuf->m_pkt_09.m_address = inbuf->m_pkt_09.m_address;
2523 outbuf->m_pkt_09.m_data = inbuf->m_pkt_09.m_data;
2527#ifdef CDVD_VARIANT_OSD
2536#ifdef CDVD_VARIANT_XOSD
2543 outbuf->m_retres = 0;
2544 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2546 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2548 inbuf->m_pkt_2E.m_arg1, inbuf->m_pkt_2E.m_arg2, &outbuf->m_pkt_2E.m_result1, &outbuf->m_pkt_2E.m_result2);
2553#ifdef CDVD_VARIANT_XOSD
2562 outbuf->m_retres = 0;
2563 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2565 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2571#ifdef CDVD_VARIANT_XOSD
2579 outbuf->m_retres = 0;
2580 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2582 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2585 outbuf->m_retres = sceCdResetWakeupReason((u32 *)inbuf, &outbuf->m_pkt_3A.m_arg2);
2588 outbuf->m_retres = 1;
2594#ifdef CDVD_VARIANT_XOSD
2602 outbuf->m_retres = 0;
2603 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2605 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2608 outbuf->m_retres = cdvdman_169(&outbuf->m_pkt_3B.m_arg1, &outbuf->m_pkt_3B.m_arg2);
2610 outbuf->m_retres = 1;
2616#ifdef CDVD_VARIANT_XOSD
2624 outbuf->m_retres = 0;
2625 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2627 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2629 inbuf->m_pkt_3C.m_arg1, inbuf->m_pkt_3C.m_arg2, &outbuf->m_pkt_3C.m_result1, &outbuf->m_pkt_3C.m_result2);
2634#ifdef CDVD_VARIANT_XOSD
2642 outbuf->m_retres = 0;
2643 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2645 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2651#ifdef CDVD_VARIANT_XOSD
2660 outbuf->m_retres = 0;
2661 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2663 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2669#ifdef CDVD_VARIANT_XOSD
2677 outbuf->m_retres = 0;
2678 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2680 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2681 outbuf->m_retres =
sceCdXDVRPReset(inbuf->m_pkt_3F.m_arg1, &outbuf->m_pkt_3F.m_status);
2686#ifdef CDVD_VARIANT_XOSD
2696#ifdef CDVD_VARIANT_OSD
2704 outbuf->m_retres = 0;
2705 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2707 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2709 inbuf->m_pkt_0E.m_block, inbuf->m_pkt_0E.m_mode, inbuf->m_pkt_0E.m_NumBlocks, &outbuf->m_pkt_0E.m_status);
2714#ifdef CDVD_VARIANT_OSD
2723 outbuf->m_retres = 0;
2724 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2726 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2732#ifdef CDVD_VARIANT_OSD
2741 outbuf->m_retres = 0;
2742 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2744 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2745 outbuf->m_retres =
sceCdReadConfig(outbuf->m_pkt_10.m_buffer, &outbuf->m_pkt_10.m_status);
2750#ifdef CDVD_VARIANT_OSD
2758 outbuf->m_retres = 0;
2759 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2761 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2762 outbuf->m_retres =
sceCdWriteConfig(inbuf->m_pkt_11.m_buffer, &outbuf->m_pkt_11.m_status);
2767#ifdef CDVD_VARIANT_DNAS
2774 outbuf->m_retres =
sceCdReadDiskID((
unsigned int *)&(outbuf->m_pkt_11.m_diskid));
2787#ifdef CDVD_VARIANT_OSD
2793 inbuf->m_pkt_0B.m_arg1, inbuf->m_pkt_0B.m_arg2, inbuf->m_pkt_0B.m_command, (u8 *)outbuf->m_pkt_0B.m_dg_buf);
2797#ifdef CDVD_VARIANT_OSD
2802 sceCdDecSet(inbuf->m_pkt_0A.m_enable_xor, inbuf->m_pkt_0A.m_enable_shift, inbuf->m_pkt_0A.m_shiftval);
2812 inbuf->m_pkt_0B.m_cmdNum, &inbuf->m_pkt_0B.m_inBuff, inbuf->m_pkt_0B.m_inBuffSize, &(outbuf->m_pkt_0B.m_outbuf));
2820 outbuf->m_retres =
sceCdApplyNCmd(inbuf->m_pkt_0C.m_cmdNum, &inbuf->m_pkt_0C.m_inBuff, inbuf->m_pkt_0C.m_inBuffSize);
2839 outbuf->m_retres = 0;
2840 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2842 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2843 outbuf->m_retres =
sceCdTrayReq(inbuf->m_pkt_05.m_param, &outbuf->m_pkt_05.m_traychk);
2852 outbuf->m_retres =
sceCdSetTimeout(inbuf->m_pkt_25.m_param, inbuf->m_pkt_25.m_timeout);
2861 outbuf->m_retres =
sceCdReadDvdDualInfo(&outbuf->m_pkt_27.m_on_dual, &outbuf->m_pkt_27.m_layer1_start);
2864static int cdvdfsv_rpc5_0E_diskready(
void)
2871 VERBOSE_PRINTF(1,
"sceCdNcmddiskready call\n");
2877 case SCECdDETCTDVDS:
2878 case SCECdDETCTDVDD:
2886 (
sceCdDiskReady(8) & 0xC0) != 0x40 || sceCdSC(0xFFFFFFFD, &scres_unused) || !sceCdSC(0xFFFFFFF4, &scres_unused)
2889 VERBOSE_PRINTF(1,
"Drive Not Ready\n");
2893 VERBOSE_PRINTF(1,
"sceCdNcmddiskready call OKend\n");
2897static void *cbrpc_rpc5_cdvdncmds(
int fno,
void *buffer,
int length)
2904 VERBOSE_KPRINTF(1,
"sce_cdvd N cmd start %d\n", fno);
2905 g_cdvdfsv_rpc5flg = 1;
2906 sceCdSC(0xFFFFFFF6, &fno_1);
2911 cdvdfsv_rpc5_01_readee(
2915 cdvdfsv_rpc5_02_readcdda(buffer, length, &g_crr, 0);
2917#ifdef CDVD_VARIANT_OSD
2919 cdvdfsv_rpc5_03_readdvdv(buffer, length, &g_crr);
2923 cdvdfsv_rpc5_04_gettoc(buffer, length, &g_crr);
2928 VERBOSE_PRINTF(1,
"Call Seek end\n");
2932 VERBOSE_PRINTF(1,
"Call Standby\n");
2935 VERBOSE_PRINTF(1,
"Call Standby called\n");
2938 VERBOSE_PRINTF(1,
"Call Stop\n");
2943 VERBOSE_PRINTF(1,
"Call Pause\n");
2948 if ( devctl(
"cdrom_stm0:", 0x4396, buffer, length, &g_crr.m_retres,
sizeof(g_crr.m_retres)) < 0 )
2952 if ( devctl(
"cdrom_stm0:", 0x4398, buffer, length, &g_crr.m_retres,
sizeof(g_crr.m_retres)) < 0 )
2955#ifdef CDVD_VARIANT_OSD
2957 cdvdfsv_rpc5_0B_dg(buffer, length, &g_crr);
2961 cdvdfsv_rpc5_0C_applyncmd(buffer, length, &g_crr);
2964 cdvdfsv_rpc5_0D_iopmread(buffer, length, &g_crr);
2967 g_crr.m_retres = cdvdfsv_rpc5_0E_diskready();
2970 cdvdfsv_rpc5_0F_readchain(buffer, length, &g_crr);
2972#ifdef CDVD_VARIANT_OSD
2974 cdvdfsv_rpc5_02_readcdda(buffer, length, &g_crr, 1);
2977#ifdef CDVD_VARIANT_DNAS
2979 cdvdfsv_rpc5_11_readdiskid(buffer, length, &g_crr);
2984 cdvdfsv_rpc5_01_readee(
2987#ifdef CDVD_VARIANT_DNAS
2989 cdvdfsv_rpc5_17_doesuniquekeyexist(buffer, length, &g_crr);
2993 VERBOSE_PRINTF(1,
"sce_cdvd no block IO :unrecognized code %x\n", fno);
2998 sceCdSC(0xFFFFFFF6, &fno_1);
2999 g_cdvdfsv_rpc5flg = 0;
3001 VERBOSE_KPRINTF(1,
"sce_cdvd N cmd end\n");
3002 return (
void *)&g_crr;
3006static void *cbrpc_rpc3_cdvdscmds(
int fno,
void *buffer,
int length)
3008 VERBOSE_PRINTF(1,
"sce_cdvd S cmd start %d\n", fno);
3009 g_cdvdfsv_rpc3flg = 1;
3013 cdvdfsv_rpc3_01_readclock(buffer, length, &g_outbuf);
3015#ifdef CDVD_VARIANT_OSD
3017 cdvdfsv_rpc3_02_writeclock(buffer, length, &g_outbuf);
3021 cdvdfsv_rpc3_03_disktype(buffer, length, &g_outbuf);
3024 cdvdfsv_rpc3_04_geterror(buffer, length, &g_outbuf);
3027 cdvdfsv_rpc3_05_trayreq(buffer, length, &g_outbuf);
3030 cdvdfsv_rpc3_06_ri(buffer, length, &g_outbuf);
3032#ifdef CDVD_VARIANT_OSD
3035 cdvdfsv_rpc3_07_wi(buffer, length, &g_outbuf);
3038 cdvdfsv_rpc3_08_readnvm(buffer, length, &g_outbuf);
3041 cdvdfsv_rpc3_09_writenvm(buffer, length, &g_outbuf);
3044 cdvdfsv_rpc3_0A_decset(buffer, length, &g_outbuf);
3048 cdvdfsv_rpc3_0B_applyscmd(buffer, length, &g_outbuf);
3051 cdvdfsv_rpc3_0C_cdstatus(buffer, length, &g_outbuf);
3053#ifdef CDVD_VARIANT_OSD
3055 cdvdfsv_rpc3_0D_sethdmode(buffer, length, &g_outbuf);
3058 cdvdfsv_rpc3_0E_openconfig(buffer, length, &g_outbuf);
3061 cdvdfsv_rpc3_0F_closeconfig(buffer, length, &g_outbuf);
3064 cdvdfsv_rpc3_10_readconfig(buffer, length, &g_outbuf);
3067 cdvdfsv_rpc3_11_writeconfig(buffer, length, &g_outbuf);
3070 cdvdfsv_rpc3_12_readconsoleid(buffer, length, &g_outbuf);
3074 cdvdfsv_rpc3_13_writeconsoleid(buffer, length, &g_outbuf);
3077 cdvdfsv_rpc3_14_getmversion(buffer, length, &g_outbuf);
3081 cdvdfsv_rpc3_15_ctrladout(buffer, length, &g_outbuf);
3084 cdvdfsv_rpc3_16_break(buffer, length, &g_outbuf);
3086#ifdef CDVD_VARIANT_OSD
3088 cdvdfsv_rpc3_17_readsubq(buffer, length, &g_outbuf);
3091 cdvdfsv_rpc3_18_forbiddvdp(buffer, length, &g_outbuf);
3094 cdvdfsv_rpc3_19_autoadjustctrl(buffer, length, &g_outbuf);
3098 cdvdfsv_rpc3_1A_rm(buffer, length, &g_outbuf);
3100#ifdef CDVD_VARIANT_OSD
3103 cdvdfsv_rpc3_1B_wm(buffer, length, &g_outbuf);
3106 cdvdfsv_rpc3_1C_forbidread(buffer, length, &g_outbuf);
3109 cdvdfsv_rpc3_1D_sc_FFFFFFF8(buffer, length, &g_outbuf);
3112 cdvdfsv_rpc3_1E_bootcertify(buffer, length, &g_outbuf);
3115 cdvdfsv_rpc3_1F_cancelpoffrdy(buffer, length, &g_outbuf);
3118 cdvdfsv_rpc3_20_blueledctl(buffer, length, &g_outbuf);
3122 cdvdfsv_rpc3_21_poweroff(buffer, length, &g_outbuf);
3125 cdvdfsv_rpc3_22_mmode(buffer, length, &g_outbuf);
3128 cdvdfsv_rpc3_23_changethreadpriority(buffer, length, &g_outbuf);
3130#ifdef CDVD_VARIANT_DNAS
3132 cdvdfsv_rpc3_24_readguid(buffer, length, &g_outbuf);
3136 cdvdfsv_rpc3_25_settimeout(buffer, length, &g_outbuf);
3138#ifdef CDVD_VARIANT_DNAS
3140 cdvdfsv_rpc3_26_readmodelid(buffer, length, &g_outbuf);
3144 cdvdfsv_rpc3_27_readdvddualinfo(buffer, length, &g_outbuf);
3146#ifdef CDVD_VARIANT_OSD
3148 cdvdfsv_rpc3_28_writewakeuptime(buffer, length, &g_outbuf);
3151 cdvdfsv_rpc3_29_readwakeuptime(buffer, length, &g_outbuf);
3154 cdvdfsv_rpc3_2A_readps1bootparam(buffer, length, &g_outbuf);
3157 cdvdfsv_rpc3_2B_setfanprofile(buffer, length, &g_outbuf);
3160 cdvdfsv_rpc3_2C_i_152(buffer, length, &g_outbuf);
3163#ifdef CDVD_VARIANT_XOSD
3165 cdvdfsv_rpc3_2D_chgsys(buffer, length, &g_outbuf);
3168 cdvdfsv_rpc3_2E_xledctl(buffer, length, &g_outbuf);
3171 cdvdfsv_rpc3_2F_noticegamestart(buffer, length, &g_outbuf);
3174#ifdef CDVD_VARIANT_OSD
3176 cdvdfsv_rpc3_30_rcbypassctl(buffer, length, &g_outbuf);
3179 cdvdfsv_rpc3_31_remote2_7(buffer, length, &g_outbuf);
3182 cdvdfsv_rpc3_32_sendscmd1d(buffer, length, &g_outbuf);
3185 cdvdfsv_rpc3_35_setledsmode(buffer, length, &g_outbuf);
3188 cdvdfsv_rpc3_38_remote2_7_get(buffer, length, &g_outbuf);
3191#ifdef CDVD_VARIANT_XOSD
3193 cdvdfsv_rpc3_39_buzzerctl(buffer, length, &g_outbuf);
3196 cdvdfsv_rpc3_3A_resetwakeupreason(buffer, length, &g_outbuf);
3199 cdvdfsv_rpc3_3B_i_169(buffer, length, &g_outbuf);
3202 cdvdfsv_rpc3_3C_xbspowerctl(buffer, length, &g_outbuf);
3205 cdvdfsv_rpc3_3D_setmediumremoval(buffer, length, &g_outbuf);
3208 cdvdfsv_rpc3_3E_getmediumremoval(buffer, length, &g_outbuf);
3211 cdvdfsv_rpc3_3F_xdvrpreset(buffer, length, &g_outbuf);
3214 cdvdfsv_rpc3_40_getwakeupreason(buffer, length, &g_outbuf);
3217#ifdef CDVD_VARIANT_OSD
3219 cdvdfsv_rpc3_43_readregionparams(buffer, length, &g_outbuf);
3223 cdvdfsv_rpc3_44_writeregionparams(buffer, length, &g_outbuf);
3227 VERBOSE_PRINTF(1,
"sce_cdvd block IO :unrecognized code 0x%02x\n", fno);
3228 g_outbuf.m_retres = 0;
3231 VERBOSE_PRINTF(1,
"sce_cdvd S cmd end\n");
3232 g_cdvdfsv_rpc3flg = 0;
3233 return (
void *)&g_outbuf;
3236static void cdvdfsv_poffloop(
void)
3243 g_cdvdman_intr_evfid = sceCdSC(0xFFFFFFF5, &scres);
3246 ClearEventFlag(g_cdvdman_intr_evfid, ~4);
3247 WaitEventFlag(g_cdvdman_intr_evfid, 4, WEF_AND, &efbits);
3248 if ( g_cdvdfsv_nopocm )
3250 if ( !g_cdvdfsv_plbreak )
3254 trid = sceSifSendCmd(0x80000012, cmdpkt,
sizeof(cmdpkt), 0, 0, 0);
3259 while ( cdvdfsv_checkdmastat(trid) >= 0 )
3265#ifdef CDVD_VARIANT_OSD
3266static void cdvdfsv_rpc4_th(
void *arg)
3274 g_cdvdman_intr_evfid = sceCdSC(0xFFFFFFF5, &scres);
3277 ClearEventFlag(g_cdvdman_intr_evfid, ~0x40);
3278 WaitEventFlag(g_cdvdman_intr_evfid, 0x40, WEF_AND, &efbits);
3279 if ( g_cdvdfsv_nopocm )
3281 if ( !g_cdvdfsv_plbreak )
3285 trid = sceSifSendCmd(0x80000015, cmdpkt,
sizeof(cmdpkt), 0, 0, 0);
3290 while ( cdvdfsv_checkdmastat(trid) >= 0 )
3298#ifdef CDVD_VARIANT_OSD
3299static void cdvdfsv_rpc5_th(
void *arg)
3307 g_cdvdman_intr_evfid = sceCdSC(0xFFFFFFF5, &scres);
3310 ClearEventFlag(g_cdvdman_intr_evfid, ~0x80);
3311 WaitEventFlag(g_cdvdman_intr_evfid, 0x80, WEF_AND, &efbits);
3312 if ( g_cdvdfsv_nopocm )
3314 if ( !g_cdvdfsv_plbreak )
3318 trid = sceSifSendCmd(0x80000016, cmdpkt,
sizeof(cmdpkt), 0, 0, 0);
3323 while ( cdvdfsv_checkdmastat(trid) >= 0 )
3331static void cdvdfsv_rpc1_th(
void *arg)
3335 sceSifSetRpcQueue(&g_rpc_qdata1, GetThreadId());
3336 sceSifRegisterRpc(&g_rpc_sdata1, 0x80000592, cbrpc_rpc1_cdinit, g_rpc_buffer1, 0, 0, &g_rpc_qdata1);
3337 sceSifRegisterRpc(&g_rpc_sdata2, 0x8000059A, cbrpc_rpc2_diskready, g_rpc_buffer2, 0, 0, &g_rpc_qdata1);
3338 sceSifRegisterRpc(&g_rpc_sdata3, 0x80000593, cbrpc_rpc3_cdvdscmds, g_rpc_buffer3, 0, 0, &g_rpc_qdata1);
3339 sceSifRpcLoop(&g_rpc_qdata1);
3343static void cdvdfsv_rpc3_th(
void *arg)
3347 sceSifSetRpcQueue(&g_rpc_qdata3, GetThreadId());
3348 sceSifRegisterRpc(&g_rpc_sdata6, 0x8000059C, cbrpc_rpc2_diskready, g_rpc_buffer2, 0, 0, &g_rpc_qdata3);
3349 sceSifRpcLoop(&g_rpc_qdata3);
3353static void cdvdfsv_rpc2_th(
void *arg)
3357 sceSifSetRpcQueue(&g_rpc_qdata2, GetThreadId());
3358 sceSifRegisterRpc(&g_rpc_sdata4, 0x80000597, cbrpc_rpc4_fscall, g_rpc_buffer4, 0, 0, &g_rpc_qdata2);
3359 sceSifRegisterRpc(&g_rpc_sdata5, 0x80000595, cbrpc_rpc5_cdvdncmds, g_rpc_buffer5, 0, 0, &g_rpc_qdata2);
3360 sceSifRpcLoop(&g_rpc_qdata2);
3368 "\t" ".set push" "\n"
3369 "\t" ".set noat" "\n"
3370 "\t" ".set noreorder" "\n"
3371 "\t" ".global optimized_memcpy" "\n"
3372 "\t" "optimized_memcpy:" "\n"
3373 "\t" " srl $a3, $a2, 2" "\n"
3374 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3375 "\t" " or $a3, $a0, $a1" "\n"
3376 "\t" " andi $a3, $a3, 0x3" "\n"
3377 "\t" " bnez $a3, .Loptimized_memcpy_3" "\n"
3379 "\t" " srl $a3, $a2, 2" "\n"
3380 "\t" " addiu $at, $zero, 0xC" "\n"
3381 "\t" " div $zero, $a3, $at" "\n"
3382 "\t" " mflo $a3" "\n"
3383 "\t" " mfhi $v1" "\n"
3384 "\t" " beqz $v1, .Loptimized_memcpy_2" "\n"
3386 "\t" ".Loptimized_memcpy_1:" "\n"
3387 "\t" " lw $v0, 0x0($a1)" "\n"
3388 "\t" " addiu $v1, $v1, -0x1" "\n"
3389 "\t" " sw $v0, 0x0($a0)" "\n"
3390 "\t" " addiu $a1, $a1, 0x4" "\n"
3391 "\t" " bnez $v1, .Loptimized_memcpy_1" "\n"
3392 "\t" " addiu $a0, $a0, 0x4" "\n"
3393 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3395 "\t" ".Loptimized_memcpy_2:" "\n"
3396 "\t" " lw $v0, 0x0($a1)" "\n"
3397 "\t" " lw $v1, 0x4($a1)" "\n"
3398 "\t" " lw $t0, 0x8($a1)" "\n"
3399 "\t" " lw $t1, 0xC($a1)" "\n"
3400 "\t" " lw $t2, 0x10($a1)" "\n"
3401 "\t" " lw $t3, 0x14($a1)" "\n"
3402 "\t" " lw $t4, 0x18($a1)" "\n"
3403 "\t" " lw $t5, 0x1C($a1)" "\n"
3404 "\t" " lw $t6, 0x20($a1)" "\n"
3405 "\t" " lw $t7, 0x24($a1)" "\n"
3406 "\t" " lw $t8, 0x28($a1)" "\n"
3407 "\t" " lw $t9, 0x2C($a1)" "\n"
3408 "\t" " addiu $a3, $a3, -0x1" "\n"
3409 "\t" " sw $v0, 0x0($a0)" "\n"
3410 "\t" " sw $v1, 0x4($a0)" "\n"
3411 "\t" " sw $t0, 0x8($a0)" "\n"
3412 "\t" " sw $t1, 0xC($a0)" "\n"
3413 "\t" " sw $t2, 0x10($a0)" "\n"
3414 "\t" " sw $t3, 0x14($a0)" "\n"
3415 "\t" " sw $t4, 0x18($a0)" "\n"
3416 "\t" " sw $t5, 0x1C($a0)" "\n"
3417 "\t" " sw $t6, 0x20($a0)" "\n"
3418 "\t" " sw $t7, 0x24($a0)" "\n"
3419 "\t" " sw $t8, 0x28($a0)" "\n"
3420 "\t" " sw $t9, 0x2C($a0)" "\n"
3421 "\t" " addiu $a1, $a1, 0x30" "\n"
3422 "\t" " bnez $a3, .Loptimized_memcpy_2" "\n"
3423 "\t" " addiu $a0, $a0, 0x30" "\n"
3424 "\t" " j .Loptimized_memcpy_12" "\n"
3426 "\t" ".Loptimized_memcpy_3:" "\n"
3427 "\t" " andi $a3, $a0, 0x3" "\n"
3428 "\t" " beqz $a3, .Loptimized_memcpy_6" "\n"
3429 "\t" " andi $a3, $a1, 0x3" "\n"
3430 "\t" " beqz $a3, .Loptimized_memcpy_6" "\n"
3432 "\t" " srl $a3, $a2, 2" "\n"
3433 "\t" " addiu $at, $zero, 0xC" "\n"
3434 "\t" " div $zero, $a3, $at" "\n"
3435 "\t" " mflo $a3" "\n"
3436 "\t" " mfhi $v1" "\n"
3437 "\t" " beqz $v1, .Loptimized_memcpy_5" "\n"
3439 "\t" ".Loptimized_memcpy_4:" "\n"
3440 "\t" " lwl $v0, 0x3($a1)" "\n"
3441 "\t" " lwr $v0, 0x0($a1)" "\n"
3442 "\t" " addiu $v1, $v1, -0x1" "\n"
3443 "\t" " swl $v0, 0x3($a0)" "\n"
3444 "\t" " swr $v0, 0x0($a0)" "\n"
3445 "\t" " addiu $a1, $a1, 0x4" "\n"
3446 "\t" " bnez $v1, .Loptimized_memcpy_4" "\n"
3447 "\t" " addiu $a0, $a0, 0x4" "\n"
3448 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3450 "\t" ".Loptimized_memcpy_5:" "\n"
3451 "\t" " lwl $v0, 0x3($a1)" "\n"
3452 "\t" " lwr $v0, 0x0($a1)" "\n"
3453 "\t" " lwl $v1, 0x7($a1)" "\n"
3454 "\t" " lwr $v1, 0x4($a1)" "\n"
3455 "\t" " lwl $t0, 0xB($a1)" "\n"
3456 "\t" " lwr $t0, 0x8($a1)" "\n"
3457 "\t" " lwl $t1, 0xF($a1)" "\n"
3458 "\t" " lwr $t1, 0xC($a1)" "\n"
3459 "\t" " lwl $t2, 0x13($a1)" "\n"
3460 "\t" " lwr $t2, 0x10($a1)" "\n"
3461 "\t" " lwl $t3, 0x17($a1)" "\n"
3462 "\t" " lwr $t3, 0x14($a1)" "\n"
3463 "\t" " lwl $t4, 0x1B($a1)" "\n"
3464 "\t" " lwr $t4, 0x18($a1)" "\n"
3465 "\t" " lwl $t5, 0x1F($a1)" "\n"
3466 "\t" " lwr $t5, 0x1C($a1)" "\n"
3467 "\t" " lwl $t6, 0x23($a1)" "\n"
3468 "\t" " lwr $t6, 0x20($a1)" "\n"
3469 "\t" " lwl $t7, 0x27($a1)" "\n"
3470 "\t" " lwr $t7, 0x24($a1)" "\n"
3471 "\t" " lwl $t8, 0x2B($a1)" "\n"
3472 "\t" " lwr $t8, 0x28($a1)" "\n"
3473 "\t" " lwl $t9, 0x2F($a1)" "\n"
3474 "\t" " lwr $t9, 0x2C($a1)" "\n"
3475 "\t" " addiu $a3, $a3, -0x1" "\n"
3476 "\t" " swl $v0, 0x3($a0)" "\n"
3477 "\t" " swr $v0, 0x0($a0)" "\n"
3478 "\t" " swl $v1, 0x7($a0)" "\n"
3479 "\t" " swr $v1, 0x4($a0)" "\n"
3480 "\t" " swl $t0, 0xB($a0)" "\n"
3481 "\t" " swr $t0, 0x8($a0)" "\n"
3482 "\t" " swl $t1, 0xF($a0)" "\n"
3483 "\t" " swr $t1, 0xC($a0)" "\n"
3484 "\t" " swl $t2, 0x13($a0)" "\n"
3485 "\t" " swr $t2, 0x10($a0)" "\n"
3486 "\t" " swl $t3, 0x17($a0)" "\n"
3487 "\t" " swr $t3, 0x14($a0)" "\n"
3488 "\t" " swl $t4, 0x1B($a0)" "\n"
3489 "\t" " swr $t4, 0x18($a0)" "\n"
3490 "\t" " swl $t5, 0x1F($a0)" "\n"
3491 "\t" " swr $t5, 0x1C($a0)" "\n"
3492 "\t" " swl $t6, 0x23($a0)" "\n"
3493 "\t" " swr $t6, 0x20($a0)" "\n"
3494 "\t" " swl $t7, 0x27($a0)" "\n"
3495 "\t" " swr $t7, 0x24($a0)" "\n"
3496 "\t" " swl $t8, 0x2B($a0)" "\n"
3497 "\t" " swr $t8, 0x28($a0)" "\n"
3498 "\t" " swl $t9, 0x2F($a0)" "\n"
3499 "\t" " swr $t9, 0x2C($a0)" "\n"
3500 "\t" " addiu $a1, $a1, 0x30" "\n"
3501 "\t" " bnez $a3, .Loptimized_memcpy_5" "\n"
3502 "\t" " addiu $a0, $a0, 0x30" "\n"
3503 "\t" " j .Loptimized_memcpy_12" "\n"
3505 "\t" ".Loptimized_memcpy_6:" "\n"
3506 "\t" " andi $a3, $a0, 0x3" "\n"
3507 "\t" " beqz $a3, .Loptimized_memcpy_9" "\n"
3509 "\t" " srl $a3, $a2, 2" "\n"
3510 "\t" " addiu $at, $zero, 0xC" "\n"
3511 "\t" " div $zero, $a3, $at" "\n"
3512 "\t" " mflo $a3" "\n"
3513 "\t" " mfhi $v1" "\n"
3514 "\t" " beqz $v1, .Loptimized_memcpy_8" "\n"
3516 "\t" ".Loptimized_memcpy_7:" "\n"
3517 "\t" " lw $v0, 0x0($a1)" "\n"
3518 "\t" " addiu $v1, $v1, -0x1" "\n"
3519 "\t" " swl $v0, 0x3($a0)" "\n"
3520 "\t" " swr $v0, 0x0($a0)" "\n"
3521 "\t" " addiu $a1, $a1, 0x4" "\n"
3522 "\t" " bnez $v1, .Loptimized_memcpy_7" "\n"
3523 "\t" " addiu $a0, $a0, 0x4" "\n"
3524 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3526 "\t" ".Loptimized_memcpy_8:" "\n"
3527 "\t" " lw $v0, 0x0($a1)" "\n"
3528 "\t" " lw $v1, 0x4($a1)" "\n"
3529 "\t" " lw $t0, 0x8($a1)" "\n"
3530 "\t" " lw $t1, 0xC($a1)" "\n"
3531 "\t" " lw $t2, 0x10($a1)" "\n"
3532 "\t" " lw $t3, 0x14($a1)" "\n"
3533 "\t" " lw $t4, 0x18($a1)" "\n"
3534 "\t" " lw $t5, 0x1C($a1)" "\n"
3535 "\t" " lw $t6, 0x20($a1)" "\n"
3536 "\t" " lw $t7, 0x24($a1)" "\n"
3537 "\t" " lw $t8, 0x28($a1)" "\n"
3538 "\t" " lw $t9, 0x2C($a1)" "\n"
3539 "\t" " addiu $a3, $a3, -0x1" "\n"
3540 "\t" " swl $v0, 0x3($a0)" "\n"
3541 "\t" " swr $v0, 0x0($a0)" "\n"
3542 "\t" " swl $v1, 0x7($a0)" "\n"
3543 "\t" " swr $v1, 0x4($a0)" "\n"
3544 "\t" " swl $t0, 0xB($a0)" "\n"
3545 "\t" " swr $t0, 0x8($a0)" "\n"
3546 "\t" " swl $t1, 0xF($a0)" "\n"
3547 "\t" " swr $t1, 0xC($a0)" "\n"
3548 "\t" " swl $t2, 0x13($a0)" "\n"
3549 "\t" " swr $t2, 0x10($a0)" "\n"
3550 "\t" " swl $t3, 0x17($a0)" "\n"
3551 "\t" " swr $t3, 0x14($a0)" "\n"
3552 "\t" " swl $t4, 0x1B($a0)" "\n"
3553 "\t" " swr $t4, 0x18($a0)" "\n"
3554 "\t" " swl $t5, 0x1F($a0)" "\n"
3555 "\t" " swr $t5, 0x1C($a0)" "\n"
3556 "\t" " swl $t6, 0x23($a0)" "\n"
3557 "\t" " swr $t6, 0x20($a0)" "\n"
3558 "\t" " swl $t7, 0x27($a0)" "\n"
3559 "\t" " swr $t7, 0x24($a0)" "\n"
3560 "\t" " swl $t8, 0x2B($a0)" "\n"
3561 "\t" " swr $t8, 0x28($a0)" "\n"
3562 "\t" " swl $t9, 0x2F($a0)" "\n"
3563 "\t" " swr $t9, 0x2C($a0)" "\n"
3564 "\t" " addiu $a1, $a1, 0x30" "\n"
3565 "\t" " bnez $a3, .Loptimized_memcpy_8" "\n"
3566 "\t" " addiu $a0, $a0, 0x30" "\n"
3567 "\t" " j .Loptimized_memcpy_12" "\n"
3569 "\t" ".Loptimized_memcpy_9:" "\n"
3570 "\t" " srl $a3, $a2, 2" "\n"
3571 "\t" " addiu $at, $zero, 0xC" "\n"
3572 "\t" " div $zero, $a3, $at" "\n"
3573 "\t" " mflo $a3" "\n"
3574 "\t" " mfhi $v1" "\n"
3575 "\t" " beqz $v1, .Loptimized_memcpy_11" "\n"
3577 "\t" ".Loptimized_memcpy_10:" "\n"
3578 "\t" " lwl $v0, 0x3($a1)" "\n"
3579 "\t" " lwr $v0, 0x0($a1)" "\n"
3580 "\t" " addiu $v1, $v1, -0x1" "\n"
3581 "\t" " sw $v0, 0x0($a0)" "\n"
3582 "\t" " addiu $a1, $a1, 0x4" "\n"
3583 "\t" " bnez $v1, .Loptimized_memcpy_10" "\n"
3584 "\t" " addiu $a0, $a0, 0x4" "\n"
3585 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3587 "\t" ".Loptimized_memcpy_11:" "\n"
3588 "\t" " lwl $v0, 0x3($a1)" "\n"
3589 "\t" " lwr $v0, 0x0($a1)" "\n"
3590 "\t" " lwl $v1, 0x7($a1)" "\n"
3591 "\t" " lwr $v1, 0x4($a1)" "\n"
3592 "\t" " lwl $t0, 0xB($a1)" "\n"
3593 "\t" " lwr $t0, 0x8($a1)" "\n"
3594 "\t" " lwl $t1, 0xF($a1)" "\n"
3595 "\t" " lwr $t1, 0xC($a1)" "\n"
3596 "\t" " lwl $t2, 0x13($a1)" "\n"
3597 "\t" " lwr $t2, 0x10($a1)" "\n"
3598 "\t" " lwl $t3, 0x17($a1)" "\n"
3599 "\t" " lwr $t3, 0x14($a1)" "\n"
3600 "\t" " lwl $t4, 0x1B($a1)" "\n"
3601 "\t" " lwr $t4, 0x18($a1)" "\n"
3602 "\t" " lwl $t5, 0x1F($a1)" "\n"
3603 "\t" " lwr $t5, 0x1C($a1)" "\n"
3604 "\t" " lwl $t6, 0x23($a1)" "\n"
3605 "\t" " lwr $t6, 0x20($a1)" "\n"
3606 "\t" " lwl $t7, 0x27($a1)" "\n"
3607 "\t" " lwr $t7, 0x24($a1)" "\n"
3608 "\t" " lwl $t8, 0x2B($a1)" "\n"
3609 "\t" " lwr $t8, 0x28($a1)" "\n"
3610 "\t" " lwl $t9, 0x2F($a1)" "\n"
3611 "\t" " lwr $t9, 0x2C($a1)" "\n"
3612 "\t" " addiu $a3, $a3, -0x1" "\n"
3613 "\t" " sw $v0, 0x0($a0)" "\n"
3614 "\t" " sw $v1, 0x4($a0)" "\n"
3615 "\t" " sw $t0, 0x8($a0)" "\n"
3616 "\t" " sw $t1, 0xC($a0)" "\n"
3617 "\t" " sw $t2, 0x10($a0)" "\n"
3618 "\t" " sw $t3, 0x14($a0)" "\n"
3619 "\t" " sw $t4, 0x18($a0)" "\n"
3620 "\t" " sw $t5, 0x1C($a0)" "\n"
3621 "\t" " sw $t6, 0x20($a0)" "\n"
3622 "\t" " sw $t7, 0x24($a0)" "\n"
3623 "\t" " sw $t8, 0x28($a0)" "\n"
3624 "\t" " sw $t9, 0x2C($a0)" "\n"
3625 "\t" " addiu $a1, $a1, 0x30" "\n"
3626 "\t" " bnez $a3, .Loptimized_memcpy_11" "\n"
3627 "\t" " addiu $a0, $a0, 0x30" "\n"
3628 "\t" ".Loptimized_memcpy_12:" "\n"
3629 "\t" " andi $v1, $a2, 0x3" "\n"
3630 "\t" " beqz $v1, .Loptimized_memcpy_14" "\n"
3632 "\t" ".Loptimized_memcpy_13:" "\n"
3633 "\t" " lb $v0, 0x0($a1)" "\n"
3634 "\t" " addiu $v1, $v1, -0x1" "\n"
3635 "\t" " sb $v0, 0x0($a0)" "\n"
3636 "\t" " addiu $a1, $a1, 0x1" "\n"
3637 "\t" " bnez $v1, .Loptimized_memcpy_13" "\n"
3638 "\t" " addiu $a0, $a0, 0x1" "\n"
3639 "\t" ".Loptimized_memcpy_14:" "\n"
3640 "\t" " addu $v0, $a2, $zero" "\n"
3643 "\t" ".set pop" "\n"
int sceCdRV(u32 lsn, u32 sectors, void *buf, sceCdRMode *mode, int arg5, void *cb)
int sceCdReadDiskID(unsigned int *id)
int CpuResumeIntr(int state)
int QueryIntrContext(void)
int DisableIntr(int irq, int *res)
int CpuSuspendIntr(int *state)
int sceCdReadModelID(unsigned int *id)
int sceCdSearchFile(sceCdlFILE *file, const char *name)
int sceCdXLEDCtl(u8 arg1, u8 arg2, u32 *result1, u32 *result2)
int sceCdRcBypassCtl(int mode, u32 *status)
int sceCdCancelPOffRdy(u32 *result)
int sceCdReadRegionParams(u32 *arg1, u32 *result)
int sceCdPowerOff(u32 *result)
int sceRemote2_7(u16 param, u32 *status)
int sceCdSetFanProfile(u8 param, u32 *result)
int sceCdDoesUniqueKeyExist(u32 *status)
int sceCdGetMediumRemoval(u32 *result1, u32 *result2)
int sceCdReadSUBQ(void *buffer, u32 *status)
int sceCdSetHDMode(u32 mode)
int sceCdReadKey(unsigned char arg1, unsigned char arg2, unsigned int command, unsigned char *key)
int sceCdReadNVM(u32 address, u16 *data, u8 *result)
int sceCdReadPS1BootParam(u8 *out, u32 *result)
int sceCdXDVRPReset(u8 arg1, u32 *result)
int sceCdSetMediumRemoval(u8 arg1, u32 *result)
int sceCdSendSCmd1D(int *arg1, unsigned int *arg2, unsigned int *arg3, u32 *status)
int sceCdReadDvdDualInfo(int *on_dual, unsigned int *layer1_start)
int sceCdCloseConfig(u32 *result)
int sceCdReadGUID(u64 *guid)
int sceCdChangeThreadPriority(int priority)
int sceCdDiskReady(int mode)
int sceCdForbidRead(u32 *result)
int sceCdRM(char *buffer, u32 *status)
u32 sceCdPosToInt(sceCdlLOCCD *p)
int sceCdReadConsoleID(u8 *buffer, u32 *result)
int sceCdLayerSearchFile(sceCdlFILE *fp, const char *path, int layer)
int sceCdReadClock(sceCdCLOCK *clock)
int sceCdWriteConfig(const void *buffer, u32 *result)
int sceCdWM(const char *buffer, u32 *status)
int sceCdWriteConsoleID(const u8 *buffer, u32 *status)
u32 sceCdGetReadPos(void)
int sceCdGetDiskType(void)
int sceCdGetWakeUpReason(void)
int sceCdMmode(int media)
int sceCdWI(const u8 *buffer, u32 *result)
int sceCdAutoAdjustCtrl(int mode, u32 *result)
int sceCdApplySCmd(u8 cmdNum, const void *inBuff, u16 inBuffSize, void *outBuff)
int sceCdXBSPowerCtl(u8 arg1, u8 arg2, u32 *result1, u32 *result2)
int sceRemote2_7Get(u32 *param, u32 *status)
int sceCdSetTimeout(int param, int timeout)
int sceCdBootCertify(const u8 *romname)
int sceCdChgSys(u32 arg1)
int sceCdReadConfig(void *buffer, u32 *result)
int sceCdMV(u8 *buffer, u32 *status)
int sceCdWriteNVM(u32 address, u16 data, u8 *result)
int sceCdReadFull(unsigned int lsn, unsigned int sectors, void *buf, sceCdRMode *mode)
int sceCdDecSet(unsigned char enable_xor, unsigned char enable_shift, unsigned char shiftval)
int sceCdBuzzerCtl(u32 *result)
int sceCdRI(u8 *buffer, u32 *result)
int sceCdNoticeGameStart(u8 arg1, u32 *result)
int sceCdReadWakeUpTime(sceCdCLOCK *clock, u16 *userdata, u32 *wakeupreason, int *flags)
int sceCdForbidDVDP(u32 *result)
int sceCdApplyNCmd(u8 cmdNum, const void *inBuff, u16 inBuffSize)
int sceCdWriteWakeUpTime(const sceCdCLOCK *clock, u16 userdata, int flags)
int sceCdRE(unsigned int lsn, unsigned int sectors, void *buf, sceCdRMode *mode)
int sceCdOpenConfig(int block, int mode, int NumBlocks, u32 *status)
int sceCdTrayReq(int param, u32 *traychk)
int sceCdSetLEDsMode(u32 param, u32 *result)
int sceCdWriteClock(sceCdCLOCK *clock)
int sceCdWriteRegionParams(u8 arg1, u32 *arg2, u8 *arg3, u32 *result)
int sceCdBlueLEDCtl(u8 control, u32 *result)
int sceCdCtrlADout(int mode, u32 *status)