sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
mcserv.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright (c) 2009 jimmikaelkael
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "mcserv.h"
12
13// TODO: last sdk 3.1.0 and sdk 3.0.3 has MCSERV module version 0x2,0x10
14// Check what was changed, and maybe port changes.
15// Note: currently is based on the last XMCSERV from BOOTROM:
16// 0x02,0x08
17IRX_ID(MODNAME, 2, 8);
18
19static int mcserv_tidS_0400;
20static int mcserv_in_rpc_0400 = 0;
21
22static SifRpcDataQueue_t mcserv_qdS_0400 __attribute__((aligned(16)));
23static SifRpcServerData_t mcserv_sdS_0400 __attribute__((aligned(16)));
24
25static u8 mcserv_rpc_buf[2048] __attribute__((__aligned__(4)));
26static mcRpcStat_t rpc_stat __attribute__((aligned(16)));
27
28#define MCSERV_BUFSIZE 8192
29static u8 mcserv_buf[MCSERV_BUFSIZE] __attribute__((aligned(16)));
30
31#ifdef BUILDING_XFROMSERV
32#define MCSERV_RPC_ID 0x80000480
33extern struct irx_export_table _exp_xfromsrv;
34#define MCSERV_EXPORT_TABLE (&_exp_xfromsrv)
35#else
36#define MCSERV_RPC_ID 0x80000400
37extern struct irx_export_table _exp_mcserv;
38#define MCSERV_EXPORT_TABLE (&_exp_mcserv)
39#endif
40
41//--------------------------------------------------------------
42int _start(int argc, char *argv[], void *startaddr, ModuleInfo_t *mi)
43{
44 iop_thread_t thread_param;
45 register int thread_id;
46
47 (void)argc;
48 (void)argv;
49 (void)startaddr;
50
51#ifdef SIO_DEBUG
52 sio_init(38400, 0, 0, 0, 0);
53#endif
54 DPRINTF("_start...\n");
55
56 if (argc < 0)
57 {
58 int release_res;
59 int state;
60
61 if (mcserv_in_rpc_0400)
62 {
63 return MODULE_REMOVABLE_END;
64 }
65
66 CpuSuspendIntr(&state);
67 release_res = ReleaseLibraryEntries(MCSERV_EXPORT_TABLE);
68 CpuResumeIntr(state);
69 if (release_res == 0 || release_res == -213)
70 {
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;
76 }
77 return MODULE_REMOVABLE_END;
78 }
79
80 // Register mcserv dummy export table
81 DPRINTF("registering exports...\n");
82 if (RegisterLibraryEntries(MCSERV_EXPORT_TABLE) != 0)
83 goto err_out;
84
86
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;
93
94 thread_id = CreateThread(&thread_param);
95 mcserv_tidS_0400 = thread_id;
96
97 StartThread(thread_id, 0);
98
99 DPRINTF("_start returns MODULE_RESIDENT_END...\n");
100
101 if (mi && ((mi->newflags & 2) != 0))
102 mi->newflags |= 0x10;
103 return MODULE_RESIDENT_END;
104
105err_out:
106
107 DPRINTF("_start returns MODULE_NO_RESIDENT_END...\n");
108
109 return MODULE_NO_RESIDENT_END;
110}
111
112//--------------------------------------------------------------
113void thread_rpc_S_0400(void* arg)
114{
115 (void)arg;
116
117 if (!sceSifCheckInit())
118 sceSifInit();
119
120 sceSifInitRpc(0);
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);
124}
125
126//--------------------------------------------------------------
127void *cb_rpc_S_0400(u32 fno, void *buf, int size)
128{
129 int need_replace_bad_block;
130
131 (void)buf;
132 (void)size;
133
134 need_replace_bad_block = 1;
135
136 mcserv_in_rpc_0400 = 1;
137
138 switch (fno)
139 {
140 case 0x70:
141#ifdef BUILDING_XMCSERV
142 case 0xFE: // CMD_INIT
143#endif
144 rpc_stat.result = sceMcInit();
145 break;
146 case 0x71:
147#ifdef BUILDING_XMCSERV
148 case 0x02: // CMD_OPEN
149#endif
150 rpc_stat.result = sceMcOpen();
151 break;
152 case 0x72:
153#ifdef BUILDING_XMCSERV
154 case 0x03: // CMD_CLOSE
155#endif
156 rpc_stat.result = sceMcClose();
157 break;
158 case 0x73:
159 rpc_stat.result = sceMcRead();
160 break;
161 case 0x74:
162#ifdef BUILDING_XMCSERV
163 case 0x06: // CMD_WRITE
164#endif
165 rpc_stat.result = sceMcWrite();
166 break;
167 case 0x75:
168#ifdef BUILDING_XMCSERV
169 case 0x04: // CMD_SEEK
170#endif
171 rpc_stat.result = sceMcSeek();
172 break;
173 case 0x76:
174#ifdef BUILDING_XMCSERV
175 case 0x0D: // CMD_GETDIR
176#endif
177 rpc_stat.result = sceMcGetDir();
178 break;
179 case 0x77:
180#ifdef BUILDING_XMCSERV
181 case 0x10: // CMD_FORMAT
182#endif
183 rpc_stat.result = sceMcFormat();
184 break;
185 case 0x78:
186 rpc_stat.result = sceMcGetInfo();
187 break;
188 case 0x79:
189#ifdef BUILDING_XMCSERV
190 case 0x0F: // CMD_DELETE
191#endif
192 rpc_stat.result = sceMcDelete();
193 break;
194 case 0x7A:
195#ifdef BUILDING_XMCSERV
196 case 0x0A: // CMD_FLUSH
197#endif
198 rpc_stat.result = sceMcFlush();
199 break;
200 case 0x7B:
201#ifdef BUILDING_XMCSERV
202 case 0x0C: // CMD_CHDIR
203#endif
204 rpc_stat.result = sceMcChDir();
205 break;
206 case 0x7C:
207#ifdef BUILDING_XMCSERV
208 case 0x0E: // CMD_SETFILEINFO
209#endif
210 rpc_stat.result = sceMcSetFileInfo();
211 break;
212 case 0x7D:
213 rpc_stat.result = sceMcEraseBlock();
214 break;
215 case 0x7E:
216 rpc_stat.result = sceMcReadPage();
217 break;
218 case 0x7F:
219 rpc_stat.result = sceMcWritePage();
220 break;
221 case 0x80:
222#ifdef BUILDING_XMCSERV
223 case 0x11: // CMD_UNFORMAT
224#endif
225 rpc_stat.result = sceMcUnformat();
226 break;
227#ifdef BUILDING_XMCSERV
228 case 0x01: // CMD_GETINFO
229 rpc_stat.result = sceMcGetInfo2();
230 break;
231 case 0x05: // CMD_READ
232 rpc_stat.result = sceMcRead2();
233 break;
234 case 0x12: // CMD_GETENTSPACE
235 rpc_stat.result = sceMcGetEntSpace();
236 break;
237 case 0x33: // CMD_CHECKBLOCK (calls xmcman_funcs: 45)
238 rpc_stat.result = sceMcCheckBlock();
239 break;
240#endif
241 default:
242 // Do not set a result value
243 // (needed for detection of version by libmc)
244 need_replace_bad_block = 0;
245 break;
246 }
247
248 if (need_replace_bad_block)
249 McReplaceBadBlock();
250
251 mcserv_in_rpc_0400 = 0;
252
253 return (void *)&rpc_stat;
254}
255
256//--------------------------------------------------------------
257int sceMcInit(void)
258{
259 register int r;
260#ifdef BUILDING_XMCSERV
261 struct irx_id *ModuleInfo;
262#endif
263
264 r = _McInit(&mcserv_rpc_buf);
265
266#ifdef BUILDING_XMCSERV
267 {
268 ModuleInfo = McGetModuleInfo();
269 rpc_stat.mcserv_version = MODVER;
270 rpc_stat.mcman_version = ModuleInfo->v;
271 }
272#endif
273
274 return r;
275}
276
277//--------------------------------------------------------------
278int sceMcOpen(void)
279{
280 return _McOpen(&mcserv_rpc_buf);
281}
282
283//--------------------------------------------------------------
284int sceMcClose(void)
285{
286 return _McClose(&mcserv_rpc_buf);
287}
288
289//--------------------------------------------------------------
290int sceMcRead(void)
291{
292 return _McRead(&mcserv_rpc_buf);
293}
294
295//--------------------------------------------------------------
296int sceMcRead2(void)
297{
298 return _McRead2(&mcserv_rpc_buf);
299}
300
301//--------------------------------------------------------------
302int sceMcWrite(void)
303{
304 return _McWrite(&mcserv_rpc_buf);
305}
306
307//--------------------------------------------------------------
308int sceMcSeek(void)
309{
310 return _McSeek(&mcserv_rpc_buf);
311}
312
313//--------------------------------------------------------------
314int sceMcGetDir(void)
315{
316 return _McGetDir(&mcserv_rpc_buf);
317}
318
319//--------------------------------------------------------------
320int sceMcFormat(void)
321{
322 return _McFormat(&mcserv_rpc_buf);
323}
324
325//--------------------------------------------------------------
326int sceMcUnformat(void)
327{
328 return _McUnformat(&mcserv_rpc_buf);
329}
330
331//--------------------------------------------------------------
332int sceMcGetInfo(void)
333{
334 return _McGetInfo(&mcserv_rpc_buf);
335}
336
337//--------------------------------------------------------------
338#ifdef BUILDING_XMCSERV
339int sceMcGetInfo2(void)
340{
341 return _McGetInfo2(&mcserv_rpc_buf);
342}
343#endif
344
345//--------------------------------------------------------------
346int sceMcDelete(void)
347{
348 return _McDelete(&mcserv_rpc_buf);
349}
350
351//--------------------------------------------------------------
352int sceMcFlush(void)
353{
354 return _McFlush(&mcserv_rpc_buf);
355}
356
357//--------------------------------------------------------------
358int sceMcChDir(void)
359{
360 return _McChDir(&mcserv_rpc_buf);
361}
362
363//--------------------------------------------------------------
364int sceMcEraseBlock(void)
365{
366 return _McEraseBlock(&mcserv_rpc_buf);
367}
368
369//--------------------------------------------------------------
370int sceMcReadPage(void)
371{
372 return _McReadPage(&mcserv_rpc_buf);
373}
374
375//--------------------------------------------------------------
376int sceMcWritePage(void)
377{
378 return _McWritePage(&mcserv_rpc_buf);
379}
380
381//--------------------------------------------------------------
382int sceMcSetFileInfo(void)
383{
384 return _McSetFileInfo(&mcserv_rpc_buf);
385}
386
387//--------------------------------------------------------------
388#ifdef BUILDING_XMCSERV
389int sceMcGetEntSpace(void)
390{
391 return _McGetEntSpace(&mcserv_rpc_buf);
392}
393#endif
394
395//--------------------------------------------------------------
396#ifdef BUILDING_XMCSERV
397int sceMcCheckBlock(void)
398{
399 return _McCheckBlock(&mcserv_rpc_buf);
400}
401#endif
402
403//--------------------------------------------------------------
404int _McInit(void *rpc_buf)
405{
406 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
407
408 DPRINTF("_McInit fd %d offset %d\n", dP->fd, dP->offset);
409
410#ifndef BUILDING_XMCSERV
411 {
412 int ps1flag = 0;
413
414 if (dP->offset == -217)
415 ps1flag = 1;
416
417 McSetPS1CardFlag(ps1flag);
418 }
419#endif
420
421 return McRetOnly(dP->fd);
422}
423
424//--------------------------------------------------------------
425int _McOpen(void *rpc_buf)
426{
427 mcNameParam_t *nP = (mcNameParam_t *)rpc_buf;
428
429 DPRINTF("_McOpen port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
430
431 return McOpen(nP->port, nP->slot, nP->name, nP->flags);
432}
433
434//--------------------------------------------------------------
435int _McClose(void *rpc_buf)
436{
437 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
438
439 DPRINTF("_McClose fd %d\n", dP->fd);
440
441 return McClose(dP->fd);
442}
443
444//--------------------------------------------------------------
445int _McSeek(void *rpc_buf)
446{
447 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
448
449 DPRINTF("_McSeek fd %d offset %d origin %d\n", dP->fd, dP->offset, dP->origin);
450
451 return McSeek(dP->fd, dP->offset, dP->origin);
452}
453
454//--------------------------------------------------------------
455int _McRead(void *rpc_buf)
456{
457 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
458 register int file_offset, status;
459 register int left_to_read, size_readed, size_to_read;
460 mcEndParam_t eP;
461 SifDmaTransfer_t dmaStruct;
462 int intStatus;
463 void *eedata;
464
465 DPRINTF("_McRead fd %d ee buffer addr %x size %d\n", dP->fd, (int)dP->buffer, dP->size);
466
467 eP.size1 = 0;
468 eP.size2 = 0;
469 eP.dest1 = NULL;
470 eP.dest2 = NULL;
471
472 size_readed = 0;
473 file_offset = 0;
474
475 eedata = dP->buffer;
476
477 eP.size1 = dP->size;
478
479 if (dP->size > 16)
480 eP.size1 = (((int)(eedata)-1) & 0xfffffff0) - ((int)(eedata) - 16);
481
482 eP.size2 = (dP->size - eP.size1) & 0x0f;
483 left_to_read = (dP->size - eP.size1) - eP.size2;
484
485 if (eP.size2 != 0)
486 eP.dest2 = (void *)((u8 *)eedata + eP.size1 + left_to_read);
487
488 if (eP.size1 != 0) {
489 size_readed = McRead(dP->fd, eP.src1, eP.size1);
490
491 if (size_readed < 0) {
492 eP.size1 = 0;
493 eP.size2 = 0;
494 goto dma_transfer2;
495 }
496 else {
497 file_offset = size_readed;
498 eP.dest1 = eedata;
499 eedata = (void *)((u8 *)eedata + size_readed);
500
501 if (size_readed != eP.size1) {
502 eP.size1 = size_readed;
503 eP.size2 = 0;
504 size_readed = 0;
505 goto dma_transfer2;
506 }
507 else
508 size_readed = 0;
509 }
510 }
511
512 while (left_to_read > 0) {
513
514 size_to_read = left_to_read;
515
516 if (left_to_read > MCSERV_BUFSIZE)
517 size_to_read = MCSERV_BUFSIZE;
518
519 size_readed = McRead(dP->fd, mcserv_buf, size_to_read);
520
521 if (size_readed < 0) {
522 eP.size2 = 0;
523 goto dma_transfer2;
524 }
525
526 dmaStruct.src = (void *)mcserv_buf;
527 dmaStruct.dest = (void *)eedata;
528 dmaStruct.size = size_readed;
529 dmaStruct.attr = 0;
530
531 CpuSuspendIntr(&intStatus);
532 sceSifSetDma(&dmaStruct, 1);
533
534 file_offset += size_readed;
535 left_to_read -= size_readed;
536
537 CpuResumeIntr(intStatus);
538
539 eedata = (void *)((u8 *)eedata + size_readed);
540
541 if (size_to_read != size_readed) {
542 eP.size2 = 0;
543 size_readed = 0;
544 goto dma_transfer2;
545 }
546 size_readed = 0;
547 }
548
549 if (eP.size2 == 0)
550 goto dma_transfer2;
551
552 size_readed = McRead(dP->fd, eP.src2, eP.size2);
553
554 if (size_readed < 0) {
555 eP.size2 = 0;
556 goto dma_transfer2;
557 }
558
559 file_offset += size_readed;
560 eP.size2 = size_readed;
561 size_readed = 0;
562
563dma_transfer2:
564 dmaStruct.src = (void *)&eP;
565 dmaStruct.dest = (void *)dP->param;
566 dmaStruct.size = sizeof (mcEndParam_t);
567 dmaStruct.attr = 0;
568
569 CpuSuspendIntr(&intStatus);
570 status = sceSifSetDma(&dmaStruct, 1);
571 CpuResumeIntr(intStatus);
572
573 while (sceSifDmaStat(status) >= 0)
574 DelayThread(100);
575
576 if (size_readed != 0)
577 return size_readed;
578
579 return file_offset;
580}
581
582//--------------------------------------------------------------
583int _McRead2(void *rpc_buf)
584{
585 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
586 register int file_offset, status;
587 register int left_to_read, size_readed, size_to_read;
588 mcEndParam2_t eP;
589 SifDmaTransfer_t dmaStruct;
590 int intStatus;
591 void *eedata;
592
593 DPRINTF("_McRead2 fd %d ee buffer addr %x size %d\n", dP->fd, (int)dP->buffer, dP->size);
594
595 eP.size1 = 0;
596 eP.size2 = 0;
597 eP.dest1 = NULL;
598 eP.dest2 = NULL;
599
600 size_readed = 0;
601 file_offset = 0;
602
603 eedata = dP->buffer;
604
605 eP.size1 = dP->size;
606
607 if (dP->size > 64)
608 eP.size1 = (((u32)(eedata)-1) & 0xffffffc0) - ((u32)(eedata) - 64);
609
610 eP.size2 = (dP->size - eP.size1) & 0x3f;
611 left_to_read = (dP->size - eP.size1) - eP.size2;
612
613 if (eP.size2 != 0)
614 eP.dest2 = (void *)((u8 *)eedata + eP.size1 + left_to_read);
615
616 if (eP.size1 != 0) {
617 size_readed = McRead(dP->fd, eP.src1, eP.size1);
618
619 if (size_readed < 0) {
620 eP.size1 = 0;
621 eP.size2 = 0;
622 goto dma_transfer2;
623 }
624 else {
625 file_offset = size_readed;
626 eP.dest1 = eedata;
627 eedata = (void *)((u8 *)eedata + size_readed);
628
629 if (size_readed != eP.size1) {
630 eP.size1 = size_readed;
631 eP.size2 = 0;
632 size_readed = 0;
633 goto dma_transfer2;
634 }
635 else
636 size_readed = 0;
637 }
638 }
639
640 while (left_to_read > 0) {
641
642 size_to_read = left_to_read;
643
644 if (left_to_read > MCSERV_BUFSIZE)
645 size_to_read = MCSERV_BUFSIZE;
646
647 size_readed = McRead(dP->fd, mcserv_buf, size_to_read);
648
649 if (size_readed < 0) {
650 eP.size2 = 0;
651 goto dma_transfer2;
652 }
653
654 if (size_readed == size_to_read) {
655 dmaStruct.size = size_readed;
656 goto dma_transfer;
657 }
658
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);
663 }
664
665 if (eP.size2 == size_readed)
666 goto skip_dma_transfer;
667
668 dmaStruct.size = size_readed - eP.size2;
669
670dma_transfer:
671 dmaStruct.src = (void *)mcserv_buf;
672 dmaStruct.dest = (void *)eedata;
673 dmaStruct.attr = 0;
674
675 CpuSuspendIntr(&intStatus);
676 sceSifSetDma(&dmaStruct, 1);
677 CpuResumeIntr(intStatus);
678
679skip_dma_transfer:
680 file_offset += size_readed;
681 left_to_read -= size_readed;
682 eedata = (void *)((u8 *)eedata + size_readed);
683
684 if (size_to_read != size_readed) {
685 size_readed = 0;
686 goto dma_transfer2;
687 }
688 size_readed = 0;
689 }
690
691 if (eP.size2 == 0)
692 goto dma_transfer2;
693
694 size_readed = McRead(dP->fd, eP.src2, eP.size2);
695
696 if (size_readed < 0) {
697 eP.size2 = 0;
698 goto dma_transfer2;
699 }
700
701 file_offset += size_readed;
702 eP.size2 = size_readed;
703 size_readed = 0;
704
705dma_transfer2:
706 dmaStruct.src = (void *)&eP;
707 dmaStruct.dest = (void *)dP->param;
708 dmaStruct.size = sizeof (mcEndParam2_t);
709 dmaStruct.attr = 0;
710
711 CpuSuspendIntr(&intStatus);
712 status = sceSifSetDma(&dmaStruct, 1);
713 CpuResumeIntr(intStatus);
714
715 while (sceSifDmaStat(status) >= 0)
716 DelayThread(100);
717
718 if (size_readed != 0)
719 return size_readed;
720
721 return file_offset;
722}
723
724//--------------------------------------------------------------
725int _McWrite(void *rpc_buf)
726{
727 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
728 SifRpcReceiveData_t rD;
729 register int size_written;
730
731 DPRINTF("_McWrite fd %d ee buffer addr %x size %d\n", dP->fd, (int)dP->buffer, dP->size);
732
733 size_written = 0;
734
735 if (dP->origin != 0) {
736 size_written = McWrite(dP->fd, dP->data, dP->origin);
737
738 if (size_written != dP->origin)
739 return size_written;
740 }
741
742 while (dP->size > 0) {
743 register int size_to_write, r;
744
745 size_to_write = dP->size;
746
747 if (dP->size > MCSERV_BUFSIZE)
748 size_to_write = MCSERV_BUFSIZE;
749
750 sceSifGetOtherData(&rD, dP->buffer, &mcserv_buf, size_to_write, 0);
751
752 r = McWrite(dP->fd, &mcserv_buf, size_to_write);
753 if (r != size_to_write) {
754 if (r < 0)
755 return r;
756 return r + size_written;
757 }
758
759 size_written += size_to_write;
760 dP->size -= size_to_write;
761
762 dP->buffer += size_to_write;
763 }
764
765 return size_written;
766}
767
768//--------------------------------------------------------------
769int _McGetDir(void *rpc_buf)
770{
771 mcNameParam_t *nP = (mcNameParam_t *)rpc_buf;
772 register int status, file_entries, flags, r;
773 SifDmaTransfer_t dmaStruct;
774 int intStatus;
775
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);
777
778 status = 0;
779 file_entries = 0;
780 flags = nP->flags;
781
782 nP->maxent--;
783
784 while (nP->maxent > -1) {
785
786 r = McGetDir(nP->port, nP->slot, nP->name, flags & 0xffff, 1, (sceMcTblGetDir *)mcserv_buf);
787 if (r < 0)
788 return r;
789 if (r == 0)
790 goto dma_wait;
791
792 file_entries++;
793
794 dmaStruct.src = (void *)mcserv_buf;
795 dmaStruct.dest = (void *)nP->mcT;
796 dmaStruct.size = sizeof (sceMcTblGetDir);
797 dmaStruct.attr = 0;
798
799 CpuSuspendIntr(&intStatus);
800 status = sceSifSetDma(&dmaStruct, 1);
801 CpuResumeIntr(intStatus);
802
803 flags = 1;
804 nP->mcT++;
805 nP->maxent--;
806 }
807
808dma_wait:
809 if (status == 0)
810 return file_entries;
811
812 while (sceSifDmaStat(status) >= 0)
813 DelayThread(100);
814
815 return file_entries;
816}
817
818//--------------------------------------------------------------
819int _McChDir(void *rpc_buf)
820{
821 mcNameParam_t *nP = (mcNameParam_t *)rpc_buf;
822 register int status, r;
823 SifDmaTransfer_t dmaStruct;
824 int intStatus;
825
826 DPRINTF("_McChDir port%d slot%d newdir %s\n", nP->port, nP->slot, nP->name);
827
828 r = McChDir(nP->port, nP->slot, nP->name, (char *)mcserv_buf);
829
830 dmaStruct.src = (void *)mcserv_buf;
831 dmaStruct.dest = (void *)nP->curdir;
832 dmaStruct.size = 1024;
833 dmaStruct.attr = 0;
834
835 CpuSuspendIntr(&intStatus);
836 status = sceSifSetDma(&dmaStruct, 1);
837 CpuResumeIntr(intStatus);
838
839 while (sceSifDmaStat(status) >= 0)
840 DelayThread(100);
841
842 return r;
843}
844
845//--------------------------------------------------------------
846int _McFormat(void *rpc_buf)
847{
848 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
849
850 DPRINTF("_McFormat port%d slot%d\n", dP->port, dP->slot);
851
852 return McFormat(dP->port, dP->slot);
853}
854
855//--------------------------------------------------------------
856int _McUnformat(void *rpc_buf)
857{
858 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
859
860 DPRINTF("_McUnformat port%d slot%d\n", dP->port, dP->slot);
861
862 return McUnformat(dP->port, dP->slot);
863}
864
865//--------------------------------------------------------------
866int _McGetInfo(void *rpc_buf)
867{
868 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
869 register int status, mc_free, r;
870 mcEndParam_t eP;
871 SifDmaTransfer_t dmaStruct;
872 int intStatus;
873
874 DPRINTF("_McGetInfo port%d slot%d\n", dP->port, dP->slot);
875
876 mc_free = 0;
877
878 r = McDetectCard(dP->port, dP->slot);
879
880 if (dP->size > 0)
881 eP.type = McGetMcType(dP->port, dP->slot);
882
883 eP.free = 0;
884 if (r >= -1) {
885 if (dP->offset == 0)
886 goto dma_transfer;
887
888 mc_free = McGetFreeClusters(dP->port, dP->slot);
889 if (mc_free >= 0)
890 eP.free = mc_free;
891 }
892
893dma_transfer:
894
895 dmaStruct.src = (void *)&eP;
896 dmaStruct.dest = (void *)dP->param;
897 dmaStruct.size = sizeof (mcEndParam_t);
898 dmaStruct.attr = 0;
899
900 CpuSuspendIntr(&intStatus);
901 status = sceSifSetDma(&dmaStruct, 1);
902 CpuResumeIntr(intStatus);
903
904 while (sceSifDmaStat(status) >= 0)
905 DelayThread(100);
906
907 if (mc_free < 0)
908 return mc_free;
909
910 return r;
911}
912
913//--------------------------------------------------------------
914#ifdef BUILDING_XMCSERV
915int _McGetInfo2(void *rpc_buf)
916{
917 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
918 register int status, mc_free, r;
919 mcEndParam2_t eP;
920 SifDmaTransfer_t dmaStruct;
921 int intStatus;
922
923 DPRINTF("_McGetInfo2 port%d slot%d\n", dP->port, dP->slot);
924
925 mc_free = 0;
926
927 r = McDetectCard2(dP->port, dP->slot);
928
929 if (dP->origin > 0)
930 eP.type = McGetMcType(dP->port, dP->slot);
931
932 if (r < -1) {
933 eP.free = 0;
934 eP.formatted = 0;
935 goto dma_transfer;
936 }
937
938 if (dP->offset > 0) {
939 mc_free = McGetFreeClusters(dP->port, dP->slot);
940
941 if (mc_free < 0)
942 eP.free = 0;
943 else
944 eP.free = mc_free;
945 }
946
947 if (dP->size > 0) {
948 eP.formatted = 0;
949 if (McGetFormat(dP->port, dP->slot) > 0)
950 eP.formatted = 1;
951 }
952
953dma_transfer:
954
955 dmaStruct.src = (void *)&eP;
956 dmaStruct.dest = (void *)dP->param;
957 dmaStruct.size = sizeof (mcEndParam2_t);
958 dmaStruct.attr = 0;
959
960 CpuSuspendIntr(&intStatus);
961 status = sceSifSetDma(&dmaStruct, 1);
962 CpuResumeIntr(intStatus);
963
964 while (sceSifDmaStat(status) >= 0)
965 DelayThread(100);
966
967 if (mc_free < 0)
968 return mc_free;
969
970 return r;
971}
972#endif
973
974//--------------------------------------------------------------
975#ifdef BUILDING_XMCSERV
976int _McGetEntSpace(void *rpc_buf)
977{
978 mcNameParam_t *nP = (mcNameParam_t *)rpc_buf;
979
980 DPRINTF("_McGetEntSpace port%d slot%d dirname %s\n", nP->port, nP->slot, nP->name);
981
982 return McGetEntSpace(nP->port, nP->slot, nP->name);
983}
984#endif
985
986//--------------------------------------------------------------
987int _McDelete(void *rpc_buf)
988{
989 mcNameParam_t *nP = (mcNameParam_t *)rpc_buf;
990
991 DPRINTF("_McDelete port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
992
993 return McDelete(nP->port, nP->slot, nP->name, nP->flags);
994}
995
996//--------------------------------------------------------------
997int _McFlush(void *rpc_buf)
998{
999 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
1000
1001 DPRINTF("_McFlush fd %d\n", dP->fd);
1002
1003 return McFlush(dP->fd);
1004}
1005
1006//--------------------------------------------------------------
1007int _McEraseBlock(void *rpc_buf)
1008{
1009 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
1010 register int r;
1011 u8 eccbuf[16];
1012
1013 DPRINTF("_McEraseBlock port%d slot%d offset %d\n", dP->port, dP->slot, dP->offset);
1014
1015 dP->port = (dP->port & 1) + 2;
1016
1017 if (McGetMcType(dP->port, dP->slot) == 2) {
1018 register int pagenum;
1019
1020 r = McEraseBlock(dP->port, dP->offset, NULL, NULL);
1021 if (r != 0)
1022 return r;
1023
1024 if (dP->origin == -1)
1025 return r;
1026
1027 memset(mcserv_buf, dP->origin, 512);
1028
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]);
1033
1034 pagenum = 0;
1035
1036 do {
1037 r = McWritePage(dP->port, dP->slot, (dP->offset << 4) + pagenum, mcserv_buf, eccbuf);
1038
1039 } while (++pagenum < 16); // <-- and the last page of the block ???
1040
1041 return r;
1042
1043 }
1044
1045 memset(mcserv_buf, dP->origin, 128);
1046
1047 r = McWritePS1PDACard(dP->port, dP->slot, dP->offset, mcserv_buf);
1048
1049 return r;
1050}
1051
1052//--------------------------------------------------------------
1053int _McReadPage(void *rpc_buf)
1054{
1055 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
1056 mcEndParam_t eP;
1057 register int status, fastsize, r, i, j;
1058 SifDmaTransfer_t dmaStruct;
1059 int intStatus;
1060
1061 DPRINTF("_McReadPage port%d slot%d page %d\n", dP->port, dP->slot, dP->fd);
1062
1063 eP.dest1 = dP->buffer;
1064
1065 fastsize = ((u32)dP->buffer) & 0xf;
1066 dP->port = (dP->port & 1) + 2;
1067
1068 if (McGetMcType(dP->port, dP->slot) == 2) {
1069 r = 0;
1070 McReadPage(dP->port, dP->slot, dP->fd, (void *)(mcserv_buf + fastsize));
1071 }
1072 else {
1073 memset((void *)(mcserv_buf + fastsize), 0, 512);
1074 r = McReadPS1PDACard(dP->port, dP->slot, dP->fd, (void *)(mcserv_buf + fastsize));
1075 }
1076
1077 if (fastsize == 0)
1078 goto fullpage;
1079
1080 i = 0;
1081 j = fastsize;
1082 while (j < 16) {
1083 eP.src1[i] = mcserv_buf[j];
1084 j++;
1085 i++;
1086 }
1087
1088 j = 0;
1089 if (fastsize > 0) {
1090 while (j < 16) {
1091 eP.src1[i] = mcserv_buf[512 + j];
1092 j++;
1093 i++;
1094 }
1095 }
1096
1097 dmaStruct.src = (void *)(mcserv_buf + 16);
1098 dmaStruct.dest = (void *)(dP->buffer - (fastsize - 16));
1099 dmaStruct.size = 496;
1100 dmaStruct.attr = 0;
1101 goto dma_transfer;
1102
1103fullpage:
1104 dmaStruct.src = (void *)mcserv_buf;
1105 dmaStruct.dest = (void *)dP->buffer;
1106 dmaStruct.size = 512;
1107 dmaStruct.attr = 0;
1108
1109dma_transfer:
1110 CpuSuspendIntr(&intStatus);
1111 sceSifSetDma(&dmaStruct, 1);
1112 CpuResumeIntr(intStatus);
1113
1114 dmaStruct.src = (void *)&eP;
1115 dmaStruct.dest = (void *)dP->param;
1116 dmaStruct.size = sizeof (mcEndParam_t);
1117 dmaStruct.attr = 0;
1118
1119 CpuSuspendIntr(&intStatus);
1120 status = sceSifSetDma(&dmaStruct, 1);
1121 CpuResumeIntr(intStatus);
1122
1123 while (sceSifDmaStat(status) >= 0)
1124 DelayThread(100);
1125
1126 return r;
1127}
1128
1129//--------------------------------------------------------------
1130int _McWritePage(void *rpc_buf)
1131{
1132 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
1133 register int fastsize, i, j;
1134 SifRpcReceiveData_t rD;
1135 u8 eccbuf[16];
1136
1137 DPRINTF("_McWritePage port%d slot%d page %d\n", dP->port, dP->slot, dP->fd);
1138
1139 fastsize = ((u32)dP->buffer) & 0xf;
1140 if (fastsize == 0)
1141 goto fullpage;
1142
1143 sceSifGetOtherData(&rD, (void *)(dP->buffer - (fastsize - 16)), &mcserv_buf, 496, 0);
1144
1145 i = fastsize;
1146 while (i < 16) {
1147 mcserv_buf[i] = dP->data[i - fastsize];
1148 i++;
1149 }
1150
1151 if (fastsize == 0)
1152 goto ecc_calc;
1153
1154
1155 j = 16;
1156 i = 0;
1157 while (i < fastsize) {
1158 mcserv_buf[496 + j] = dP->data[j - fastsize];
1159 i++;
1160 j++;
1161 }
1162
1163 goto ecc_calc;
1164
1165fullpage:
1166
1167 sceSifGetOtherData(&rD, dP->buffer, &mcserv_buf, 512, 0);
1168
1169ecc_calc:
1170
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]);
1175
1176 return McWritePage((dP->port & 1) | 2, dP->slot, dP->fd, (void *)(mcserv_buf + fastsize), eccbuf);
1177}
1178
1179//--------------------------------------------------------------
1180int _McSetFileInfo(void *rpc_buf)
1181{
1182 mcNameParam_t *nP = (mcNameParam_t *)rpc_buf;
1183 SifRpcReceiveData_t rD;
1184
1185 DPRINTF("_McSetFileInfo port%d slot%d file %s flags %d\n", nP->port, nP->slot, nP->name, nP->flags);
1186
1187 sceSifGetOtherData(&rD, (void *)nP->mcT, &mcserv_buf, sizeof (sceMcTblGetDir), 0);
1188
1189 return McSetFileInfo(nP->port, nP->slot, nP->name, (sceMcTblGetDir *)mcserv_buf, nP->flags);
1190}
1191
1192//--------------------------------------------------------------
1193#ifdef BUILDING_XMCSERV
1194int _McCheckBlock(void *rpc_buf)
1195{
1196 mcDescParam_t *dP = (mcDescParam_t *)rpc_buf;
1197
1198 DPRINTF("_McCheckBlock port%d slot%d block %d\n", dP->port, dP->slot, dP->offset);
1199
1200 return McCheckBlock(dP->port, dP->slot, dP->offset);
1201}
1202#endif
1203
1204//--------------------------------------------------------------
int CpuEnableIntr()
Definition intrman.c:240
int CpuResumeIntr(int state)
Definition intrman.c:217
int CpuSuspendIntr(int *state)
Definition intrman.c:195
struct _ModuleInfo ModuleInfo_t
u16 newflags
Definition loadcore.h:37
Definition irx.h:28