19static int mcserv_tidS_0400;
20static int mcserv_in_rpc_0400 = 0;
25static u8 mcserv_rpc_buf[2048]
__attribute__((__aligned__(4)));
28#define MCSERV_BUFSIZE 8192
34int _start(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
37 register int thread_id;
44 sio_init(38400, 0, 0, 0, 0);
46 DPRINTF(
"_start...\n");
53 if (mcserv_in_rpc_0400)
55 return MODULE_REMOVABLE_END;
59 release_res = ReleaseLibraryEntries(&_exp_mcserv);
61 if (release_res == 0 || release_res == -213)
63 TerminateThread(mcserv_tidS_0400);
64 DeleteThread(mcserv_tidS_0400);
65 sceSifRemoveRpc(&mcserv_sdS_0400, &mcserv_qdS_0400);
66 sceSifRemoveRpcQueue(&mcserv_qdS_0400);
67 return MODULE_NO_RESIDENT_END;
69 return MODULE_REMOVABLE_END;
73 DPRINTF(
"registering exports...\n");
74 if (RegisterLibraryEntries(&_exp_mcserv) != 0)
79 DPRINTF(
"starting RPC thread...\n");
80 thread_param.attr = TH_C;
81 thread_param.thread = thread_rpc_S_0400;
82 thread_param.priority = 0x68;
83 thread_param.stacksize = 0x1000;
84 thread_param.option = 0;
86 thread_id = CreateThread(&thread_param);
87 mcserv_tidS_0400 = thread_id;
89 StartThread(thread_id, 0);
91 DPRINTF(
"_start returns MODULE_RESIDENT_END...\n");
95 return MODULE_RESIDENT_END;
99 DPRINTF(
"_start returns MODULE_NO_RESIDENT_END...\n");
101 return MODULE_NO_RESIDENT_END;
105void thread_rpc_S_0400(
void* arg)
109 if (!sceSifCheckInit())
113 sceSifSetRpcQueue(&mcserv_qdS_0400, GetThreadId());
114 sceSifRegisterRpc(&mcserv_sdS_0400, 0x80000400, (
void *)cb_rpc_S_0400, &mcserv_rpc_buf, NULL, NULL, &mcserv_qdS_0400);
115 sceSifRpcLoop(&mcserv_qdS_0400);
119void *cb_rpc_S_0400(u32 fno,
void *buf,
int size)
121 int need_replace_bad_block;
126 need_replace_bad_block = 1;
128 mcserv_in_rpc_0400 = 1;
133#ifdef BUILDING_XMCSERV
136 rpc_stat.result = sceMcInit();
139#ifdef BUILDING_XMCSERV
142 rpc_stat.result = sceMcOpen();
145#ifdef BUILDING_XMCSERV
148 rpc_stat.result = sceMcClose();
151 rpc_stat.result = sceMcRead();
154#ifdef BUILDING_XMCSERV
157 rpc_stat.result = sceMcWrite();
160#ifdef BUILDING_XMCSERV
163 rpc_stat.result = sceMcSeek();
166#ifdef BUILDING_XMCSERV
169 rpc_stat.result = sceMcGetDir();
172#ifdef BUILDING_XMCSERV
175 rpc_stat.result = sceMcFormat();
178 rpc_stat.result = sceMcGetInfo();
181#ifdef BUILDING_XMCSERV
184 rpc_stat.result = sceMcDelete();
187#ifdef BUILDING_XMCSERV
190 rpc_stat.result = sceMcFlush();
193#ifdef BUILDING_XMCSERV
196 rpc_stat.result = sceMcChDir();
199#ifdef BUILDING_XMCSERV
202 rpc_stat.result = sceMcSetFileInfo();
205 rpc_stat.result = sceMcEraseBlock();
208 rpc_stat.result = sceMcReadPage();
211 rpc_stat.result = sceMcWritePage();
214#ifdef BUILDING_XMCSERV
217 rpc_stat.result = sceMcUnformat();
219#ifdef BUILDING_XMCSERV
221 rpc_stat.result = sceMcGetInfo2();
224 rpc_stat.result = sceMcRead2();
227 rpc_stat.result = sceMcGetEntSpace();
230 rpc_stat.result = sceMcCheckBlock();
236 need_replace_bad_block = 0;
240 if (need_replace_bad_block)
243 mcserv_in_rpc_0400 = 0;
245 return (
void *)&rpc_stat;
252#ifdef BUILDING_XMCSERV
256 r = _McInit(&mcserv_rpc_buf);
258#ifdef BUILDING_XMCSERV
261 rpc_stat.mcserv_version = MODVER;
272 return _McOpen(&mcserv_rpc_buf);
278 return _McClose(&mcserv_rpc_buf);
284 return _McRead(&mcserv_rpc_buf);
290 return _McRead2(&mcserv_rpc_buf);
296 return _McWrite(&mcserv_rpc_buf);
302 return _McSeek(&mcserv_rpc_buf);
308 return _McGetDir(&mcserv_rpc_buf);
314 return _McFormat(&mcserv_rpc_buf);
318int sceMcUnformat(
void)
320 return _McUnformat(&mcserv_rpc_buf);
324int sceMcGetInfo(
void)
326 return _McGetInfo(&mcserv_rpc_buf);
330#ifdef BUILDING_XMCSERV
331int sceMcGetInfo2(
void)
333 return _McGetInfo2(&mcserv_rpc_buf);
340 return _McDelete(&mcserv_rpc_buf);
346 return _McFlush(&mcserv_rpc_buf);
352 return _McChDir(&mcserv_rpc_buf);
356int sceMcEraseBlock(
void)
358 return _McEraseBlock(&mcserv_rpc_buf);
362int sceMcReadPage(
void)
364 return _McReadPage(&mcserv_rpc_buf);
368int sceMcWritePage(
void)
370 return _McWritePage(&mcserv_rpc_buf);
374int sceMcSetFileInfo(
void)
376 return _McSetFileInfo(&mcserv_rpc_buf);
380#ifdef BUILDING_XMCSERV
381int sceMcGetEntSpace(
void)
383 return _McGetEntSpace(&mcserv_rpc_buf);
388#ifdef BUILDING_XMCSERV
389int sceMcCheckBlock(
void)
391 return _McCheckBlock(&mcserv_rpc_buf);
396int _McInit(
void *rpc_buf)
400 DPRINTF(
"_McInit fd %d offset %d\n", dP->fd, dP->offset);
402#ifndef BUILDING_XMCSERV
406 if (dP->offset == -217)
409 McSetPS1CardFlag(ps1flag);
413 return McRetOnly(dP->fd);
417int _McOpen(
void *rpc_buf)
421 DPRINTF(
"_McOpen port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
423 return McOpen(nP->port, nP->slot, nP->name, nP->flags);
427int _McClose(
void *rpc_buf)
431 DPRINTF(
"_McClose fd %d\n", dP->fd);
433 return McClose(dP->fd);
437int _McSeek(
void *rpc_buf)
441 DPRINTF(
"_McSeek fd %d offset %d origin %d\n", dP->fd, dP->offset, dP->origin);
443 return McSeek(dP->fd, dP->offset, dP->origin);
447int _McRead(
void *rpc_buf)
450 register int file_offset, status;
451 register int left_to_read, size_readed, size_to_read;
457 DPRINTF(
"_McRead fd %d ee buffer addr %x size %d\n", dP->fd, (
int)dP->buffer, dP->size);
472 eP.size1 = (((int)(eedata)-1) & 0xfffffff0) - ((
int)(eedata) - 16);
474 eP.size2 = (dP->size - eP.size1) & 0x0f;
475 left_to_read = (dP->size - eP.size1) - eP.size2;
478 eP.dest2 = (
void *)((u8 *)eedata + eP.size1 + left_to_read);
481 size_readed = McRead(dP->fd, eP.src1, eP.size1);
483 if (size_readed < 0) {
489 file_offset = size_readed;
491 eedata = (
void *)((u8 *)eedata + size_readed);
493 if (size_readed != eP.size1) {
494 eP.size1 = size_readed;
504 while (left_to_read > 0) {
506 size_to_read = left_to_read;
508 if (left_to_read > MCSERV_BUFSIZE)
509 size_to_read = MCSERV_BUFSIZE;
511 size_readed = McRead(dP->fd, mcserv_buf, size_to_read);
513 if (size_readed < 0) {
518 dmaStruct.src = (
void *)mcserv_buf;
519 dmaStruct.dest = (
void *)eedata;
520 dmaStruct.size = size_readed;
524 sceSifSetDma(&dmaStruct, 1);
526 file_offset += size_readed;
527 left_to_read -= size_readed;
531 eedata = (
void *)((u8 *)eedata + size_readed);
533 if (size_to_read != size_readed) {
544 size_readed = McRead(dP->fd, eP.src2, eP.size2);
546 if (size_readed < 0) {
551 file_offset += size_readed;
552 eP.size2 = size_readed;
556 dmaStruct.src = (
void *)&eP;
557 dmaStruct.dest = (
void *)dP->param;
562 status = sceSifSetDma(&dmaStruct, 1);
565 while (sceSifDmaStat(status) >= 0)
568 if (size_readed != 0)
575int _McRead2(
void *rpc_buf)
578 register int file_offset, status;
579 register int left_to_read, size_readed, size_to_read;
585 DPRINTF(
"_McRead2 fd %d ee buffer addr %x size %d\n", dP->fd, (
int)dP->buffer, dP->size);
600 eP.size1 = (((u32)(eedata)-1) & 0xffffffc0) - ((u32)(eedata) - 64);
602 eP.size2 = (dP->size - eP.size1) & 0x3f;
603 left_to_read = (dP->size - eP.size1) - eP.size2;
606 eP.dest2 = (
void *)((u8 *)eedata + eP.size1 + left_to_read);
609 size_readed = McRead(dP->fd, eP.src1, eP.size1);
611 if (size_readed < 0) {
617 file_offset = size_readed;
619 eedata = (
void *)((u8 *)eedata + size_readed);
621 if (size_readed != eP.size1) {
622 eP.size1 = size_readed;
632 while (left_to_read > 0) {
634 size_to_read = left_to_read;
636 if (left_to_read > MCSERV_BUFSIZE)
637 size_to_read = MCSERV_BUFSIZE;
639 size_readed = McRead(dP->fd, mcserv_buf, size_to_read);
641 if (size_readed < 0) {
646 if (size_readed == size_to_read) {
647 dmaStruct.size = size_readed;
651 eP.size2 = size_readed & 0x3f;
652 if ((size_readed & 0x3f) != 0) {
653 eP.dest2 = (
void *)((u8 *)eedata + (size_readed & 0xffffffc0));
654 memcpy(eP.src2, (
void *)(mcserv_buf + (size_readed & 0xffffffc0)), size_readed & 0x3f);
657 if (eP.size2 == size_readed)
658 goto skip_dma_transfer;
660 dmaStruct.size = size_readed - eP.size2;
663 dmaStruct.src = (
void *)mcserv_buf;
664 dmaStruct.dest = (
void *)eedata;
668 sceSifSetDma(&dmaStruct, 1);
672 file_offset += size_readed;
673 left_to_read -= size_readed;
674 eedata = (
void *)((u8 *)eedata + size_readed);
676 if (size_to_read != size_readed) {
686 size_readed = McRead(dP->fd, eP.src2, eP.size2);
688 if (size_readed < 0) {
693 file_offset += size_readed;
694 eP.size2 = size_readed;
698 dmaStruct.src = (
void *)&eP;
699 dmaStruct.dest = (
void *)dP->param;
704 status = sceSifSetDma(&dmaStruct, 1);
707 while (sceSifDmaStat(status) >= 0)
710 if (size_readed != 0)
717int _McWrite(
void *rpc_buf)
721 register int size_written;
723 DPRINTF(
"_McWrite fd %d ee buffer addr %x size %d\n", dP->fd, (
int)dP->buffer, dP->size);
727 if (dP->origin != 0) {
728 size_written = McWrite(dP->fd, dP->data, dP->origin);
730 if (size_written != dP->origin)
734 while (dP->size > 0) {
735 register int size_to_write, r;
737 size_to_write = dP->size;
739 if (dP->size > MCSERV_BUFSIZE)
740 size_to_write = MCSERV_BUFSIZE;
742 sceSifGetOtherData(&rD, dP->buffer, &mcserv_buf, size_to_write, 0);
744 r = McWrite(dP->fd, &mcserv_buf, size_to_write);
745 if (r != size_to_write) {
748 return r + size_written;
751 size_written += size_to_write;
752 dP->size -= size_to_write;
754 dP->buffer += size_to_write;
761int _McGetDir(
void *rpc_buf)
764 register int status, file_entries, flags, r;
768 DPRINTF(
"_McGetDir port%d slot%d dir %s flags %d maxent %d mcT addr %x\n", nP->port, nP->slot, nP->name, nP->flags, nP->maxent, (
int)nP->mcT);
776 while (nP->maxent > -1) {
778 r = McGetDir(nP->port, nP->slot, nP->name, flags & 0xffff, 1, (
sceMcTblGetDir *)mcserv_buf);
786 dmaStruct.src = (
void *)mcserv_buf;
787 dmaStruct.dest = (
void *)nP->mcT;
792 status = sceSifSetDma(&dmaStruct, 1);
804 while (sceSifDmaStat(status) >= 0)
811int _McChDir(
void *rpc_buf)
814 register int status, r;
818 DPRINTF(
"_McChDir port%d slot%d newdir %s\n", nP->port, nP->slot, nP->name);
820 r = McChDir(nP->port, nP->slot, nP->name, (
char *)mcserv_buf);
822 dmaStruct.src = (
void *)mcserv_buf;
823 dmaStruct.dest = (
void *)nP->curdir;
824 dmaStruct.size = 1024;
828 status = sceSifSetDma(&dmaStruct, 1);
831 while (sceSifDmaStat(status) >= 0)
838int _McFormat(
void *rpc_buf)
842 DPRINTF(
"_McFormat port%d slot%d\n", dP->port, dP->slot);
844 return McFormat(dP->port, dP->slot);
848int _McUnformat(
void *rpc_buf)
852 DPRINTF(
"_McUnformat port%d slot%d\n", dP->port, dP->slot);
854 return McUnformat(dP->port, dP->slot);
858int _McGetInfo(
void *rpc_buf)
861 register int status, mc_free, r;
866 DPRINTF(
"_McGetInfo port%d slot%d\n", dP->port, dP->slot);
870 r = McDetectCard(dP->port, dP->slot);
873 eP.type = McGetMcType(dP->port, dP->slot);
880 mc_free = McGetFreeClusters(dP->port, dP->slot);
887 dmaStruct.src = (
void *)&eP;
888 dmaStruct.dest = (
void *)dP->param;
893 status = sceSifSetDma(&dmaStruct, 1);
896 while (sceSifDmaStat(status) >= 0)
906#ifdef BUILDING_XMCSERV
907int _McGetInfo2(
void *rpc_buf)
910 register int status, mc_free, r;
915 DPRINTF(
"_McGetInfo2 port%d slot%d\n", dP->port, dP->slot);
919 r = McDetectCard2(dP->port, dP->slot);
922 eP.type = McGetMcType(dP->port, dP->slot);
930 if (dP->offset > 0) {
931 mc_free = McGetFreeClusters(dP->port, dP->slot);
941 if (McGetFormat(dP->port, dP->slot) > 0)
947 dmaStruct.src = (
void *)&eP;
948 dmaStruct.dest = (
void *)dP->param;
953 status = sceSifSetDma(&dmaStruct, 1);
956 while (sceSifDmaStat(status) >= 0)
967#ifdef BUILDING_XMCSERV
968int _McGetEntSpace(
void *rpc_buf)
972 DPRINTF(
"_McGetEntSpace port%d slot%d dirname %s\n", nP->port, nP->slot, nP->name);
974 return McGetEntSpace(nP->port, nP->slot, nP->name);
979int _McDelete(
void *rpc_buf)
983 DPRINTF(
"_McDelete port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
985 return McDelete(nP->port, nP->slot, nP->name, nP->flags);
989int _McFlush(
void *rpc_buf)
993 DPRINTF(
"_McFlush fd %d\n", dP->fd);
995 return McFlush(dP->fd);
999int _McEraseBlock(
void *rpc_buf)
1005 DPRINTF(
"_McEraseBlock port%d slot%d offset %d\n", dP->port, dP->slot, dP->offset);
1007 dP->port = (dP->port & 1) + 2;
1009 if (McGetMcType(dP->port, dP->slot) == 2) {
1010 register int pagenum;
1012 r = McEraseBlock(dP->port, dP->offset, NULL, NULL);
1016 if (dP->origin == -1)
1019 memset(mcserv_buf, dP->origin, 512);
1021 McDataChecksum(&mcserv_buf[0], &eccbuf[0]);
1022 McDataChecksum(&mcserv_buf[128], &eccbuf[3]);
1023 McDataChecksum(&mcserv_buf[256], &eccbuf[6]);
1024 McDataChecksum(&mcserv_buf[384], &eccbuf[9]);
1029 r = McWritePage(dP->port, dP->slot, (dP->offset << 4) + pagenum, mcserv_buf, eccbuf);
1031 }
while (++pagenum < 16);
1037 memset(mcserv_buf, dP->origin, 128);
1039 r = McWritePS1PDACard(dP->port, dP->slot, dP->offset, mcserv_buf);
1045int _McReadPage(
void *rpc_buf)
1049 register int status, fastsize, r, i, j;
1053 DPRINTF(
"_McReadPage port%d slot%d page %d\n", dP->port, dP->slot, dP->fd);
1055 eP.dest1 = dP->buffer;
1057 fastsize = ((u32)dP->buffer) & 0xf;
1058 dP->port = (dP->port & 1) + 2;
1060 if (McGetMcType(dP->port, dP->slot) == 2) {
1062 McReadPage(dP->port, dP->slot, dP->fd, (
void *)(mcserv_buf + fastsize));
1065 memset((
void *)(mcserv_buf + fastsize), 0, 512);
1066 r = McReadPS1PDACard(dP->port, dP->slot, dP->fd, (
void *)(mcserv_buf + fastsize));
1075 eP.src1[i] = mcserv_buf[j];
1083 eP.src1[i] = mcserv_buf[512 + j];
1089 dmaStruct.src = (
void *)(mcserv_buf + 16);
1090 dmaStruct.dest = (
void *)(dP->buffer - (fastsize - 16));
1091 dmaStruct.size = 496;
1096 dmaStruct.src = (
void *)mcserv_buf;
1097 dmaStruct.dest = (
void *)dP->buffer;
1098 dmaStruct.size = 512;
1103 sceSifSetDma(&dmaStruct, 1);
1106 dmaStruct.src = (
void *)&eP;
1107 dmaStruct.dest = (
void *)dP->param;
1112 status = sceSifSetDma(&dmaStruct, 1);
1115 while (sceSifDmaStat(status) >= 0)
1122int _McWritePage(
void *rpc_buf)
1125 register int fastsize, i, j;
1129 DPRINTF(
"_McWritePage port%d slot%d page %d\n", dP->port, dP->slot, dP->fd);
1131 fastsize = ((u32)dP->buffer) & 0xf;
1135 sceSifGetOtherData(&rD, (
void *)(dP->buffer - (fastsize - 16)), &mcserv_buf, 496, 0);
1139 mcserv_buf[i] = dP->data[i - fastsize];
1149 while (i < fastsize) {
1150 mcserv_buf[496 + j] = dP->data[j - fastsize];
1159 sceSifGetOtherData(&rD, dP->buffer, &mcserv_buf, 512, 0);
1163 McDataChecksum((
void *)(mcserv_buf + fastsize), &eccbuf[0]);
1164 McDataChecksum(&mcserv_buf[128], &eccbuf[3]);
1165 McDataChecksum(&mcserv_buf[256], &eccbuf[6]);
1166 McDataChecksum(&mcserv_buf[384], &eccbuf[9]);
1168 return McWritePage((dP->port & 1) | 2, dP->slot, dP->fd, (
void *)(mcserv_buf + fastsize), eccbuf);
1172int _McSetFileInfo(
void *rpc_buf)
1177 DPRINTF(
"_McSetFileInfo port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
1179 sceSifGetOtherData(&rD, (
void *)nP->mcT, &mcserv_buf, sizeof (
sceMcTblGetDir), 0);
1181 return McSetFileInfo(nP->port, nP->slot, nP->name, (
sceMcTblGetDir *)mcserv_buf, nP->flags);
1185#ifdef BUILDING_XMCSERV
1186int _McCheckBlock(
void *rpc_buf)
1190 DPRINTF(
"_McCheckBlock port%d slot%d block %d\n", dP->port, dP->slot, dP->offset);
1192 return McCheckBlock(dP->port, dP->slot, dP->offset);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)