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  strncpy(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) - 1);
524  target->m_interface_data->m_name_desc_param.m_name_param.m_name[sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name) - 1] = 0;
525 
526  return libmc_post_rpc(target, MC_RPCCMD_OPEN, 0, NULL, NULL);
527 }
528 
529 static int libmc_rpc_close(const libmc_target_desc_t *target)
530 {
531  LIBMC_PRE_RPC(target, 0, 0);
532 
533  // set global variables
534  target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
535 
536  return libmc_post_rpc(target, MC_RPCCMD_CLOSE, 1, NULL, NULL);
537 }
538 
539 static int libmc_rpc_seek(const libmc_target_desc_t *target, int offset, int origin)
540 {
541  LIBMC_PRE_RPC(target, 0, 0);
542 
543  // set global variables
544  target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
545  target->m_interface_data->m_name_desc_param.m_desc_param.offset = offset;
546  target->m_interface_data->m_name_desc_param.m_desc_param.origin = origin;
547 
548  return libmc_post_rpc(target, MC_RPCCMD_SEEK, 1, NULL, NULL);
549 }
550 
551 static int libmc_rpc_read(const libmc_target_desc_t *target, void *buffer, int size)
552 {
553  LIBMC_PRE_RPC(target, 0, 0);
554 
555  // set global variables
556  target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
557  target->m_interface_data->m_name_desc_param.m_desc_param.size = size;
558  target->m_interface_data->m_name_desc_param.m_desc_param.buffer = buffer;
559  target->m_interface_data->m_name_desc_param.m_desc_param.param = target->m_interface_data->m_extra_send_recv_param.m_end_parameter;
560  sceSifWriteBackDCache(buffer, size);
561  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));
562  target->m_interface_data->m_extra_end_param.m_extra_send_recv_param = UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param);
563 
564  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);
565 }
566 
567 static int libmc_rpc_write(const libmc_target_desc_t *target, const void *buffer, int size)
568 {
569  int i;
570 
571  LIBMC_PRE_RPC(target, 0, 0);
572 
573  // set global variables
574  target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
575  if (size < 17)
576  {
577  target->m_interface_data->m_name_desc_param.m_desc_param.size = 0;
578  target->m_interface_data->m_name_desc_param.m_desc_param.origin = size;
579  target->m_interface_data->m_name_desc_param.m_desc_param.buffer = 0;
580  }
581  else
582  {
583  target->m_interface_data->m_name_desc_param.m_desc_param.size = size - ( ((int)((const u8 *)buffer-1) & 0xFFFFFFF0) - (int)((const u8 *)buffer-16) );
584  target->m_interface_data->m_name_desc_param.m_desc_param.origin = ( ((int)((const u8 *)buffer-1) & 0xFFFFFFF0) - (int)((const u8 *)buffer-16) );
585  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) ));
586  }
587  for (i = 0; i < target->m_interface_data->m_name_desc_param.m_desc_param.origin; i++)
588  {
589  target->m_interface_data->m_name_desc_param.m_desc_param.data[i] = *(char*)((const u8 *)buffer+i);
590  }
591  FlushCache(0);
592 
593  return libmc_post_rpc(target, MC_RPCCMD_WRITE, 1, NULL, NULL);
594 }
595 
596 static int libmc_rpc_flush(const libmc_target_desc_t *target)
597 {
598  LIBMC_PRE_RPC(target, 0, 0);
599 
600  // set global variables
601  target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
602 
603  return libmc_post_rpc(target, MC_RPCCMD_FLUSH, 1, NULL, NULL);
604 }
605 
606 static int libmc_rpc_mkdir(const libmc_target_desc_t *target, const char* name)
607 {
608  int ret;
609 
610  ret = libmc_rpc_open(target, name, 0x40);
611  if (ret)
612  target->m_interface_data->m_current_command = MC_FUNC_MK_DIR;
613  return ret;
614 }
615 
616 static int libmc_rpc_chdir(const libmc_target_desc_t *target, const char* newDir, char* currentDir)
617 {
618  LIBMC_PRE_RPC(target, 0, 0);
619 
620  // set global variables
621  target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
622  target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
623  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;
624  strncpy(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) - 1);
625  target->m_interface_data->m_name_desc_param.m_name_param.m_name[sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name) - 1] = 0;
626  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));
627  target->m_interface_data->m_extra_end_param.m_dst_cur_dir = currentDir;
628  target->m_interface_data->m_extra_end_param.m_extra_send_recv_param = UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param);
629 
630  return libmc_post_rpc(target, MC_RPCCMD_CH_DIR, 0, (SifRpcEndFunc_t)mcStoreDir, &target->m_interface_data->m_extra_end_param);
631 }
632 
633 static int libmc_rpc_getdir(const libmc_target_desc_t *target, const char *name, unsigned mode, int maxent, sceMcTblGetDir* table)
634 {
635  LIBMC_PRE_RPC(target, 0, 0);
636 
637  // set global variables
638  target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
639  target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
640  target->m_interface_data->m_name_desc_param.m_name_param.m_flags = mode;
641  target->m_interface_data->m_name_desc_param.m_name_param.m_maxent = maxent;
642  target->m_interface_data->m_name_desc_param.m_name_param.m_mcT = table;
643  strncpy(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) - 1);
644  target->m_interface_data->m_name_desc_param.m_name_param.m_name[sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name) - 1] = 0;
645  sceSifWriteBackDCache(table, maxent * sizeof(sceMcTblGetDir));
646 
647  return libmc_post_rpc(target, MC_RPCCMD_GET_DIR, 0, NULL, NULL);
648 }
649 
650 static int libmc_rpc_setfileinfo(const libmc_target_desc_t *target, const char* name, const sceMcTblGetDir* info, unsigned flags)
651 {
652  LIBMC_PRE_RPC(target, 0, 0);
653 
654  // set global variables
655  target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
656  target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
657  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! :)
658  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);
659  memcpy(&(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff), info, sizeof(sceMcTblGetDir));
660 
661  strncpy(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) - 1);
662  target->m_interface_data->m_name_desc_param.m_name_param.m_name[sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name) - 1] = 0;
663  FlushCache(0);
664 
665  return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
666 }
667 
668 static int libmc_rpc_delete(const libmc_target_desc_t *target, const char *name)
669 {
670  LIBMC_PRE_RPC(target, 0, 0);
671 
672  // set global variables
673  target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
674  target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
675  target->m_interface_data->m_name_desc_param.m_name_param.m_flags = 0;
676  strncpy(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) - 1);
677  target->m_interface_data->m_name_desc_param.m_name_param.m_name[sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name) - 1] = 0;
678 
679  return libmc_post_rpc(target, MC_RPCCMD_DELETE, 0, NULL, NULL);
680 }
681 
682 static int libmc_rpc_format(const libmc_target_desc_t *target)
683 {
684  LIBMC_PRE_RPC(target, 0, 0);
685 
686  // set global variables
687  target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
688  target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
689 
690  return libmc_post_rpc(target, MC_RPCCMD_FORMAT, 1, NULL, NULL);
691 }
692 
693 static int libmc_rpc_unformat(const libmc_target_desc_t *target)
694 {
695  LIBMC_PRE_RPC(target, 0, 0);
696 
697  // set global variables
698  target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
699  target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
700 
701  return libmc_post_rpc(target, MC_RPCCMD_UNFORMAT, 1, NULL, NULL);
702 }
703 
704 static int libmc_rpc_get_ent_space(const libmc_target_desc_t *target, const char* path)
705 {
706  LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
707 
708  // set global variables
709  target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
710  target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
711  strncpy(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) - 1);
712  target->m_interface_data->m_name_desc_param.m_name_param.m_name[sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name) - 1] = 0;
713 
714  return libmc_post_rpc(target, MC_RPCCMD_GET_ENT, 0, NULL, NULL);
715 }
716 
717 static int libmc_rpc_rename(const libmc_target_desc_t *target, const char* oldName, const char* newName)
718 {
719  // 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...
720  LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
721 
722  // set global variables
723  target->m_interface_data->m_name_desc_param.m_name_param.m_port = target->m_port;
724  target->m_interface_data->m_name_desc_param.m_name_param.m_slot = target->m_slot;
725  target->m_interface_data->m_name_desc_param.m_name_param.m_flags = 0x10;
726  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);
727  strncpy(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) - 1);
728  target->m_interface_data->m_name_desc_param.m_name_param.m_name[sizeof(target->m_interface_data->m_name_desc_param.m_name_param.m_name) - 1] = 0;
729  strncpy((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) - 1);
730  target->m_interface_data->m_extra_send_recv_param.m_file_info_buff.EntryName[sizeof(target->m_interface_data->m_extra_send_recv_param.m_file_info_buff.EntryName) - 1] = 0;
731  FlushCache(0);
732 
733  return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
734 }
735 
736 static int libmc_rpc_erase_block(const libmc_target_desc_t *target, int block, int mode)
737 {
738  LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
739 
740  target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
741  target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
742  target->m_interface_data->m_name_desc_param.m_desc_param.offset = block;
743  target->m_interface_data->m_name_desc_param.m_desc_param.origin = mode;
744 
745  return libmc_post_rpc(target, MC_RPCCMD_ERASE_BLOCK, 1, NULL, NULL);
746 }
747 
748 static int libmc_rpc_read_page(const libmc_target_desc_t *target, unsigned int page, void *buffer)
749 {
750  LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
751 
752  target->m_interface_data->m_name_desc_param.m_desc_param.fd = page;
753  target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
754  target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
755  target->m_interface_data->m_name_desc_param.m_desc_param.buffer = buffer;
756  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);
757 
758  sceSifWriteBackDCache(buffer, 0x200);
759 
760  return libmc_post_rpc(target, MC_RPCCMD_READ_PAGE, 1, &libmc_ReadAlignFunction, UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param));
761 }
762 
763 static int libmc_rpc_write_page(const libmc_target_desc_t *target, int page, const void *buffer)
764 {
765  int misaligned;
766 
767  LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
768 
769  target->m_interface_data->m_name_desc_param.m_desc_param.fd = page;
770  target->m_interface_data->m_name_desc_param.m_desc_param.port = target->m_port;
771  target->m_interface_data->m_name_desc_param.m_desc_param.slot = target->m_slot;
772  target->m_interface_data->m_name_desc_param.m_desc_param.buffer = (void*)buffer;
773 
774  sceSifWriteBackDCache((void*)buffer, 512);
775 
776  if ((misaligned=(unsigned int)buffer&0xF)!=0)
777  {
778  memcpy(target->m_interface_data->m_name_desc_param.m_desc_param.data, buffer, 16-misaligned);
779  memcpy((void*)(target->m_interface_data->m_name_desc_param.m_desc_param.data+(16-misaligned)), (void*)((const u8 *)buffer+(16-misaligned)+0x1F0), misaligned);
780  }
781 
782  return libmc_post_rpc(target, MC_RPCCMD_WRITE_PAGE, 1, NULL, NULL);
783 }
784 
785 static int libmc_rpc_change_thread_priority(const libmc_target_desc_t *target, int level)
786 {
787  (void)level;
788 
789  LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
790 
791  // set global variables
792 // *(u32*)mcCmd.name = level;
793 
794  return libmc_post_rpc(target, MC_RPCCMD_CHG_PRITY, 1, NULL, NULL);
795 }
796 
797 static int libmc_rpc_sync(const libmc_target_desc_t *target, int mode, int *cmd, int *result)
798 {
799  int funcIsExecuting;
800 
801  // check if any functions are registered
802  if (target->m_interface_data->m_current_command == MC_FUNC_NONE)
803  return -1;
804 
805  // check if function is still processing
806  funcIsExecuting = sceSifCheckStatRpc(&target->m_interface_data->m_client_data);
807 
808  // if mode = 0, wait for function to finish
809  if (mode == 0)
810  {
811  while (sceSifCheckStatRpc(&target->m_interface_data->m_client_data))
812  {
813  int i;
814  for (i=0; i<100000; i++)
815  ;
816  }
817  // function has finished
818  funcIsExecuting = 0;
819  }
820 
821  // get the function that just finished
822  if (cmd)
823  *cmd = target->m_interface_data->m_current_command;
824 
825  // if function is still processing, return 0
826  if (funcIsExecuting == 1)
827  return 0;
828 
829  // function has finished, so clear last command
830  target->m_interface_data->m_current_command = MC_FUNC_NONE;
831 
832  // get result
833  if (result)
834  *result = target->m_interface_data->m_rpc_rdata.m_result;
835 
836  return 1;
837 }
838 
839 static int libmc_rpc_reset(const libmc_target_desc_t *target)
840 {
841  if (target)
842  {
843  memset(&(target->m_interface_data->m_client_data), 0, sizeof(target->m_interface_data->m_client_data));
844  }
845  else
846  {
847  unsigned int i;
848  for (i = 0; i < (sizeof(g_libmc_internal_data.m_interface_data)/sizeof(g_libmc_internal_data.m_interface_data[0])); i += 1)
849  {
850  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));
851  }
852  }
853  return 0;
854 }
855 
856 int mcInit(int type)
857 {
858  libmc_target_desc_t target;
859 
860  (void)type;
861  libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
862  return libmc_rpc_init(&target);
863 }
864 
865 int mcGetInfo(int port, int slot, int* type, int* free, int* format)
866 {
867  libmc_target_desc_t target;
868 
869  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
870  return libmc_rpc_get_info(&target, type, free, format);
871 }
872 
873 int mcOpen(int port, int slot, const char *name, int mode)
874 {
875  libmc_target_desc_t target;
876 
877  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
878  return libmc_rpc_open(&target, name, mode);
879 }
880 
881 int mcClose(int fd)
882 {
883  libmc_target_desc_t target;
884 
885  libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
886  return libmc_rpc_close(&target);
887 }
888 
889 int mcSeek(int fd, int offset, int origin)
890 {
891  libmc_target_desc_t target;
892 
893  libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
894  return libmc_rpc_seek(&target, offset, origin);
895 }
896 
897 int mcRead(int fd, 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_read(&target, buffer, size);
903 }
904 
905 int mcWrite(int fd, const void *buffer, int size)
906 {
907  libmc_target_desc_t target;
908 
909  libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
910  return libmc_rpc_write(&target, buffer, size);
911 }
912 
913 int mcFlush(int fd)
914 {
915  libmc_target_desc_t target;
916 
917  libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
918  return libmc_rpc_flush(&target);
919 }
920 
921 int mcMkDir(int port, int slot, const char* name)
922 {
923  libmc_target_desc_t target;
924 
925  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
926  return libmc_rpc_mkdir(&target, name);
927 }
928 
929 int mcChdir(int port, int slot, const char* newDir, char* currentDir)
930 {
931  libmc_target_desc_t target;
932 
933  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
934  return libmc_rpc_chdir(&target, newDir, currentDir);
935 }
936 
937 int mcGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir* table)
938 {
939  libmc_target_desc_t target;
940 
941  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
942  return libmc_rpc_getdir(&target, name, mode, maxent, table);
943 }
944 
945 int mcSetFileInfo(int port, int slot, const char* name, const sceMcTblGetDir* info, unsigned flags)
946 {
947  libmc_target_desc_t target;
948 
949  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
950  return libmc_rpc_setfileinfo(&target, name, info, flags);
951 }
952 
953 int mcDelete(int port, int slot, const char *name)
954 {
955  libmc_target_desc_t target;
956 
957  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
958  return libmc_rpc_delete(&target, name);
959 }
960 
961 int mcFormat(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_format(&target);
967 }
968 
969 int mcUnformat(int port, int slot)
970 {
971  libmc_target_desc_t target;
972 
973  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
974  return libmc_rpc_unformat(&target);
975 }
976 
977 int mcGetEntSpace(int port, int slot, const char* path)
978 {
979  libmc_target_desc_t target;
980 
981  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
982  return libmc_rpc_get_ent_space(&target, path);
983 }
984 
985 int mcRename(int port, int slot, const char* oldName, const char* newName)
986 {
987  libmc_target_desc_t target;
988 
989  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
990  return libmc_rpc_rename(&target, oldName, newName);
991 }
992 
993 int mcEraseBlock(int port, int slot, int block, int mode)
994 {
995  libmc_target_desc_t target;
996 
997  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
998  return libmc_rpc_erase_block(&target, block, mode);
999 }
1000 
1001 int mcReadPage(int port, int slot, unsigned int page, 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_read_page(&target, page, buffer);
1007 }
1008 
1009 int mcWritePage(int port, int slot, int page, const void *buffer)
1010 {
1011  libmc_target_desc_t target;
1012 
1013  libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
1014  return libmc_rpc_write_page(&target, page, buffer);
1015 }
1016 
1018 {
1019  libmc_target_desc_t target;
1020 
1021  libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1022  return libmc_rpc_change_thread_priority(&target, level);
1023 }
1024 
1025 int mcSync(int mode, int *cmd, int *result)
1026 {
1027  libmc_target_desc_t target;
1028 
1029  libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1030  return libmc_rpc_sync(&target, mode, cmd, result);
1031 }
1032 
1033 int mcReset(void)
1034 {
1035  libmc_target_desc_t target;
1036 
1037  libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1038  return libmc_rpc_reset(&target);
1039 }
1040 
1041 int xfromInit(int type)
1042 {
1043  libmc_target_desc_t target;
1044 
1045  (void)type;
1046  libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1047  return libmc_rpc_init(&target);
1048 }
1049 
1050 int xfromGetInfo(int port, int slot, int* type, int* free, int* format)
1051 {
1052  libmc_target_desc_t target;
1053 
1054  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1055  return libmc_rpc_get_info(&target, type, free, format);
1056 }
1057 
1058 int xfromOpen(int port, int slot, const char *name, int mode)
1059 {
1060  libmc_target_desc_t target;
1061 
1062  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1063  return libmc_rpc_open(&target, name, mode);
1064 }
1065 
1066 int xfromClose(int fd)
1067 {
1068  libmc_target_desc_t target;
1069 
1070  libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1071  return libmc_rpc_close(&target);
1072 }
1073 
1074 int xfromSeek(int fd, int offset, int origin)
1075 {
1076  libmc_target_desc_t target;
1077 
1078  libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1079  return libmc_rpc_seek(&target, offset, origin);
1080 }
1081 
1082 int xfromRead(int fd, 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_read(&target, buffer, size);
1088 }
1089 
1090 int xfromWrite(int fd, const void *buffer, int size)
1091 {
1092  libmc_target_desc_t target;
1093 
1094  libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1095  return libmc_rpc_write(&target, buffer, size);
1096 }
1097 
1098 int xfromFlush(int fd)
1099 {
1100  libmc_target_desc_t target;
1101 
1102  libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1103  return libmc_rpc_flush(&target);
1104 }
1105 
1106 int xfromMkDir(int port, int slot, const char* name)
1107 {
1108  libmc_target_desc_t target;
1109 
1110  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1111  return libmc_rpc_mkdir(&target, name);
1112 }
1113 
1114 int xfromChdir(int port, int slot, const char* newDir, char* currentDir)
1115 {
1116  libmc_target_desc_t target;
1117 
1118  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1119  return libmc_rpc_chdir(&target, newDir, currentDir);
1120 }
1121 
1122 int xfromGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir* table)
1123 {
1124  libmc_target_desc_t target;
1125 
1126  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1127  return libmc_rpc_getdir(&target, name, mode, maxent, table);
1128 }
1129 
1130 int xfromSetFileInfo(int port, int slot, const char* name, const sceMcTblGetDir* info, unsigned flags)
1131 {
1132  libmc_target_desc_t target;
1133 
1134  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1135  return libmc_rpc_setfileinfo(&target, name, info, flags);
1136 }
1137 
1138 int xfromDelete(int port, int slot, const char *name)
1139 {
1140  libmc_target_desc_t target;
1141 
1142  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1143  return libmc_rpc_delete(&target, name);
1144 }
1145 
1146 int xfromFormat(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_format(&target);
1152 }
1153 
1154 int xfromUnformat(int port, int slot)
1155 {
1156  libmc_target_desc_t target;
1157 
1158  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1159  return libmc_rpc_unformat(&target);
1160 }
1161 
1162 int xfromGetEntSpace(int port, int slot, const char* path)
1163 {
1164  libmc_target_desc_t target;
1165 
1166  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1167  return libmc_rpc_get_ent_space(&target, path);
1168 }
1169 
1170 int xfromRename(int port, int slot, const char* oldName, const char* newName)
1171 {
1172  libmc_target_desc_t target;
1173 
1174  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1175  return libmc_rpc_rename(&target, oldName, newName);
1176 }
1177 
1178 int xfromEraseBlock(int port, int slot, int block, int mode)
1179 {
1180  libmc_target_desc_t target;
1181 
1182  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1183  return libmc_rpc_erase_block(&target, block, mode);
1184 }
1185 
1186 int xfromReadPage(int port, int slot, unsigned int page, 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_read_page(&target, page, buffer);
1192 }
1193 
1194 int xfromWritePage(int port, int slot, int page, const void *buffer)
1195 {
1196  libmc_target_desc_t target;
1197 
1198  libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1199  return libmc_rpc_write_page(&target, page, buffer);
1200 }
1201 
1203 {
1204  libmc_target_desc_t target;
1205 
1206  libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1207  return libmc_rpc_change_thread_priority(&target, level);
1208 }
1209 
1210 int xfromSync(int mode, int *cmd, int *result)
1211 {
1212  libmc_target_desc_t target;
1213 
1214  libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1215  return libmc_rpc_sync(&target, mode, cmd, result);
1216 }
1217 
1218 int xfromReset(void)
1219 {
1220  libmc_target_desc_t target;
1221 
1222  libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1223  return libmc_rpc_reset(&target);
1224 }
kernel.h
mcEndParam2_t
Definition: libmc-common.h:121
xfromChangeThreadPriority
int xfromChangeThreadPriority(int level)
Definition: libmc.c:1202
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:937
xfromFormat
int xfromFormat(int port, int slot)
Definition: libmc.c:1146
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:889
libmc_interface_data_stru
Definition: libmc.c:153
mcRename
int mcRename(int port, int slot, const char *oldName, const char *newName)
Definition: libmc.c:985
xfromReadPage
int xfromReadPage(int port, int slot, unsigned int page, void *buffer)
Definition: libmc.c:1186
xfromWritePage
int xfromWritePage(int port, int slot, int page, const void *buffer)
Definition: libmc.c:1194
s_info
Definition: xprintf.c:78
mcRpcStat_t
Definition: libmc-common.h:144
xfromClose
int xfromClose(int fd)
Definition: libmc.c:1066
xfromMkDir
int xfromMkDir(int port, int slot, const char *name)
Definition: libmc.c:1106
xfromOpen
int xfromOpen(int port, int slot, const char *name, int mode)
Definition: libmc.c:1058
mcFormat
int mcFormat(int port, int slot)
Definition: libmc.c:961
mcExtraEndParam_
Definition: libmc.c:143
xfromUnformat
int xfromUnformat(int port, int slot)
Definition: libmc.c:1154
xfromRead
int xfromRead(int fd, void *buffer, int size)
Definition: libmc.c:1082
xfromSetFileInfo
int xfromSetFileInfo(int port, int slot, const char *name, const sceMcTblGetDir *info, unsigned flags)
Definition: libmc.c:1130
xfromSync
int xfromSync(int mode, int *cmd, int *result)
Definition: libmc.c:1210
mcGetEntSpace
int mcGetEntSpace(int port, int slot, const char *path)
Definition: libmc.c:977
iopcontrol.h
mcReadFixAlignOld
static void mcReadFixAlignOld(void *arg)
Definition: libmc.c:284
xfromSeek
int xfromSeek(int fd, int offset, int origin)
Definition: libmc.c:1074
libmc_target_desc_
Definition: libmc.c:178
xfromGetInfo
int xfromGetInfo(int port, int slot, int *type, int *free, int *format)
Definition: libmc.c:1050
mcGetInfoApdxOld
static void mcGetInfoApdxOld(void *arg)
Definition: libmc.c:246
_sceMcTblGetDir
Definition: libmc.h:138
mcWrite
int mcWrite(int fd, const void *buffer, int size)
Definition: libmc.c:905
mcStoreDir
static void mcStoreDir(void *arg)
Definition: libmc.c:316
xfromReset
int xfromReset(void)
Definition: libmc.c:1218
mcFlush
int mcFlush(int fd)
Definition: libmc.c:913
mcReadPage
int mcReadPage(int port, int slot, unsigned int page, void *buffer)
Definition: libmc.c:1001
mcRead
int mcRead(int fd, void *buffer, int size)
Definition: libmc.c:897
mcUnformat
int mcUnformat(int port, int slot)
Definition: libmc.c:969
xfromEraseBlock
int xfromEraseBlock(int port, int slot, int block, int mode)
Definition: libmc.c:1178
xfromGetDir
int xfromGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir *table)
Definition: libmc.c:1122
libmc_name_desc_param_unio
Definition: libmc.c:111
mcEraseBlock
int mcEraseBlock(int port, int slot, int block, int mode)
Definition: libmc.c:993
mcOpen
int mcOpen(int port, int slot, const char *name, int mode)
Definition: libmc.c:873
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:856
mcSync
int mcSync(int mode, int *cmd, int *result)
Definition: libmc.c:1025
stdio.h
libmc.h
mcWritePage
int mcWritePage(int port, int slot, int page, const void *buffer)
Definition: libmc.c:1009
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:1090
mcChangeThreadPriority
int mcChangeThreadPriority(int level)
Definition: libmc.c:1017
mcDelete
int mcDelete(int port, int slot, const char *name)
Definition: libmc.c:953
mcChdir
int mcChdir(int port, int slot, const char *newDir, char *currentDir)
Definition: libmc.c:929
xfromFlush
int xfromFlush(int fd)
Definition: libmc.c:1098
xfromGetEntSpace
int xfromGetEntSpace(int port, int slot, const char *path)
Definition: libmc.c:1162
mcGetInfo
int mcGetInfo(int port, int slot, int *type, int *free, int *format)
Definition: libmc.c:865
t_SifRpcClientData
Definition: sifrpc-common.h:134
mcReset
int mcReset(void)
Definition: libmc.c:1033
__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:945
mcMkDir
int mcMkDir(int port, int slot, const char *name)
Definition: libmc.c:921
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:1114
xfromRename
int xfromRename(int port, int slot, const char *oldName, const char *newName)
Definition: libmc.c:1170
mcClose
int mcClose(int fd)
Definition: libmc.c:881
xfromInit
int xfromInit(int type)
Definition: libmc.c:1041
xfromDelete
int xfromDelete(int port, int slot, const char *name)
Definition: libmc.c:1138