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