11#include "irx_imports.h"
17IRX_ID(
"cdvd_ee_driver", 2, 38);
22static int cdvdfsv_init();
23static void cdvdfsv_main_th(
void *arg);
24int *cdvdfsv_dummyentry(
int arg1);
25static void cdvdfsv_parseargs(
int ac,
char **av);
26static void cdvdfsv_poffloop();
27static void cdvdfsv_rpc1_th(
void *arg);
28static void cdvdfsv_rpc3_th(
void *arg);
29static void cdvdfsv_rpc2_th(
void *arg);
30unsigned int optimized_memcpy(
char *dst,
const char *src,
unsigned int n);
32static int g_cdvdfsv_def_pri = 81;
33static int g_verbose_level = 0;
34static int g_cdvdfsv_spinctl = -1;
35static int g_cdvdfsv_plbreak = 0;
36static int g_cdvdfsv_nopocm = 0;
37static int g_cdvdfsv_rpc5flg = 0;
38static int g_cdvdfsv_rpc3flg = 0;
40static iop_library_t g_modload_libinfo = { NULL, NULL, 256, 0,
"modload", { NULL } };
42static int g_cdvdfsv_r2retry = 0;
43static int g_cdvdfsv_r2count = 0;
44static int g_cdvdfsv_sid_err_recover_cnt = 0;
45static int g_cdvdfsv_err_count = 0;
46static void *g_cdvdfsv_fsvrbuf;
47static char *g_cdvdfsv_rtocbuf;
60static int g_cdvdman_intr_efid;
61static int g_scmd_evid;
62static int g_cdvdfsv_thids[4];
76static int g_cdvdfsv_readpos;
77static int g_cdvdfsv_rderror;
81static int g_rpc_buffer3[260];
82static int g_rpc_buffer5[256];
83static int g_rpc_buffer1[4];
84static int g_rpc_buffer4[76];
85static int g_rpc_buffer2[4];
87static int cdvdfsv_checkdmastat(
int trid)
93 return sceSifDmaStat(trid);
95 retval = sceSifDmaStat(trid);
100static int cdvdfsv_cleanuprpc()
104 sceSifRemoveRpc(&g_rpc_sdata1, &g_rpc_qdata1);
105 sceSifRemoveRpc(&g_rpc_sdata2, &g_rpc_qdata1);
106 sceSifRemoveRpc(&g_rpc_sdata3, &g_rpc_qdata1);
107 sceSifRemoveRpc(&g_rpc_sdata6, &g_rpc_qdata3);
108 sceSifRemoveRpc(&g_rpc_sdata4, &g_rpc_qdata2);
109 sceSifRemoveRpc(&g_rpc_sdata5, &g_rpc_qdata2);
110 sceSifRemoveRpcQueue(&g_rpc_qdata1);
111 sceSifRemoveRpcQueue(&g_rpc_qdata2);
112 sceSifRemoveRpcQueue(&g_rpc_qdata3);
113 g_cdvdfsv_nopocm = 1;
114 g_cdvdfsv_plbreak = 1;
115 for ( i = 0; i < (
sizeof(g_cdvdfsv_thids) /
sizeof(g_cdvdfsv_thids[0])); i += 1 )
117 TerminateThread(g_cdvdfsv_thids[i]);
118 DeleteThread(g_cdvdfsv_thids[i]);
123int _start(
int ac,
char *av[],
void *startaddr,
ModuleInfo_t *mi)
126 const u16 *LibraryEntryTable;
137 if ( g_cdvdfsv_rpc5flg || g_cdvdfsv_rpc3flg || !cdvdfsv_cleanuprpc() )
139 return MODULE_REMOVABLE_END;
142 error_code = ReleaseLibraryEntries(&_exp_cdvdfsv);
144 if ( error_code && error_code != KE_LIBRARY_NOTFOUND )
146 KPRINTF(
"ReleaseLibraryEntries Error code %d\n", error_code);
147 return MODULE_REMOVABLE_END;
149 return MODULE_NO_RESIDENT_END;
151 if ( RegisterLibraryEntries(&_exp_cdvdfsv) )
153 return MODULE_NO_RESIDENT_END;
155 g_cdvdfsv_fsvrbuf = sceGetFsvRbuf();
157 g_cdvdfsv_rtocbuf = (
char *)g_cdvdfsv_fsvrbuf;
158 cdvdfsv_parseargs(ac, av);
162 LibraryEntryTable = (u16 *)QueryLibraryEntryTable(&g_modload_libinfo);
164 if ( !LibraryEntryTable || (*(LibraryEntryTable - 6) < 0x104) )
166 KPRINTF(
"Warning cdvdfsv.irx: Unload function can't be used.\n");
167 return MODULE_RESIDENT_END;
169 return MODULE_REMOVABLE_END;
171 if ( mi && ((mi->
newflags & 2) != 0) )
173 return MODULE_RESIDENT_END;
177static int cdvdfsv_init()
183 BootMode = QueryBootMode(3);
184 if ( BootMode && (BootMode[1] & 2) )
186 PRINTF(
" No cdvd driver \n");
189 sceCdSC(0xFFFFFFF2, (
int *)&g_cdvdman_istruct_ptr);
190 g_scmd_evid = sceCdSC(0xFFFFFFE7, &scres);
192 thparam.thread = cdvdfsv_main_th;
193 thparam.stacksize = 0x800;
195 thparam.priority = g_cdvdfsv_def_pri - 1;
196 g_cdvdfsv_thids[0] = CreateThread(&thparam);
197 if ( g_cdvdfsv_thids[0] <= 0 )
201 StartThread(g_cdvdfsv_thids[0], 0);
205static void cdvdfsv_main_th(
void *arg)
212 if ( !sceSifCheckInit() )
215 PRINTF(
"cdvd driver module version 0.1.1 (C)SCEI\n");
216 thparam2.thread = cdvdfsv_rpc1_th;
217 thparam2.attr = TH_C;
218 thparam2.stacksize = 0x1900;
220 thparam2.priority = g_cdvdfsv_def_pri;
221 g_cdvdfsv_thids[1] = CreateThread(&thparam2);
222 StartThread(g_cdvdfsv_thids[1], 0);
223 thparam1.attr = TH_C;
224 thparam1.thread = cdvdfsv_rpc2_th;
225 thparam1.stacksize = 0x1900;
227 thparam1.priority = g_cdvdfsv_def_pri;
228 g_cdvdfsv_thids[2] = CreateThread(&thparam1);
229 StartThread(g_cdvdfsv_thids[2], 0);
230 thparam1.thread = cdvdfsv_rpc3_th;
231 thparam1.attr = TH_C;
232 thparam1.stacksize = 0x800;
234 thparam1.priority = g_cdvdfsv_def_pri;
235 g_cdvdfsv_thids[3] = CreateThread(&thparam1);
236 StartThread(g_cdvdfsv_thids[3], 0);
241int *cdvdfsv_dummyentry(
int arg1)
243 VERBOSE_PRINTF(1,
"Dummy Entry Called\n");
246 return &g_verbose_level;
249static void cdvdfsv_parseargs(
int ac,
char **av)
253 g_cdvdfsv_def_pri = 81;
254 for ( i = 1; i < ac; i += 1 )
256 if ( !strncmp(av[i],
"thpri=", 6) )
258 g_cdvdfsv_def_pri = strtol(av[i] + 6, 0, 10);
259 if ( (
unsigned int)(g_cdvdfsv_def_pri - 9) >= 0x73 )
261 PRINTF(
"Cdvdfsv:thpri=%d Illegal priority\n", g_cdvdfsv_def_pri);
262 g_cdvdfsv_def_pri = 81;
264 if ( g_cdvdfsv_def_pri == 9 )
265 g_cdvdfsv_def_pri = 10;
274 if ( (
unsigned int)(priority - 9) >= 0x73 )
278 ReferThreadStatus(0, &thinfo);
279 ChangeThreadPriority(0, 8);
280 ChangeThreadPriority(g_cdvdfsv_thids[0], priority - 1);
281 ChangeThreadPriority(g_cdvdfsv_thids[2], priority);
282 ChangeThreadPriority(g_cdvdfsv_thids[1], priority);
283 ChangeThreadPriority(g_cdvdfsv_thids[3], priority);
287static void *cbrpc_rpc1_cdinit(
int fno,
void *buffer,
int length)
294 VERBOSE_PRINTF(1,
"sceCdInit call\n");
296 g_cdvdfsv_spinctl = -1;
297 g_cdvdfsv_initres.m_debug_mode = g_verbose_level ? 254 : 0;
298 g_cdvdfsv_initres.m_cdvdfsv_ver = (u16)_irx_id.v;
299 g_cdvdfsv_initres.m_cdvdman_ver = sceCdSC(0xFFFFFFF7, &scres_unused);
300 VERBOSE_PRINTF(1,
"sceCdInit end\n");
301 g_cdvdfsv_initres.m_retres = 1;
302 return (
void *)&g_cdvdfsv_initres;
310 VERBOSE_PRINTF(1,
"sceCdAbort call\n");
312 outbuf->m_retres = 1;
315static void *cbrpc_rpc4_fscall(
int fno,
void *buffer,
int length)
325 sceCdSC(0xFFFFFFF6, &scres);
326 VERBOSE_PRINTF(1,
"search file name %s call struct_siz %d\n", inbuf->m_pkt_sz12c.m_path, length);
329 case sizeof(inbuf->m_pkt_sz12c):
330 g_cdvdfsv_srchres.m_retres =
331 sceCdLayerSearchFile(&(inbuf->m_pkt_sz12c.m_fp), inbuf->m_pkt_sz12c.m_path, inbuf->m_pkt_sz12c.m_layer);
332 g_cdvdfsv_fssdd.src = buffer;
333 g_cdvdfsv_fssdd.dest = (
void *)inbuf->m_pkt_sz12c.m_eedest;
334 g_cdvdfsv_fssdd.size =
sizeof(
sceCdlFILE) + 4;
336 case sizeof(inbuf->m_pkt_sz128):
337 PRINTF(
"sceCdSearchFile: Called from Not_Dual_layer Version.\n");
338 g_cdvdfsv_srchres.m_retres =
sceCdSearchFile(&(inbuf->m_pkt_sz128.m_fp), inbuf->m_pkt_sz128.m_path);
339 g_cdvdfsv_fssdd.src = buffer;
340 g_cdvdfsv_fssdd.dest = (
void *)inbuf->m_pkt_sz128.m_eedest;
341 g_cdvdfsv_fssdd.size =
sizeof(
sceCdlFILE) + 4;
344 PRINTF(
"Warning sceCdSearchFile: Called from Old liblary.\n");
345 g_cdvdfsv_srchres.m_retres =
sceCdSearchFile(&(inbuf->m_pkt_sz124.m_fp), inbuf->m_pkt_sz124.m_path);
346 g_cdvdfsv_fssdd.src = buffer;
347 g_cdvdfsv_fssdd.dest = (
void *)inbuf->m_pkt_sz124.m_eedest;
351 g_cdvdfsv_fssdd.attr = 0;
357 trid = sceSifSetDma(&g_cdvdfsv_fssdd, 1);
364 sceCdSC(0xFFFFFFF6, &scres);
365 return (
void *)&g_cdvdfsv_srchres;
372 read_timeout = sys_clock->lo / 0x9000;
373 KPRINTF(
"Read Time Out %d(msec)\n", read_timeout);
374 sceCdSC(0xFFFFFFEE, &read_timeout);
390 g_cdvdfsv_read_timeout.hi = 0;
391 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
392 g_cdvdfsv_iomrsdd.src = &g_cdvdfsv_readpos;
393 g_cdvdfsv_iomrsdd.size =
sizeof(g_cdvdfsv_readpos);
394 g_cdvdfsv_iomrsdd.attr = 0;
395 g_cdvdfsv_iomrsdd.dest = (
void *)inbuf->m_pkt_0D.m_eedest;
398 "sceCdReadIOPm addr= 0x%08x sector= %d\n",
399 (
unsigned int)(uiptr)(inbuf->m_pkt_0D.m_buf),
400 (
int)(inbuf->m_pkt_0D.m_sectors));
402 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);
409 trid = sceSifSetDma(&g_cdvdfsv_iomrsdd, 1);
416 while ( cdvdfsv_checkdmastat(trid) >= 0 )
420 if ( error_code || !cmd_error )
423 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
424 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
428static u8 cdvdfsv_syncdec(
int flag,
int xorkey,
int arg2, u8 data)
430 return flag ? (((data << (arg2 % 8)) | (data >> (8 - arg2 % 8))) ^ xorkey) : data;
433static int cdvdfsv_cb_read()
435 iSetEventFlag(g_cdvdman_intr_efid, 0x20);
439static int cdvdfsv_checksid(u32 lsn, u32 sectors, u32 ps2dvd,
void *buf,
int decflag,
int decshift, u32 *syncdec_mask)
452 scret = decflag ? sceCdSC(0xFFFFFFE8, &scres) : 0;
454 for ( i = 0; i < sectors; i += 1 )
458 syncdec = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[3]);
459 syncdec += cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[2]) << 8;
460 syncdec += cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[1]) << 16;
461 syncdec_4 = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[0]);
462 if ( i && !*syncdec_mask )
464 ipi_emu = syncdec_4 & 0xC;
468 *syncdec_mask = syncdec_4 & 0xC;
470 readlsn = syncdec - 0x30000;
472 g_cdvdman_istruct_ptr->m_opo_or_para && (lsn + i) >= g_cdvdman_istruct_ptr->m_layer_1_lsn
473 && g_cdvdman_istruct_ptr->m_opo_or_para == 1 )
475 readlsn += g_cdvdman_istruct_ptr->m_layer_1_lsn;
480 rpos.
minute = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[0]);
481 rpos.
second = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[1]);
482 rpos.
sector = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[2]);
485 if ( readlsn != (lsn + i) || ipi_emu )
489 "Read_EE Sector_ID error lsn= %d readlsn= %d layer= %d layer1_start %d\n",
493 (
int)(g_cdvdman_istruct_ptr->m_layer_1_lsn));
500 1,
"Read_EE NO_Data_zone error lsn= %d layer= %d SecID %02x\n", (
int)lsn, (syncdec_4 & 1), (
int)(*syncdec_mask));
509 u32 sector_size_selection,
510 int do_multi_retries,
511 int enable_dec_shift,
535 int nsec_div_cdvdfsv_sectors;
541 sector_sizes[0] = 0x924;
542 sector_sizes[1] = 0x810;
543 g_cdvdfsv_read_timeout.hi = 0;
544 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
546 g_cdvdfsv_r2retry = 0;
547 g_cdvdfsv_r2count = 0;
548 if ( secsize != 0x924 && !fssift )
550 for ( i = 0; i < (
sizeof(g_cdvdfsv_multi_dmat) /
sizeof(g_cdvdfsv_multi_dmat[0])); i += 1 )
552 g_cdvdfsv_multi_dmat[i].attr = 0;
553 g_cdvdfsv_multi_dmat[i].size = secsize;
556 sector_size = sector_sizes[sector_size_selection];
561 csec = (nsec <= (
sizeof(g_cdvdfsv_multi_dmat) /
sizeof(g_cdvdfsv_multi_dmat[0]))) ?
563 (sizeof(g_cdvdfsv_multi_dmat) / sizeof(g_cdvdfsv_multi_dmat[0]));
564 nsec_div_cdvdfsv_sectors = (nsec >> 4) + (!!((nsec & 0xF)));
566 ee_addr_tmp = ee_addr;
567 dmasize_tmp = dmasize;
568 g_cdvdman_istruct_ptr->m_dec_mode_set = 1;
569 g_cdvdman_istruct_ptr->m_dec_mode_last_set = 0;
571 if ( enable_dec_shift )
573 g_cdvdman_istruct_ptr->m_dec_shift = dec_shift;
574 g_cdvdman_istruct_ptr->m_dec_state = 2;
576 if ( g_cdvdfsv_r2retry )
578 VERBOSE_KPRINTF(1,
"Rty_Read\n");
579 read_res_tmp = (sector_size_selection ?
sceCdRV : sceCdRead0)(
580 (lsn >= 0x60) ? (lsn - 0x10 * g_cdvdfsv_r2retry) : (lsn + 0x10 * g_cdvdfsv_r2retry + 0x60),
582 &g_cdvdfsv_rtocbuf[0x1248],
590 read_res_tmp = (sector_size_selection ?
sceCdRV : sceCdRead0)(
591 lsn, nsec, &g_cdvdfsv_rtocbuf[0x1248], mode, csec, cdvdfsv_cb_read);
595 SetAlarm(&g_cdvdfsv_read_timeout, (
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
603 g_cdvdman_istruct_ptr->m_dec_state = 0;
604 g_cdvdman_istruct_ptr->m_dec_mode_set = 0;
605 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
609 g_cdvdfsv_r2retry -= 1;
611 for ( i = 0; (int)i < nsec_div_cdvdfsv_sectors; i += 1 )
614 if ( g_cdvdman_istruct_ptr->m_dec_mode_last_set )
618 if ( cdvdfsv_checksid(
621 sector_size_selection,
622 &g_cdvdfsv_rtocbuf[0x1248],
627 if ( do_multi_retries && syncdec_mask && !i )
633 else if ( do_multi_retries )
638 if ( retry_flag1 || g_cdvdfsv_r2retry )
641 else if ( secsize == 0x924 && !sector_size_selection )
647 optimized_memcpy(&g_cdvdfsv_rtocbuf[secsize], &g_cdvdfsv_rtocbuf[fssift], secsize - fssift);
648 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[secsize + secsize * csec], secsize);
649 g_cdvdfsv_rdp2sdd.size =
650 ((int)i == nsec_div_cdvdfsv_sectors - 1) ? dmasize_tmp : (secsize * (csec - 1) + fssift);
652 &g_cdvdfsv_rtocbuf[secsize + secsize - fssift],
653 &g_cdvdfsv_rtocbuf[secsize * 2],
654 g_cdvdfsv_rdp2sdd.size);
658 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[secsize * 2 + secsize * (csec - 1)], secsize);
659 g_cdvdfsv_rdp2sdd.size = ((int)i == nsec_div_cdvdfsv_sectors - 1) ? dmasize_tmp : (secsize * (csec - 1));
661 &g_cdvdfsv_rtocbuf[secsize], &g_cdvdfsv_rtocbuf[secsize * 2 + fssift], g_cdvdfsv_rdp2sdd.size);
663 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[secsize];
667 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[secsize * 2];
668 g_cdvdfsv_rdp2sdd.size = secsize * csec;
670 g_cdvdfsv_rdp2sdd.attr = 0;
671 g_cdvdfsv_rdp2sdd.dest = ee_addr_tmp;
672 ee_addr_tmp += g_cdvdfsv_rdp2sdd.size;
673 dmasize_tmp -= g_cdvdfsv_rdp2sdd.size;
677 trid = sceSifSetDma(&g_cdvdfsv_rdp2sdd, 1);
683 while ( cdvdfsv_checkdmastat(trid) >= 0 )
688 for ( j = 0; j < csec; j += 1 )
690 g_cdvdfsv_multi_dmat[j].dest = &ee_addr[(csec_comm + j) * secsize];
691 g_cdvdfsv_multi_dmat[j].src = &g_cdvdfsv_rtocbuf[0x1248 + (j * sector_size) + 12];
696 trid = sceSifSetDma(g_cdvdfsv_multi_dmat, csec);
702 while ( cdvdfsv_checkdmastat(trid) >= 0 )
707 size_2 = ((int)i != nsec_div_cdvdfsv_sectors - 1) ? fssift : secsize;
708 g_cdvdfsv_rdp2sdd.size = dmasize_tmp;
711 optimized_memcpy(&g_cdvdfsv_rtocbuf[0x924], &g_cdvdfsv_rtocbuf[fssift + 12], secsize - fssift);
712 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[0x1248 + (csec - 1) * sector_size], sector_size);
713 for ( j = 0; j < csec - 1; j += 1 )
716 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + (j * secsize)],
717 &g_cdvdfsv_rtocbuf[0x1248 + 12 + (j * sector_size)],
721 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + ((csec - 1) * secsize)],
722 &g_cdvdfsv_rtocbuf[0x1248 + 12 + ((csec - 1) * sector_size)],
724 if ( (
int)i != nsec_div_cdvdfsv_sectors - 1 )
726 g_cdvdfsv_rdp2sdd.size = secsize * csec;
731 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[0x1248 + (csec - 1) * sector_size], sector_size);
732 optimized_memcpy(&g_cdvdfsv_rtocbuf[0x924], &g_cdvdfsv_rtocbuf[0x1248 + fssift + 12], secsize - fssift);
733 for ( j = 0; j < csec - 2; j += 1 )
736 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + (j * secsize)],
737 &g_cdvdfsv_rtocbuf[0x1248 + sector_size + 12 + (j * sector_size)],
741 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + ((csec - 2) * secsize)],
742 &g_cdvdfsv_rtocbuf[0x1248 + sector_size + 12 + ((csec - 2) * sector_size)],
744 if ( (
int)i != nsec_div_cdvdfsv_sectors - 1 )
746 g_cdvdfsv_rdp2sdd.size = secsize * (csec - 1);
749 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[0x924];
750 g_cdvdfsv_rdp2sdd.attr = 0;
751 g_cdvdfsv_rdp2sdd.dest = ee_addr_tmp;
752 ee_addr_tmp += g_cdvdfsv_rdp2sdd.size;
753 dmasize_tmp -= g_cdvdfsv_rdp2sdd.size;
757 trid = sceSifSetDma(&g_cdvdfsv_rdp2sdd, 1);
763 while ( cdvdfsv_checkdmastat(trid) >= 0 )
772 if ( (
int)i == nsec_div_cdvdfsv_sectors - 1 )
778 csec_comm = csec_comm + csec;
779 csec = ((
unsigned int)csec > nsec - (
unsigned int)csec_comm) ?
780 (nsec - (
unsigned int)csec_comm) :
781 (
sizeof(g_cdvdfsv_multi_dmat) /
sizeof(g_cdvdfsv_multi_dmat[0]));
782 ClearEventFlag(g_cdvdman_intr_efid, ~0x20);
783 dmac_ch_set_chcr(3, 0);
785 g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_maddress = &g_cdvdfsv_rtocbuf[0x1248];
786 dmac_ch_set_madr(3, (uiptr)(&g_cdvdfsv_rtocbuf[0x1248]));
789 g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_blkwords
790 | ((g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_blkcount * csec) << 16));
791 dmac_ch_set_chcr(3, 0x41000200);
792 chcr = dmac_ch_get_chcr(3);
795 g_cdvdfsv_readpos += secsize * csec;
796 sceSifSetDma(post_dmat, 1);
802 CancelAlarm((
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
803 g_cdvdman_istruct_ptr->m_dec_mode_set = 0;
804 g_cdvdman_istruct_ptr->m_dec_state = 0;
806 if ( (u16)g_cdvdman_istruct_ptr->m_dec_mode_last_set )
810 mode->spindlctrl = 16;
812 if ( error_code || g_cdvdfsv_r2count >= 5 )
816 if ( !error_code_tmp )
818 sceCdSC(0xFFFFFFFE, &error_code_tmp);
819 VERBOSE_KPRINTF(1,
"secid_chk_ee_trns lsn %d nsec %d IPI Err\n", lsn, nsec);
822 if ( !g_cdvdfsv_r2retry )
824 g_cdvdfsv_r2count += 1;
825 VERBOSE_PRINTF(1,
"Read_CD/DVD-ROM Error Recover Start\n");
826 g_cdvdfsv_r2retry = 3;
829 if ( g_cdvdfsv_r2count >= 5 && !error_code )
831 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
843 int dec_shift_enable,
852 g_cdvdfsv_read_timeout.hi = 0;
853 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
855 g_cdvdfsv_sid_err_recover_cnt = 0;
856 g_cdvdfsv_err_count = 0;
863 if ( dec_shift_enable )
865 g_cdvdman_istruct_ptr->m_dec_shift = dec_shift_value;
866 g_cdvdman_istruct_ptr->m_dec_state = 2;
868 cmd_error = (ps2dvd ?
sceCdRV : sceCdRead0)(
869 (lsn >= 0x30) ? (lsn - 0x10 * g_cdvdfsv_sid_err_recover_cnt) : (lsn + 0x10 * g_cdvdfsv_sid_err_recover_cnt),
877 SetAlarm(&g_cdvdfsv_read_timeout, (
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
879 CancelAlarm((
unsigned int (*)(
void *))read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
880 g_cdvdman_istruct_ptr->m_dec_state = 0;
882 if ( error_code || !cmd_error || g_cdvdfsv_err_count >= 5 )
884 VERBOSE_KPRINTF(1,
"Read error error code %x cmd error %d\n", error_code, cmd_error);
885 if ( (!cmd_error || g_cdvdfsv_err_count >= 5) && (!error_code) )
887 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
891 if ( cdvdfsv_checksid(lsn, nsec, ps2dvd, retptr, dec_shift_enable, dec_shift_value, &syncdec_mask) )
893 if ( enable_retries && syncdec_mask )
897 if ( !enable_retries )
899 if ( !g_cdvdfsv_sid_err_recover_cnt )
901 g_cdvdfsv_err_count += 1;
902 VERBOSE_PRINTF(1,
"Read_CD/DVD-ROM Sector_ID Error Recover Start\n");
903 g_cdvdfsv_sid_err_recover_cnt = 3;
905 g_cdvdfsv_sid_err_recover_cnt -= 1;
907 if ( !error_code_tmp )
909 sceCdSC(0xFFFFFFFE, &error_code_tmp);
910 VERBOSE_KPRINTF(1,
"secid_chk lsn %d nsec %d IPI Err\n", lsn, nsec);
914static void cdvdfsv_rpc5_01_readee(
917 unsigned int secsize;
919 unsigned int bsize_tmp;
929 unsigned int buf_offs_sum;
933 unsigned int len2_plus_sec2;
943 sector_sizes[0] = 0x924;
944 sector_sizes[1] = 0x810;
945 g_cdvdfsv_rmodeee = inbuf->m_pkt_01.m_rmodeee;
946 lsndualchg_res = inbuf->m_pkt_01.m_lbn;
947 decval = decflag ? inbuf->m_pkt_01.m_decval : 0;
948 g_cdvdfsv_eerpsdd.src = &g_cdvdfsv_readpos;
949 g_cdvdfsv_eerpsdd.size =
sizeof(g_cdvdfsv_readpos);
950 g_cdvdfsv_eerpsdd.attr = 0;
951 g_cdvdfsv_eerpsdd.dest = (
void *)inbuf->m_pkt_01.m_eedest;
954 if ( !sceCdSC(0xFFFFFFEA, &scres_unused) )
957 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
967 lsndualchg_res = sceCdSC(0xFFFFFFE9, &lsndualchg_res);
969 datapattern = SCECdSecS2048;
976 switch ( datapattern )
991 len2_plus_sec2 = lsndualchg_res + inbuf->m_pkt_01.m_sectors;
996 all_sec_bytes = secsize * inbuf->m_pkt_01.m_sectors;
997 if ( g_cdvdfsv_spinctl != -1 )
998 g_cdvdfsv_rmodeee.
spindlctrl = g_cdvdfsv_spinctl;
999 paddr = inbuf->m_pkt_01.m_paddr;
1000 saddr = (paddr + all_sec_bytes) & ~0x3F;
1001 psize = ((paddr & 0x3F)) ? ((paddr & ~0x3F) - (paddr - 0x40)) : 0;
1002 bsize = saddr - (paddr + psize);
1003 ssize = paddr + all_sec_bytes - saddr;
1004 VERBOSE_KPRINTF(1,
"CD/DVD-ROM lsn= %d sec= %d\n", lsndualchg_res, inbuf->m_pkt_01.m_sectors);
1005 VERBOSE_KPRINTF(1,
"f psize= %d bsize= %d ssize= %d\n", psize, bsize, ssize);
1011 sectors = (len2_plus_sec2 < lsndualchg_res + buf_offs_sum / secsize + 2) ? 1 : 2;
1014 "0 CD_READ LBN= %d sectors= %d all= %d\n",
1015 (
int)(lsndualchg_res + buf_offs_sum / secsize),
1017 (
int)inbuf->m_pkt_01.m_sectors);
1019 lsndualchg_res + buf_offs_sum / secsize,
1034 if ( datapattern != SCECdSecS2340 || ps2dvd )
1039 for ( i = 0; i < psize; i += 1 )
1041 rtoc_ind += (i && !(i % secsize)) ? (sector_sizes[ps2dvd] - secsize) : 0;
1042 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[rtoc_ind + i];
1047 for ( i = 0; i < psize; i += 1 )
1048 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[i];
1050 buf_offs_sum += psize;
1054 for ( i = 0; i < bsize; i += sizestuff )
1056 u32 offs_sector_only;
1058 bsize_tmp = bsize - i;
1059 if ( g_cdvdfsv_spinctl != -1 )
1060 g_cdvdfsv_rmodeee.
spindlctrl = g_cdvdfsv_spinctl;
1061 offs_sector_only = lsndualchg_res + buf_offs_sum / secsize;
1062 if ( (
unsigned int)(secsize << 6) >= bsize_tmp )
1064 needed_offset = (bsize_tmp / secsize) + (!!(bsize_tmp % secsize));
1065 sizestuff = bsize_tmp;
1069 needed_offset = (((offs_sector_only & 0xF)) && (!(secsize & 0xF))) ? (0x10 - (offs_sector_only & 0xF)) : 0x40;
1070 sizestuff = secsize * needed_offset;
1072 needed_offset += !!((buf_offs_sum + i) % secsize);
1073 if ( len2_plus_sec2 < offs_sector_only + needed_offset )
1074 needed_offset = len2_plus_sec2 - (lsndualchg_res + (buf_offs_sum + i) / secsize);
1075 g_cdvdfsv_readpos = buf_offs_sum + i;
1084 (
char *)(inbuf->m_pkt_01.m_paddr + psize) + i,
1085 (buf_offs_sum + i) % secsize,
1088 &g_cdvdfsv_eerpsdd) )
1094 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1097 trid = sceSifSetDma(&g_cdvdfsv_eerpsdd, 1);
1102 if ( !early_break && ssize )
1105 unsigned int buf_offs_sum_bytes_in_sector;
1107 buf_offs_sum_bytes_in_sector = buf_offs_sum % secsize;
1108 sectors_1 = (len2_plus_sec2 < lsndualchg_res + buf_offs_sum / secsize + 2) ? 1 : 2;
1110 1,
"2 CD_READ LBN= %d sectors= %d\n", (
int)(lsndualchg_res + buf_offs_sum / secsize), (
int)sectors_1);
1112 lsndualchg_res + buf_offs_sum / secsize,
1125 if ( datapattern != SCECdSecS2340 || ps2dvd )
1130 for ( i = 0; i < ssize; i += 1 )
1133 ((i + buf_offs_sum_bytes_in_sector)
1134 && (i % secsize) == (secsize - (buf_offs_sum_bytes_in_sector ? buf_offs_sum_bytes_in_sector : secsize))) ?
1135 (sector_sizes[ps2dvd] - secsize) :
1137 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[buf_offs_sum_bytes_in_sector + i2_offs + i];
1142 for ( i = 0; i < ssize; i += 1 )
1143 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[buf_offs_sum_bytes_in_sector + i];
1145 buf_offs_sum += ssize;
1148 g_cdvdfsv_eereadx.m_b1len = psize;
1149 g_cdvdfsv_eereadx.m_b2len = ssize;
1150 g_cdvdfsv_eereadx.m_b1dst = paddr;
1151 g_cdvdfsv_eereadx.m_b2dst = saddr;
1153 1,
"b psize= %d paddr= %08x bsize= %d ssize= %d saddr %08x\n", (
int)psize, paddr, (
int)bsize, (
int)ssize, saddr);
1154 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1156 g_cdvdfsv_datasdd.src = &g_cdvdfsv_eereadx;
1157 g_cdvdfsv_datasdd.size =
sizeof(g_cdvdfsv_eereadx);
1158 g_cdvdfsv_datasdd.attr = 0;
1159 g_cdvdfsv_readpos = buf_offs_sum;
1160 g_cdvdfsv_datasdd.dest = (
void *)inbuf->m_pkt_01.m_eeremaindest;
1164 trid = sceSifSetDma(&g_cdvdfsv_datasdd, 1);
1165 sceSifSetDma(&g_cdvdfsv_eerpsdd, 1);
1171 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1173 g_cdvdfsv_spinctl = -1;
1174 VERBOSE_PRINTF(1,
"read end\n");
1175 outbuf->m_retres = buf_offs_sum;
1179cdvdfsv_chreadee(
int secoffs,
int seccount,
char *ee_addr,
const sceCdRMode *in_rmode, u32 disktype_14,
int sync)
1181 unsigned int secsize;
1188 lsndualchg_res = secoffs;
1192 if ( !sceCdSC(0xFFFFFFEA, &scres_unused) )
1195 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1199 lsndualchg_res = sceCdSC(0xFFFFFFE9, &lsndualchg_res);
1219 for ( i = 0; i < (
unsigned int)(secsize * seccount); i += readsize_bytes )
1221 unsigned int bytescount;
1222 int sectors_partial;
1223 int bytescount_in_sectors;
1225 bytescount = (
unsigned int)(secsize * seccount) - i;
1226 sectors_partial = (lsndualchg_res + i / secsize) & 0xF;
1227 bytescount_in_sectors = 0x10;
1228 readsize_bytes = secsize * bytescount_in_sectors;
1229 if ( (
unsigned int)readsize_bytes >= bytescount )
1231 bytescount_in_sectors = (bytescount / secsize) + (!!(bytescount % secsize));
1232 readsize_bytes = bytescount;
1234 else if ( sectors_partial && !(secsize & 0xF) )
1236 bytescount_in_sectors -= sectors_partial;
1239 lsndualchg_res + i / secsize,
1240 bytescount_in_sectors,
1273 g_cdvdfsv_readpos = 0;
1274 g_cdvdman_istruct_ptr->m_break_cdvdfsv_readchain = 0;
1275 g_cdvdfsv_chrdsdd.src = &g_cdvdfsv_readpos;
1276 g_cdvdfsv_chrdsdd.size =
sizeof(g_cdvdfsv_readpos);
1277 g_cdvdfsv_chrdsdd.attr = 0;
1278 g_cdvdfsv_chrdsdd.dest = (
void *)inbuf->m_pkt_0F.m_eedest;
1279 switch ( inbuf->m_pkt_0F.m_mode.datapattern )
1282 sector_size = 0x918;
1285 sector_size = 0x924;
1289 sector_size = 0x800;
1292 chain = inbuf->m_pkt_0F.m_readChain;
1293 for ( i = 0; i < 0x40; i += 1 )
1295 if ( g_cdvdman_istruct_ptr->m_break_cdvdfsv_readchain )
1297 VERBOSE_PRINTF(1,
"ReadChain cnt %d on sceCdBreak()\n", (
int)i);
1300 if ( chain[i].lbn == 0xFFFFFFFF || chain[i].sectors == 0xFFFFFFFF || chain[i].buffer == 0xFFFFFFFF )
1302 if ( (chain[i].buffer & 1) )
1304 buf = (
void *)(chain[i].buffer & ~1);
1307 "ReadChain lsn= %d nsec= %d buf= %08x secsize= %d\n",
1308 (
int)(chain[i].lbn),
1309 (
int)(chain[i].sectors),
1310 (
unsigned int)(uiptr)buf,
1311 inbuf->m_pkt_0F.m_mode.datapattern);
1312 re_result =
sceCdRE(chain[i].lbn, chain[i].sectors, buf, (
sceCdRMode *)&(inbuf->m_pkt_0F.m_mode));
1313 if ( re_result == 1 )
1320 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1326 1,
"ReadChain EE Memory addr= 0x%08x sector= %d\n", (
unsigned int)(chain[i].lbn), (
int)(chain[i].sectors));
1328 re_result = cdvdfsv_chreadee(
1331 (
char *)chain[i].buffer,
1332 &(inbuf->m_pkt_0F.m_mode),
1334 !sceCdSC(0xFFFFFFFC, &scres_unused));
1338 VERBOSE_PRINTF(1,
"ReadChain error code= 0x%02x\n",
sceCdGetError());
1341 g_cdvdfsv_readpos += chain[i].sectors * sector_size;
1345 trid = sceSifSetDma(&g_cdvdfsv_chrdsdd, 1);
1351 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1359 unsigned int sector_size;
1361 unsigned int buf_1_toalign;
1368 unsigned int buf_offs;
1369 unsigned int buf_toalign;
1370 unsigned int buf_sec_tmp;
1371 unsigned int lbn_1_end;
1376 g_cdvdfsv_eereadfull_dma2.src = &g_cdvdfsv_readpos;
1377 g_cdvdfsv_eereadfull_dma2.size =
sizeof(g_cdvdfsv_readpos);
1378 g_cdvdfsv_eereadfull_dma2.attr = 0;
1379 g_cdvdfsv_eereadfull_dma2.dest = (
void *)inbuf->m_pkt_02.m_eedest;
1380 switch ( inbuf->m_pkt_02.m_mode.datapattern )
1383 sector_size = 0x940;
1388 sector_size = 0x930;
1392 all_sec_bytes = sector_size * inbuf->m_pkt_02.m_sectors;
1393 lbn_1_end = inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors;
1395 ((inbuf->m_pkt_02.m_buf & 0x3F)) ? ((inbuf->m_pkt_02.m_buf & ~0x3F) - (inbuf->m_pkt_02.m_buf - 0x40)) : 0;
1396 buf_1_toalign = (inbuf->m_pkt_02.m_buf + all_sec_bytes) & ~0x3F;
1397 buf_sec_tmp = all_sec_bytes - (buf_1_toalign - inbuf->m_pkt_02.m_buf);
1400 unsigned int buf_offs_sectors;
1403 buf_offs_sectors = buf_offs / sector_size;
1404 sectors_1 = (lbn_1_end < inbuf->m_pkt_02.m_lbn + buf_offs / sector_size + 2) ? 1 : 2;
1407 "0 CD_READ LBN= %d sectors= %d all= %d\n",
1408 (
int)(inbuf->m_pkt_02.m_lbn + buf_offs_sectors),
1410 (
int)inbuf->m_pkt_02.m_sectors);
1411 cmd_error = sceCdReadCDDA(
1412 inbuf->m_pkt_02.m_lbn + buf_offs_sectors, sectors_1, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1415 if ( error_code || !cmd_error )
1418 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1419 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1420 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1421 error_code_tmp = error_code;
1427 if ( error_code_tmp && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG )
1429 for ( i = 0; i < buf_toalign; i += 1 )
1431 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[i];
1433 buf_offs += buf_toalign;
1436 if ( error_code_tmp && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG )
1438 unsigned int sector_count_in_bytes;
1439 unsigned int buf_aligned;
1441 for ( buf_aligned = inbuf->m_pkt_02.m_buf + buf_toalign; buf_aligned < buf_1_toalign;
1442 buf_aligned += sector_count_in_bytes )
1444 unsigned int buf_align_remain;
1445 unsigned int buf_offs_mod_sector_size;
1449 buf_align_remain = buf_1_toalign - buf_aligned;
1450 buf_offs_mod_sector_size = buf_offs % sector_size;
1451 lsn_2 = inbuf->m_pkt_02.m_lbn + buf_offs / sector_size;
1452 sector_count_in_bytes = 8 * sector_size;
1453 if ( sector_count_in_bytes >= buf_align_remain )
1455 sector_count_in_bytes = buf_align_remain;
1457 (buf_align_remain / sector_size) + (!!(buf_align_remain % sector_size)) + (!!buf_offs_mod_sector_size);
1461 sector_count = 8 + (!!(buf_offs % sector_size));
1463 if ( sector_count > lbn_1_end - lsn_2 )
1464 sector_count = lbn_1_end - lsn_2;
1465 while ( cdvdfsv_checkdmastat(trid1) >= 0 )
1467 cmd_error = sceCdReadCDDA(lsn_2, sector_count, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1470 if ( error_code || !cmd_error )
1473 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1474 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1475 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1477 error_code_tmp = error_code;
1481 if ( buf_offs_mod_sector_size )
1482 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[buf_offs_mod_sector_size], sector_count_in_bytes);
1483 g_cdvdfsv_eereadfull_dma1.src = g_cdvdfsv_rtocbuf;
1484 g_cdvdfsv_eereadfull_dma1.size = sector_count_in_bytes;
1485 g_cdvdfsv_eereadfull_dma1.attr = 0;
1486 g_cdvdfsv_eereadfull_dma1.dest = (
char *)buf_aligned;
1487 g_cdvdfsv_readpos = buf_offs;
1491 trid1 = sceSifSetDma(&g_cdvdfsv_eereadfull_dma1, 1);
1497 if ( (
unsigned int)buflen >= 0x19 )
1500 sceSifSetDma(&g_cdvdfsv_eereadfull_dma2, 1);
1503 buf_offs += sector_count_in_bytes;
1506 if ( (error_code_tmp && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG) && buf_sec_tmp )
1511 lsn_3 = inbuf->m_pkt_02.m_lbn + buf_offs / sector_size;
1512 sectors_3 = (lbn_1_end < lsn_3 + 2) ? 1 : 2;
1515 "0 CD_READ LBN= %d sectors= %d all= %d\n",
1516 (
int)(inbuf->m_pkt_02.m_lbn + buf_offs / sector_size),
1518 (
int)inbuf->m_pkt_02.m_sectors);
1519 VERBOSE_PRINTF(1,
"2 CD_READ LBN= %d sectors= %d\n", (
int)lsn_3, (
int)sectors_3);
1520 cmd_error = sceCdReadCDDA(lsn_3, sectors_3, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1523 if ( error_code || !cmd_error )
1526 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1527 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1528 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1529 error_code_tmp = error_code;
1533 for ( i = 0; i < buf_sec_tmp; i += 1 )
1535 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[(buf_offs % sector_size) + i];
1537 buf_offs += buf_sec_tmp;
1539 g_cdvdfsv_eereadx.m_b1len = buf_toalign;
1540 g_cdvdfsv_eereadx.m_b2len = buf_sec_tmp;
1541 g_cdvdfsv_eereadx.m_b1dst = inbuf->m_pkt_02.m_buf;
1542 g_cdvdfsv_eereadx.m_b2dst = buf_1_toalign;
1543 while ( cdvdfsv_checkdmastat(trid1) >= 0 )
1545 g_cdvdfsv_eereadfull_dma1.src = &g_cdvdfsv_eereadx;
1546 g_cdvdfsv_eereadfull_dma1.size =
sizeof(g_cdvdfsv_eereadx);
1547 g_cdvdfsv_eereadfull_dma1.attr = 0;
1548 g_cdvdfsv_readpos = buf_offs;
1549 g_cdvdfsv_eereadfull_dma1.dest = (
void *)inbuf->m_pkt_02.m_eeremaindest;
1553 trid2 = sceSifSetDma(&g_cdvdfsv_eereadfull_dma1, 1);
1554 if ( (
unsigned int)buflen >= 0x19 )
1555 sceSifSetDma(&g_cdvdfsv_eereadfull_dma2, 1);
1561 while ( cdvdfsv_checkdmastat(trid2) >= 0 )
1563 if ( error_code_tmp )
1564 sceCdSC(0xFFFFFFFE, &error_code_tmp);
1565 VERBOSE_PRINTF(1,
"read end\n");
1566 outbuf->m_retres = buf_offs;
1569void *cbrpc_rpc2_diskready(
int fno,
void *buffer,
int length)
1575 VERBOSE_KPRINTF(1,
"DISK READY call 0x%02x\n",
sceCdStatus());
1578 return (
void *)&g_diskready_res;
1588 VERBOSE_PRINTF(1,
"GET TOC call 0x%08x\n", (
int)inbuf);
1589 outbuf->m_retres =
sceCdGetToc((u8 *)g_cdvdfsv_rtocbuf);
1590 VERBOSE_PRINTF(1,
"GET TOC called\n");
1591 g_cdvdfsv_rtocsdd.src = g_cdvdfsv_rtocbuf;
1592 g_cdvdfsv_rtocsdd.size = 0x810;
1593 g_cdvdfsv_rtocsdd.attr = 0;
1594 g_cdvdfsv_rtocsdd.dest = (
void *)inbuf->m_pkt_04.m_eedest;
1598 trid = sceSifSetDma(&g_cdvdfsv_rtocsdd, 1);
1604 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1612 outbuf->m_pkt_04.m_isdvd = 1;
1615 outbuf->m_pkt_04.m_isdvd = 0;
1644 outbuf->m_retres = 0;
1645 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1647 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1648 outbuf->m_retres =
sceCdRI(outbuf->m_pkt_06.m_buffer, &outbuf->m_pkt_06.m_result);
1660 outbuf->m_retres = 0;
1661 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1663 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1664 outbuf->m_retres =
sceCdRM(outbuf->m_pkt_1A.m_buffer, &outbuf->m_pkt_1A.m_status);
1668#ifdef CDVD_VARIANT_DNAS
1677 outbuf->m_retres = 0;
1678 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1680 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1694 outbuf->m_retres = 0;
1695 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1697 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1705 if ( buflen == 4 || !inbuf->m_pkt_22.m_char4 )
1707 outbuf->m_retres =
sceCdMmode(inbuf->m_pkt_22.m_media);
1727 outbuf->m_retres = 0;
1728 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1730 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1731 outbuf->m_retres =
sceCdPowerOff(&outbuf->m_pkt_21.m_result);
1743 outbuf->m_retres = 0;
1744 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1746 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1747 outbuf->m_retres =
sceCdCtrlADout(inbuf->m_pkt_15.m_mode, &outbuf->m_pkt_15.m_status);
1760 outbuf->m_retres = 0;
1761 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1763 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1768#ifdef CDVD_VARIANT_DNAS
1775 outbuf->m_retres =
sceCdReadDiskID((
unsigned int *)&(outbuf->m_pkt_11.m_diskid));
1794 inbuf->m_pkt_0B.m_cmdNum, &inbuf->m_pkt_0B.m_inBuff, inbuf->m_pkt_0B.m_inBuffSize, &(outbuf->m_pkt_0B.m_outbuf));
1802 outbuf->m_retres =
sceCdApplyNCmd(inbuf->m_pkt_0C.m_cmdNum, &inbuf->m_pkt_0C.m_inBuff, inbuf->m_pkt_0C.m_inBuffSize);
1821 outbuf->m_retres = 0;
1822 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1824 WaitEventFlag(g_scmd_evid, 1, WEF_AND, &efbits);
1825 outbuf->m_retres =
sceCdTrayReq(inbuf->m_pkt_05.m_param, &outbuf->m_pkt_05.m_traychk);
1834 outbuf->m_retres =
sceCdSetTimeout(inbuf->m_pkt_25.m_param, inbuf->m_pkt_25.m_timeout);
1843 outbuf->m_retres =
sceCdReadDvdDualInfo(&outbuf->m_pkt_27.m_on_dual, &outbuf->m_pkt_27.m_layer1_start);
1846static int cdvdfsv_rpc5_0E_diskready()
1857 case SCECdDETCTDVDS:
1858 case SCECdDETCTDVDD:
1866 (
sceCdDiskReady(8) & 0xC0) != 0x40 || sceCdSC(0xFFFFFFFD, &scres_unused) || !sceCdSC(0xFFFFFFF4, &scres_unused)
1869 VERBOSE_PRINTF(1,
"Drive Not Ready\n");
1875static void *cbrpc_rpc5_cdvdncmds(
int fno,
void *buffer,
int length)
1881 VERBOSE_PRINTF(1,
"sce_cdvd N cmd start %d\n", fno);
1882 g_cdvdfsv_rpc5flg = 1;
1883 sceCdSC(0xFFFFFFF6, &fno_1);
1888 cdvdfsv_rpc5_01_readee(
1892 cdvdfsv_rpc5_02_readcdda(buffer, length, &g_crr);
1895 cdvdfsv_rpc5_04_gettoc(buffer, length, &g_crr);
1900 VERBOSE_PRINTF(1,
"Call Seek end\n");
1904 VERBOSE_PRINTF(1,
"Call Standby\n");
1907 VERBOSE_PRINTF(1,
"Call Standby called\n");
1910 VERBOSE_PRINTF(1,
"Call Stop\n");
1915 VERBOSE_PRINTF(1,
"Call Pause\n");
1920 if ( devctl(
"cdrom_stm0:", 0x4396, buffer, length, &g_crr.m_retres, 4) < 0 )
1924 if ( devctl(
"cdrom_stm0:", 0x4398, buffer, length, &g_crr.m_retres, 4) < 0 )
1928 cdvdfsv_rpc5_0C_applyncmd(buffer, length, &g_crr);
1931 cdvdfsv_rpc5_0D_iopmread(buffer, length, &g_crr);
1934 g_crr.m_retres = cdvdfsv_rpc5_0E_diskready();
1937 cdvdfsv_rpc5_0F_readchain(buffer, length, &g_crr);
1939#ifdef CDVD_VARIANT_DNAS
1941 cdvdfsv_rpc5_11_readdiskid(buffer, length, &g_crr);
1946 cdvdfsv_rpc5_01_readee(
1949#ifdef CDVD_VARIANT_DNAS
1951 cdvdfsv_rpc5_17_doesuniquekeyexist(buffer, length, &g_crr);
1955 VERBOSE_PRINTF(1,
"sce_cdvd no block IO :unrecognized code %x\n", fno);
1960 sceCdSC(0xFFFFFFF6, &fno_1);
1961 g_cdvdfsv_rpc5flg = 0;
1962 VERBOSE_PRINTF(1,
"sce_cdvd N cmd end\n");
1963 return (
void *)&g_crr;
1967static void *cbrpc_rpc3_cdvdscmds(
int fno,
void *buffer,
int length)
1969 VERBOSE_PRINTF(1,
"sce_cdvd S cmd start %d\n", fno);
1970 g_cdvdfsv_rpc3flg = 1;
1974 cdvdfsv_rpc3_01_readclock(buffer, length, &g_outbuf);
1977 cdvdfsv_rpc3_03_disktype(buffer, length, &g_outbuf);
1980 cdvdfsv_rpc3_04_geterror(buffer, length, &g_outbuf);
1983 cdvdfsv_rpc3_05_trayreq(buffer, length, &g_outbuf);
1986 cdvdfsv_rpc3_06_ri(buffer, length, &g_outbuf);
1989 cdvdfsv_rpc3_0B_applyscmd(buffer, length, &g_outbuf);
1992 cdvdfsv_rpc3_0C_cdstatus(buffer, length, &g_outbuf);
1995 cdvdfsv_rpc3_15_ctrladout(buffer, length, &g_outbuf);
1998 cdvdfsv_rpc3_16_break(buffer, length, &g_outbuf);
2001 cdvdfsv_rpc3_1A_rm(buffer, length, &g_outbuf);
2004 cdvdfsv_rpc3_21_poweroff(buffer, length, &g_outbuf);
2007 cdvdfsv_rpc3_22_mmode(buffer, length, &g_outbuf);
2010 cdvdfsv_rpc3_23_changethreadpriority(buffer, length, &g_outbuf);
2012#ifdef CDVD_VARIANT_DNAS
2014 cdvdfsv_rpc3_24_readguid(buffer, length, &g_outbuf);
2018 cdvdfsv_rpc3_25_settimeout(buffer, length, &g_outbuf);
2020#ifdef CDVD_VARIANT_DNAS
2022 cdvdfsv_rpc3_26_readmodelid(buffer, length, &g_outbuf);
2026 cdvdfsv_rpc3_27_readdvddualinfo(buffer, length, &g_outbuf);
2029 VERBOSE_PRINTF(1,
"sce_cdvd block IO :unrecognized code 0x%02x\n", fno);
2030 g_outbuf.m_retres = 0;
2033 VERBOSE_PRINTF(1,
"sce_cdvd S cmd end\n");
2034 g_cdvdfsv_rpc3flg = 0;
2035 return (
void *)&g_outbuf;
2038static void cdvdfsv_poffloop()
2045 g_cdvdman_intr_efid = sceCdSC(0xFFFFFFF5, &scres);
2048 ClearEventFlag(g_cdvdman_intr_efid, ~4);
2049 WaitEventFlag(g_cdvdman_intr_efid, 4, WEF_AND, &efbits);
2050 if ( g_cdvdfsv_nopocm )
2052 if ( !g_cdvdfsv_plbreak )
2056 trid = sceSifSendCmd(0x80000012, cmdpkt,
sizeof(cmdpkt), 0, 0, 0);
2061 while ( cdvdfsv_checkdmastat(trid) >= 0 )
2067static void cdvdfsv_rpc1_th(
void *arg)
2071 sceSifSetRpcQueue(&g_rpc_qdata1, GetThreadId());
2072 sceSifRegisterRpc(&g_rpc_sdata1, 0x80000592, cbrpc_rpc1_cdinit, g_rpc_buffer1, 0, 0, &g_rpc_qdata1);
2073 sceSifRegisterRpc(&g_rpc_sdata2, 0x8000059A, cbrpc_rpc2_diskready, g_rpc_buffer2, 0, 0, &g_rpc_qdata1);
2074 sceSifRegisterRpc(&g_rpc_sdata3, 0x80000593, cbrpc_rpc3_cdvdscmds, g_rpc_buffer3, 0, 0, &g_rpc_qdata1);
2075 sceSifRpcLoop(&g_rpc_qdata1);
2079static void cdvdfsv_rpc3_th(
void *arg)
2083 sceSifSetRpcQueue(&g_rpc_qdata3, GetThreadId());
2084 sceSifRegisterRpc(&g_rpc_sdata6, 0x8000059C, cbrpc_rpc2_diskready, g_rpc_buffer2, 0, 0, &g_rpc_qdata3);
2085 sceSifRpcLoop(&g_rpc_qdata3);
2089static void cdvdfsv_rpc2_th(
void *arg)
2093 sceSifSetRpcQueue(&g_rpc_qdata2, GetThreadId());
2094 sceSifRegisterRpc(&g_rpc_sdata4, 0x80000597, cbrpc_rpc4_fscall, g_rpc_buffer4, 0, 0, &g_rpc_qdata2);
2095 sceSifRegisterRpc(&g_rpc_sdata5, 0x80000595, cbrpc_rpc5_cdvdncmds, g_rpc_buffer5, 0, 0, &g_rpc_qdata2);
2096 sceSifRpcLoop(&g_rpc_qdata2);
2104 "\t" ".set push" "\n"
2105 "\t" ".set noat" "\n"
2106 "\t" ".set noreorder" "\n"
2107 "\t" ".global optimized_memcpy" "\n"
2108 "\t" "optimized_memcpy:" "\n"
2109 "\t" " srl $a3, $a2, 2" "\n"
2110 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
2111 "\t" " or $a3, $a0, $a1" "\n"
2112 "\t" " andi $a3, $a3, 0x3" "\n"
2113 "\t" " bnez $a3, .Loptimized_memcpy_3" "\n"
2115 "\t" " srl $a3, $a2, 2" "\n"
2116 "\t" " addiu $at, $zero, 0xC" "\n"
2117 "\t" " div $zero, $a3, $at" "\n"
2118 "\t" " mflo $a3" "\n"
2119 "\t" " mfhi $v1" "\n"
2120 "\t" " beqz $v1, .Loptimized_memcpy_2" "\n"
2122 "\t" ".Loptimized_memcpy_1:" "\n"
2123 "\t" " lw $v0, 0x0($a1)" "\n"
2124 "\t" " addiu $v1, $v1, -0x1" "\n"
2125 "\t" " sw $v0, 0x0($a0)" "\n"
2126 "\t" " addiu $a1, $a1, 0x4" "\n"
2127 "\t" " bnez $v1, .Loptimized_memcpy_1" "\n"
2128 "\t" " addiu $a0, $a0, 0x4" "\n"
2129 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
2131 "\t" ".Loptimized_memcpy_2:" "\n"
2132 "\t" " lw $v0, 0x0($a1)" "\n"
2133 "\t" " lw $v1, 0x4($a1)" "\n"
2134 "\t" " lw $t0, 0x8($a1)" "\n"
2135 "\t" " lw $t1, 0xC($a1)" "\n"
2136 "\t" " lw $t2, 0x10($a1)" "\n"
2137 "\t" " lw $t3, 0x14($a1)" "\n"
2138 "\t" " lw $t4, 0x18($a1)" "\n"
2139 "\t" " lw $t5, 0x1C($a1)" "\n"
2140 "\t" " lw $t6, 0x20($a1)" "\n"
2141 "\t" " lw $t7, 0x24($a1)" "\n"
2142 "\t" " lw $t8, 0x28($a1)" "\n"
2143 "\t" " lw $t9, 0x2C($a1)" "\n"
2144 "\t" " addiu $a3, $a3, -0x1" "\n"
2145 "\t" " sw $v0, 0x0($a0)" "\n"
2146 "\t" " sw $v1, 0x4($a0)" "\n"
2147 "\t" " sw $t0, 0x8($a0)" "\n"
2148 "\t" " sw $t1, 0xC($a0)" "\n"
2149 "\t" " sw $t2, 0x10($a0)" "\n"
2150 "\t" " sw $t3, 0x14($a0)" "\n"
2151 "\t" " sw $t4, 0x18($a0)" "\n"
2152 "\t" " sw $t5, 0x1C($a0)" "\n"
2153 "\t" " sw $t6, 0x20($a0)" "\n"
2154 "\t" " sw $t7, 0x24($a0)" "\n"
2155 "\t" " sw $t8, 0x28($a0)" "\n"
2156 "\t" " sw $t9, 0x2C($a0)" "\n"
2157 "\t" " addiu $a1, $a1, 0x30" "\n"
2158 "\t" " bnez $a3, .Loptimized_memcpy_2" "\n"
2159 "\t" " addiu $a0, $a0, 0x30" "\n"
2160 "\t" " j .Loptimized_memcpy_12" "\n"
2162 "\t" ".Loptimized_memcpy_3:" "\n"
2163 "\t" " andi $a3, $a0, 0x3" "\n"
2164 "\t" " beqz $a3, .Loptimized_memcpy_6" "\n"
2165 "\t" " andi $a3, $a1, 0x3" "\n"
2166 "\t" " beqz $a3, .Loptimized_memcpy_6" "\n"
2168 "\t" " srl $a3, $a2, 2" "\n"
2169 "\t" " addiu $at, $zero, 0xC" "\n"
2170 "\t" " div $zero, $a3, $at" "\n"
2171 "\t" " mflo $a3" "\n"
2172 "\t" " mfhi $v1" "\n"
2173 "\t" " beqz $v1, .Loptimized_memcpy_5" "\n"
2175 "\t" ".Loptimized_memcpy_4:" "\n"
2176 "\t" " lwl $v0, 0x3($a1)" "\n"
2177 "\t" " lwr $v0, 0x0($a1)" "\n"
2178 "\t" " addiu $v1, $v1, -0x1" "\n"
2179 "\t" " swl $v0, 0x3($a0)" "\n"
2180 "\t" " swr $v0, 0x0($a0)" "\n"
2181 "\t" " addiu $a1, $a1, 0x4" "\n"
2182 "\t" " bnez $v1, .Loptimized_memcpy_4" "\n"
2183 "\t" " addiu $a0, $a0, 0x4" "\n"
2184 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
2186 "\t" ".Loptimized_memcpy_5:" "\n"
2187 "\t" " lwl $v0, 0x3($a1)" "\n"
2188 "\t" " lwr $v0, 0x0($a1)" "\n"
2189 "\t" " lwl $v1, 0x7($a1)" "\n"
2190 "\t" " lwr $v1, 0x4($a1)" "\n"
2191 "\t" " lwl $t0, 0xB($a1)" "\n"
2192 "\t" " lwr $t0, 0x8($a1)" "\n"
2193 "\t" " lwl $t1, 0xF($a1)" "\n"
2194 "\t" " lwr $t1, 0xC($a1)" "\n"
2195 "\t" " lwl $t2, 0x13($a1)" "\n"
2196 "\t" " lwr $t2, 0x10($a1)" "\n"
2197 "\t" " lwl $t3, 0x17($a1)" "\n"
2198 "\t" " lwr $t3, 0x14($a1)" "\n"
2199 "\t" " lwl $t4, 0x1B($a1)" "\n"
2200 "\t" " lwr $t4, 0x18($a1)" "\n"
2201 "\t" " lwl $t5, 0x1F($a1)" "\n"
2202 "\t" " lwr $t5, 0x1C($a1)" "\n"
2203 "\t" " lwl $t6, 0x23($a1)" "\n"
2204 "\t" " lwr $t6, 0x20($a1)" "\n"
2205 "\t" " lwl $t7, 0x27($a1)" "\n"
2206 "\t" " lwr $t7, 0x24($a1)" "\n"
2207 "\t" " lwl $t8, 0x2B($a1)" "\n"
2208 "\t" " lwr $t8, 0x28($a1)" "\n"
2209 "\t" " lwl $t9, 0x2F($a1)" "\n"
2210 "\t" " lwr $t9, 0x2C($a1)" "\n"
2211 "\t" " addiu $a3, $a3, -0x1" "\n"
2212 "\t" " swl $v0, 0x3($a0)" "\n"
2213 "\t" " swr $v0, 0x0($a0)" "\n"
2214 "\t" " swl $v1, 0x7($a0)" "\n"
2215 "\t" " swr $v1, 0x4($a0)" "\n"
2216 "\t" " swl $t0, 0xB($a0)" "\n"
2217 "\t" " swr $t0, 0x8($a0)" "\n"
2218 "\t" " swl $t1, 0xF($a0)" "\n"
2219 "\t" " swr $t1, 0xC($a0)" "\n"
2220 "\t" " swl $t2, 0x13($a0)" "\n"
2221 "\t" " swr $t2, 0x10($a0)" "\n"
2222 "\t" " swl $t3, 0x17($a0)" "\n"
2223 "\t" " swr $t3, 0x14($a0)" "\n"
2224 "\t" " swl $t4, 0x1B($a0)" "\n"
2225 "\t" " swr $t4, 0x18($a0)" "\n"
2226 "\t" " swl $t5, 0x1F($a0)" "\n"
2227 "\t" " swr $t5, 0x1C($a0)" "\n"
2228 "\t" " swl $t6, 0x23($a0)" "\n"
2229 "\t" " swr $t6, 0x20($a0)" "\n"
2230 "\t" " swl $t7, 0x27($a0)" "\n"
2231 "\t" " swr $t7, 0x24($a0)" "\n"
2232 "\t" " swl $t8, 0x2B($a0)" "\n"
2233 "\t" " swr $t8, 0x28($a0)" "\n"
2234 "\t" " swl $t9, 0x2F($a0)" "\n"
2235 "\t" " swr $t9, 0x2C($a0)" "\n"
2236 "\t" " addiu $a1, $a1, 0x30" "\n"
2237 "\t" " bnez $a3, .Loptimized_memcpy_5" "\n"
2238 "\t" " addiu $a0, $a0, 0x30" "\n"
2239 "\t" " j .Loptimized_memcpy_12" "\n"
2241 "\t" ".Loptimized_memcpy_6:" "\n"
2242 "\t" " andi $a3, $a0, 0x3" "\n"
2243 "\t" " beqz $a3, .Loptimized_memcpy_9" "\n"
2245 "\t" " srl $a3, $a2, 2" "\n"
2246 "\t" " addiu $at, $zero, 0xC" "\n"
2247 "\t" " div $zero, $a3, $at" "\n"
2248 "\t" " mflo $a3" "\n"
2249 "\t" " mfhi $v1" "\n"
2250 "\t" " beqz $v1, .Loptimized_memcpy_8" "\n"
2252 "\t" ".Loptimized_memcpy_7:" "\n"
2253 "\t" " lw $v0, 0x0($a1)" "\n"
2254 "\t" " addiu $v1, $v1, -0x1" "\n"
2255 "\t" " swl $v0, 0x3($a0)" "\n"
2256 "\t" " swr $v0, 0x0($a0)" "\n"
2257 "\t" " addiu $a1, $a1, 0x4" "\n"
2258 "\t" " bnez $v1, .Loptimized_memcpy_7" "\n"
2259 "\t" " addiu $a0, $a0, 0x4" "\n"
2260 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
2262 "\t" ".Loptimized_memcpy_8:" "\n"
2263 "\t" " lw $v0, 0x0($a1)" "\n"
2264 "\t" " lw $v1, 0x4($a1)" "\n"
2265 "\t" " lw $t0, 0x8($a1)" "\n"
2266 "\t" " lw $t1, 0xC($a1)" "\n"
2267 "\t" " lw $t2, 0x10($a1)" "\n"
2268 "\t" " lw $t3, 0x14($a1)" "\n"
2269 "\t" " lw $t4, 0x18($a1)" "\n"
2270 "\t" " lw $t5, 0x1C($a1)" "\n"
2271 "\t" " lw $t6, 0x20($a1)" "\n"
2272 "\t" " lw $t7, 0x24($a1)" "\n"
2273 "\t" " lw $t8, 0x28($a1)" "\n"
2274 "\t" " lw $t9, 0x2C($a1)" "\n"
2275 "\t" " addiu $a3, $a3, -0x1" "\n"
2276 "\t" " swl $v0, 0x3($a0)" "\n"
2277 "\t" " swr $v0, 0x0($a0)" "\n"
2278 "\t" " swl $v1, 0x7($a0)" "\n"
2279 "\t" " swr $v1, 0x4($a0)" "\n"
2280 "\t" " swl $t0, 0xB($a0)" "\n"
2281 "\t" " swr $t0, 0x8($a0)" "\n"
2282 "\t" " swl $t1, 0xF($a0)" "\n"
2283 "\t" " swr $t1, 0xC($a0)" "\n"
2284 "\t" " swl $t2, 0x13($a0)" "\n"
2285 "\t" " swr $t2, 0x10($a0)" "\n"
2286 "\t" " swl $t3, 0x17($a0)" "\n"
2287 "\t" " swr $t3, 0x14($a0)" "\n"
2288 "\t" " swl $t4, 0x1B($a0)" "\n"
2289 "\t" " swr $t4, 0x18($a0)" "\n"
2290 "\t" " swl $t5, 0x1F($a0)" "\n"
2291 "\t" " swr $t5, 0x1C($a0)" "\n"
2292 "\t" " swl $t6, 0x23($a0)" "\n"
2293 "\t" " swr $t6, 0x20($a0)" "\n"
2294 "\t" " swl $t7, 0x27($a0)" "\n"
2295 "\t" " swr $t7, 0x24($a0)" "\n"
2296 "\t" " swl $t8, 0x2B($a0)" "\n"
2297 "\t" " swr $t8, 0x28($a0)" "\n"
2298 "\t" " swl $t9, 0x2F($a0)" "\n"
2299 "\t" " swr $t9, 0x2C($a0)" "\n"
2300 "\t" " addiu $a1, $a1, 0x30" "\n"
2301 "\t" " bnez $a3, .Loptimized_memcpy_8" "\n"
2302 "\t" " addiu $a0, $a0, 0x30" "\n"
2303 "\t" " j .Loptimized_memcpy_12" "\n"
2305 "\t" ".Loptimized_memcpy_9:" "\n"
2306 "\t" " srl $a3, $a2, 2" "\n"
2307 "\t" " addiu $at, $zero, 0xC" "\n"
2308 "\t" " div $zero, $a3, $at" "\n"
2309 "\t" " mflo $a3" "\n"
2310 "\t" " mfhi $v1" "\n"
2311 "\t" " beqz $v1, .Loptimized_memcpy_11" "\n"
2313 "\t" ".Loptimized_memcpy_10:" "\n"
2314 "\t" " lwl $v0, 0x3($a1)" "\n"
2315 "\t" " lwr $v0, 0x0($a1)" "\n"
2316 "\t" " addiu $v1, $v1, -0x1" "\n"
2317 "\t" " sw $v0, 0x0($a0)" "\n"
2318 "\t" " addiu $a1, $a1, 0x4" "\n"
2319 "\t" " bnez $v1, .Loptimized_memcpy_10" "\n"
2320 "\t" " addiu $a0, $a0, 0x4" "\n"
2321 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
2323 "\t" ".Loptimized_memcpy_11:" "\n"
2324 "\t" " lwl $v0, 0x3($a1)" "\n"
2325 "\t" " lwr $v0, 0x0($a1)" "\n"
2326 "\t" " lwl $v1, 0x7($a1)" "\n"
2327 "\t" " lwr $v1, 0x4($a1)" "\n"
2328 "\t" " lwl $t0, 0xB($a1)" "\n"
2329 "\t" " lwr $t0, 0x8($a1)" "\n"
2330 "\t" " lwl $t1, 0xF($a1)" "\n"
2331 "\t" " lwr $t1, 0xC($a1)" "\n"
2332 "\t" " lwl $t2, 0x13($a1)" "\n"
2333 "\t" " lwr $t2, 0x10($a1)" "\n"
2334 "\t" " lwl $t3, 0x17($a1)" "\n"
2335 "\t" " lwr $t3, 0x14($a1)" "\n"
2336 "\t" " lwl $t4, 0x1B($a1)" "\n"
2337 "\t" " lwr $t4, 0x18($a1)" "\n"
2338 "\t" " lwl $t5, 0x1F($a1)" "\n"
2339 "\t" " lwr $t5, 0x1C($a1)" "\n"
2340 "\t" " lwl $t6, 0x23($a1)" "\n"
2341 "\t" " lwr $t6, 0x20($a1)" "\n"
2342 "\t" " lwl $t7, 0x27($a1)" "\n"
2343 "\t" " lwr $t7, 0x24($a1)" "\n"
2344 "\t" " lwl $t8, 0x2B($a1)" "\n"
2345 "\t" " lwr $t8, 0x28($a1)" "\n"
2346 "\t" " lwl $t9, 0x2F($a1)" "\n"
2347 "\t" " lwr $t9, 0x2C($a1)" "\n"
2348 "\t" " addiu $a3, $a3, -0x1" "\n"
2349 "\t" " sw $v0, 0x0($a0)" "\n"
2350 "\t" " sw $v1, 0x4($a0)" "\n"
2351 "\t" " sw $t0, 0x8($a0)" "\n"
2352 "\t" " sw $t1, 0xC($a0)" "\n"
2353 "\t" " sw $t2, 0x10($a0)" "\n"
2354 "\t" " sw $t3, 0x14($a0)" "\n"
2355 "\t" " sw $t4, 0x18($a0)" "\n"
2356 "\t" " sw $t5, 0x1C($a0)" "\n"
2357 "\t" " sw $t6, 0x20($a0)" "\n"
2358 "\t" " sw $t7, 0x24($a0)" "\n"
2359 "\t" " sw $t8, 0x28($a0)" "\n"
2360 "\t" " sw $t9, 0x2C($a0)" "\n"
2361 "\t" " addiu $a1, $a1, 0x30" "\n"
2362 "\t" " bnez $a3, .Loptimized_memcpy_11" "\n"
2363 "\t" " addiu $a0, $a0, 0x30" "\n"
2364 "\t" ".Loptimized_memcpy_12:" "\n"
2365 "\t" " andi $v1, $a2, 0x3" "\n"
2366 "\t" " beqz $v1, .Loptimized_memcpy_14" "\n"
2368 "\t" ".Loptimized_memcpy_13:" "\n"
2369 "\t" " lb $v0, 0x0($a1)" "\n"
2370 "\t" " addiu $v1, $v1, -0x1" "\n"
2371 "\t" " sb $v0, 0x0($a0)" "\n"
2372 "\t" " addiu $a1, $a1, 0x1" "\n"
2373 "\t" " bnez $v1, .Loptimized_memcpy_13" "\n"
2374 "\t" " addiu $a0, $a0, 0x1" "\n"
2375 "\t" ".Loptimized_memcpy_14:" "\n"
2376 "\t" " addu $v0, $a2, $zero" "\n"
2379 "\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 sceCdPowerOff(u32 *result)
int sceCdDoesUniqueKeyExist(u32 *status)
int sceCdReadDvdDualInfo(int *on_dual, unsigned int *layer1_start)
int sceCdReadGUID(u64 *guid)
int sceCdChangeThreadPriority(int priority)
int sceCdDiskReady(int mode)
int sceCdRM(char *buffer, u32 *status)
u32 sceCdPosToInt(sceCdlLOCCD *p)
int sceCdLayerSearchFile(sceCdlFILE *fp, const char *path, int layer)
int sceCdReadClock(sceCdCLOCK *clock)
u32 sceCdGetReadPos(void)
int sceCdGetDiskType(void)
int sceCdMmode(int media)
int sceCdApplySCmd(u8 cmdNum, const void *inBuff, u16 inBuffSize, void *outBuff)
int sceCdSetTimeout(int param, int timeout)
int sceCdRI(u8 *buffer, u32 *result)
int sceCdApplyNCmd(u8 cmdNum, const void *inBuff, u16 inBuffSize)
int sceCdRE(unsigned int lsn, unsigned int sectors, void *buf, sceCdRMode *mode)
int sceCdTrayReq(int param, u32 *traychk)
int sceCdCtrlADout(int mode, u32 *status)