sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
libmc.c
Go to the documentation of this file.
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
15
16#include <tamtypes.h>
17#include <kernel.h>
18#include <sifrpc.h>
19#include <string.h>
20#include <iopcontrol.h>
21#include "libmc.h"
22
23//#define MC_DEBUG
24
25#ifdef MC_DEBUG
26#include <stdio.h>
27#endif
28
29enum MC_RPCCMD_NUMBERS
30{
31 MC_RPCCMD_INIT = 0x00,
32 MC_RPCCMD_GET_INFO,
33 MC_RPCCMD_OPEN,
34 MC_RPCCMD_CLOSE,
35 MC_RPCCMD_SEEK,
36 MC_RPCCMD_READ,
37 MC_RPCCMD_WRITE,
38 MC_RPCCMD_FLUSH,
39 MC_RPCCMD_CH_DIR,
40 MC_RPCCMD_GET_DIR,
41 MC_RPCCMD_SET_INFO,
42 MC_RPCCMD_DELETE,
43 MC_RPCCMD_FORMAT,
44 MC_RPCCMD_UNFORMAT,
45 MC_RPCCMD_GET_ENT,
46 MC_RPCCMD_CHG_PRITY,
47 MC_RPCCMD_CHECK_BLOCK,
48 MC_RPCCMD_ERASE_BLOCK = 0x0E,
49 MC_RPCCMD_READ_PAGE,
50 MC_RPCCMD_WRITE_PAGE
51};
52
53static const int mcRpcCmd[2][17] =
54{
55 // MCMAN/MCSERV values
56 {
57 0x70, // MC_RPCCMD_INIT
58 0x78, // MC_RPCCMD_GET_INFO
59 0x71, // MC_RPCCMD_OPEN
60 0x72, // MC_RPCCMD_CLOSE
61 0x75, // MC_RPCCMD_SEEK
62 0x73, // MC_RPCCMD_READ
63 0x74, // MC_RPCCMD_WRITE
64 0x7A, // MC_RPCCMD_FLUSH
65 0x7B, // MC_RPCCMD_CH_DIR
66 0x76, // MC_RPCCMD_GET_DIR
67 0x7C, // MC_RPCCMD_SET_INFO
68 0x79, // MC_RPCCMD_DELETE
69 0x77, // MC_RPCCMD_FORMAT
70 0x80, // MC_RPCCMD_UNFORMAT
71 0x7D, // MC_RPCCMD_ERASE_BLOCK (calls mcman_funcs: 39, 17, 20, 19, 30)
72 0x7E, // MC_RPCCMD_READ_PAGE
73 0x7F, // MC_RPCCMD_WRITE_PAGE (calls mcman_funcs: 20, 19)
74 },
75 // XMCMAN/XMCSERV values
76 {
77 0xFE, // MC_RPCCMD_INIT
78 0x01, // MC_RPCCMD_GET_INFO
79 0x02, // MC_RPCCMD_OPEN
80 0x03, // MC_RPCCMD_CLOSE
81 0x04, // MC_RPCCMD_SEEK
82 0x05, // MC_RPCCMD_READ
83 0x06, // MC_RPCCMD_WRITE
84 0x0A, // MC_RPCCMD_FLUSH
85 0x0C, // MC_RPCCMD_CH_DIR
86 0x0D, // MC_RPCCMD_GET_DIR
87 0x0E, // MC_RPCCMD_SET_INFO
88 0x0F, // MC_RPCCMD_DELETE
89 0x10, // MC_RPCCMD_FORMAT
90 0x11, // MC_RPCCMD_UNFORMAT
91 0x12, // MC_RPCCMD_GET_ENT
92 0x14, // MC_RPCCMD_CHG_PRITY
93 0x33, // MC_RPCCMD_CHECK_BLOCK (calls xmcman_funcs: 45)
94 }
95};
96
98{
99 int m_port;
100 int m_slot;
101 int m_flags;
102 int m_maxent;
103 union
104 {
105 sceMcTblGetDir *m_mcT;
106 char *m_curdir;
107 };
108 char m_name[1024];
109};
110
112{
113 struct libmc_name_param_stru m_name_param;
114 mcDescParam_t m_desc_param;
115};
116
118{
119 int m_result;
120 mcRpcStat_t m_rpcStat;
121 u8 m_buffer[2048];
122};
123
125{
126 unsigned int m_size1;
127 unsigned int m_size2;
128 void *m_dest1;
129 void *m_dest2;
130 unsigned char m_data1[16];
131 unsigned char m_data2[16];
132 unsigned char m_padding[16];
133};
134
136{
137 int m_end_parameter[48];
138 char m_cur_dir[1024];
139 sceMcTblGetDir m_file_info_buff;
140 struct libmc_page_read_align_data_stru m_page_read_align_data;
141};
142
143typedef struct mcExtraEndParam_
144{
145 union libmc_extra_send_recv_unio *m_extra_send_recv_param;
146 int* m_p_type;
147 int* m_p_free;
148 int* m_p_format;
149 int* m_p_result;
150 char *m_dst_cur_dir;
151} mcExtraEndParam_t;
152
154{
155 SifRpcClientData_t m_client_data __attribute__((aligned(64))); // target->m_interface_data->m_client_data
156 unsigned int m_current_command; // target->m_interface_data->m_current_command
157 int m_mc_rpc_type; // target->m_interface_data->m_mc_rpc_type
158 mcExtraEndParam_t m_extra_end_param; // target->m_interface_data->m_extra_end_param
159 union libmc_name_desc_param_unio m_name_desc_param __attribute__((aligned(64))); // target->m_interface_data->m_name_desc_param
160 union libmc_rdata_param_unio m_rpc_rdata __attribute__((aligned(64))); // target->m_interface_data->m_rpc_rdata
161 union libmc_extra_send_recv_unio m_extra_send_recv_param __attribute__((aligned(64))); // target->m_interface_data->m_extra_send_recv_param
162};
163
164enum MC_INTERFACE
165{
166 MC_INTERFACE_SIO2 = 0,
167 MC_INTERFACE_DEV9,
168 MC_INTERFACE_MAX,
169};
170
172{
173 struct libmc_interface_data_stru m_interface_data[MC_INTERFACE_MAX];
174} libmc_internal_data_t;
175
176static libmc_internal_data_t g_libmc_internal_data;
177
178typedef struct libmc_target_desc_
179{
180 struct libmc_interface_data_stru *m_interface_data;
181 int m_interface;
182 int m_port;
183 int m_slot;
184 int m_fd;
185} libmc_target_desc_t;
186
187#define LIBMC_PRE_CHECK_FLAG_ONLY_TYPE 1
188
189static inline int libmc_pre_rpc_impl(const libmc_target_desc_t *target, int flags, int only_type)
190{
191 // check mc lib is inited
192 if (!target->m_interface_data->m_client_data.server)
193 return -1;
194 // If MCSERV version does not support a feature, return error
195 if ((flags & LIBMC_PRE_CHECK_FLAG_ONLY_TYPE) != 0 && target->m_interface_data->m_mc_rpc_type != only_type)
196 return -1;
197 // check nothing else is processing
198 if (target->m_interface_data->m_current_command != MC_FUNC_NONE)
199 return target->m_interface_data->m_current_command;
200 return 0;
201}
202
203#define LIBMC_PRE_RPC(target, flags, only_type) \
204 { \
205 int cur_ret; \
206 cur_ret = libmc_pre_rpc_impl(target, flags, only_type); \
207 if (cur_ret) \
208 return cur_ret; \
209 }
210
211static inline int libmc_post_rpc(const libmc_target_desc_t *target, int cmd, int desc_param_or_name_param, SifRpcEndFunc_t end_function, void *end_param)
212{
213 int ret;
214
215 // send sif command
216 ret = sceSifCallRpc(
217 &target->m_interface_data->m_client_data,
218 mcRpcCmd[target->m_interface_data->m_mc_rpc_type][cmd],
220 desc_param_or_name_param ? (void *)&(target->m_interface_data->m_name_desc_param.m_desc_param) : (void *)&(target->m_interface_data->m_name_desc_param.m_name_param),
221 desc_param_or_name_param ? sizeof(target->m_interface_data->m_name_desc_param.m_desc_param) : sizeof(target->m_interface_data->m_name_desc_param.m_name_param),
222 &(target->m_interface_data->m_rpc_rdata.m_result),
223 sizeof(target->m_interface_data->m_rpc_rdata.m_result),
224 end_function,
225 end_param
226 );
227
228 if (ret)
229 return ret;
230 target->m_interface_data->m_current_command = cmd;
231 return 0;
232}
233
234static inline void libmc_setup_target(libmc_target_desc_t *target, int interface, int port, int slot, int fd)
235{
236 target->m_interface_data = &(g_libmc_internal_data.m_interface_data[interface]);
237 target->m_interface = interface;
238 target->m_port = port;
239 target->m_slot = slot;
240 target->m_fd = fd;
241}
242
246static void mcGetInfoApdxOld(void* arg)
247{
248 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
249 const mcEndParam_t *ptr = (const mcEndParam_t*)(ep->m_extra_send_recv_param->m_end_parameter);
250
251 // older MCSERV doesnt support retrieving whether card is formatted
252 // so if a card is present, determine whether its formatted based on the return value from MCSERV
253 if (ep->m_p_type)
254 *(ep->m_p_type) = ptr->type;
255
256 if (ep->m_p_free)
257 *(ep->m_p_free) = ptr->free;
258
259 if (ep->m_p_format)
260 *(ep->m_p_format) = (ptr->type == MC_TYPE_NONE || *(ep->m_p_result) == -2) ? 0 : 1;
261}
262
266static void mcGetInfoApdxNew(void* arg)
267{
268 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
269 const mcEndParam2_t *ptr = (const mcEndParam2_t*)(ep->m_extra_send_recv_param->m_end_parameter);
270
271 if (ep->m_p_type)
272 *(ep->m_p_type) = ptr->type;
273
274 if (ep->m_p_free)
275 *(ep->m_p_free) = ptr->free;
276
277 if (ep->m_p_format)
278 *(ep->m_p_format) = ptr->formatted;
279}
280
284static void mcReadFixAlignOld(void* arg)
285{
286 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
287 mcEndParam_t *ptr = (mcEndParam_t*)(ep->m_extra_send_recv_param->m_end_parameter);
288 u8 *dest;
289 int i;
290
291 for (i = 0, dest = (u8*)ptr->dest1; i < ptr->size1; i++)
292 dest[i] = ptr->src1[i];
293 for (i = 0, dest = (u8*)ptr->dest2; i < ptr->size2; i++)
294 dest[i] = ptr->src2[i];
295}
296
300static void mcReadFixAlignNew(void* arg)
301{
302 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
303 mcEndParam2_t *ptr = (mcEndParam2_t*)(ep->m_extra_send_recv_param->m_end_parameter);
304 u8 *dest;
305 int i;
306
307 for (i = 0, dest = (u8*)ptr->dest1; i < ptr->size1; i++)
308 dest[i] = ptr->src1[i];
309 for (i = 0, dest = (u8*)ptr->dest2; i < ptr->size2; i++)
310 dest[i] = ptr->src2[i];
311}
312
316static void mcStoreDir(void* arg)
317{
318 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
319 int len;
320 char *currentDir = ep->m_extra_send_recv_param->m_cur_dir;
321 len = strlen(currentDir);
322 if (len >= 1024)
323 len = strlen(currentDir+1023);
324 memcpy(ep->m_dst_cur_dir, currentDir, len);
325 *(currentDir+len) = 0;
326}
327
328static void libmc_ReadAlignFunction(void *arg)
329{
330 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
331 const struct libmc_page_read_align_data_stru *data = UNCACHED_SEG(&(ep->m_extra_send_recv_param->m_page_read_align_data));
332 unsigned int misaligned;
333
334 if ((misaligned=(unsigned int)data->m_dest1&0xF)!=0)
335 {
336 memcpy(UNCACHED_SEG(data->m_dest1), UNCACHED_SEG(data->m_data1), sizeof(data->m_data1)-misaligned);
337 memcpy(UNCACHED_SEG((unsigned int)data->m_dest1+(sizeof(data->m_data1)-misaligned)), UNCACHED_SEG((unsigned int)data->m_data1+(sizeof(data->m_data1)-misaligned)+0x1F0), misaligned);
338 }
339}
340
341static int libmc_rpc_reset(const libmc_target_desc_t *target);
342
343static int libmc_rpc_init(const libmc_target_desc_t *target)
344{
345 int ret, err, rpc_id;
346 const mcRpcStat_t *rpcStat = (const mcRpcStat_t*)UNCACHED_SEG(&target->m_interface_data->m_rpc_rdata.m_rpcStat);
347
348 if (HasIopRebootedSinceLastCall())
349 libmc_rpc_reset(NULL);
350 switch (target->m_interface)
351 {
352 case MC_INTERFACE_SIO2:
353 default:
354 rpc_id = 0x80000400;
355 break;
356 case MC_INTERFACE_DEV9:
357 rpc_id = 0x80000480;
358 break;
359 }
360
361 if (target->m_interface_data->m_client_data.server)
362 return -1;
363
364 sceSifInitRpc(0);
365
366 // bind to mc rpc on iop
367 do
368 {
369 if ((ret=sceSifBindRpc(&target->m_interface_data->m_client_data, rpc_id, 0)) < 0)
370 {
371 #ifdef MC_DEBUG
372 printf("libmc: bind error\n");
373 #endif
374
375 return ret;
376 }
377 if (target->m_interface_data->m_client_data.server == NULL)
378 nopdelay();
379 }
380 while (target->m_interface_data->m_client_data.server == NULL);
381
382 // for some reason calling this init sif function with 'mcserv' makes all other
383 // functions not work properly. although NOT calling it means that detecting
384 // whether or not cards are formatted doesnt seem to work :P
385
386 // Start with calling flush with an invalid fd (so it sets the return value to
387 // sceMcResDeniedPermit, which MC_RPCCMD_INIT will not return)
388 target->m_interface_data->m_name_desc_param.m_desc_param.fd = 0xFFFFFFFF;
389 sceSifCallRpc(&target->m_interface_data->m_client_data, mcRpcCmd[MC_TYPE_XMC][MC_RPCCMD_FLUSH], 0, &(target->m_interface_data->m_name_desc_param.m_desc_param), sizeof(target->m_interface_data->m_name_desc_param.m_desc_param), &target->m_interface_data->m_rpc_rdata, 4, NULL, NULL);
390 sceSifCallRpc(&target->m_interface_data->m_client_data, mcRpcCmd[MC_TYPE_MC][MC_RPCCMD_FLUSH], 0, &(target->m_interface_data->m_name_desc_param.m_desc_param), sizeof(target->m_interface_data->m_name_desc_param.m_desc_param), &target->m_interface_data->m_rpc_rdata, 4, NULL, NULL);
391#ifdef MC_DEBUG
392 printf("libmc: using XMCMAN & XMCSERV\n");
393#endif
394
395 err = 0;
396 // Try XMCSERV RPC
397 target->m_interface_data->m_mc_rpc_type = MC_TYPE_XMC;
398 // call init function
399 if ((ret = sceSifCallRpc(&target->m_interface_data->m_client_data, mcRpcCmd[target->m_interface_data->m_mc_rpc_type][MC_RPCCMD_INIT], 0, &(target->m_interface_data->m_name_desc_param.m_desc_param), sizeof(target->m_interface_data->m_name_desc_param.m_desc_param), &target->m_interface_data->m_rpc_rdata, 12, NULL, NULL)) < 0)
400 {
401 // init error
402#ifdef MC_DEBUG
403 printf("libmc: initialisation error\n");
404#endif
405 err = ret - 100;
406 }
407
408 // If result was sceMcResDeniedPermit, RPC was unhandled
409 if (!err && rpcStat->result == sceMcResDeniedPermit)
410 {
411 err = -122;
412 }
413
414 if (!err)
415 {
416 // check if old version of mcserv loaded
417 if (rpcStat->mcserv_version < 0x205)
418 {
419#ifdef MC_DEBUG
420 printf("libmc: mcserv is too old (%x)\n", rpcStat->mcserv_version);
421#endif
422 err = -120;
423 }
424
425 // check if old version of mcman loaded
426 if (rpcStat->mcman_version < 0x206)
427 {
428#ifdef MC_DEBUG
429 printf("libmc: mcman is too old (%x)\n", rpcStat->mcman_version);
430#endif
431 err = -121;
432 }
433 }
434
435 if (!err)
436 {
437 ret = rpcStat->result;
438 }
439
440 if (err && rpcStat->result == sceMcResDeniedPermit)
441 {
442 err = 0;
443
444 // Try MCSERV RPC
445 target->m_interface_data->m_mc_rpc_type = MC_TYPE_MC;
446#ifdef MC_DEBUG
447 printf("libmc: using MCMAN & MCSERV\n");
448#endif
449
450 target->m_interface_data->m_name_desc_param.m_desc_param.offset = -217;
451
452 // call init function
453 if ((ret = sceSifCallRpc(&target->m_interface_data->m_client_data, mcRpcCmd[target->m_interface_data->m_mc_rpc_type][MC_RPCCMD_INIT], 0, &(target->m_interface_data->m_name_desc_param.m_desc_param), sizeof(target->m_interface_data->m_name_desc_param.m_desc_param), &target->m_interface_data->m_rpc_rdata, 4, NULL, NULL)) < 0)
454 {
455 // init error
456#ifdef MC_DEBUG
457 printf("libmc: initialisation error\n");
458#endif
459 err = ret - 100;
460 }
461
462 // If result was sceMcResDeniedPermit, RPC was unhandled
463 if (!err && rpcStat->result == sceMcResDeniedPermit)
464 {
465 err = -122;
466 }
467
468 if (!err)
469 {
470 ret = target->m_interface_data->m_rpc_rdata.m_result;
471 }
472 }
473
474 if (err)
475 {
476 libmc_rpc_reset(target);
477 return err;
478 }
479
480 // successfully inited
481 target->m_interface_data->m_current_command = MC_FUNC_NONE;
482 return ret;
483}
484
485static int libmc_rpc_get_info(const libmc_target_desc_t *target, int* type, int* free, int* format)
486{
487 LIBMC_PRE_RPC(target, 0, 0);
488
489 // set global variables
490 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
491 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
492 if (target->m_interface_data->m_mc_rpc_type == MC_TYPE_MC)
493 {
494 target->m_interface_data->m_name_desc_param.m_desc_param.size = (type) ? 1 : 0;
495 target->m_interface_data->m_name_desc_param.m_desc_param.offset = (free) ? 1 : 0;
496 target->m_interface_data->m_name_desc_param.m_desc_param.origin = (format) ? 1 : 0;
497 }
498 else
499 {
500 target->m_interface_data->m_name_desc_param.m_desc_param.size = (format) ? 1 : 0;
501 target->m_interface_data->m_name_desc_param.m_desc_param.offset = (free) ? 1 : 0;
502 target->m_interface_data->m_name_desc_param.m_desc_param.origin = (type) ? 1 : 0;
503 }
504 target->m_interface_data->m_name_desc_param.m_desc_param.param = target->m_interface_data->m_extra_send_recv_param.m_end_parameter;
505 target->m_interface_data->m_extra_end_param.m_p_type = type;
506 target->m_interface_data->m_extra_end_param.m_p_free = free;
507 target->m_interface_data->m_extra_end_param.m_p_format = format;
508 sceSifWriteBackDCache(target->m_interface_data->m_extra_send_recv_param.m_end_parameter, sizeof(target->m_interface_data->m_extra_send_recv_param.m_end_parameter));
509 target->m_interface_data->m_extra_end_param.m_extra_send_recv_param = UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param);
510 target->m_interface_data->m_extra_end_param.m_p_result = UNCACHED_SEG(&target->m_interface_data->m_rpc_rdata.m_result);
511
512 return libmc_post_rpc(target, MC_RPCCMD_GET_INFO, 1, (target->m_interface_data->m_mc_rpc_type == MC_TYPE_MC) ? (SifRpcEndFunc_t)mcGetInfoApdxOld : (SifRpcEndFunc_t)mcGetInfoApdxNew, &target->m_interface_data->m_extra_end_param);
513}
514
515static int libmc_rpc_open(const libmc_target_desc_t *target, const char *name, int mode)
516{
517 LIBMC_PRE_RPC(target, 0, 0);
518
519 // set global variables
520 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
521 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
522 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = mode;
523 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, name, sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
524
525 return libmc_post_rpc(target, MC_RPCCMD_OPEN, 0, NULL, NULL);
526}
527
528static int libmc_rpc_close(const libmc_target_desc_t *target)
529{
530 LIBMC_PRE_RPC(target, 0, 0);
531
532 // set global variables
533 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
534
535 return libmc_post_rpc(target, MC_RPCCMD_CLOSE, 1, NULL, NULL);
536}
537
538static int libmc_rpc_seek(const libmc_target_desc_t *target, int offset, int origin)
539{
540 LIBMC_PRE_RPC(target, 0, 0);
541
542 // set global variables
543 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
544 target->m_interface_data->m_name_desc_param.m_desc_param.offset = offset;
545 target->m_interface_data->m_name_desc_param.m_desc_param.origin = origin;
546
547 return libmc_post_rpc(target, MC_RPCCMD_SEEK, 1, NULL, NULL);
548}
549
550static int libmc_rpc_read(const libmc_target_desc_t *target, void *buffer, int size)
551{
552 LIBMC_PRE_RPC(target, 0, 0);
553
554 // set global variables
555 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
556 target->m_interface_data->m_name_desc_param.m_desc_param.size = size;
557 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = buffer;
558 target->m_interface_data->m_name_desc_param.m_desc_param.param = target->m_interface_data->m_extra_send_recv_param.m_end_parameter;
559 sceSifWriteBackDCache(buffer, size);
560 sceSifWriteBackDCache(target->m_interface_data->m_extra_send_recv_param.m_end_parameter, sizeof(target->m_interface_data->m_extra_send_recv_param.m_end_parameter));
561 target->m_interface_data->m_extra_end_param.m_extra_send_recv_param = UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param);
562
563 return libmc_post_rpc(target, MC_RPCCMD_READ, 1, (target->m_interface_data->m_mc_rpc_type == MC_TYPE_MC) ? (SifRpcEndFunc_t)mcReadFixAlignOld : (SifRpcEndFunc_t)mcReadFixAlignNew, &target->m_interface_data->m_extra_end_param);
564}
565
566static int libmc_rpc_write(const libmc_target_desc_t *target, const void *buffer, int size)
567{
568 int i;
569
570 LIBMC_PRE_RPC(target, 0, 0);
571
572 // set global variables
573 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
574 if (size < 17)
575 {
576 target->m_interface_data->m_name_desc_param.m_desc_param.size = 0;
577 target->m_interface_data->m_name_desc_param.m_desc_param.origin = size;
578 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = 0;
579 }
580 else
581 {
582 target->m_interface_data->m_name_desc_param.m_desc_param.size = size - ( ((int)((const u8 *)buffer-1) & 0xFFFFFFF0) - (int)((const u8 *)buffer-16) );
583 target->m_interface_data->m_name_desc_param.m_desc_param.origin = ( ((int)((const u8 *)buffer-1) & 0xFFFFFFF0) - (int)((const u8 *)buffer-16) );
584 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = (void*)((int)(const u8 *)buffer + ( ((int)((const u8 *)buffer-1) & 0xFFFFFFF0) - (int)((const u8 *)buffer-16) ));
585 }
586 for (i = 0; i < target->m_interface_data->m_name_desc_param.m_desc_param.origin; i++)
587 {
588 target->m_interface_data->m_name_desc_param.m_desc_param.data[i] = *(char*)((const u8 *)buffer+i);
589 }
590 FlushCache(0);
591
592 return libmc_post_rpc(target, MC_RPCCMD_WRITE, 1, NULL, NULL);
593}
594
595static int libmc_rpc_flush(const libmc_target_desc_t *target)
596{
597 LIBMC_PRE_RPC(target, 0, 0);
598
599 // set global variables
600 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
601
602 return libmc_post_rpc(target, MC_RPCCMD_FLUSH, 1, NULL, NULL);
603}
604
605static int libmc_rpc_mkdir(const libmc_target_desc_t *target, const char* name)
606{
607 int ret;
608
609 ret = libmc_rpc_open(target, name, 0x40);
610 if (ret)
611 target->m_interface_data->m_current_command = MC_FUNC_MK_DIR;
612 return ret;
613}
614
615static int libmc_rpc_chdir(const libmc_target_desc_t *target, const char* newDir, char* currentDir)
616{
617 LIBMC_PRE_RPC(target, 0, 0);
618
619 // set global variables
620 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
621 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
622 target->m_interface_data->m_name_desc_param.m_name_param.m_curdir = target->m_interface_data->m_extra_send_recv_param.m_cur_dir;
623 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, newDir, sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
624 sceSifWriteBackDCache(target->m_interface_data->m_extra_send_recv_param.m_cur_dir, sizeof(target->m_interface_data->m_extra_send_recv_param.m_cur_dir));
625 target->m_interface_data->m_extra_end_param.m_dst_cur_dir = currentDir;
626 target->m_interface_data->m_extra_end_param.m_extra_send_recv_param = UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param);
627
628 return libmc_post_rpc(target, MC_RPCCMD_CH_DIR, 0, (SifRpcEndFunc_t)mcStoreDir, &target->m_interface_data->m_extra_end_param);
629}
630
631static int libmc_rpc_getdir(const libmc_target_desc_t *target, const char *name, unsigned mode, int maxent, sceMcTblGetDir* table)
632{
633 LIBMC_PRE_RPC(target, 0, 0);
634
635 // set global variables
636 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
637 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
638 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = mode;
639 target->m_interface_data->m_name_desc_param.m_name_param.m_maxent = maxent;
640 target->m_interface_data->m_name_desc_param.m_name_param.m_mcT = table;
641 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, name, sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
642 sceSifWriteBackDCache(table, maxent * sizeof(sceMcTblGetDir));
643
644 return libmc_post_rpc(target, MC_RPCCMD_GET_DIR, 0, NULL, NULL);
645}
646
647static int libmc_rpc_setfileinfo(const libmc_target_desc_t *target, const char* name, const sceMcTblGetDir* info, unsigned flags)
648{
649 LIBMC_PRE_RPC(target, 0, 0);
650
651 // set global variables
652 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
653 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
654 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = flags; // NOTE: this was ANDed with 7 so that u cant turn off copy protect! :)
655 target->m_interface_data->m_name_desc_param.m_name_param.m_mcT = &(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff);
656 memcpy(&(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff), info, sizeof(sceMcTblGetDir));
657
658 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, name, sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
659 FlushCache(0);
660
661 return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
662}
663
664static int libmc_rpc_delete(const libmc_target_desc_t *target, const char *name)
665{
666 LIBMC_PRE_RPC(target, 0, 0);
667
668 // set global variables
669 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
670 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
671 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = 0;
672 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, name, sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
673
674 return libmc_post_rpc(target, MC_RPCCMD_DELETE, 0, NULL, NULL);
675}
676
677static int libmc_rpc_format(const libmc_target_desc_t *target)
678{
679 LIBMC_PRE_RPC(target, 0, 0);
680
681 // set global variables
682 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
683 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
684
685 return libmc_post_rpc(target, MC_RPCCMD_FORMAT, 1, NULL, NULL);
686}
687
688static int libmc_rpc_unformat(const libmc_target_desc_t *target)
689{
690 LIBMC_PRE_RPC(target, 0, 0);
691
692 // set global variables
693 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
694 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
695
696 return libmc_post_rpc(target, MC_RPCCMD_UNFORMAT, 1, NULL, NULL);
697}
698
699static int libmc_rpc_get_ent_space(const libmc_target_desc_t *target, const char* path)
700{
701 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
702
703 // set global variables
704 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
705 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
706 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, path, sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
707
708 return libmc_post_rpc(target, MC_RPCCMD_GET_ENT, 0, NULL, NULL);
709}
710
711static int libmc_rpc_rename(const libmc_target_desc_t *target, const char* oldName, const char* newName)
712{
713 // I don't think that the old MCSERV module supports this because the v1.00 and v1.01 OSDSYS doesn't seem to have the sceMcRename function at all and the sceMcRename function was only introduced with SCE PS2SDK v1.50. I see that it doesn't work with rom0:MCSERV either way...
714 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
715
716 // set global variables
717 target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
718 target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
719 target->m_interface_data->m_name_desc_param.m_name_param.m_flags = 0x10;
720 target->m_interface_data->m_name_desc_param.m_name_param.m_mcT = &(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff);
721 strlcpy(target->m_interface_data->m_name_desc_param.m_name_param.m_name, oldName, sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name));
722 strlcpy((char*)target->m_interface_data->m_extra_send_recv_param.m_file_info_buff.EntryName, newName, sizeof(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff.EntryName));
723 FlushCache(0);
724
725 return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
726}
727
728static int libmc_rpc_erase_block(const libmc_target_desc_t *target, int block, int mode)
729{
730 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
731
732 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
733 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
734 target->m_interface_data->m_name_desc_param.m_desc_param.offset = block;
735 target->m_interface_data->m_name_desc_param.m_desc_param.origin = mode;
736
737 return libmc_post_rpc(target, MC_RPCCMD_ERASE_BLOCK, 1, NULL, NULL);
738}
739
740static int libmc_rpc_read_page(const libmc_target_desc_t *target, unsigned int page, void *buffer)
741{
742 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
743
744 target->m_interface_data->m_name_desc_param.m_desc_param.fd = page;
745 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
746 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
747 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = buffer;
748 target->m_interface_data->m_name_desc_param.m_desc_param.param = &(target->m_interface_data->m_extra_send_recv_param.m_page_read_align_data);
749
750 sceSifWriteBackDCache(buffer, 0x200);
751
752 return libmc_post_rpc(target, MC_RPCCMD_READ_PAGE, 1, &libmc_ReadAlignFunction, UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param));
753}
754
755static int libmc_rpc_write_page(const libmc_target_desc_t *target, int page, const void *buffer)
756{
757 int misaligned;
758
759 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
760
761 target->m_interface_data->m_name_desc_param.m_desc_param.fd = page;
762 target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
763 target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
764 target->m_interface_data->m_name_desc_param.m_desc_param.buffer = (void*)buffer;
765
766 sceSifWriteBackDCache((void*)buffer, 512);
767
768 if ((misaligned=(unsigned int)buffer&0xF)!=0)
769 {
770 memcpy(target->m_interface_data->m_name_desc_param.m_desc_param.data, buffer, 16-misaligned);
771 memcpy((void*)(target->m_interface_data->m_name_desc_param.m_desc_param.data+(16-misaligned)), (void*)((const u8 *)buffer+(16-misaligned)+0x1F0), misaligned);
772 }
773
774 return libmc_post_rpc(target, MC_RPCCMD_WRITE_PAGE, 1, NULL, NULL);
775}
776
777static int libmc_rpc_change_thread_priority(const libmc_target_desc_t *target, int level)
778{
779 (void)level;
780
781 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
782
783 // set global variables
784// *(u32*)mcCmd.name = level;
785
786 return libmc_post_rpc(target, MC_RPCCMD_CHG_PRITY, 1, NULL, NULL);
787}
788
789static int libmc_rpc_sync(const libmc_target_desc_t *target, int mode, int *cmd, int *result)
790{
791 int funcIsExecuting;
792
793 // check if any functions are registered
794 if (target->m_interface_data->m_current_command == MC_FUNC_NONE)
795 return -1;
796
797 // check if function is still processing
798 funcIsExecuting = sceSifCheckStatRpc(&target->m_interface_data->m_client_data);
799
800 // if mode = 0, wait for function to finish
801 if (mode == 0)
802 {
803 while (sceSifCheckStatRpc(&target->m_interface_data->m_client_data))
804 {
805 int i;
806 for (i=0; i<100000; i++)
807 ;
808 }
809 // function has finished
810 funcIsExecuting = 0;
811 }
812
813 // get the function that just finished
814 if (cmd)
815 *cmd = target->m_interface_data->m_current_command;
816
817 // if function is still processing, return 0
818 if (funcIsExecuting == 1)
819 return 0;
820
821 // function has finished, so clear last command
822 target->m_interface_data->m_current_command = MC_FUNC_NONE;
823
824 // get result
825 if (result)
826 *result = target->m_interface_data->m_rpc_rdata.m_result;
827
828 return 1;
829}
830
831static int libmc_rpc_reset(const libmc_target_desc_t *target)
832{
833 if (target)
834 {
835 memset(&(target->m_interface_data->m_client_data), 0, sizeof(target->m_interface_data->m_client_data));
836 }
837 else
838 {
839 unsigned int i;
840 for (i = 0; i < (sizeof(g_libmc_internal_data.m_interface_data)/sizeof(g_libmc_internal_data.m_interface_data[0])); i += 1)
841 {
842 memset(&(g_libmc_internal_data.m_interface_data[i].m_client_data), 0, sizeof(g_libmc_internal_data.m_interface_data[i].m_client_data));
843 }
844 }
845 return 0;
846}
847
848int mcInit(int type)
849{
850 libmc_target_desc_t target;
851
852 (void)type;
853 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
854 return libmc_rpc_init(&target);
855}
856
857int mcGetInfo(int port, int slot, int* type, int* free, int* format)
858{
859 libmc_target_desc_t target;
860
861 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
862 return libmc_rpc_get_info(&target, type, free, format);
863}
864
865int mcOpen(int port, int slot, const char *name, int mode)
866{
867 libmc_target_desc_t target;
868
869 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
870 return libmc_rpc_open(&target, name, mode);
871}
872
873int mcClose(int fd)
874{
875 libmc_target_desc_t target;
876
877 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
878 return libmc_rpc_close(&target);
879}
880
881int mcSeek(int fd, int offset, int origin)
882{
883 libmc_target_desc_t target;
884
885 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
886 return libmc_rpc_seek(&target, offset, origin);
887}
888
889int mcRead(int fd, void *buffer, int size)
890{
891 libmc_target_desc_t target;
892
893 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
894 return libmc_rpc_read(&target, buffer, size);
895}
896
897int mcWrite(int fd, const void *buffer, int size)
898{
899 libmc_target_desc_t target;
900
901 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
902 return libmc_rpc_write(&target, buffer, size);
903}
904
905int mcFlush(int fd)
906{
907 libmc_target_desc_t target;
908
909 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
910 return libmc_rpc_flush(&target);
911}
912
913int mcMkDir(int port, int slot, const char* name)
914{
915 libmc_target_desc_t target;
916
917 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
918 return libmc_rpc_mkdir(&target, name);
919}
920
921int mcChdir(int port, int slot, const char* newDir, char* currentDir)
922{
923 libmc_target_desc_t target;
924
925 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
926 return libmc_rpc_chdir(&target, newDir, currentDir);
927}
928
929int mcGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir* table)
930{
931 libmc_target_desc_t target;
932
933 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
934 return libmc_rpc_getdir(&target, name, mode, maxent, table);
935}
936
937int mcSetFileInfo(int port, int slot, const char* name, const sceMcTblGetDir* info, unsigned flags)
938{
939 libmc_target_desc_t target;
940
941 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
942 return libmc_rpc_setfileinfo(&target, name, info, flags);
943}
944
945int mcDelete(int port, int slot, const char *name)
946{
947 libmc_target_desc_t target;
948
949 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
950 return libmc_rpc_delete(&target, name);
951}
952
953int mcFormat(int port, int slot)
954{
955 libmc_target_desc_t target;
956
957 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
958 return libmc_rpc_format(&target);
959}
960
961int mcUnformat(int port, int slot)
962{
963 libmc_target_desc_t target;
964
965 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
966 return libmc_rpc_unformat(&target);
967}
968
969int mcGetEntSpace(int port, int slot, const char* path)
970{
971 libmc_target_desc_t target;
972
973 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
974 return libmc_rpc_get_ent_space(&target, path);
975}
976
977int mcRename(int port, int slot, const char* oldName, const char* newName)
978{
979 libmc_target_desc_t target;
980
981 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
982 return libmc_rpc_rename(&target, oldName, newName);
983}
984
985int mcEraseBlock(int port, int slot, int block, int mode)
986{
987 libmc_target_desc_t target;
988
989 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
990 return libmc_rpc_erase_block(&target, block, mode);
991}
992
993int mcReadPage(int port, int slot, unsigned int page, void *buffer)
994{
995 libmc_target_desc_t target;
996
997 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
998 return libmc_rpc_read_page(&target, page, buffer);
999}
1000
1001int mcWritePage(int port, int slot, int page, const void *buffer)
1002{
1003 libmc_target_desc_t target;
1004
1005 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
1006 return libmc_rpc_write_page(&target, page, buffer);
1007}
1008
1010{
1011 libmc_target_desc_t target;
1012
1013 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1014 return libmc_rpc_change_thread_priority(&target, level);
1015}
1016
1017int mcSync(int mode, int *cmd, int *result)
1018{
1019 libmc_target_desc_t target;
1020
1021 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1022 return libmc_rpc_sync(&target, mode, cmd, result);
1023}
1024
1025int mcReset(void)
1026{
1027 libmc_target_desc_t target;
1028
1029 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1030 return libmc_rpc_reset(&target);
1031}
1032
1033int xfromInit(int type)
1034{
1035 libmc_target_desc_t target;
1036
1037 (void)type;
1038 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1039 return libmc_rpc_init(&target);
1040}
1041
1042int xfromGetInfo(int port, int slot, int* type, int* free, int* format)
1043{
1044 libmc_target_desc_t target;
1045
1046 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1047 return libmc_rpc_get_info(&target, type, free, format);
1048}
1049
1050int xfromOpen(int port, int slot, const char *name, int mode)
1051{
1052 libmc_target_desc_t target;
1053
1054 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1055 return libmc_rpc_open(&target, name, mode);
1056}
1057
1058int xfromClose(int fd)
1059{
1060 libmc_target_desc_t target;
1061
1062 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1063 return libmc_rpc_close(&target);
1064}
1065
1066int xfromSeek(int fd, int offset, int origin)
1067{
1068 libmc_target_desc_t target;
1069
1070 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1071 return libmc_rpc_seek(&target, offset, origin);
1072}
1073
1074int xfromRead(int fd, void *buffer, int size)
1075{
1076 libmc_target_desc_t target;
1077
1078 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1079 return libmc_rpc_read(&target, buffer, size);
1080}
1081
1082int xfromWrite(int fd, const void *buffer, int size)
1083{
1084 libmc_target_desc_t target;
1085
1086 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1087 return libmc_rpc_write(&target, buffer, size);
1088}
1089
1090int xfromFlush(int fd)
1091{
1092 libmc_target_desc_t target;
1093
1094 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1095 return libmc_rpc_flush(&target);
1096}
1097
1098int xfromMkDir(int port, int slot, const char* name)
1099{
1100 libmc_target_desc_t target;
1101
1102 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1103 return libmc_rpc_mkdir(&target, name);
1104}
1105
1106int xfromChdir(int port, int slot, const char* newDir, char* currentDir)
1107{
1108 libmc_target_desc_t target;
1109
1110 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1111 return libmc_rpc_chdir(&target, newDir, currentDir);
1112}
1113
1114int xfromGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir* table)
1115{
1116 libmc_target_desc_t target;
1117
1118 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1119 return libmc_rpc_getdir(&target, name, mode, maxent, table);
1120}
1121
1122int xfromSetFileInfo(int port, int slot, const char* name, const sceMcTblGetDir* info, unsigned flags)
1123{
1124 libmc_target_desc_t target;
1125
1126 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1127 return libmc_rpc_setfileinfo(&target, name, info, flags);
1128}
1129
1130int xfromDelete(int port, int slot, const char *name)
1131{
1132 libmc_target_desc_t target;
1133
1134 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1135 return libmc_rpc_delete(&target, name);
1136}
1137
1138int xfromFormat(int port, int slot)
1139{
1140 libmc_target_desc_t target;
1141
1142 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1143 return libmc_rpc_format(&target);
1144}
1145
1146int xfromUnformat(int port, int slot)
1147{
1148 libmc_target_desc_t target;
1149
1150 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1151 return libmc_rpc_unformat(&target);
1152}
1153
1154int xfromGetEntSpace(int port, int slot, const char* path)
1155{
1156 libmc_target_desc_t target;
1157
1158 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1159 return libmc_rpc_get_ent_space(&target, path);
1160}
1161
1162int xfromRename(int port, int slot, const char* oldName, const char* newName)
1163{
1164 libmc_target_desc_t target;
1165
1166 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1167 return libmc_rpc_rename(&target, oldName, newName);
1168}
1169
1170int xfromEraseBlock(int port, int slot, int block, int mode)
1171{
1172 libmc_target_desc_t target;
1173
1174 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1175 return libmc_rpc_erase_block(&target, block, mode);
1176}
1177
1178int xfromReadPage(int port, int slot, unsigned int page, void *buffer)
1179{
1180 libmc_target_desc_t target;
1181
1182 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1183 return libmc_rpc_read_page(&target, page, buffer);
1184}
1185
1186int xfromWritePage(int port, int slot, int page, const void *buffer)
1187{
1188 libmc_target_desc_t target;
1189
1190 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1191 return libmc_rpc_write_page(&target, page, buffer);
1192}
1193
1195{
1196 libmc_target_desc_t target;
1197
1198 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1199 return libmc_rpc_change_thread_priority(&target, level);
1200}
1201
1202int xfromSync(int mode, int *cmd, int *result)
1203{
1204 libmc_target_desc_t target;
1205
1206 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1207 return libmc_rpc_sync(&target, mode, cmd, result);
1208}
1209
1210int xfromReset(void)
1211{
1212 libmc_target_desc_t target;
1213
1214 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1215 return libmc_rpc_reset(&target);
1216}
int mcReset(void)
Definition libmc.c:1025
int mcGetEntSpace(int port, int slot, const char *path)
Definition libmc.c:969
int xfromWrite(int fd, const void *buffer, int size)
Definition libmc.c:1082
int mcUnformat(int port, int slot)
Definition libmc.c:961
int xfromReset(void)
Definition libmc.c:1210
int xfromMkDir(int port, int slot, const char *name)
Definition libmc.c:1098
int mcSeek(int fd, int offset, int origin)
Definition libmc.c:881
int xfromChangeThreadPriority(int level)
Definition libmc.c:1194
int mcRead(int fd, void *buffer, int size)
Definition libmc.c:889
int xfromSync(int mode, int *cmd, int *result)
Definition libmc.c:1202
int mcMkDir(int port, int slot, const char *name)
Definition libmc.c:913
int xfromSetFileInfo(int port, int slot, const char *name, const sceMcTblGetDir *info, unsigned flags)
Definition libmc.c:1122
int mcWritePage(int port, int slot, int page, const void *buffer)
Definition libmc.c:1001
int mcEraseBlock(int port, int slot, int block, int mode)
Definition libmc.c:985
int xfromDelete(int port, int slot, const char *name)
Definition libmc.c:1130
int mcOpen(int port, int slot, const char *name, int mode)
Definition libmc.c:865
int mcRename(int port, int slot, const char *oldName, const char *newName)
Definition libmc.c:977
int mcChdir(int port, int slot, const char *newDir, char *currentDir)
Definition libmc.c:921
int mcSetFileInfo(int port, int slot, const char *name, const sceMcTblGetDir *info, unsigned flags)
Definition libmc.c:937
int xfromClose(int fd)
Definition libmc.c:1058
int mcReadPage(int port, int slot, unsigned int page, void *buffer)
Definition libmc.c:993
int xfromFlush(int fd)
Definition libmc.c:1090
int xfromRename(int port, int slot, const char *oldName, const char *newName)
Definition libmc.c:1162
int mcGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir *table)
Definition libmc.c:929
int mcClose(int fd)
Definition libmc.c:873
int xfromGetInfo(int port, int slot, int *type, int *free, int *format)
Definition libmc.c:1042
int xfromGetEntSpace(int port, int slot, const char *path)
Definition libmc.c:1154
int xfromSeek(int fd, int offset, int origin)
Definition libmc.c:1066
int xfromInit(int type)
Definition libmc.c:1033
int mcGetInfo(int port, int slot, int *type, int *free, int *format)
Definition libmc.c:857
int xfromWritePage(int port, int slot, int page, const void *buffer)
Definition libmc.c:1186
int mcInit(int type)
Definition libmc.c:848
int xfromChdir(int port, int slot, const char *newDir, char *currentDir)
Definition libmc.c:1106
int mcDelete(int port, int slot, const char *name)
Definition libmc.c:945
int xfromEraseBlock(int port, int slot, int block, int mode)
Definition libmc.c:1170
int mcFormat(int port, int slot)
Definition libmc.c:953
int xfromFormat(int port, int slot)
Definition libmc.c:1138
int xfromUnformat(int port, int slot)
Definition libmc.c:1146
int mcWrite(int fd, const void *buffer, int size)
Definition libmc.c:897
int xfromReadPage(int port, int slot, unsigned int page, void *buffer)
Definition libmc.c:1178
int mcChangeThreadPriority(int level)
Definition libmc.c:1009
int mcSync(int mode, int *cmd, int *result)
Definition libmc.c:1017
int xfromGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir *table)
Definition libmc.c:1114
int mcFlush(int fd)
Definition libmc.c:905
int xfromRead(int fd, void *buffer, int size)
Definition libmc.c:1074
int xfromOpen(int port, int slot, const char *name, int mode)
Definition libmc.c:1050
#define SIF_RPC_M_NOWAIT