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;
417static unsigned int read_timeout_alarm_cb(
void *userdata)
423 read_timeout = sys_clock->lo / 0x9000;
424 KPRINTF(
"Read Time Out %d(msec)\n", read_timeout);
425 sceCdSC(0xFFFFFFEE, &read_timeout);
441 g_cdvdfsv_read_timeout.hi = 0;
442 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
443 g_cdvdfsv_iomrsdd.src = &g_cdvdfsv_readpos;
444 g_cdvdfsv_iomrsdd.size =
sizeof(g_cdvdfsv_readpos);
445 g_cdvdfsv_iomrsdd.attr = 0;
446 g_cdvdfsv_iomrsdd.dest = (
void *)inbuf->m_pkt_0D.m_eedest;
449 "sceCdReadIOPm addr= 0x%08x sector= %d\n",
450 (
unsigned int)(uiptr)(inbuf->m_pkt_0D.m_buf),
451 (
int)(inbuf->m_pkt_0D.m_sectors));
453 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);
460 trid = sceSifSetDma(&g_cdvdfsv_iomrsdd, 1);
467 while ( cdvdfsv_checkdmastat(trid) >= 0 )
471 if ( error_code !=
SCECdErNO || !cmd_error )
474 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
475 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
479static u8 cdvdfsv_syncdec(
int flag,
int xorkey,
int arg2, u8 data)
481 return flag ? (((data << (arg2 % 8)) | (data >> (8 - arg2 % 8))) ^ xorkey) : data;
484static int cdvdfsv_cb_read(
void)
486 iSetEventFlag(g_cdvdman_intr_evfid, 0x20);
490static int cdvdfsv_checksid(u32 lsn, u32 sectors, u32 ps2dvd,
void *buf,
int decflag,
int decshift, u32 *syncdec_mask)
503 scret = decflag ? sceCdSC(0xFFFFFFE8, &scres) : 0;
505 for ( i = 0; i < sectors; i += 1 )
509 syncdec = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[3]);
510 syncdec += cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[2]) << 8;
511 syncdec += cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[1]) << 16;
512 syncdec_4 = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x810))[0]);
513 if ( i && !*syncdec_mask )
515 ipi_emu = syncdec_4 & 0xC;
519 *syncdec_mask = syncdec_4 & 0xC;
521 readlsn = syncdec - 0x30000;
523 g_cdvdman_istruct_ptr->m_opo_or_para && (lsn + i) >= g_cdvdman_istruct_ptr->m_layer_1_lsn
524 && g_cdvdman_istruct_ptr->m_opo_or_para == 1 )
526 readlsn += g_cdvdman_istruct_ptr->m_layer_1_lsn;
531 rpos.
minute = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[0]);
532 rpos.
second = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[1]);
533 rpos.
sector = cdvdfsv_syncdec(decflag, scret, decshift, ((u8 *)buf + (i * 0x924))[2]);
536 if ( readlsn != (lsn + i) || ipi_emu )
541 "Read_EE Sector_ID error lsn= %d readlsn= %d layer= %d layer1_start %d ipi_emu %d\n",
545 (
int)(g_cdvdman_istruct_ptr->m_layer_1_lsn),
553 1,
"Read_EE NO_Data_zone error lsn= %d layer= %d SecID %02x\n", (
int)lsn, (syncdec_4 & 1), (
int)(*syncdec_mask));
562 u32 sector_size_selection,
563 int do_multi_retries,
564 int enable_dec_shift,
588 int nsec_div_cdvdfsv_sectors;
594 sector_sizes[0] = 0x924;
595 sector_sizes[1] = 0x810;
596 g_cdvdfsv_read_timeout.hi = 0;
597 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
599 g_cdvdfsv_r2retry = 0;
600 g_cdvdfsv_r2count = 0;
601 if ( secsize != 0x924 && !fssift )
603 for ( i = 0; i < (
unsigned int)g_cdvdfsv_sectors; i += 1 )
605 g_cdvdfsv_multi_dmat[i].attr = 0;
606 g_cdvdfsv_multi_dmat[i].size = secsize;
610 VERBOSE_KPRINTF(1,
"lsn= %d nsec= %d ee_addr= %08x fssift= %d secsize= %d\n", lsn, nsec, ee_addr, fssift, secsize);
611 sector_size = sector_sizes[sector_size_selection];
616 csec = (nsec <= (u32)g_cdvdfsv_sectors) ? nsec : (u32)g_cdvdfsv_sectors;
617#ifdef CDVD_VARIANT_OSD
618 if ( !g_cdvdfsv_sectors )
621 nsec_div_cdvdfsv_sectors = (nsec / g_cdvdfsv_sectors) + (!!((nsec & 0xF)));
623 ee_addr_tmp = ee_addr;
624 dmasize_tmp = dmasize;
625 g_cdvdman_istruct_ptr->m_dec_mode_set = 1;
626 g_cdvdman_istruct_ptr->m_dec_mode_last_set = 0;
628 if ( enable_dec_shift )
630 g_cdvdman_istruct_ptr->m_dec_shift = dec_shift;
631 g_cdvdman_istruct_ptr->m_dec_state = 2;
633 if ( g_cdvdfsv_r2retry )
635 VERBOSE_KPRINTF(1,
"Rty_Read\n");
636 read_res_tmp = (sector_size_selection ?
sceCdRV : sceCdRead0)(
637 (lsn >= (u32)(6 * g_cdvdfsv_sectors)) ? (lsn - g_cdvdfsv_sectors * g_cdvdfsv_r2retry) :
638 (lsn + g_cdvdfsv_sectors * g_cdvdfsv_r2retry + 6 * g_cdvdfsv_sectors),
640 &g_cdvdfsv_rtocbuf[0x1248],
648 read_res_tmp = (sector_size_selection ?
sceCdRV : sceCdRead0)(
649 lsn, nsec, &g_cdvdfsv_rtocbuf[0x1248], mode, csec, cdvdfsv_cb_read);
653 SetAlarm(&g_cdvdfsv_read_timeout, read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
661 g_cdvdman_istruct_ptr->m_dec_state = 0;
662 g_cdvdman_istruct_ptr->m_dec_mode_set = 0;
663 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
667 g_cdvdfsv_r2retry -= 1;
669 for ( i = 0; (int)i < nsec_div_cdvdfsv_sectors; i += 1 )
672 if ( g_cdvdman_istruct_ptr->m_dec_mode_last_set )
676 if ( cdvdfsv_checksid(
679 sector_size_selection,
680 &g_cdvdfsv_rtocbuf[0x1248],
685 if ( do_multi_retries && syncdec_mask && !i )
691 else if ( do_multi_retries )
696 if ( retry_flag1 || g_cdvdfsv_r2retry )
699 else if ( secsize == 0x924 && !sector_size_selection )
705 optimized_memcpy(&g_cdvdfsv_rtocbuf[secsize], &g_cdvdfsv_rtocbuf[fssift], secsize - fssift);
706 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[secsize + secsize * csec], secsize);
707 g_cdvdfsv_rdp2sdd.size =
708 ((int)i == nsec_div_cdvdfsv_sectors - 1) ? dmasize_tmp : (secsize * (csec - 1) + fssift);
710 &g_cdvdfsv_rtocbuf[secsize + secsize - fssift],
711 &g_cdvdfsv_rtocbuf[secsize * 2],
712 g_cdvdfsv_rdp2sdd.size);
716 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[secsize * 2 + secsize * (csec - 1)], secsize);
717 g_cdvdfsv_rdp2sdd.size = ((int)i == nsec_div_cdvdfsv_sectors - 1) ? dmasize_tmp : (secsize * (csec - 1));
719 &g_cdvdfsv_rtocbuf[secsize], &g_cdvdfsv_rtocbuf[secsize * 2 + fssift], g_cdvdfsv_rdp2sdd.size);
721 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[secsize];
725 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[secsize * 2];
726 g_cdvdfsv_rdp2sdd.size = secsize * csec;
728 g_cdvdfsv_rdp2sdd.attr = 0;
729 g_cdvdfsv_rdp2sdd.dest = ee_addr_tmp;
730 ee_addr_tmp += g_cdvdfsv_rdp2sdd.size;
731 dmasize_tmp -= g_cdvdfsv_rdp2sdd.size;
735 trid = sceSifSetDma(&g_cdvdfsv_rdp2sdd, 1);
741 while ( cdvdfsv_checkdmastat(trid) >= 0 )
746 for ( j = 0; j < csec; j += 1 )
748 g_cdvdfsv_multi_dmat[j].dest = &ee_addr[(csec_comm + j) * secsize];
749 g_cdvdfsv_multi_dmat[j].src = &g_cdvdfsv_rtocbuf[0x1248 + (j * sector_size) + 12];
754 trid = sceSifSetDma(g_cdvdfsv_multi_dmat, csec);
760 while ( cdvdfsv_checkdmastat(trid) >= 0 )
765 size_2 = ((int)i != nsec_div_cdvdfsv_sectors - 1) ? fssift : secsize;
766 g_cdvdfsv_rdp2sdd.size = dmasize_tmp;
769 optimized_memcpy(&g_cdvdfsv_rtocbuf[0x924], &g_cdvdfsv_rtocbuf[fssift + 12], secsize - fssift);
770 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[0x1248 + (csec - 1) * sector_size], sector_size);
771 for ( j = 0; j < csec - 1; j += 1 )
774 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + (j * secsize)],
775 &g_cdvdfsv_rtocbuf[0x1248 + 12 + (j * sector_size)],
779 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + ((csec - 1) * secsize)],
780 &g_cdvdfsv_rtocbuf[0x1248 + 12 + ((csec - 1) * sector_size)],
782 if ( (
int)i != nsec_div_cdvdfsv_sectors - 1 )
784 g_cdvdfsv_rdp2sdd.size = secsize * csec;
789 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[0x1248 + (csec - 1) * sector_size], sector_size);
790 optimized_memcpy(&g_cdvdfsv_rtocbuf[0x924], &g_cdvdfsv_rtocbuf[0x1248 + fssift + 12], secsize - fssift);
791 for ( j = 0; j < csec - 2; j += 1 )
794 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + (j * secsize)],
795 &g_cdvdfsv_rtocbuf[0x1248 + sector_size + 12 + (j * sector_size)],
799 &g_cdvdfsv_rtocbuf[0x924 + secsize - fssift + ((csec - 2) * secsize)],
800 &g_cdvdfsv_rtocbuf[0x1248 + sector_size + 12 + ((csec - 2) * sector_size)],
802 if ( (
int)i != nsec_div_cdvdfsv_sectors - 1 )
804 g_cdvdfsv_rdp2sdd.size = secsize * (csec - 1);
807 g_cdvdfsv_rdp2sdd.src = &g_cdvdfsv_rtocbuf[0x924];
808 g_cdvdfsv_rdp2sdd.attr = 0;
809 g_cdvdfsv_rdp2sdd.dest = ee_addr_tmp;
810 ee_addr_tmp += g_cdvdfsv_rdp2sdd.size;
811 dmasize_tmp -= g_cdvdfsv_rdp2sdd.size;
815 trid = sceSifSetDma(&g_cdvdfsv_rdp2sdd, 1);
821 while ( cdvdfsv_checkdmastat(trid) >= 0 )
830 if ( (
int)i == nsec_div_cdvdfsv_sectors - 1 )
837 csec = ((
unsigned int)csec > nsec - (
unsigned int)csec_comm) ? (nsec - (
unsigned int)csec_comm) :
838 (
unsigned int)g_cdvdfsv_sectors;
839 ClearEventFlag(g_cdvdman_intr_evfid, ~0x20);
840 dmac_ch_set_chcr(3, 0);
842 g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_maddress = &g_cdvdfsv_rtocbuf[0x1248];
843 dmac_ch_set_madr(3, (uiptr)(&g_cdvdfsv_rtocbuf[0x1248]));
846 g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_blkwords
847 | ((g_cdvdman_istruct_ptr->m_dma3_param.m_dma3_blkcount * csec) << 16));
848 dmac_ch_set_chcr(3, 0x41000200);
849 chcr = dmac_ch_get_chcr(3);
852 g_cdvdfsv_readpos += secsize * csec;
853 sceSifSetDma(post_dmat, 1);
859 CancelAlarm(read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
860 g_cdvdman_istruct_ptr->m_dec_mode_set = 0;
861 g_cdvdman_istruct_ptr->m_dec_state = 0;
863 if ( (u16)g_cdvdman_istruct_ptr->m_dec_mode_last_set )
867 mode->spindlctrl = 16;
869 if ( error_code !=
SCECdErNO || g_cdvdfsv_r2count >= 5 )
875 sceCdSC(0xFFFFFFFE, &error_code_tmp);
876 VERBOSE_KPRINTF(1,
"secid_chk_ee_trns lsn %d nsec %d IPI Err\n", lsn, nsec);
879 if ( !g_cdvdfsv_r2retry )
881 g_cdvdfsv_r2count += 1;
882 VERBOSE_PRINTF(1,
"Read_CD/DVD-ROM Error Recover Start\n");
883 g_cdvdfsv_r2retry = g_cdvdfsv_r2retry_initval;
886 if ( g_cdvdfsv_r2count >= 5 && error_code ==
SCECdErNO )
888 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
900 int dec_shift_enable,
909 g_cdvdfsv_read_timeout.hi = 0;
910 g_cdvdfsv_read_timeout.lo = 0x9000 * sceCdSC(0xFFFFFFF1, &scres_unused);
912 g_cdvdfsv_sid_err_recover_cnt = 0;
913 g_cdvdfsv_err_count = 0;
920 if ( dec_shift_enable )
922 g_cdvdman_istruct_ptr->m_dec_shift = dec_shift_value;
923 g_cdvdman_istruct_ptr->m_dec_state = 2;
925 cmd_error = (ps2dvd ?
sceCdRV : sceCdRead0)(
926 (lsn >= 0x30) ? (lsn - 0x10 * g_cdvdfsv_sid_err_recover_cnt) : (lsn + 0x10 * g_cdvdfsv_sid_err_recover_cnt),
934 SetAlarm(&g_cdvdfsv_read_timeout, read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
936 CancelAlarm(read_timeout_alarm_cb, &g_cdvdfsv_read_timeout);
937 g_cdvdman_istruct_ptr->m_dec_state = 0;
939 if ( error_code !=
SCECdErNO || !cmd_error || g_cdvdfsv_err_count >= 5 )
941 VERBOSE_KPRINTF(1,
"Read error error code %x cmd error %d\n", error_code, cmd_error);
942 if ( (!cmd_error || g_cdvdfsv_err_count >= 5) && error_code ==
SCECdErNO )
944 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
948 if ( cdvdfsv_checksid(lsn, nsec, ps2dvd, retptr, dec_shift_enable, dec_shift_value, &syncdec_mask) )
950 if ( enable_retries && syncdec_mask )
954 if ( !enable_retries )
956 if ( !g_cdvdfsv_sid_err_recover_cnt )
958 g_cdvdfsv_err_count += 1;
959 VERBOSE_PRINTF(1,
"Read_CD/DVD-ROM Sector_ID Error Recover Start\n");
960 g_cdvdfsv_sid_err_recover_cnt = 3;
962 g_cdvdfsv_sid_err_recover_cnt -= 1;
966 sceCdSC(0xFFFFFFFE, &error_code_tmp);
967 VERBOSE_KPRINTF(1,
"secid_chk lsn %d nsec %d IPI Err\n", lsn, nsec);
971static void cdvdfsv_rpc5_01_readee(
974 unsigned int secsize;
976 unsigned int bsize_tmp;
986 unsigned int buf_offs_sum;
990 unsigned int len2_plus_sec2;
1000 sector_sizes[0] = 0x924;
1001 sector_sizes[1] = 0x810;
1002 g_cdvdfsv_rmodeee = inbuf->m_pkt_01.m_rmodeee;
1003 lsndualchg_res = inbuf->m_pkt_01.m_lbn;
1004 decval = decflag ? inbuf->m_pkt_01.m_decval : 0;
1005 g_cdvdfsv_eerpsdd.src = &g_cdvdfsv_readpos;
1006 g_cdvdfsv_eerpsdd.size =
sizeof(g_cdvdfsv_readpos);
1007 g_cdvdfsv_eerpsdd.attr = 0;
1008 g_cdvdfsv_eerpsdd.dest = (
void *)inbuf->m_pkt_01.m_eedest;
1011 if ( !sceCdSC(0xFFFFFFEA, &scres_unused) )
1014 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1024 lsndualchg_res = sceCdSC(0xFFFFFFE9, &lsndualchg_res);
1026 datapattern = SCECdSecS2048;
1033 switch ( datapattern )
1048 len2_plus_sec2 = lsndualchg_res + inbuf->m_pkt_01.m_sectors;
1053 all_sec_bytes = secsize * inbuf->m_pkt_01.m_sectors;
1054 if ( g_cdvdfsv_spinctl != -1 )
1055 g_cdvdfsv_rmodeee.
spindlctrl = g_cdvdfsv_spinctl;
1056 paddr = inbuf->m_pkt_01.m_paddr;
1057 saddr = (paddr + all_sec_bytes) & ~0x3F;
1058 psize = ((paddr & 0x3F)) ? ((paddr & ~0x3F) - (paddr - 0x40)) : 0;
1059 bsize = saddr - (paddr + psize);
1060 ssize = paddr + all_sec_bytes - saddr;
1061 VERBOSE_KPRINTF(1,
"CD/DVD-ROM lsn= %d sec= %d\n", lsndualchg_res, inbuf->m_pkt_01.m_sectors);
1062 VERBOSE_KPRINTF(1,
"f psize= %d bsize= %d ssize= %d\n", psize, bsize, ssize);
1068 sectors = (len2_plus_sec2 < lsndualchg_res + buf_offs_sum / secsize + 2) ? 1 : 2;
1071 "0 CD_READ LBN= %d sectors= %d all= %d\n",
1072 (
int)(lsndualchg_res + buf_offs_sum / secsize),
1074 (
int)inbuf->m_pkt_01.m_sectors);
1076 lsndualchg_res + buf_offs_sum / secsize,
1091 if ( datapattern != SCECdSecS2340 || ps2dvd )
1096 for ( i = 0; i < psize; i += 1 )
1098 rtoc_ind += (i && !(i % secsize)) ? (sector_sizes[ps2dvd] - secsize) : 0;
1099 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[rtoc_ind + i];
1104 for ( i = 0; i < psize; i += 1 )
1105 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[i];
1107 buf_offs_sum += psize;
1111 for ( i = 0; i < bsize; i += sizestuff )
1113 u32 offs_sector_only;
1115 bsize_tmp = bsize - i;
1116 if ( g_cdvdfsv_spinctl != -1 )
1117 g_cdvdfsv_rmodeee.
spindlctrl = g_cdvdfsv_spinctl;
1118 offs_sector_only = lsndualchg_res + buf_offs_sum / secsize;
1119 if ( (
unsigned int)(secsize << 6) >= bsize_tmp )
1121 needed_offset = (bsize_tmp / secsize) + (!!(bsize_tmp % secsize));
1122 sizestuff = bsize_tmp;
1126 needed_offset = (((offs_sector_only & 0xF)) && (!(secsize & 0xF))) ? (0x10 - (offs_sector_only & 0xF)) : 0x40;
1127 sizestuff = secsize * needed_offset;
1129 needed_offset += !!((buf_offs_sum + i) % secsize);
1130 if ( len2_plus_sec2 < offs_sector_only + needed_offset )
1131 needed_offset = len2_plus_sec2 - (lsndualchg_res + (buf_offs_sum + i) / secsize);
1132 g_cdvdfsv_readpos = buf_offs_sum + i;
1141 (
char *)(inbuf->m_pkt_01.m_paddr + psize) + i,
1142 (buf_offs_sum + i) % secsize,
1145 &g_cdvdfsv_eerpsdd) )
1151 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1154 trid = sceSifSetDma(&g_cdvdfsv_eerpsdd, 1);
1159 if ( !early_break && ssize )
1162 unsigned int buf_offs_sum_bytes_in_sector;
1164 buf_offs_sum_bytes_in_sector = buf_offs_sum % secsize;
1165 sectors_1 = (len2_plus_sec2 < lsndualchg_res + buf_offs_sum / secsize + 2) ? 1 : 2;
1167 1,
"2 CD_READ LBN= %d sectors= %d\n", (
int)(lsndualchg_res + buf_offs_sum / secsize), (
int)sectors_1);
1169 lsndualchg_res + buf_offs_sum / secsize,
1182 if ( datapattern != SCECdSecS2340 || ps2dvd )
1187 for ( i = 0; i < ssize; i += 1 )
1190 ((i + buf_offs_sum_bytes_in_sector)
1191 && (i % secsize) == (secsize - (buf_offs_sum_bytes_in_sector ? buf_offs_sum_bytes_in_sector : secsize))) ?
1192 (sector_sizes[ps2dvd] - secsize) :
1194 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[buf_offs_sum_bytes_in_sector + i2_offs + i];
1199 for ( i = 0; i < ssize; i += 1 )
1200 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[buf_offs_sum_bytes_in_sector + i];
1202 buf_offs_sum += ssize;
1205 g_cdvdfsv_eereadx.m_b1len = psize;
1206 g_cdvdfsv_eereadx.m_b2len = ssize;
1207 g_cdvdfsv_eereadx.m_b1dst = paddr;
1208 g_cdvdfsv_eereadx.m_b2dst = saddr;
1210 1,
"b psize= %d paddr= %08x bsize= %d ssize= %d saddr %08x\n", (
int)psize, paddr, (
int)bsize, (
int)ssize, saddr);
1211 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1213 g_cdvdfsv_datasdd.src = &g_cdvdfsv_eereadx;
1214 g_cdvdfsv_datasdd.size =
sizeof(g_cdvdfsv_eereadx);
1215 g_cdvdfsv_datasdd.attr = 0;
1216 g_cdvdfsv_readpos = buf_offs_sum;
1217 g_cdvdfsv_datasdd.dest = (
void *)inbuf->m_pkt_01.m_eeremaindest;
1221 trid = sceSifSetDma(&g_cdvdfsv_datasdd, 1);
1222 sceSifSetDma(&g_cdvdfsv_eerpsdd, 1);
1228 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1230 g_cdvdfsv_spinctl = -1;
1231 VERBOSE_PRINTF(1,
"read end\n");
1232 outbuf->m_retres = buf_offs_sum;
1236cdvdfsv_chreadee(
int secoffs,
int seccount,
char *ee_addr,
const sceCdRMode *in_rmode, u32 disktype_14,
int sync)
1238 unsigned int secsize;
1245 lsndualchg_res = secoffs;
1249 if ( !sceCdSC(0xFFFFFFEA, &scres_unused) )
1252 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1256 lsndualchg_res = sceCdSC(0xFFFFFFE9, &lsndualchg_res);
1276 for ( i = 0; i < (
unsigned int)(secsize * seccount); i += readsize_bytes )
1278 unsigned int bytescount;
1279 int sectors_partial;
1280 int bytescount_in_sectors;
1282 bytescount = (
unsigned int)(secsize * seccount) - i;
1283 sectors_partial = (lsndualchg_res + i / secsize) & 0xF;
1284 bytescount_in_sectors = 0x10;
1285 readsize_bytes = secsize * bytescount_in_sectors;
1286 if ( (
unsigned int)readsize_bytes >= bytescount )
1288 bytescount_in_sectors = (bytescount / secsize) + (!!(bytescount % secsize));
1289 readsize_bytes = bytescount;
1291 else if ( sectors_partial && !(secsize & 0xF) )
1293 bytescount_in_sectors -= sectors_partial;
1296 lsndualchg_res + i / secsize,
1297 bytescount_in_sectors,
1331 g_cdvdfsv_readpos = 0;
1332 g_cdvdman_istruct_ptr->m_break_cdvdfsv_readchain = 0;
1333 g_cdvdfsv_chrdsdd.src = &g_cdvdfsv_readpos;
1334 g_cdvdfsv_chrdsdd.size =
sizeof(g_cdvdfsv_readpos);
1335 g_cdvdfsv_chrdsdd.attr = 0;
1336 g_cdvdfsv_chrdsdd.dest = (
void *)inbuf->m_pkt_0F.m_eedest;
1337 switch ( inbuf->m_pkt_0F.m_mode.datapattern )
1340 sector_size = 0x918;
1343 sector_size = 0x924;
1347 sector_size = 0x800;
1350 chain = inbuf->m_pkt_0F.m_readChain;
1351 for ( i = 0; i < 0x40; i += 1 )
1353 if ( g_cdvdman_istruct_ptr->m_break_cdvdfsv_readchain )
1355 VERBOSE_PRINTF(1,
"ReadChain cnt %d on sceCdBreak()\n", (
int)i);
1358 if ( chain[i].lbn == 0xFFFFFFFF || chain[i].sectors == 0xFFFFFFFF || chain[i].buffer == 0xFFFFFFFF )
1360 if ( (chain[i].buffer & 1) )
1362 buf = (
void *)(chain[i].buffer & ~1);
1365 "ReadChain lsn= %d nsec= %d buf= %08x secsize= %d\n",
1366 (
int)(chain[i].lbn),
1367 (
int)(chain[i].sectors),
1368 (
unsigned int)(uiptr)buf,
1369 inbuf->m_pkt_0F.m_mode.datapattern);
1370 re_result =
sceCdRE(chain[i].lbn, chain[i].sectors, buf, (
sceCdRMode *)&(inbuf->m_pkt_0F.m_mode));
1371 if ( re_result == 1 )
1378 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1385 1,
"ReadChain EE\t Memory addr= 0x%08x sector= %d\n", (
unsigned int)(chain[i].lbn), (
int)(chain[i].sectors));
1387 re_result = cdvdfsv_chreadee(
1390 (
char *)chain[i].buffer,
1391 &(inbuf->m_pkt_0F.m_mode),
1393 !sceCdSC(0xFFFFFFFC, &scres_unused));
1397 VERBOSE_PRINTF(1,
"ReadChain error code= 0x%02x\n",
sceCdGetError());
1400 g_cdvdfsv_readpos += chain[i].sectors * sector_size;
1404 trid = sceSifSetDma(&g_cdvdfsv_chrdsdd, 1);
1410 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1415#ifdef CDVD_VARIANT_OSD
1419 unsigned int buf_1_toalign;
1420 unsigned int buf_offs_mod_sector_size;
1421 unsigned int buf_aligned;
1431 unsigned int buf_offs;
1432 unsigned int buf_toalign;
1433 unsigned int buf_sec_tmp;
1440 all_sec_bytes = 0x810 * inbuf->m_pkt_03.m_nsectors;
1441 buf_toalign = ((inbuf->m_pkt_03.m_buf & 0x3F)) ? (inbuf->m_pkt_03.m_buf & ~0x3F) - (inbuf->m_pkt_03.m_buf - 0x40) : 0;
1442 buf_1_toalign = (inbuf->m_pkt_03.m_buf + all_sec_bytes) & ~0x3F;
1443 buf_sec_tmp = all_sec_bytes - (buf_1_toalign - inbuf->m_pkt_03.m_buf);
1446 lbn = inbuf->m_pkt_03.m_lbn + buf_offs / 0x810;
1447 sectors = 1 + (!!((inbuf->m_pkt_03.m_lbn + inbuf->m_pkt_03.m_nsectors) >= (
unsigned int)(lbn + 2)));
1448 VERBOSE_PRINTF(1,
"0 CD_READ LBN= %d sectors= %d all= %d\n", lbn, (
int)sectors, (
int)inbuf->m_pkt_03.m_nsectors);
1449 cmd_error = sceCdReadDVDV(lbn, sectors, g_cdvdfsv_fsvrbuf[0], (
sceCdRMode *)&inbuf->m_pkt_03.m_mode);
1452 if ( error_code !=
SCECdErNO || !cmd_error )
1455 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1456 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1459 for ( i = 0; i < buf_toalign; i += 1 )
1460 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_fsvrbuf[0][i];
1461 buf_offs += buf_toalign;
1463 if ( error_code ==
SCECdErNO && cmd_error )
1466 unsigned int sector_count_in_bytes;
1468 buf_offs_mod_sector_size = 0;
1472 for ( buf_aligned = inbuf->m_pkt_03.m_buf + buf_toalign; buf_aligned < buf_1_toalign;
1473 buf_aligned += sector_count_in_bytes )
1475 unsigned int buf_align_remain;
1477 buf_align_remain = buf_1_toalign - buf_aligned;
1478 buf_offs_mod_sector_size = (buf_aligned - inbuf->m_pkt_03.m_buf) % 0x810;
1479 sector_count_in_bytes = (0x8100 >= buf_align_remain) ? buf_align_remain : 0x8100;
1480 sectors = (0x8100 >= buf_align_remain) ? (buf_align_remain / 0x810 + (!!(buf_align_remain % 0x810))) : 16;
1481 sectors += !!buf_offs_mod_sector_size;
1482 lbn = inbuf->m_pkt_03.m_lbn + (buf_aligned - inbuf->m_pkt_03.m_buf) / 0x810;
1483 if ( sectors > (inbuf->m_pkt_03.m_lbn + inbuf->m_pkt_03.m_nsectors) - lbn )
1484 sectors = (inbuf->m_pkt_03.m_lbn + inbuf->m_pkt_03.m_nsectors) - lbn;
1485 cmd_error = sceCdReadDVDV(lbn, sectors, g_cdvdfsv_fsvrbuf[readbuf], (
sceCdRMode *)&inbuf->m_pkt_03.m_mode);
1488 if ( buf_offs_mod_sector_size )
1490 g_cdvdfsv_fsvrbuf[readbuf ^ 1], &g_cdvdfsv_fsvrbuf[readbuf ^ 1][buf_offs_mod_sector_size], cpysize);
1491 g_cdvdfsv_readdvdv_dmat.dest = (
void *)(buf_aligned - cpysize);
1492 g_cdvdfsv_readdvdv_dmat.size = cpysize;
1493 g_cdvdfsv_readdvdv_dmat.attr = 0;
1494 g_cdvdfsv_readdvdv_dmat.src = g_cdvdfsv_fsvrbuf[readbuf ^ 1];
1498 trid = sceSifSetDma(&g_cdvdfsv_readdvdv_dmat, 1);
1504 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1509 if ( error_code !=
SCECdErNO || !cmd_error )
1512 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1513 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1518 cpysize = sector_count_in_bytes;
1519 buf_offs += sector_count_in_bytes;
1522 if ( error_code ==
SCECdErNO && cmd_error )
1524 if ( buf_offs_mod_sector_size )
1526 g_cdvdfsv_fsvrbuf[readbuf ^ 1], &g_cdvdfsv_fsvrbuf[readbuf ^ 1][buf_offs_mod_sector_size], cpysize);
1527 g_cdvdfsv_readdvdv_dmat.dest = (
void *)buf_aligned;
1528 g_cdvdfsv_readdvdv_dmat.size = cpysize;
1529 g_cdvdfsv_readdvdv_dmat.attr = 0;
1530 g_cdvdfsv_readdvdv_dmat.src = g_cdvdfsv_fsvrbuf[readbuf ^ 1];
1534 trid = sceSifSetDma(&g_cdvdfsv_readdvdv_dmat, 1);
1540 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1544 lbn = inbuf->m_pkt_03.m_lbn + buf_offs / 0x810;
1545 sectors = 1 + (!!((inbuf->m_pkt_03.m_lbn + inbuf->m_pkt_03.m_nsectors) >= (
unsigned int)(lbn + 2)));
1546 VERBOSE_PRINTF(1,
"2 CD_READ LBN= %d sectors= %d\n", lbn, (
int)sectors);
1547 cmd_error = sceCdReadDVDV(lbn, sectors, g_cdvdfsv_fsvrbuf[0], (
sceCdRMode *)&inbuf->m_pkt_03.m_mode);
1550 if ( error_code !=
SCECdErNO || !cmd_error )
1553 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1554 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1557 for ( i = 0; i < buf_sec_tmp; i += 1 )
1558 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_fsvrbuf[0][(buf_offs % 0x810) + i];
1559 buf_offs += buf_sec_tmp;
1562 g_cdvdfsv_eereadx.m_b1len = buf_toalign;
1563 g_cdvdfsv_eereadx.m_b2len = buf_sec_tmp;
1564 g_cdvdfsv_eereadx.m_b1dst = inbuf->m_pkt_03.m_buf;
1565 g_cdvdfsv_eereadx.m_b2dst = buf_1_toalign;
1566 g_cdvdfsv_readdvdv_dmat.src = &g_cdvdfsv_eereadx;
1567 g_cdvdfsv_readdvdv_dmat.size =
sizeof(g_cdvdfsv_eereadx);
1568 g_cdvdfsv_readdvdv_dmat.attr = 0;
1569 g_cdvdfsv_readdvdv_dmat.dest = (
void *)inbuf->m_pkt_03.m_eedest;
1573 trid = sceSifSetDma(&g_cdvdfsv_readdvdv_dmat, 1);
1579 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1581 VERBOSE_PRINTF(1,
"read end\n");
1582 outbuf->m_retres = buf_offs;
1587static void cdvdfsv_rpc5_02_readcdda(
1591 unsigned int sector_size;
1593 unsigned int buf_1_toalign;
1601 unsigned int buf_offs;
1602 unsigned int buf_toalign;
1603 unsigned int buf_sec_tmp;
1605#ifndef CDVD_VARIANT_OSD
1611 g_cdvdfsv_eereadfull_dma2.src = &g_cdvdfsv_readpos;
1612 g_cdvdfsv_eereadfull_dma2.size =
sizeof(g_cdvdfsv_readpos);
1613 g_cdvdfsv_eereadfull_dma2.attr = 0;
1614 g_cdvdfsv_eereadfull_dma2.dest = (
void *)inbuf->m_pkt_02.m_eedest;
1618 sector_size = 0x940;
1623 sector_size = 0x930;
1627 all_sec_bytes = sector_size * inbuf->m_pkt_02.m_sectors;
1629 ((inbuf->m_pkt_02.m_buf & 0x3F)) ? ((inbuf->m_pkt_02.m_buf & ~0x3F) - (inbuf->m_pkt_02.m_buf - 0x40)) : 0;
1630 buf_1_toalign = (inbuf->m_pkt_02.m_buf + all_sec_bytes) & ~0x3F;
1631 buf_sec_tmp = all_sec_bytes - (buf_1_toalign - inbuf->m_pkt_02.m_buf);
1634 unsigned int buf_offs_sectors;
1636 buf_offs_sectors = buf_offs / sector_size;
1637 lbn = inbuf->m_pkt_02.m_lbn + buf_offs_sectors;
1638 sectors = 1 + !!((inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors) >= (
unsigned int)(lbn + 2));
1640 1,
"0 CD_READ LBN= %d sectors= %d all= %d\n", (
int)lbn, (
int)sectors, (
int)inbuf->m_pkt_02.m_sectors);
1641#ifdef CDVD_VARIANT_OSD
1642 cmd_error = do_read_full ?
sceCdReadFull(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode) :
1643 sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1645 cmd_error = sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1649 if ( error_code !=
SCECdErNO || !cmd_error )
1652 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1653 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1654 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1655 error_code_tmp = error_code;
1661 if ( error_code_tmp !=
SCECdErNO && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG )
1663 for ( i = 0; i < buf_toalign; i += 1 )
1665 g_cdvdfsv_eereadx.m_pbuf1[i] = g_cdvdfsv_rtocbuf[i];
1667 buf_offs += buf_toalign;
1670 if ( error_code_tmp !=
SCECdErNO && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG )
1672 unsigned int sector_count_in_bytes;
1673 unsigned int buf_aligned;
1675 for ( buf_aligned = inbuf->m_pkt_02.m_buf + buf_toalign; buf_aligned < buf_1_toalign;
1676 buf_aligned += sector_count_in_bytes )
1678 unsigned int buf_align_remain;
1679 unsigned int buf_offs_mod_sector_size;
1681 buf_align_remain = buf_1_toalign - buf_aligned;
1682 buf_offs_mod_sector_size = buf_offs % sector_size;
1683 lbn = inbuf->m_pkt_02.m_lbn + buf_offs / sector_size;
1684 sectors = (g_cdvdfsv_sectors_cdda * sector_size >= buf_align_remain) ?
1685 (buf_align_remain / sector_size) + (!!(buf_align_remain % sector_size)) :
1686 g_cdvdfsv_sectors_cdda;
1687 sectors += !!buf_offs_mod_sector_size;
1688 sector_count_in_bytes = (g_cdvdfsv_sectors_cdda * sector_size >= buf_align_remain) ?
1689 g_cdvdfsv_sectors_cdda * sector_size :
1691 if ( sectors > (inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors) - lbn )
1692 sectors = (inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors) - lbn;
1693 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1695#ifdef CDVD_VARIANT_OSD
1696 cmd_error = do_read_full ?
sceCdReadFull(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode) :
1697 sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1699 cmd_error = sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1703 if ( error_code !=
SCECdErNO || !cmd_error )
1706 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1707 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1708 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1710 error_code_tmp = error_code;
1714 if ( buf_offs_mod_sector_size )
1715 optimized_memcpy(g_cdvdfsv_rtocbuf, &g_cdvdfsv_rtocbuf[buf_offs_mod_sector_size], sector_count_in_bytes);
1716 g_cdvdfsv_eereadfull_dma1.src = g_cdvdfsv_rtocbuf;
1717 g_cdvdfsv_eereadfull_dma1.size = sector_count_in_bytes;
1718 g_cdvdfsv_eereadfull_dma1.attr = 0;
1719 g_cdvdfsv_eereadfull_dma1.dest = (
char *)buf_aligned;
1720 g_cdvdfsv_readpos = buf_offs;
1724 trid = sceSifSetDma(&g_cdvdfsv_eereadfull_dma1, 1);
1730 if ( (
unsigned int)buflen >= 0x19 )
1733 sceSifSetDma(&g_cdvdfsv_eereadfull_dma2, 1);
1736 buf_offs += sector_count_in_bytes;
1740 (error_code_tmp !=
SCECdErNO && error_code_tmp !=
SCECdErEOM && error_code_tmp != SCECdErSFRMTNG) && buf_sec_tmp )
1742 lbn = inbuf->m_pkt_02.m_lbn + buf_offs / sector_size;
1743 sectors = 1 + !!((inbuf->m_pkt_02.m_lbn + inbuf->m_pkt_02.m_sectors) >= (
unsigned int)(lbn + 2));
1746 "0 CD_READ LBN= %d sectors= %d all= %d\n",
1747 (
int)(inbuf->m_pkt_02.m_lbn + buf_offs / sector_size),
1749 (
int)inbuf->m_pkt_02.m_sectors);
1750 VERBOSE_PRINTF(1,
"2 CD_READ LBN= %d sectors= %d\n", (
int)lbn, (
int)sectors);
1751#ifdef CDVD_VARIANT_OSD
1752 cmd_error = do_read_full ?
sceCdReadFull(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode) :
1753 sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1755 cmd_error = sceCdReadCDDA(lbn, sectors, g_cdvdfsv_rtocbuf, (
sceCdRMode *)&inbuf->m_pkt_02.m_mode);
1759 if ( error_code !=
SCECdErNO || !cmd_error )
1762 sceCdSC(0xFFFFFFFE, &g_cdvdfsv_rderror);
1763 VERBOSE_PRINTF(1,
"Read error code %x cmd error %d\n", error_code, cmd_error);
1764 if ( error_code ==
SCECdErEOM || error_code == SCECdErSFRMTNG )
1765 error_code_tmp = error_code;
1769 for ( i = 0; i < buf_sec_tmp; i += 1 )
1771 g_cdvdfsv_eereadx.m_pbuf2[i] = g_cdvdfsv_rtocbuf[(buf_offs % sector_size) + i];
1773 buf_offs += buf_sec_tmp;
1775 g_cdvdfsv_eereadx.m_b1len = buf_toalign;
1776 g_cdvdfsv_eereadx.m_b2len = buf_sec_tmp;
1777 g_cdvdfsv_eereadx.m_b1dst = inbuf->m_pkt_02.m_buf;
1778 g_cdvdfsv_eereadx.m_b2dst = buf_1_toalign;
1779 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1781 g_cdvdfsv_eereadfull_dma1.src = &g_cdvdfsv_eereadx;
1782 g_cdvdfsv_eereadfull_dma1.size =
sizeof(g_cdvdfsv_eereadx);
1783 g_cdvdfsv_eereadfull_dma1.attr = 0;
1784 g_cdvdfsv_readpos = buf_offs;
1785 g_cdvdfsv_eereadfull_dma1.dest = (
void *)inbuf->m_pkt_02.m_eeremaindest;
1789 trid = sceSifSetDma(&g_cdvdfsv_eereadfull_dma1, 1);
1790 if ( (
unsigned int)buflen >= 0x19 )
1791 sceSifSetDma(&g_cdvdfsv_eereadfull_dma2, 1);
1797 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1800 sceCdSC(0xFFFFFFFE, &error_code_tmp);
1801 VERBOSE_PRINTF(1,
"read end\n");
1802 outbuf->m_retres = buf_offs;
1805static void *cbrpc_rpc2_diskready(
int fno,
void *buffer,
int length)
1811 VERBOSE_KPRINTF(1,
"DISK READY call 0x%02x\n",
sceCdStatus());
1814 return (
void *)&g_diskready_res;
1824 VERBOSE_PRINTF(1,
"GET TOC call 0x%08x\n", (
int)inbuf);
1825 outbuf->m_retres =
sceCdGetToc((u8 *)g_cdvdfsv_rtocbuf);
1826 VERBOSE_PRINTF(1,
"GET TOC called\n");
1827 g_cdvdfsv_rtocsdd.src = g_cdvdfsv_rtocbuf;
1828 g_cdvdfsv_rtocsdd.size = 0x810;
1829 g_cdvdfsv_rtocsdd.attr = 0;
1830 g_cdvdfsv_rtocsdd.dest = (
void *)inbuf->m_pkt_04.m_eedest;
1834 trid = sceSifSetDma(&g_cdvdfsv_rtocsdd, 1);
1840 while ( cdvdfsv_checkdmastat(trid) >= 0 )
1848 outbuf->m_pkt_04.m_isdvd = 1;
1851 outbuf->m_pkt_04.m_isdvd = 0;
1880 outbuf->m_retres = 0;
1881 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1883 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1884 outbuf->m_retres =
sceCdRI(outbuf->m_pkt_06.m_buffer, &outbuf->m_pkt_06.m_result);
1896 outbuf->m_retres = 0;
1897 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1899 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1900 outbuf->m_retres =
sceCdRM(outbuf->m_pkt_1A.m_buffer, &outbuf->m_pkt_1A.m_status);
1904#ifdef CDVD_VARIANT_DNAS
1913 outbuf->m_retres = 0;
1914 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1916 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1930 outbuf->m_retres = 0;
1931 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1933 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1941 if ( buflen == 4 || !inbuf->m_pkt_22.m_char4 )
1943 outbuf->m_retres =
sceCdMmode(inbuf->m_pkt_22.m_media);
1947#ifdef CDVD_VARIANT_XOSD
1951 VERBOSE_KPRINTF(1,
"EE call recv sceCdChgSys %d %08x\n", inbuf->m_pkt_2D.m_arg1, inbuf);
1952 outbuf->m_retres =
sceCdChgSys(inbuf->m_pkt_2D.m_arg1);
1964#ifdef CDVD_VARIANT_OSD
1972 outbuf->m_retres = 0;
1973 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1975 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1976 outbuf->m_retres =
sceCdWI(inbuf->m_pkt_07.m_buffer, &outbuf->m_pkt_07.m_status);
1981#ifdef CDVD_VARIANT_OSD
1989 outbuf->m_retres = 0;
1990 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
1992 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
1993 outbuf->m_retres =
sceCdWM(inbuf->m_pkt_1B.m_buffer, &outbuf->m_pkt_1B.m_status);
1998#ifdef CDVD_VARIANT_OSD
2007 outbuf->m_retres = 0;
2008 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2010 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2011 outbuf->m_retres =
sceCdReadConsoleID(outbuf->m_pkt_12.m_buffer, &outbuf->m_pkt_12.m_status);
2016#ifdef CDVD_VARIANT_OSD
2025 outbuf->m_retres = 0;
2026 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2028 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2029 outbuf->m_retres =
sceCdWriteConsoleID(inbuf->m_pkt_13.m_buffer, &outbuf->m_pkt_13.m_status);
2034#ifdef CDVD_VARIANT_OSD
2043 outbuf->m_retres = 0;
2044 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2046 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2047 outbuf->m_retres =
sceCdMV(outbuf->m_pkt_14.m_buffer, &outbuf->m_pkt_14.m_status);
2052#ifdef CDVD_VARIANT_OSD
2060 outbuf->m_retres = 0;
2061 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2063 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2064 outbuf->m_retres =
sceCdReadSUBQ(outbuf->m_pkt_17.m_buffer, &outbuf->m_pkt_17.m_status);
2069#ifdef CDVD_VARIANT_OSD
2078 outbuf->m_retres = 0;
2079 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2081 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2087#ifdef CDVD_VARIANT_OSD
2096 outbuf->m_retres = 0;
2097 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2099 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2105#ifdef CDVD_VARIANT_OSD
2113 outbuf->m_retres = 0;
2114 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2116 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2122#ifdef CDVD_VARIANT_OSD
2131 outbuf->m_retres = 0;
2132 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2134 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2148 outbuf->m_retres = 0;
2149 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2151 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2152 outbuf->m_retres =
sceCdPowerOff(&outbuf->m_pkt_21.m_result);
2156#ifdef CDVD_VARIANT_OSD
2164 outbuf->m_retres = 0;
2165 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2167 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2168 outbuf->m_retres =
sceCdBlueLEDCtl(inbuf->m_pkt_20.m_control, &outbuf->m_pkt_20.m_status);
2173#ifdef CDVD_VARIANT_OSD
2178 g_cdvdfsv_spinctl = inbuf->m_pkt_1D.m_spinctl;
2179 outbuf->m_retres = sceCdSC(0xFFFFFFF8, &g_cdvdfsv_spinctl);
2191 outbuf->m_retres = 0;
2192 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2194 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2195 outbuf->m_retres =
sceCdCtrlADout(inbuf->m_pkt_15.m_mode, &outbuf->m_pkt_15.m_status);
2199#ifdef CDVD_VARIANT_OSD
2207 outbuf->m_retres = 0;
2208 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2210 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2211 outbuf->m_retres =
sceCdAutoAdjustCtrl(inbuf->m_pkt_19.m_mode, &outbuf->m_pkt_19.m_status);
2216#ifdef CDVD_VARIANT_OSD
2225 outbuf->m_retres = 0;
2226 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2228 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2230 &outbuf->m_pkt_29.m_clock,
2231 &outbuf->m_pkt_29.m_userdata,
2232 &outbuf->m_pkt_29.m_wakeupreason,
2233 &outbuf->m_pkt_29.m_flags);
2238#ifdef CDVD_VARIANT_OSD
2246 outbuf->m_retres = 0;
2247 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2250 memcpy(&outbuf->m_pkt_28.m_clock, &inbuf->m_pkt_28.m_clock,
sizeof(
sceCdCLOCK));
2251 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2253 sceCdWriteWakeUpTime(&outbuf->m_pkt_28.m_clock, inbuf->m_pkt_28.m_userdata, inbuf->m_pkt_28.m_flags);
2258#ifdef CDVD_VARIANT_OSD
2266 outbuf->m_retres = 0;
2267 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2269 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2270 outbuf->m_retres =
sceCdRcBypassCtl(inbuf->m_pkt_30.m_mode, &outbuf->m_pkt_30.m_status);
2275#ifdef CDVD_VARIANT_OSD
2284 outbuf->m_retres = 0;
2285 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2287 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2289 (
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);
2294#ifdef CDVD_VARIANT_OSD
2302 outbuf->m_retres = 0;
2303 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2305 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2306 outbuf->m_retres =
sceRemote2_7(inbuf->m_pkt_31.m_param, &outbuf->m_pkt_31.m_status);
2311#ifdef CDVD_VARIANT_OSD
2320 outbuf->m_retres = 0;
2321 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2323 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2324 outbuf->m_retres =
sceRemote2_7Get(&outbuf->m_pkt_38.m_param, &outbuf->m_pkt_38.m_status);
2329#ifdef CDVD_VARIANT_OSD
2338 outbuf->m_retres = 0;
2339 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2341 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2347#ifdef CDVD_VARIANT_OSD
2355 outbuf->m_retres = 0;
2356 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2358 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2359 outbuf->m_retres =
sceCdSetFanProfile(inbuf->m_pkt_2B.m_param, &outbuf->m_pkt_2B.m_status);
2364#ifdef CDVD_VARIANT_OSD
2372 outbuf->m_retres = 0;
2373 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2375 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2378 outbuf->m_retres = cdvdman_152(&outbuf->m_pkt_2C.m_arg1, &outbuf->m_pkt_2C.m_arg2);
2380 outbuf->m_retres = 1;
2386#ifdef CDVD_VARIANT_OSD
2395 outbuf->m_retres = 0;
2396 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2398 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2404#ifdef CDVD_VARIANT_OSD
2412 outbuf->m_retres = 0;
2413 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2415 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2417 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);
2422#ifdef CDVD_VARIANT_XOSD
2430 outbuf->m_retres = 0;
2431 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2433 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2439#ifdef CDVD_VARIANT_OSD
2447 outbuf->m_retres = 0;
2448 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2450 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2451 outbuf->m_retres =
sceCdSetLEDsMode(inbuf->m_pkt_35.m_param, &outbuf->m_pkt_35.m_status);
2465 outbuf->m_retres = 0;
2466 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2468 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2473#ifdef CDVD_VARIANT_OSD
2482 outbuf->m_retres = 0;
2483 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2486 memcpy(&outbuf->m_pkt_02.m_clock, &inbuf->m_pkt_02.m_clock,
sizeof(
sceCdCLOCK));
2487 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2493#ifdef CDVD_VARIANT_OSD
2500 outbuf->m_retres = 0;
2501 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2503 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2505 outbuf->m_retres =
sceCdReadNVM(inbuf->m_pkt_08.m_address, &outbuf->m_pkt_08.m_data, &outbuf->m_pkt_08.m_status);
2507 outbuf->m_pkt_08.m_address = inbuf->m_pkt_08.m_address;
2511#ifdef CDVD_VARIANT_OSD
2518 outbuf->m_retres = 0;
2519 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2521 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2522 outbuf->m_retres =
sceCdWriteNVM(inbuf->m_pkt_09.m_address, inbuf->m_pkt_09.m_data, &outbuf->m_pkt_09.m_status);
2524 outbuf->m_pkt_09.m_address = inbuf->m_pkt_09.m_address;
2525 outbuf->m_pkt_09.m_data = inbuf->m_pkt_09.m_data;
2529#ifdef CDVD_VARIANT_OSD
2538#ifdef CDVD_VARIANT_XOSD
2545 outbuf->m_retres = 0;
2546 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2548 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2550 inbuf->m_pkt_2E.m_arg1, inbuf->m_pkt_2E.m_arg2, &outbuf->m_pkt_2E.m_result1, &outbuf->m_pkt_2E.m_result2);
2555#ifdef CDVD_VARIANT_XOSD
2564 outbuf->m_retres = 0;
2565 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2567 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2573#ifdef CDVD_VARIANT_XOSD
2581 outbuf->m_retres = 0;
2582 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2584 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2587 outbuf->m_retres = sceCdResetWakeupReason((u32 *)inbuf, &outbuf->m_pkt_3A.m_arg2);
2590 outbuf->m_retres = 1;
2596#ifdef CDVD_VARIANT_XOSD
2604 outbuf->m_retres = 0;
2605 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2607 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2610 outbuf->m_retres = cdvdman_169(&outbuf->m_pkt_3B.m_arg1, &outbuf->m_pkt_3B.m_arg2);
2612 outbuf->m_retres = 1;
2618#ifdef CDVD_VARIANT_XOSD
2626 outbuf->m_retres = 0;
2627 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2629 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2631 inbuf->m_pkt_3C.m_arg1, inbuf->m_pkt_3C.m_arg2, &outbuf->m_pkt_3C.m_result1, &outbuf->m_pkt_3C.m_result2);
2636#ifdef CDVD_VARIANT_XOSD
2644 outbuf->m_retres = 0;
2645 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2647 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2653#ifdef CDVD_VARIANT_XOSD
2662 outbuf->m_retres = 0;
2663 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2665 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2671#ifdef CDVD_VARIANT_XOSD
2679 outbuf->m_retres = 0;
2680 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2682 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2683 outbuf->m_retres =
sceCdXDVRPReset(inbuf->m_pkt_3F.m_arg1, &outbuf->m_pkt_3F.m_status);
2688#ifdef CDVD_VARIANT_XOSD
2698#ifdef CDVD_VARIANT_OSD
2706 outbuf->m_retres = 0;
2707 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2709 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2711 inbuf->m_pkt_0E.m_block, inbuf->m_pkt_0E.m_mode, inbuf->m_pkt_0E.m_NumBlocks, &outbuf->m_pkt_0E.m_status);
2716#ifdef CDVD_VARIANT_OSD
2725 outbuf->m_retres = 0;
2726 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2728 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2734#ifdef CDVD_VARIANT_OSD
2743 outbuf->m_retres = 0;
2744 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2746 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2747 outbuf->m_retres =
sceCdReadConfig(outbuf->m_pkt_10.m_buffer, &outbuf->m_pkt_10.m_status);
2752#ifdef CDVD_VARIANT_OSD
2760 outbuf->m_retres = 0;
2761 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2763 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2764 outbuf->m_retres =
sceCdWriteConfig(inbuf->m_pkt_11.m_buffer, &outbuf->m_pkt_11.m_status);
2769#ifdef CDVD_VARIANT_DNAS
2776 outbuf->m_retres =
sceCdReadDiskID((
unsigned int *)&(outbuf->m_pkt_11.m_diskid));
2789#ifdef CDVD_VARIANT_OSD
2795 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);
2799#ifdef CDVD_VARIANT_OSD
2804 sceCdDecSet(inbuf->m_pkt_0A.m_enable_xor, inbuf->m_pkt_0A.m_enable_shift, inbuf->m_pkt_0A.m_shiftval);
2814 inbuf->m_pkt_0B.m_cmdNum, &inbuf->m_pkt_0B.m_inBuff, inbuf->m_pkt_0B.m_inBuffSize, &(outbuf->m_pkt_0B.m_outbuf));
2822 outbuf->m_retres =
sceCdApplyNCmd(inbuf->m_pkt_0C.m_cmdNum, &inbuf->m_pkt_0C.m_inBuff, inbuf->m_pkt_0C.m_inBuffSize);
2841 outbuf->m_retres = 0;
2842 for ( i = 0; i < 3 && !outbuf->m_retres; i += 1 )
2844 WaitEventFlag(g_scmd_evfid, 1, WEF_AND, &efbits);
2845 outbuf->m_retres =
sceCdTrayReq(inbuf->m_pkt_05.m_param, &outbuf->m_pkt_05.m_traychk);
2854 outbuf->m_retres =
sceCdSetTimeout(inbuf->m_pkt_25.m_param, inbuf->m_pkt_25.m_timeout);
2863 outbuf->m_retres =
sceCdReadDvdDualInfo(&outbuf->m_pkt_27.m_on_dual, &outbuf->m_pkt_27.m_layer1_start);
2866static int cdvdfsv_rpc5_0E_diskready(
void)
2873 VERBOSE_PRINTF(1,
"sceCdNcmddiskready call\n");
2879 case SCECdDETCTDVDS:
2880 case SCECdDETCTDVDD:
2888 (
sceCdDiskReady(8) & 0xC0) != 0x40 || sceCdSC(0xFFFFFFFD, &scres_unused) || !sceCdSC(0xFFFFFFF4, &scres_unused)
2891 VERBOSE_PRINTF(1,
"Drive Not Ready\n");
2895 VERBOSE_PRINTF(1,
"sceCdNcmddiskready call OKend\n");
2899static void *cbrpc_rpc5_cdvdncmds(
int fno,
void *buffer,
int length)
2906 VERBOSE_KPRINTF(1,
"sce_cdvd N cmd start %d\n", fno);
2907 g_cdvdfsv_rpc5flg = 1;
2908 sceCdSC(0xFFFFFFF6, &fno_1);
2913 cdvdfsv_rpc5_01_readee(
2917 cdvdfsv_rpc5_02_readcdda(buffer, length, &g_crr, 0);
2919#ifdef CDVD_VARIANT_OSD
2921 cdvdfsv_rpc5_03_readdvdv(buffer, length, &g_crr);
2925 cdvdfsv_rpc5_04_gettoc(buffer, length, &g_crr);
2930 VERBOSE_PRINTF(1,
"Call Seek end\n");
2934 VERBOSE_PRINTF(1,
"Call Standby\n");
2937 VERBOSE_PRINTF(1,
"Call Standby called\n");
2940 VERBOSE_PRINTF(1,
"Call Stop\n");
2945 VERBOSE_PRINTF(1,
"Call Pause\n");
2950 if ( devctl(
"cdrom_stm0:", 0x4396, buffer, length, &g_crr.m_retres,
sizeof(g_crr.m_retres)) < 0 )
2954 if ( devctl(
"cdrom_stm0:", 0x4398, buffer, length, &g_crr.m_retres,
sizeof(g_crr.m_retres)) < 0 )
2957#ifdef CDVD_VARIANT_OSD
2959 cdvdfsv_rpc5_0B_dg(buffer, length, &g_crr);
2963 cdvdfsv_rpc5_0C_applyncmd(buffer, length, &g_crr);
2966 cdvdfsv_rpc5_0D_iopmread(buffer, length, &g_crr);
2969 g_crr.m_retres = cdvdfsv_rpc5_0E_diskready();
2972 cdvdfsv_rpc5_0F_readchain(buffer, length, &g_crr);
2974#ifdef CDVD_VARIANT_OSD
2976 cdvdfsv_rpc5_02_readcdda(buffer, length, &g_crr, 1);
2979#ifdef CDVD_VARIANT_DNAS
2981 cdvdfsv_rpc5_11_readdiskid(buffer, length, &g_crr);
2986 cdvdfsv_rpc5_01_readee(
2989#ifdef CDVD_VARIANT_DNAS
2991 cdvdfsv_rpc5_17_doesuniquekeyexist(buffer, length, &g_crr);
2995 VERBOSE_PRINTF(1,
"sce_cdvd no block IO :unrecognized code %x\n", fno);
3000 sceCdSC(0xFFFFFFF6, &fno_1);
3001 g_cdvdfsv_rpc5flg = 0;
3003 VERBOSE_KPRINTF(1,
"sce_cdvd N cmd end\n");
3004 return (
void *)&g_crr;
3008static void *cbrpc_rpc3_cdvdscmds(
int fno,
void *buffer,
int length)
3010 VERBOSE_PRINTF(1,
"sce_cdvd S cmd start %d\n", fno);
3011 g_cdvdfsv_rpc3flg = 1;
3015 cdvdfsv_rpc3_01_readclock(buffer, length, &g_outbuf);
3017#ifdef CDVD_VARIANT_OSD
3019 cdvdfsv_rpc3_02_writeclock(buffer, length, &g_outbuf);
3023 cdvdfsv_rpc3_03_disktype(buffer, length, &g_outbuf);
3026 cdvdfsv_rpc3_04_geterror(buffer, length, &g_outbuf);
3029 cdvdfsv_rpc3_05_trayreq(buffer, length, &g_outbuf);
3032 cdvdfsv_rpc3_06_ri(buffer, length, &g_outbuf);
3034#ifdef CDVD_VARIANT_OSD
3037 cdvdfsv_rpc3_07_wi(buffer, length, &g_outbuf);
3040 cdvdfsv_rpc3_08_readnvm(buffer, length, &g_outbuf);
3043 cdvdfsv_rpc3_09_writenvm(buffer, length, &g_outbuf);
3046 cdvdfsv_rpc3_0A_decset(buffer, length, &g_outbuf);
3050 cdvdfsv_rpc3_0B_applyscmd(buffer, length, &g_outbuf);
3053 cdvdfsv_rpc3_0C_cdstatus(buffer, length, &g_outbuf);
3055#ifdef CDVD_VARIANT_OSD
3057 cdvdfsv_rpc3_0D_sethdmode(buffer, length, &g_outbuf);
3060 cdvdfsv_rpc3_0E_openconfig(buffer, length, &g_outbuf);
3063 cdvdfsv_rpc3_0F_closeconfig(buffer, length, &g_outbuf);
3066 cdvdfsv_rpc3_10_readconfig(buffer, length, &g_outbuf);
3069 cdvdfsv_rpc3_11_writeconfig(buffer, length, &g_outbuf);
3072 cdvdfsv_rpc3_12_readconsoleid(buffer, length, &g_outbuf);
3076 cdvdfsv_rpc3_13_writeconsoleid(buffer, length, &g_outbuf);
3079 cdvdfsv_rpc3_14_getmversion(buffer, length, &g_outbuf);
3083 cdvdfsv_rpc3_15_ctrladout(buffer, length, &g_outbuf);
3086 cdvdfsv_rpc3_16_break(buffer, length, &g_outbuf);
3088#ifdef CDVD_VARIANT_OSD
3090 cdvdfsv_rpc3_17_readsubq(buffer, length, &g_outbuf);
3093 cdvdfsv_rpc3_18_forbiddvdp(buffer, length, &g_outbuf);
3096 cdvdfsv_rpc3_19_autoadjustctrl(buffer, length, &g_outbuf);
3100 cdvdfsv_rpc3_1A_rm(buffer, length, &g_outbuf);
3102#ifdef CDVD_VARIANT_OSD
3105 cdvdfsv_rpc3_1B_wm(buffer, length, &g_outbuf);
3108 cdvdfsv_rpc3_1C_forbidread(buffer, length, &g_outbuf);
3111 cdvdfsv_rpc3_1D_sc_FFFFFFF8(buffer, length, &g_outbuf);
3114 cdvdfsv_rpc3_1E_bootcertify(buffer, length, &g_outbuf);
3117 cdvdfsv_rpc3_1F_cancelpoffrdy(buffer, length, &g_outbuf);
3120 cdvdfsv_rpc3_20_blueledctl(buffer, length, &g_outbuf);
3124 cdvdfsv_rpc3_21_poweroff(buffer, length, &g_outbuf);
3127 cdvdfsv_rpc3_22_mmode(buffer, length, &g_outbuf);
3130 cdvdfsv_rpc3_23_changethreadpriority(buffer, length, &g_outbuf);
3132#ifdef CDVD_VARIANT_DNAS
3134 cdvdfsv_rpc3_24_readguid(buffer, length, &g_outbuf);
3138 cdvdfsv_rpc3_25_settimeout(buffer, length, &g_outbuf);
3140#ifdef CDVD_VARIANT_DNAS
3142 cdvdfsv_rpc3_26_readmodelid(buffer, length, &g_outbuf);
3146 cdvdfsv_rpc3_27_readdvddualinfo(buffer, length, &g_outbuf);
3148#ifdef CDVD_VARIANT_OSD
3150 cdvdfsv_rpc3_28_writewakeuptime(buffer, length, &g_outbuf);
3153 cdvdfsv_rpc3_29_readwakeuptime(buffer, length, &g_outbuf);
3156 cdvdfsv_rpc3_2A_readps1bootparam(buffer, length, &g_outbuf);
3159 cdvdfsv_rpc3_2B_setfanprofile(buffer, length, &g_outbuf);
3162 cdvdfsv_rpc3_2C_i_152(buffer, length, &g_outbuf);
3165#ifdef CDVD_VARIANT_XOSD
3167 cdvdfsv_rpc3_2D_chgsys(buffer, length, &g_outbuf);
3170 cdvdfsv_rpc3_2E_xledctl(buffer, length, &g_outbuf);
3173 cdvdfsv_rpc3_2F_noticegamestart(buffer, length, &g_outbuf);
3176#ifdef CDVD_VARIANT_OSD
3178 cdvdfsv_rpc3_30_rcbypassctl(buffer, length, &g_outbuf);
3181 cdvdfsv_rpc3_31_remote2_7(buffer, length, &g_outbuf);
3184 cdvdfsv_rpc3_32_sendscmd1d(buffer, length, &g_outbuf);
3187 cdvdfsv_rpc3_35_setledsmode(buffer, length, &g_outbuf);
3190 cdvdfsv_rpc3_38_remote2_7_get(buffer, length, &g_outbuf);
3193#ifdef CDVD_VARIANT_XOSD
3195 cdvdfsv_rpc3_39_buzzerctl(buffer, length, &g_outbuf);
3198 cdvdfsv_rpc3_3A_resetwakeupreason(buffer, length, &g_outbuf);
3201 cdvdfsv_rpc3_3B_i_169(buffer, length, &g_outbuf);
3204 cdvdfsv_rpc3_3C_xbspowerctl(buffer, length, &g_outbuf);
3207 cdvdfsv_rpc3_3D_setmediumremoval(buffer, length, &g_outbuf);
3210 cdvdfsv_rpc3_3E_getmediumremoval(buffer, length, &g_outbuf);
3213 cdvdfsv_rpc3_3F_xdvrpreset(buffer, length, &g_outbuf);
3216 cdvdfsv_rpc3_40_getwakeupreason(buffer, length, &g_outbuf);
3219#ifdef CDVD_VARIANT_OSD
3221 cdvdfsv_rpc3_43_readregionparams(buffer, length, &g_outbuf);
3225 cdvdfsv_rpc3_44_writeregionparams(buffer, length, &g_outbuf);
3229 VERBOSE_PRINTF(1,
"sce_cdvd block IO :unrecognized code 0x%02x\n", fno);
3230 g_outbuf.m_retres = 0;
3233 VERBOSE_PRINTF(1,
"sce_cdvd S cmd end\n");
3234 g_cdvdfsv_rpc3flg = 0;
3235 return (
void *)&g_outbuf;
3238static void cdvdfsv_poffloop(
void)
3245 g_cdvdman_intr_evfid = sceCdSC(0xFFFFFFF5, &scres);
3248 ClearEventFlag(g_cdvdman_intr_evfid, ~4);
3249 WaitEventFlag(g_cdvdman_intr_evfid, 4, WEF_AND, &efbits);
3250 if ( g_cdvdfsv_nopocm )
3252 if ( !g_cdvdfsv_plbreak )
3256 trid = sceSifSendCmd(0x80000012, cmdpkt,
sizeof(cmdpkt), 0, 0, 0);
3261 while ( cdvdfsv_checkdmastat(trid) >= 0 )
3267#ifdef CDVD_VARIANT_OSD
3268static void cdvdfsv_rpc4_th(
void *arg)
3276 g_cdvdman_intr_evfid = sceCdSC(0xFFFFFFF5, &scres);
3279 ClearEventFlag(g_cdvdman_intr_evfid, ~0x40);
3280 WaitEventFlag(g_cdvdman_intr_evfid, 0x40, WEF_AND, &efbits);
3281 if ( g_cdvdfsv_nopocm )
3283 if ( !g_cdvdfsv_plbreak )
3287 trid = sceSifSendCmd(0x80000015, cmdpkt,
sizeof(cmdpkt), 0, 0, 0);
3292 while ( cdvdfsv_checkdmastat(trid) >= 0 )
3300#ifdef CDVD_VARIANT_OSD
3301static void cdvdfsv_rpc5_th(
void *arg)
3309 g_cdvdman_intr_evfid = sceCdSC(0xFFFFFFF5, &scres);
3312 ClearEventFlag(g_cdvdman_intr_evfid, ~0x80);
3313 WaitEventFlag(g_cdvdman_intr_evfid, 0x80, WEF_AND, &efbits);
3314 if ( g_cdvdfsv_nopocm )
3316 if ( !g_cdvdfsv_plbreak )
3320 trid = sceSifSendCmd(0x80000016, cmdpkt,
sizeof(cmdpkt), 0, 0, 0);
3325 while ( cdvdfsv_checkdmastat(trid) >= 0 )
3333static void cdvdfsv_rpc1_th(
void *arg)
3337 sceSifSetRpcQueue(&g_rpc_qdata1, GetThreadId());
3338 sceSifRegisterRpc(&g_rpc_sdata1, 0x80000592, cbrpc_rpc1_cdinit, g_rpc_buffer1, 0, 0, &g_rpc_qdata1);
3339 sceSifRegisterRpc(&g_rpc_sdata2, 0x8000059A, cbrpc_rpc2_diskready, g_rpc_buffer2, 0, 0, &g_rpc_qdata1);
3340 sceSifRegisterRpc(&g_rpc_sdata3, 0x80000593, cbrpc_rpc3_cdvdscmds, g_rpc_buffer3, 0, 0, &g_rpc_qdata1);
3341 sceSifRpcLoop(&g_rpc_qdata1);
3345static void cdvdfsv_rpc3_th(
void *arg)
3349 sceSifSetRpcQueue(&g_rpc_qdata3, GetThreadId());
3350 sceSifRegisterRpc(&g_rpc_sdata6, 0x8000059C, cbrpc_rpc2_diskready, g_rpc_buffer2, 0, 0, &g_rpc_qdata3);
3351 sceSifRpcLoop(&g_rpc_qdata3);
3355static void cdvdfsv_rpc2_th(
void *arg)
3359 sceSifSetRpcQueue(&g_rpc_qdata2, GetThreadId());
3360 sceSifRegisterRpc(&g_rpc_sdata4, 0x80000597, cbrpc_rpc4_fscall, g_rpc_buffer4, 0, 0, &g_rpc_qdata2);
3361 sceSifRegisterRpc(&g_rpc_sdata5, 0x80000595, cbrpc_rpc5_cdvdncmds, g_rpc_buffer5, 0, 0, &g_rpc_qdata2);
3362 sceSifRpcLoop(&g_rpc_qdata2);
3370 "\t" ".set push" "\n"
3371 "\t" ".set noat" "\n"
3372 "\t" ".set noreorder" "\n"
3373 "\t" ".global optimized_memcpy" "\n"
3374 "\t" "optimized_memcpy:" "\n"
3375 "\t" " srl $a3, $a2, 2" "\n"
3376 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3377 "\t" " or $a3, $a0, $a1" "\n"
3378 "\t" " andi $a3, $a3, 0x3" "\n"
3379 "\t" " bnez $a3, .Loptimized_memcpy_3" "\n"
3381 "\t" " srl $a3, $a2, 2" "\n"
3382 "\t" " addiu $at, $zero, 0xC" "\n"
3383 "\t" " div $zero, $a3, $at" "\n"
3384 "\t" " mflo $a3" "\n"
3385 "\t" " mfhi $v1" "\n"
3386 "\t" " beqz $v1, .Loptimized_memcpy_2" "\n"
3388 "\t" ".Loptimized_memcpy_1:" "\n"
3389 "\t" " lw $v0, 0x0($a1)" "\n"
3390 "\t" " addiu $v1, $v1, -0x1" "\n"
3391 "\t" " sw $v0, 0x0($a0)" "\n"
3392 "\t" " addiu $a1, $a1, 0x4" "\n"
3393 "\t" " bnez $v1, .Loptimized_memcpy_1" "\n"
3394 "\t" " addiu $a0, $a0, 0x4" "\n"
3395 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3397 "\t" ".Loptimized_memcpy_2:" "\n"
3398 "\t" " lw $v0, 0x0($a1)" "\n"
3399 "\t" " lw $v1, 0x4($a1)" "\n"
3400 "\t" " lw $t0, 0x8($a1)" "\n"
3401 "\t" " lw $t1, 0xC($a1)" "\n"
3402 "\t" " lw $t2, 0x10($a1)" "\n"
3403 "\t" " lw $t3, 0x14($a1)" "\n"
3404 "\t" " lw $t4, 0x18($a1)" "\n"
3405 "\t" " lw $t5, 0x1C($a1)" "\n"
3406 "\t" " lw $t6, 0x20($a1)" "\n"
3407 "\t" " lw $t7, 0x24($a1)" "\n"
3408 "\t" " lw $t8, 0x28($a1)" "\n"
3409 "\t" " lw $t9, 0x2C($a1)" "\n"
3410 "\t" " addiu $a3, $a3, -0x1" "\n"
3411 "\t" " sw $v0, 0x0($a0)" "\n"
3412 "\t" " sw $v1, 0x4($a0)" "\n"
3413 "\t" " sw $t0, 0x8($a0)" "\n"
3414 "\t" " sw $t1, 0xC($a0)" "\n"
3415 "\t" " sw $t2, 0x10($a0)" "\n"
3416 "\t" " sw $t3, 0x14($a0)" "\n"
3417 "\t" " sw $t4, 0x18($a0)" "\n"
3418 "\t" " sw $t5, 0x1C($a0)" "\n"
3419 "\t" " sw $t6, 0x20($a0)" "\n"
3420 "\t" " sw $t7, 0x24($a0)" "\n"
3421 "\t" " sw $t8, 0x28($a0)" "\n"
3422 "\t" " sw $t9, 0x2C($a0)" "\n"
3423 "\t" " addiu $a1, $a1, 0x30" "\n"
3424 "\t" " bnez $a3, .Loptimized_memcpy_2" "\n"
3425 "\t" " addiu $a0, $a0, 0x30" "\n"
3426 "\t" " j .Loptimized_memcpy_12" "\n"
3428 "\t" ".Loptimized_memcpy_3:" "\n"
3429 "\t" " andi $a3, $a0, 0x3" "\n"
3430 "\t" " beqz $a3, .Loptimized_memcpy_6" "\n"
3431 "\t" " andi $a3, $a1, 0x3" "\n"
3432 "\t" " beqz $a3, .Loptimized_memcpy_6" "\n"
3434 "\t" " srl $a3, $a2, 2" "\n"
3435 "\t" " addiu $at, $zero, 0xC" "\n"
3436 "\t" " div $zero, $a3, $at" "\n"
3437 "\t" " mflo $a3" "\n"
3438 "\t" " mfhi $v1" "\n"
3439 "\t" " beqz $v1, .Loptimized_memcpy_5" "\n"
3441 "\t" ".Loptimized_memcpy_4:" "\n"
3442 "\t" " lwl $v0, 0x3($a1)" "\n"
3443 "\t" " lwr $v0, 0x0($a1)" "\n"
3444 "\t" " addiu $v1, $v1, -0x1" "\n"
3445 "\t" " swl $v0, 0x3($a0)" "\n"
3446 "\t" " swr $v0, 0x0($a0)" "\n"
3447 "\t" " addiu $a1, $a1, 0x4" "\n"
3448 "\t" " bnez $v1, .Loptimized_memcpy_4" "\n"
3449 "\t" " addiu $a0, $a0, 0x4" "\n"
3450 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3452 "\t" ".Loptimized_memcpy_5:" "\n"
3453 "\t" " lwl $v0, 0x3($a1)" "\n"
3454 "\t" " lwr $v0, 0x0($a1)" "\n"
3455 "\t" " lwl $v1, 0x7($a1)" "\n"
3456 "\t" " lwr $v1, 0x4($a1)" "\n"
3457 "\t" " lwl $t0, 0xB($a1)" "\n"
3458 "\t" " lwr $t0, 0x8($a1)" "\n"
3459 "\t" " lwl $t1, 0xF($a1)" "\n"
3460 "\t" " lwr $t1, 0xC($a1)" "\n"
3461 "\t" " lwl $t2, 0x13($a1)" "\n"
3462 "\t" " lwr $t2, 0x10($a1)" "\n"
3463 "\t" " lwl $t3, 0x17($a1)" "\n"
3464 "\t" " lwr $t3, 0x14($a1)" "\n"
3465 "\t" " lwl $t4, 0x1B($a1)" "\n"
3466 "\t" " lwr $t4, 0x18($a1)" "\n"
3467 "\t" " lwl $t5, 0x1F($a1)" "\n"
3468 "\t" " lwr $t5, 0x1C($a1)" "\n"
3469 "\t" " lwl $t6, 0x23($a1)" "\n"
3470 "\t" " lwr $t6, 0x20($a1)" "\n"
3471 "\t" " lwl $t7, 0x27($a1)" "\n"
3472 "\t" " lwr $t7, 0x24($a1)" "\n"
3473 "\t" " lwl $t8, 0x2B($a1)" "\n"
3474 "\t" " lwr $t8, 0x28($a1)" "\n"
3475 "\t" " lwl $t9, 0x2F($a1)" "\n"
3476 "\t" " lwr $t9, 0x2C($a1)" "\n"
3477 "\t" " addiu $a3, $a3, -0x1" "\n"
3478 "\t" " swl $v0, 0x3($a0)" "\n"
3479 "\t" " swr $v0, 0x0($a0)" "\n"
3480 "\t" " swl $v1, 0x7($a0)" "\n"
3481 "\t" " swr $v1, 0x4($a0)" "\n"
3482 "\t" " swl $t0, 0xB($a0)" "\n"
3483 "\t" " swr $t0, 0x8($a0)" "\n"
3484 "\t" " swl $t1, 0xF($a0)" "\n"
3485 "\t" " swr $t1, 0xC($a0)" "\n"
3486 "\t" " swl $t2, 0x13($a0)" "\n"
3487 "\t" " swr $t2, 0x10($a0)" "\n"
3488 "\t" " swl $t3, 0x17($a0)" "\n"
3489 "\t" " swr $t3, 0x14($a0)" "\n"
3490 "\t" " swl $t4, 0x1B($a0)" "\n"
3491 "\t" " swr $t4, 0x18($a0)" "\n"
3492 "\t" " swl $t5, 0x1F($a0)" "\n"
3493 "\t" " swr $t5, 0x1C($a0)" "\n"
3494 "\t" " swl $t6, 0x23($a0)" "\n"
3495 "\t" " swr $t6, 0x20($a0)" "\n"
3496 "\t" " swl $t7, 0x27($a0)" "\n"
3497 "\t" " swr $t7, 0x24($a0)" "\n"
3498 "\t" " swl $t8, 0x2B($a0)" "\n"
3499 "\t" " swr $t8, 0x28($a0)" "\n"
3500 "\t" " swl $t9, 0x2F($a0)" "\n"
3501 "\t" " swr $t9, 0x2C($a0)" "\n"
3502 "\t" " addiu $a1, $a1, 0x30" "\n"
3503 "\t" " bnez $a3, .Loptimized_memcpy_5" "\n"
3504 "\t" " addiu $a0, $a0, 0x30" "\n"
3505 "\t" " j .Loptimized_memcpy_12" "\n"
3507 "\t" ".Loptimized_memcpy_6:" "\n"
3508 "\t" " andi $a3, $a0, 0x3" "\n"
3509 "\t" " beqz $a3, .Loptimized_memcpy_9" "\n"
3511 "\t" " srl $a3, $a2, 2" "\n"
3512 "\t" " addiu $at, $zero, 0xC" "\n"
3513 "\t" " div $zero, $a3, $at" "\n"
3514 "\t" " mflo $a3" "\n"
3515 "\t" " mfhi $v1" "\n"
3516 "\t" " beqz $v1, .Loptimized_memcpy_8" "\n"
3518 "\t" ".Loptimized_memcpy_7:" "\n"
3519 "\t" " lw $v0, 0x0($a1)" "\n"
3520 "\t" " addiu $v1, $v1, -0x1" "\n"
3521 "\t" " swl $v0, 0x3($a0)" "\n"
3522 "\t" " swr $v0, 0x0($a0)" "\n"
3523 "\t" " addiu $a1, $a1, 0x4" "\n"
3524 "\t" " bnez $v1, .Loptimized_memcpy_7" "\n"
3525 "\t" " addiu $a0, $a0, 0x4" "\n"
3526 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3528 "\t" ".Loptimized_memcpy_8:" "\n"
3529 "\t" " lw $v0, 0x0($a1)" "\n"
3530 "\t" " lw $v1, 0x4($a1)" "\n"
3531 "\t" " lw $t0, 0x8($a1)" "\n"
3532 "\t" " lw $t1, 0xC($a1)" "\n"
3533 "\t" " lw $t2, 0x10($a1)" "\n"
3534 "\t" " lw $t3, 0x14($a1)" "\n"
3535 "\t" " lw $t4, 0x18($a1)" "\n"
3536 "\t" " lw $t5, 0x1C($a1)" "\n"
3537 "\t" " lw $t6, 0x20($a1)" "\n"
3538 "\t" " lw $t7, 0x24($a1)" "\n"
3539 "\t" " lw $t8, 0x28($a1)" "\n"
3540 "\t" " lw $t9, 0x2C($a1)" "\n"
3541 "\t" " addiu $a3, $a3, -0x1" "\n"
3542 "\t" " swl $v0, 0x3($a0)" "\n"
3543 "\t" " swr $v0, 0x0($a0)" "\n"
3544 "\t" " swl $v1, 0x7($a0)" "\n"
3545 "\t" " swr $v1, 0x4($a0)" "\n"
3546 "\t" " swl $t0, 0xB($a0)" "\n"
3547 "\t" " swr $t0, 0x8($a0)" "\n"
3548 "\t" " swl $t1, 0xF($a0)" "\n"
3549 "\t" " swr $t1, 0xC($a0)" "\n"
3550 "\t" " swl $t2, 0x13($a0)" "\n"
3551 "\t" " swr $t2, 0x10($a0)" "\n"
3552 "\t" " swl $t3, 0x17($a0)" "\n"
3553 "\t" " swr $t3, 0x14($a0)" "\n"
3554 "\t" " swl $t4, 0x1B($a0)" "\n"
3555 "\t" " swr $t4, 0x18($a0)" "\n"
3556 "\t" " swl $t5, 0x1F($a0)" "\n"
3557 "\t" " swr $t5, 0x1C($a0)" "\n"
3558 "\t" " swl $t6, 0x23($a0)" "\n"
3559 "\t" " swr $t6, 0x20($a0)" "\n"
3560 "\t" " swl $t7, 0x27($a0)" "\n"
3561 "\t" " swr $t7, 0x24($a0)" "\n"
3562 "\t" " swl $t8, 0x2B($a0)" "\n"
3563 "\t" " swr $t8, 0x28($a0)" "\n"
3564 "\t" " swl $t9, 0x2F($a0)" "\n"
3565 "\t" " swr $t9, 0x2C($a0)" "\n"
3566 "\t" " addiu $a1, $a1, 0x30" "\n"
3567 "\t" " bnez $a3, .Loptimized_memcpy_8" "\n"
3568 "\t" " addiu $a0, $a0, 0x30" "\n"
3569 "\t" " j .Loptimized_memcpy_12" "\n"
3571 "\t" ".Loptimized_memcpy_9:" "\n"
3572 "\t" " srl $a3, $a2, 2" "\n"
3573 "\t" " addiu $at, $zero, 0xC" "\n"
3574 "\t" " div $zero, $a3, $at" "\n"
3575 "\t" " mflo $a3" "\n"
3576 "\t" " mfhi $v1" "\n"
3577 "\t" " beqz $v1, .Loptimized_memcpy_11" "\n"
3579 "\t" ".Loptimized_memcpy_10:" "\n"
3580 "\t" " lwl $v0, 0x3($a1)" "\n"
3581 "\t" " lwr $v0, 0x0($a1)" "\n"
3582 "\t" " addiu $v1, $v1, -0x1" "\n"
3583 "\t" " sw $v0, 0x0($a0)" "\n"
3584 "\t" " addiu $a1, $a1, 0x4" "\n"
3585 "\t" " bnez $v1, .Loptimized_memcpy_10" "\n"
3586 "\t" " addiu $a0, $a0, 0x4" "\n"
3587 "\t" " beqz $a3, .Loptimized_memcpy_12" "\n"
3589 "\t" ".Loptimized_memcpy_11:" "\n"
3590 "\t" " lwl $v0, 0x3($a1)" "\n"
3591 "\t" " lwr $v0, 0x0($a1)" "\n"
3592 "\t" " lwl $v1, 0x7($a1)" "\n"
3593 "\t" " lwr $v1, 0x4($a1)" "\n"
3594 "\t" " lwl $t0, 0xB($a1)" "\n"
3595 "\t" " lwr $t0, 0x8($a1)" "\n"
3596 "\t" " lwl $t1, 0xF($a1)" "\n"
3597 "\t" " lwr $t1, 0xC($a1)" "\n"
3598 "\t" " lwl $t2, 0x13($a1)" "\n"
3599 "\t" " lwr $t2, 0x10($a1)" "\n"
3600 "\t" " lwl $t3, 0x17($a1)" "\n"
3601 "\t" " lwr $t3, 0x14($a1)" "\n"
3602 "\t" " lwl $t4, 0x1B($a1)" "\n"
3603 "\t" " lwr $t4, 0x18($a1)" "\n"
3604 "\t" " lwl $t5, 0x1F($a1)" "\n"
3605 "\t" " lwr $t5, 0x1C($a1)" "\n"
3606 "\t" " lwl $t6, 0x23($a1)" "\n"
3607 "\t" " lwr $t6, 0x20($a1)" "\n"
3608 "\t" " lwl $t7, 0x27($a1)" "\n"
3609 "\t" " lwr $t7, 0x24($a1)" "\n"
3610 "\t" " lwl $t8, 0x2B($a1)" "\n"
3611 "\t" " lwr $t8, 0x28($a1)" "\n"
3612 "\t" " lwl $t9, 0x2F($a1)" "\n"
3613 "\t" " lwr $t9, 0x2C($a1)" "\n"
3614 "\t" " addiu $a3, $a3, -0x1" "\n"
3615 "\t" " sw $v0, 0x0($a0)" "\n"
3616 "\t" " sw $v1, 0x4($a0)" "\n"
3617 "\t" " sw $t0, 0x8($a0)" "\n"
3618 "\t" " sw $t1, 0xC($a0)" "\n"
3619 "\t" " sw $t2, 0x10($a0)" "\n"
3620 "\t" " sw $t3, 0x14($a0)" "\n"
3621 "\t" " sw $t4, 0x18($a0)" "\n"
3622 "\t" " sw $t5, 0x1C($a0)" "\n"
3623 "\t" " sw $t6, 0x20($a0)" "\n"
3624 "\t" " sw $t7, 0x24($a0)" "\n"
3625 "\t" " sw $t8, 0x28($a0)" "\n"
3626 "\t" " sw $t9, 0x2C($a0)" "\n"
3627 "\t" " addiu $a1, $a1, 0x30" "\n"
3628 "\t" " bnez $a3, .Loptimized_memcpy_11" "\n"
3629 "\t" " addiu $a0, $a0, 0x30" "\n"
3630 "\t" ".Loptimized_memcpy_12:" "\n"
3631 "\t" " andi $v1, $a2, 0x3" "\n"
3632 "\t" " beqz $v1, .Loptimized_memcpy_14" "\n"
3634 "\t" ".Loptimized_memcpy_13:" "\n"
3635 "\t" " lb $v0, 0x0($a1)" "\n"
3636 "\t" " addiu $v1, $v1, -0x1" "\n"
3637 "\t" " sb $v0, 0x0($a0)" "\n"
3638 "\t" " addiu $a1, $a1, 0x1" "\n"
3639 "\t" " bnez $v1, .Loptimized_memcpy_13" "\n"
3640 "\t" " addiu $a0, $a0, 0x1" "\n"
3641 "\t" ".Loptimized_memcpy_14:" "\n"
3642 "\t" " addu $v0, $a2, $zero" "\n"
3645 "\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)