19static int mcserv_tidS_0400;
20static int mcserv_in_rpc_0400 = 0;
22static SifRpcDataQueue_t mcserv_qdS_0400
__attribute__((aligned(16)));
23static SifRpcServerData_t mcserv_sdS_0400
__attribute__((aligned(16)));
25static u8 mcserv_rpc_buf[2048]
__attribute__((__aligned__(4)));
28#define MCSERV_BUFSIZE 8192
29static u8 mcserv_buf[MCSERV_BUFSIZE]
__attribute__((aligned(16)));
31#ifdef BUILDING_XFROMSERV
32#define MCSERV_RPC_ID 0x80000480
34#define MCSERV_EXPORT_TABLE (&_exp_xfromsrv)
36#define MCSERV_RPC_ID 0x80000400
38#define MCSERV_EXPORT_TABLE (&_exp_mcserv)
42int _start(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
44 iop_thread_t thread_param;
45 register int thread_id;
52 sio_init(38400, 0, 0, 0, 0);
54 DPRINTF(
"_start...\n");
61 if (mcserv_in_rpc_0400)
63 return MODULE_REMOVABLE_END;
67 release_res = ReleaseLibraryEntries(MCSERV_EXPORT_TABLE);
69 if (release_res == 0 || release_res == -213)
71 TerminateThread(mcserv_tidS_0400);
72 DeleteThread(mcserv_tidS_0400);
73 sceSifRemoveRpc(&mcserv_sdS_0400, &mcserv_qdS_0400);
74 sceSifRemoveRpcQueue(&mcserv_qdS_0400);
75 return MODULE_NO_RESIDENT_END;
77 return MODULE_REMOVABLE_END;
81 DPRINTF(
"registering exports...\n");
82 if (RegisterLibraryEntries(MCSERV_EXPORT_TABLE) != 0)
87 DPRINTF(
"starting RPC thread...\n");
88 thread_param.attr = TH_C;
89 thread_param.thread = thread_rpc_S_0400;
90 thread_param.priority = 0x68;
91 thread_param.stacksize = 0x1000;
92 thread_param.option = 0;
94 thread_id = CreateThread(&thread_param);
95 mcserv_tidS_0400 = thread_id;
97 StartThread(thread_id, 0);
99 DPRINTF(
"_start returns MODULE_RESIDENT_END...\n");
101 if (mi && ((mi->
newflags & 2) != 0))
103 return MODULE_RESIDENT_END;
107 DPRINTF(
"_start returns MODULE_NO_RESIDENT_END...\n");
109 return MODULE_NO_RESIDENT_END;
113void thread_rpc_S_0400(
void* arg)
117 if (!sceSifCheckInit())
121 sceSifSetRpcQueue(&mcserv_qdS_0400, GetThreadId());
122 sceSifRegisterRpc(&mcserv_sdS_0400, MCSERV_RPC_ID, (
void *)cb_rpc_S_0400, &mcserv_rpc_buf, NULL, NULL, &mcserv_qdS_0400);
123 sceSifRpcLoop(&mcserv_qdS_0400);
127void *cb_rpc_S_0400(u32 fno,
void *buf,
int size)
129 int need_replace_bad_block;
134 need_replace_bad_block = 1;
136 mcserv_in_rpc_0400 = 1;
141#ifdef BUILDING_XMCSERV
144 rpc_stat.result = sceMcInit();
147#ifdef BUILDING_XMCSERV
150 rpc_stat.result = sceMcOpen();
153#ifdef BUILDING_XMCSERV
156 rpc_stat.result = sceMcClose();
159 rpc_stat.result = sceMcRead();
162#ifdef BUILDING_XMCSERV
165 rpc_stat.result = sceMcWrite();
168#ifdef BUILDING_XMCSERV
171 rpc_stat.result = sceMcSeek();
174#ifdef BUILDING_XMCSERV
177 rpc_stat.result = sceMcGetDir();
180#ifdef BUILDING_XMCSERV
183 rpc_stat.result = sceMcFormat();
186 rpc_stat.result = sceMcGetInfo();
189#ifdef BUILDING_XMCSERV
192 rpc_stat.result = sceMcDelete();
195#ifdef BUILDING_XMCSERV
198 rpc_stat.result = sceMcFlush();
201#ifdef BUILDING_XMCSERV
204 rpc_stat.result = sceMcChDir();
207#ifdef BUILDING_XMCSERV
210 rpc_stat.result = sceMcSetFileInfo();
213 rpc_stat.result = sceMcEraseBlock();
216 rpc_stat.result = sceMcReadPage();
219 rpc_stat.result = sceMcWritePage();
222#ifdef BUILDING_XMCSERV
225 rpc_stat.result = sceMcUnformat();
227#ifdef BUILDING_XMCSERV
229 rpc_stat.result = sceMcGetInfo2();
232 rpc_stat.result = sceMcRead2();
235 rpc_stat.result = sceMcGetEntSpace();
238 rpc_stat.result = sceMcCheckBlock();
244 need_replace_bad_block = 0;
248 if (need_replace_bad_block)
251 mcserv_in_rpc_0400 = 0;
253 return (
void *)&rpc_stat;
260#ifdef BUILDING_XMCSERV
264 r = _McInit(&mcserv_rpc_buf);
266#ifdef BUILDING_XMCSERV
269 rpc_stat.mcserv_version = MODVER;
280 return _McOpen(&mcserv_rpc_buf);
286 return _McClose(&mcserv_rpc_buf);
292 return _McRead(&mcserv_rpc_buf);
298 return _McRead2(&mcserv_rpc_buf);
304 return _McWrite(&mcserv_rpc_buf);
310 return _McSeek(&mcserv_rpc_buf);
316 return _McGetDir(&mcserv_rpc_buf);
322 return _McFormat(&mcserv_rpc_buf);
326int sceMcUnformat(
void)
328 return _McUnformat(&mcserv_rpc_buf);
332int sceMcGetInfo(
void)
334 return _McGetInfo(&mcserv_rpc_buf);
338#ifdef BUILDING_XMCSERV
339int sceMcGetInfo2(
void)
341 return _McGetInfo2(&mcserv_rpc_buf);
348 return _McDelete(&mcserv_rpc_buf);
354 return _McFlush(&mcserv_rpc_buf);
360 return _McChDir(&mcserv_rpc_buf);
364int sceMcEraseBlock(
void)
366 return _McEraseBlock(&mcserv_rpc_buf);
370int sceMcReadPage(
void)
372 return _McReadPage(&mcserv_rpc_buf);
376int sceMcWritePage(
void)
378 return _McWritePage(&mcserv_rpc_buf);
382int sceMcSetFileInfo(
void)
384 return _McSetFileInfo(&mcserv_rpc_buf);
388#ifdef BUILDING_XMCSERV
389int sceMcGetEntSpace(
void)
391 return _McGetEntSpace(&mcserv_rpc_buf);
396#ifdef BUILDING_XMCSERV
397int sceMcCheckBlock(
void)
399 return _McCheckBlock(&mcserv_rpc_buf);
404int _McInit(
void *rpc_buf)
408 DPRINTF(
"_McInit fd %d offset %d\n", dP->fd, dP->offset);
410#ifndef BUILDING_XMCSERV
414 if (dP->offset == -217)
417 McSetPS1CardFlag(ps1flag);
421 return McRetOnly(dP->fd);
425int _McOpen(
void *rpc_buf)
429 DPRINTF(
"_McOpen port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
431 return McOpen(nP->port, nP->slot, nP->name, nP->flags);
435int _McClose(
void *rpc_buf)
439 DPRINTF(
"_McClose fd %d\n", dP->fd);
441 return McClose(dP->fd);
445int _McSeek(
void *rpc_buf)
449 DPRINTF(
"_McSeek fd %d offset %d origin %d\n", dP->fd, dP->offset, dP->origin);
451 return McSeek(dP->fd, dP->offset, dP->origin);
455int _McRead(
void *rpc_buf)
458 register int file_offset, status;
459 register int left_to_read, size_readed, size_to_read;
461 SifDmaTransfer_t dmaStruct;
465 DPRINTF(
"_McRead fd %d ee buffer addr %x size %d\n", dP->fd, (
int)dP->buffer, dP->size);
480 eP.size1 = (((int)(eedata)-1) & 0xfffffff0) - ((
int)(eedata) - 16);
482 eP.size2 = (dP->size - eP.size1) & 0x0f;
483 left_to_read = (dP->size - eP.size1) - eP.size2;
486 eP.dest2 = (
void *)((u8 *)eedata + eP.size1 + left_to_read);
489 size_readed = McRead(dP->fd, eP.src1, eP.size1);
491 if (size_readed < 0) {
497 file_offset = size_readed;
499 eedata = (
void *)((u8 *)eedata + size_readed);
501 if (size_readed != eP.size1) {
502 eP.size1 = size_readed;
512 while (left_to_read > 0) {
514 size_to_read = left_to_read;
516 if (left_to_read > MCSERV_BUFSIZE)
517 size_to_read = MCSERV_BUFSIZE;
519 size_readed = McRead(dP->fd, mcserv_buf, size_to_read);
521 if (size_readed < 0) {
526 dmaStruct.src = (
void *)mcserv_buf;
527 dmaStruct.dest = (
void *)eedata;
528 dmaStruct.size = size_readed;
532 sceSifSetDma(&dmaStruct, 1);
534 file_offset += size_readed;
535 left_to_read -= size_readed;
539 eedata = (
void *)((u8 *)eedata + size_readed);
541 if (size_to_read != size_readed) {
552 size_readed = McRead(dP->fd, eP.src2, eP.size2);
554 if (size_readed < 0) {
559 file_offset += size_readed;
560 eP.size2 = size_readed;
564 dmaStruct.src = (
void *)&eP;
565 dmaStruct.dest = (
void *)dP->param;
570 status = sceSifSetDma(&dmaStruct, 1);
573 while (sceSifDmaStat(status) >= 0)
576 if (size_readed != 0)
583int _McRead2(
void *rpc_buf)
586 register int file_offset, status;
587 register int left_to_read, size_readed, size_to_read;
589 SifDmaTransfer_t dmaStruct;
593 DPRINTF(
"_McRead2 fd %d ee buffer addr %x size %d\n", dP->fd, (
int)dP->buffer, dP->size);
608 eP.size1 = (((u32)(eedata)-1) & 0xffffffc0) - ((u32)(eedata) - 64);
610 eP.size2 = (dP->size - eP.size1) & 0x3f;
611 left_to_read = (dP->size - eP.size1) - eP.size2;
614 eP.dest2 = (
void *)((u8 *)eedata + eP.size1 + left_to_read);
617 size_readed = McRead(dP->fd, eP.src1, eP.size1);
619 if (size_readed < 0) {
625 file_offset = size_readed;
627 eedata = (
void *)((u8 *)eedata + size_readed);
629 if (size_readed != eP.size1) {
630 eP.size1 = size_readed;
640 while (left_to_read > 0) {
642 size_to_read = left_to_read;
644 if (left_to_read > MCSERV_BUFSIZE)
645 size_to_read = MCSERV_BUFSIZE;
647 size_readed = McRead(dP->fd, mcserv_buf, size_to_read);
649 if (size_readed < 0) {
654 if (size_readed == size_to_read) {
655 dmaStruct.size = size_readed;
659 eP.size2 = size_readed & 0x3f;
660 if ((size_readed & 0x3f) != 0) {
661 eP.dest2 = (
void *)((u8 *)eedata + (size_readed & 0xffffffc0));
662 memcpy(eP.src2, (
void *)(mcserv_buf + (size_readed & 0xffffffc0)), size_readed & 0x3f);
665 if (eP.size2 == size_readed)
666 goto skip_dma_transfer;
668 dmaStruct.size = size_readed - eP.size2;
671 dmaStruct.src = (
void *)mcserv_buf;
672 dmaStruct.dest = (
void *)eedata;
676 sceSifSetDma(&dmaStruct, 1);
680 file_offset += size_readed;
681 left_to_read -= size_readed;
682 eedata = (
void *)((u8 *)eedata + size_readed);
684 if (size_to_read != size_readed) {
694 size_readed = McRead(dP->fd, eP.src2, eP.size2);
696 if (size_readed < 0) {
701 file_offset += size_readed;
702 eP.size2 = size_readed;
706 dmaStruct.src = (
void *)&eP;
707 dmaStruct.dest = (
void *)dP->param;
712 status = sceSifSetDma(&dmaStruct, 1);
715 while (sceSifDmaStat(status) >= 0)
718 if (size_readed != 0)
725int _McWrite(
void *rpc_buf)
728 SifRpcReceiveData_t rD;
729 register int size_written;
731 DPRINTF(
"_McWrite fd %d ee buffer addr %x size %d\n", dP->fd, (
int)dP->buffer, dP->size);
735 if (dP->origin != 0) {
736 size_written = McWrite(dP->fd, dP->data, dP->origin);
738 if (size_written != dP->origin)
742 while (dP->size > 0) {
743 register int size_to_write, r;
745 size_to_write = dP->size;
747 if (dP->size > MCSERV_BUFSIZE)
748 size_to_write = MCSERV_BUFSIZE;
750 sceSifGetOtherData(&rD, dP->buffer, &mcserv_buf, size_to_write, 0);
752 r = McWrite(dP->fd, &mcserv_buf, size_to_write);
753 if (r != size_to_write) {
756 return r + size_written;
759 size_written += size_to_write;
760 dP->size -= size_to_write;
762 dP->buffer += size_to_write;
769int _McGetDir(
void *rpc_buf)
772 register int status, file_entries, flags, r;
773 SifDmaTransfer_t dmaStruct;
776 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);
784 while (nP->maxent > -1) {
786 r = McGetDir(nP->port, nP->slot, nP->name, flags & 0xffff, 1, (sceMcTblGetDir *)mcserv_buf);
794 dmaStruct.src = (
void *)mcserv_buf;
795 dmaStruct.dest = (
void *)nP->mcT;
796 dmaStruct.size =
sizeof (sceMcTblGetDir);
800 status = sceSifSetDma(&dmaStruct, 1);
812 while (sceSifDmaStat(status) >= 0)
819int _McChDir(
void *rpc_buf)
822 register int status, r;
823 SifDmaTransfer_t dmaStruct;
826 DPRINTF(
"_McChDir port%d slot%d newdir %s\n", nP->port, nP->slot, nP->name);
828 r = McChDir(nP->port, nP->slot, nP->name, (
char *)mcserv_buf);
830 dmaStruct.src = (
void *)mcserv_buf;
831 dmaStruct.dest = (
void *)nP->curdir;
832 dmaStruct.size = 1024;
836 status = sceSifSetDma(&dmaStruct, 1);
839 while (sceSifDmaStat(status) >= 0)
846int _McFormat(
void *rpc_buf)
850 DPRINTF(
"_McFormat port%d slot%d\n", dP->port, dP->slot);
852 return McFormat(dP->port, dP->slot);
856int _McUnformat(
void *rpc_buf)
860 DPRINTF(
"_McUnformat port%d slot%d\n", dP->port, dP->slot);
862 return McUnformat(dP->port, dP->slot);
866int _McGetInfo(
void *rpc_buf)
869 register int status, mc_free, r;
871 SifDmaTransfer_t dmaStruct;
874 DPRINTF(
"_McGetInfo port%d slot%d\n", dP->port, dP->slot);
878 r = McDetectCard(dP->port, dP->slot);
881 eP.type = McGetMcType(dP->port, dP->slot);
888 mc_free = McGetFreeClusters(dP->port, dP->slot);
895 dmaStruct.src = (
void *)&eP;
896 dmaStruct.dest = (
void *)dP->param;
901 status = sceSifSetDma(&dmaStruct, 1);
904 while (sceSifDmaStat(status) >= 0)
914#ifdef BUILDING_XMCSERV
915int _McGetInfo2(
void *rpc_buf)
918 register int status, mc_free, r;
920 SifDmaTransfer_t dmaStruct;
923 DPRINTF(
"_McGetInfo2 port%d slot%d\n", dP->port, dP->slot);
927 r = McDetectCard2(dP->port, dP->slot);
930 eP.type = McGetMcType(dP->port, dP->slot);
938 if (dP->offset > 0) {
939 mc_free = McGetFreeClusters(dP->port, dP->slot);
949 if (McGetFormat(dP->port, dP->slot) > 0)
955 dmaStruct.src = (
void *)&eP;
956 dmaStruct.dest = (
void *)dP->param;
961 status = sceSifSetDma(&dmaStruct, 1);
964 while (sceSifDmaStat(status) >= 0)
975#ifdef BUILDING_XMCSERV
976int _McGetEntSpace(
void *rpc_buf)
980 DPRINTF(
"_McGetEntSpace port%d slot%d dirname %s\n", nP->port, nP->slot, nP->name);
982 return McGetEntSpace(nP->port, nP->slot, nP->name);
987int _McDelete(
void *rpc_buf)
991 DPRINTF(
"_McDelete port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
993 return McDelete(nP->port, nP->slot, nP->name, nP->flags);
997int _McFlush(
void *rpc_buf)
1001 DPRINTF(
"_McFlush fd %d\n", dP->fd);
1003 return McFlush(dP->fd);
1007int _McEraseBlock(
void *rpc_buf)
1013 DPRINTF(
"_McEraseBlock port%d slot%d offset %d\n", dP->port, dP->slot, dP->offset);
1015 dP->port = (dP->port & 1) + 2;
1017 if (McGetMcType(dP->port, dP->slot) == 2) {
1018 register int pagenum;
1020 r = McEraseBlock(dP->port, dP->offset, NULL, NULL);
1024 if (dP->origin == -1)
1027 memset(mcserv_buf, dP->origin, 512);
1029 McDataChecksum(&mcserv_buf[0], &eccbuf[0]);
1030 McDataChecksum(&mcserv_buf[128], &eccbuf[3]);
1031 McDataChecksum(&mcserv_buf[256], &eccbuf[6]);
1032 McDataChecksum(&mcserv_buf[384], &eccbuf[9]);
1037 r = McWritePage(dP->port, dP->slot, (dP->offset << 4) + pagenum, mcserv_buf, eccbuf);
1039 }
while (++pagenum < 16);
1045 memset(mcserv_buf, dP->origin, 128);
1047 r = McWritePS1PDACard(dP->port, dP->slot, dP->offset, mcserv_buf);
1053int _McReadPage(
void *rpc_buf)
1057 register int status, fastsize, r, i, j;
1058 SifDmaTransfer_t dmaStruct;
1061 DPRINTF(
"_McReadPage port%d slot%d page %d\n", dP->port, dP->slot, dP->fd);
1063 eP.dest1 = dP->buffer;
1065 fastsize = ((u32)dP->buffer) & 0xf;
1066 dP->port = (dP->port & 1) + 2;
1068 if (McGetMcType(dP->port, dP->slot) == 2) {
1070 McReadPage(dP->port, dP->slot, dP->fd, (
void *)(mcserv_buf + fastsize));
1073 memset((
void *)(mcserv_buf + fastsize), 0, 512);
1074 r = McReadPS1PDACard(dP->port, dP->slot, dP->fd, (
void *)(mcserv_buf + fastsize));
1083 eP.src1[i] = mcserv_buf[j];
1091 eP.src1[i] = mcserv_buf[512 + j];
1097 dmaStruct.src = (
void *)(mcserv_buf + 16);
1098 dmaStruct.dest = (
void *)(dP->buffer - (fastsize - 16));
1099 dmaStruct.size = 496;
1104 dmaStruct.src = (
void *)mcserv_buf;
1105 dmaStruct.dest = (
void *)dP->buffer;
1106 dmaStruct.size = 512;
1111 sceSifSetDma(&dmaStruct, 1);
1114 dmaStruct.src = (
void *)&eP;
1115 dmaStruct.dest = (
void *)dP->param;
1120 status = sceSifSetDma(&dmaStruct, 1);
1123 while (sceSifDmaStat(status) >= 0)
1130int _McWritePage(
void *rpc_buf)
1133 register int fastsize, i, j;
1134 SifRpcReceiveData_t rD;
1137 DPRINTF(
"_McWritePage port%d slot%d page %d\n", dP->port, dP->slot, dP->fd);
1139 fastsize = ((u32)dP->buffer) & 0xf;
1143 sceSifGetOtherData(&rD, (
void *)(dP->buffer - (fastsize - 16)), &mcserv_buf, 496, 0);
1147 mcserv_buf[i] = dP->data[i - fastsize];
1157 while (i < fastsize) {
1158 mcserv_buf[496 + j] = dP->data[j - fastsize];
1167 sceSifGetOtherData(&rD, dP->buffer, &mcserv_buf, 512, 0);
1171 McDataChecksum((
void *)(mcserv_buf + fastsize), &eccbuf[0]);
1172 McDataChecksum(&mcserv_buf[128], &eccbuf[3]);
1173 McDataChecksum(&mcserv_buf[256], &eccbuf[6]);
1174 McDataChecksum(&mcserv_buf[384], &eccbuf[9]);
1176 return McWritePage((dP->port & 1) | 2, dP->slot, dP->fd, (
void *)(mcserv_buf + fastsize), eccbuf);
1180int _McSetFileInfo(
void *rpc_buf)
1183 SifRpcReceiveData_t rD;
1185 DPRINTF(
"_McSetFileInfo port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
1187 sceSifGetOtherData(&rD, (
void *)nP->mcT, &mcserv_buf, sizeof (sceMcTblGetDir), 0);
1189 return McSetFileInfo(nP->port, nP->slot, nP->name, (sceMcTblGetDir *)mcserv_buf, nP->flags);
1193#ifdef BUILDING_XMCSERV
1194int _McCheckBlock(
void *rpc_buf)
1198 DPRINTF(
"_McCheckBlock port%d slot%d block %d\n", dP->port, dP->slot, dP->offset);
1200 return McCheckBlock(dP->port, dP->slot, dP->offset);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
struct _ModuleInfo ModuleInfo_t