PS2SDK
PS2 Homebrew Libraries
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 
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 
29 enum 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 
53 static 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 
143 typedef 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;
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 
164 enum MC_INTERFACE
165 {
166  MC_INTERFACE_SIO2 = 0,
167  MC_INTERFACE_DEV9,
168  MC_INTERFACE_MAX,
169 };
170 
171 typedef struct libmc_internal_data_
172 {
173  struct libmc_interface_data_stru m_interface_data[MC_INTERFACE_MAX];
175 
176 static libmc_internal_data_t g_libmc_internal_data;
177 
178 typedef 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;
186 
187 #define LIBMC_PRE_CHECK_FLAG_ONLY_TYPE 1
188 
189 static 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 
211 static 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 
234 static 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 
246 static void mcGetInfoApdxOld(void* arg)
247 {
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 
266 static void mcGetInfoApdxNew(void* arg)
267 {
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 
284 static void mcReadFixAlignOld(void* arg)
285 {
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 
300 static void mcReadFixAlignNew(void* arg)
301 {
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 
316 static void mcStoreDir(void* arg)
317 {
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 
328 static void libmc_ReadAlignFunction(void *arg)
329 {
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 
341 static int libmc_rpc_reset(const libmc_target_desc_t *target);
342 
343 static 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 
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 
485 static 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 
515 static 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 
528 static 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 
538 static 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 
550 static 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 
566 static 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 
595 static 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 
605 static 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 
615 static 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 
631 static 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 
647 static 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 
664 static 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 
677 static 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 
688 static 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 
699 static 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 
711 static 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 
728 static 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 
740 static 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 
755 static 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 
777 static 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 
789 static 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 
831 static 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 
848 int 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 
857 int 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 
865 int 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 
873 int 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 
881 int 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 
889 int 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 
897 int 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 
905 int 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 
913 int 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 
921 int 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 
929 int 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 
937 int 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 
945 int 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 
953 int 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 
961 int 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 
969 int 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 
977 int 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 
985 int 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 
993 int 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 
1001 int 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 
1017 int 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 
1025 int 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 
1033 int 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 
1042 int 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 
1050 int 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 
1058 int 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 
1066 int 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 
1074 int 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 
1082 int 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 
1090 int 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 
1098 int 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 
1106 int 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 
1114 int 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 
1122 int 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 
1130 int 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 
1138 int 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 
1146 int 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 
1154 int 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 
1162 int 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 
1170 int 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 
1178 int 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 
1186 int 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 
1202 int 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 
1210 int 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 }
kernel.h
mcEndParam2_t
Definition: libmc-common.h:121
xfromChangeThreadPriority
int xfromChangeThreadPriority(int level)
Definition: libmc.c:1194
SIF_RPC_M_NOWAIT
#define SIF_RPC_M_NOWAIT
Definition: sifrpc-common.h:23
mcGetDir
int mcGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir *table)
Definition: libmc.c:929
xfromFormat
int xfromFormat(int port, int slot)
Definition: libmc.c:1138
libmc_name_param_stru
Definition: libmc.c:97
libmc_internal_data_
Definition: libmc.c:171
mcEndParam_t
Definition: libmc-common.h:99
mcSeek
int mcSeek(int fd, int offset, int origin)
Definition: libmc.c:881
libmc_interface_data_stru
Definition: libmc.c:153
mcRename
int mcRename(int port, int slot, const char *oldName, const char *newName)
Definition: libmc.c:977
xfromReadPage
int xfromReadPage(int port, int slot, unsigned int page, void *buffer)
Definition: libmc.c:1178
xfromWritePage
int xfromWritePage(int port, int slot, int page, const void *buffer)
Definition: libmc.c:1186
s_info
Definition: xprintf.c:78
mcRpcStat_t
Definition: libmc-common.h:144
xfromClose
int xfromClose(int fd)
Definition: libmc.c:1058
xfromMkDir
int xfromMkDir(int port, int slot, const char *name)
Definition: libmc.c:1098
xfromOpen
int xfromOpen(int port, int slot, const char *name, int mode)
Definition: libmc.c:1050
mcFormat
int mcFormat(int port, int slot)
Definition: libmc.c:953
mcExtraEndParam_
Definition: libmc.c:143
xfromUnformat
int xfromUnformat(int port, int slot)
Definition: libmc.c:1146
xfromRead
int xfromRead(int fd, void *buffer, int size)
Definition: libmc.c:1074
xfromSetFileInfo
int xfromSetFileInfo(int port, int slot, const char *name, const sceMcTblGetDir *info, unsigned flags)
Definition: libmc.c:1122
xfromSync
int xfromSync(int mode, int *cmd, int *result)
Definition: libmc.c:1202
mcGetEntSpace
int mcGetEntSpace(int port, int slot, const char *path)
Definition: libmc.c:969
iopcontrol.h
mcReadFixAlignOld
static void mcReadFixAlignOld(void *arg)
Definition: libmc.c:284
xfromSeek
int xfromSeek(int fd, int offset, int origin)
Definition: libmc.c:1066
libmc_target_desc_
Definition: libmc.c:178
xfromGetInfo
int xfromGetInfo(int port, int slot, int *type, int *free, int *format)
Definition: libmc.c:1042
mcGetInfoApdxOld
static void mcGetInfoApdxOld(void *arg)
Definition: libmc.c:246
_sceMcTblGetDir
Definition: libmc.h:139
mcWrite
int mcWrite(int fd, const void *buffer, int size)
Definition: libmc.c:897
mcStoreDir
static void mcStoreDir(void *arg)
Definition: libmc.c:316
xfromReset
int xfromReset(void)
Definition: libmc.c:1210
mcFlush
int mcFlush(int fd)
Definition: libmc.c:905
mcReadPage
int mcReadPage(int port, int slot, unsigned int page, void *buffer)
Definition: libmc.c:993
mcRead
int mcRead(int fd, void *buffer, int size)
Definition: libmc.c:889
mcUnformat
int mcUnformat(int port, int slot)
Definition: libmc.c:961
xfromEraseBlock
int xfromEraseBlock(int port, int slot, int block, int mode)
Definition: libmc.c:1170
xfromGetDir
int xfromGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir *table)
Definition: libmc.c:1114
libmc_name_desc_param_unio
Definition: libmc.c:111
mcEraseBlock
int mcEraseBlock(int port, int slot, int block, int mode)
Definition: libmc.c:985
mcOpen
int mcOpen(int port, int slot, const char *name, int mode)
Definition: libmc.c:865
mcDescParam_t
Definition: libmc-common.h:83
tamtypes.h
HasIopRebootedSinceLastCall
static int HasIopRebootedSinceLastCall(void)
Definition: iopcontrol.h:47
mcInit
int mcInit(int type)
Definition: libmc.c:848
mcSync
int mcSync(int mode, int *cmd, int *result)
Definition: libmc.c:1017
stdio.h
libmc.h
mcWritePage
int mcWritePage(int port, int slot, int page, const void *buffer)
Definition: libmc.c:1001
libmc_extra_send_recv_unio
Definition: libmc.c:135
libmc_rdata_param_unio
Definition: libmc.c:117
mcReadFixAlignNew
static void mcReadFixAlignNew(void *arg)
Definition: libmc.c:300
xfromWrite
int xfromWrite(int fd, const void *buffer, int size)
Definition: libmc.c:1082
mcChangeThreadPriority
int mcChangeThreadPriority(int level)
Definition: libmc.c:1009
mcDelete
int mcDelete(int port, int slot, const char *name)
Definition: libmc.c:945
mcChdir
int mcChdir(int port, int slot, const char *newDir, char *currentDir)
Definition: libmc.c:921
xfromFlush
int xfromFlush(int fd)
Definition: libmc.c:1090
xfromGetEntSpace
int xfromGetEntSpace(int port, int slot, const char *path)
Definition: libmc.c:1154
mcGetInfo
int mcGetInfo(int port, int slot, int *type, int *free, int *format)
Definition: libmc.c:857
t_SifRpcClientData
Definition: sifrpc-common.h:134
mcReset
int mcReset(void)
Definition: libmc.c:1025
__attribute__
Definition: gif_registers.h:38
mcGetInfoApdxNew
static void mcGetInfoApdxNew(void *arg)
Definition: libmc.c:266
mcSetFileInfo
int mcSetFileInfo(int port, int slot, const char *name, const sceMcTblGetDir *info, unsigned flags)
Definition: libmc.c:937
mcMkDir
int mcMkDir(int port, int slot, const char *name)
Definition: libmc.c:913
libmc_page_read_align_data_stru
Definition: libmc.c:124
xfromChdir
int xfromChdir(int port, int slot, const char *newDir, char *currentDir)
Definition: libmc.c:1106
xfromRename
int xfromRename(int port, int slot, const char *oldName, const char *newName)
Definition: libmc.c:1162
mcClose
int mcClose(int fd)
Definition: libmc.c:873
xfromInit
int xfromInit(int type)
Definition: libmc.c:1033
xfromDelete
int xfromDelete(int port, int slot, const char *name)
Definition: libmc.c:1130