31 MC_RPCCMD_INIT = 0x00,
47 MC_RPCCMD_CHECK_BLOCK,
48 MC_RPCCMD_ERASE_BLOCK = 0x0E,
53static const int mcRpcCmd[2][17] =
105 sceMcTblGetDir *m_mcT;
126 unsigned int m_size1;
127 unsigned int m_size2;
130 unsigned char m_data1[16];
131 unsigned char m_data2[16];
132 unsigned char m_padding[16];
137 int m_end_parameter[48];
138 char m_cur_dir[1024];
139 sceMcTblGetDir m_file_info_buff;
155 SifRpcClientData_t m_client_data __attribute__((aligned(64)));
156 unsigned int m_current_command;
158 mcExtraEndParam_t m_extra_end_param;
166 MC_INTERFACE_SIO2 = 0,
174} libmc_internal_data_t;
176static libmc_internal_data_t g_libmc_internal_data;
185} libmc_target_desc_t;
187#define LIBMC_PRE_CHECK_FLAG_ONLY_TYPE 1
189static inline int libmc_pre_rpc_impl(
const libmc_target_desc_t *target,
int flags,
int only_type)
192 if (!target->m_interface_data->m_client_data.server)
195 if ((flags & LIBMC_PRE_CHECK_FLAG_ONLY_TYPE) != 0 && target->m_interface_data->m_mc_rpc_type != only_type)
198 if (target->m_interface_data->m_current_command != MC_FUNC_NONE)
199 return target->m_interface_data->m_current_command;
203#define LIBMC_PRE_RPC(target, flags, only_type) \
206 cur_ret = libmc_pre_rpc_impl(target, flags, only_type); \
211static inline int libmc_post_rpc(
const libmc_target_desc_t *target,
int cmd,
int desc_param_or_name_param, SifRpcEndFunc_t end_function,
void *end_param)
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),
230 target->m_interface_data->m_current_command = cmd;
234static inline void libmc_setup_target(libmc_target_desc_t *target,
int interface,
int port,
int slot,
int fd)
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;
246static void mcGetInfoApdxOld(
void* arg)
248 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
254 *(ep->m_p_type) = ptr->type;
257 *(ep->m_p_free) = ptr->free;
260 *(ep->m_p_format) = (ptr->type == MC_TYPE_NONE || *(ep->m_p_result) == -2) ? 0 : 1;
266static void mcGetInfoApdxNew(
void* arg)
268 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
272 *(ep->m_p_type) = ptr->type;
275 *(ep->m_p_free) = ptr->free;
278 *(ep->m_p_format) = ptr->formatted;
284static void mcReadFixAlignOld(
void* arg)
286 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
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];
300static void mcReadFixAlignNew(
void* arg)
302 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
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];
316static void mcStoreDir(
void* arg)
318 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
320 char *currentDir = ep->m_extra_send_recv_param->m_cur_dir;
321 len = strlen(currentDir);
323 len = strlen(currentDir+1023);
324 memcpy(ep->m_dst_cur_dir, currentDir, len);
325 *(currentDir+len) = 0;
328static void libmc_ReadAlignFunction(
void *arg)
330 mcExtraEndParam_t *ep = (mcExtraEndParam_t *)arg;
332 unsigned int misaligned;
334 if ((misaligned=(
unsigned int)data->m_dest1&0xF)!=0)
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);
341static int libmc_rpc_reset(
const libmc_target_desc_t *target);
343static int libmc_rpc_init(
const libmc_target_desc_t *target)
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);
348 if (HasIopRebootedSinceLastCall())
349 libmc_rpc_reset(NULL);
350 switch (target->m_interface)
352 case MC_INTERFACE_SIO2:
356 case MC_INTERFACE_DEV9:
361 if (target->m_interface_data->m_client_data.server)
369 if ((ret=sceSifBindRpc(&target->m_interface_data->m_client_data, rpc_id, 0)) < 0)
372 printf(
"libmc: bind error\n");
377 if (target->m_interface_data->m_client_data.server == NULL)
380 while (target->m_interface_data->m_client_data.server == NULL);
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);
392 printf(
"libmc: using XMCMAN & XMCSERV\n");
397 target->m_interface_data->m_mc_rpc_type = MC_TYPE_XMC;
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)
403 printf(
"libmc: initialisation error\n");
409 if (!err && rpcStat->result == sceMcResDeniedPermit)
417 if (rpcStat->mcserv_version < 0x205)
420 printf(
"libmc: mcserv is too old (%x)\n", rpcStat->mcserv_version);
426 if (rpcStat->mcman_version < 0x206)
429 printf(
"libmc: mcman is too old (%x)\n", rpcStat->mcman_version);
437 ret = rpcStat->result;
440 if (err && rpcStat->result == sceMcResDeniedPermit)
445 target->m_interface_data->m_mc_rpc_type = MC_TYPE_MC;
447 printf(
"libmc: using MCMAN & MCSERV\n");
450 target->m_interface_data->m_name_desc_param.m_desc_param.offset = -217;
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)
457 printf(
"libmc: initialisation error\n");
463 if (!err && rpcStat->result == sceMcResDeniedPermit)
470 ret = target->m_interface_data->m_rpc_rdata.m_result;
476 libmc_rpc_reset(target);
481 target->m_interface_data->m_current_command = MC_FUNC_NONE;
485static int libmc_rpc_get_info(
const libmc_target_desc_t *target,
int* type,
int* free,
int* format)
487 LIBMC_PRE_RPC(target, 0, 0);
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)
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;
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;
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);
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);
515static int libmc_rpc_open(
const libmc_target_desc_t *target,
const char *name,
int mode)
517 LIBMC_PRE_RPC(target, 0, 0);
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));
525 return libmc_post_rpc(target, MC_RPCCMD_OPEN, 0, NULL, NULL);
528static int libmc_rpc_close(
const libmc_target_desc_t *target)
530 LIBMC_PRE_RPC(target, 0, 0);
533 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
535 return libmc_post_rpc(target, MC_RPCCMD_CLOSE, 1, NULL, NULL);
538static int libmc_rpc_seek(
const libmc_target_desc_t *target,
int offset,
int origin)
540 LIBMC_PRE_RPC(target, 0, 0);
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;
547 return libmc_post_rpc(target, MC_RPCCMD_SEEK, 1, NULL, NULL);
550static int libmc_rpc_read(
const libmc_target_desc_t *target,
void *buffer,
int size)
552 LIBMC_PRE_RPC(target, 0, 0);
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);
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);
566static int libmc_rpc_write(
const libmc_target_desc_t *target,
const void *buffer,
int size)
570 LIBMC_PRE_RPC(target, 0, 0);
573 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
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;
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) ));
586 for (i = 0; i < target->m_interface_data->m_name_desc_param.m_desc_param.origin; i++)
588 target->m_interface_data->m_name_desc_param.m_desc_param.data[i] = *(
char*)((
const u8 *)buffer+i);
592 return libmc_post_rpc(target, MC_RPCCMD_WRITE, 1, NULL, NULL);
595static int libmc_rpc_flush(
const libmc_target_desc_t *target)
597 LIBMC_PRE_RPC(target, 0, 0);
600 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
602 return libmc_post_rpc(target, MC_RPCCMD_FLUSH, 1, NULL, NULL);
605static int libmc_rpc_mkdir(
const libmc_target_desc_t *target,
const char* name)
609 ret = libmc_rpc_open(target, name, 0x40);
611 target->m_interface_data->m_current_command = MC_FUNC_MK_DIR;
615static int libmc_rpc_chdir(
const libmc_target_desc_t *target,
const char* newDir,
char* currentDir)
617 LIBMC_PRE_RPC(target, 0, 0);
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);
628 return libmc_post_rpc(target, MC_RPCCMD_CH_DIR, 0, (SifRpcEndFunc_t)mcStoreDir, &target->m_interface_data->m_extra_end_param);
631static int libmc_rpc_getdir(
const libmc_target_desc_t *target,
const char *name,
unsigned mode,
int maxent, sceMcTblGetDir* table)
633 LIBMC_PRE_RPC(target, 0, 0);
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));
644 return libmc_post_rpc(target, MC_RPCCMD_GET_DIR, 0, NULL, NULL);
647static int libmc_rpc_setfileinfo(
const libmc_target_desc_t *target,
const char* name,
const sceMcTblGetDir* info,
unsigned flags)
649 LIBMC_PRE_RPC(target, 0, 0);
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;
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));
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));
661 return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
664static int libmc_rpc_delete(
const libmc_target_desc_t *target,
const char *name)
666 LIBMC_PRE_RPC(target, 0, 0);
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));
674 return libmc_post_rpc(target, MC_RPCCMD_DELETE, 0, NULL, NULL);
677static int libmc_rpc_format(
const libmc_target_desc_t *target)
679 LIBMC_PRE_RPC(target, 0, 0);
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;
685 return libmc_post_rpc(target, MC_RPCCMD_FORMAT, 1, NULL, NULL);
688static int libmc_rpc_unformat(
const libmc_target_desc_t *target)
690 LIBMC_PRE_RPC(target, 0, 0);
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;
696 return libmc_post_rpc(target, MC_RPCCMD_UNFORMAT, 1, NULL, NULL);
699static int libmc_rpc_get_ent_space(
const libmc_target_desc_t *target,
const char* path)
701 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
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));
708 return libmc_post_rpc(target, MC_RPCCMD_GET_ENT, 0, NULL, NULL);
711static int libmc_rpc_rename(
const libmc_target_desc_t *target,
const char* oldName,
const char* newName)
714 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
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));
725 return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
728static int libmc_rpc_erase_block(
const libmc_target_desc_t *target,
int block,
int mode)
730 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
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;
737 return libmc_post_rpc(target, MC_RPCCMD_ERASE_BLOCK, 1, NULL, NULL);
740static int libmc_rpc_read_page(
const libmc_target_desc_t *target,
unsigned int page,
void *buffer)
742 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
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);
750 sceSifWriteBackDCache(buffer, 0x200);
752 return libmc_post_rpc(target, MC_RPCCMD_READ_PAGE, 1, &libmc_ReadAlignFunction, UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param));
755static int libmc_rpc_write_page(
const libmc_target_desc_t *target,
int page,
const void *buffer)
759 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
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;
766 sceSifWriteBackDCache((
void*)buffer, 512);
768 if ((misaligned=(
unsigned int)buffer&0xF)!=0)
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);
774 return libmc_post_rpc(target, MC_RPCCMD_WRITE_PAGE, 1, NULL, NULL);
777static int libmc_rpc_change_thread_priority(
const libmc_target_desc_t *target,
int level)
781 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
786 return libmc_post_rpc(target, MC_RPCCMD_CHG_PRITY, 1, NULL, NULL);
789static int libmc_rpc_sync(
const libmc_target_desc_t *target,
int mode,
int *cmd,
int *result)
794 if (target->m_interface_data->m_current_command == MC_FUNC_NONE)
798 funcIsExecuting = sceSifCheckStatRpc(&target->m_interface_data->m_client_data);
803 while (sceSifCheckStatRpc(&target->m_interface_data->m_client_data))
806 for (i=0; i<100000; i++)
815 *cmd = target->m_interface_data->m_current_command;
818 if (funcIsExecuting == 1)
822 target->m_interface_data->m_current_command = MC_FUNC_NONE;
826 *result = target->m_interface_data->m_rpc_rdata.m_result;
831static int libmc_rpc_reset(
const libmc_target_desc_t *target)
835 memset(&(target->m_interface_data->m_client_data), 0,
sizeof(target->m_interface_data->m_client_data));
840 for (i = 0; i < (
sizeof(g_libmc_internal_data.m_interface_data)/
sizeof(g_libmc_internal_data.m_interface_data[0])); i += 1)
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));
850 libmc_target_desc_t target;
853 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
854 return libmc_rpc_init(&target);
857int mcGetInfo(
int port,
int slot,
int* type,
int* free,
int* format)
859 libmc_target_desc_t target;
861 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
862 return libmc_rpc_get_info(&target, type, free, format);
865int mcOpen(
int port,
int slot,
const char *name,
int mode)
867 libmc_target_desc_t target;
869 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
870 return libmc_rpc_open(&target, name, mode);
875 libmc_target_desc_t target;
877 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
878 return libmc_rpc_close(&target);
881int mcSeek(
int fd,
int offset,
int origin)
883 libmc_target_desc_t target;
885 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
886 return libmc_rpc_seek(&target, offset, origin);
889int mcRead(
int fd,
void *buffer,
int size)
891 libmc_target_desc_t target;
893 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
894 return libmc_rpc_read(&target, buffer, size);
897int mcWrite(
int fd,
const void *buffer,
int size)
899 libmc_target_desc_t target;
901 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
902 return libmc_rpc_write(&target, buffer, size);
907 libmc_target_desc_t target;
909 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
910 return libmc_rpc_flush(&target);
913int mcMkDir(
int port,
int slot,
const char* name)
915 libmc_target_desc_t target;
917 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
918 return libmc_rpc_mkdir(&target, name);
921int mcChdir(
int port,
int slot,
const char* newDir,
char* currentDir)
923 libmc_target_desc_t target;
925 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
926 return libmc_rpc_chdir(&target, newDir, currentDir);
929int mcGetDir(
int port,
int slot,
const char *name,
unsigned mode,
int maxent, sceMcTblGetDir* table)
931 libmc_target_desc_t target;
933 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
934 return libmc_rpc_getdir(&target, name, mode, maxent, table);
937int mcSetFileInfo(
int port,
int slot,
const char* name,
const sceMcTblGetDir* info,
unsigned flags)
939 libmc_target_desc_t target;
941 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
942 return libmc_rpc_setfileinfo(&target, name, info, flags);
947 libmc_target_desc_t target;
949 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
950 return libmc_rpc_delete(&target, name);
955 libmc_target_desc_t target;
957 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
958 return libmc_rpc_format(&target);
963 libmc_target_desc_t target;
965 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
966 return libmc_rpc_unformat(&target);
971 libmc_target_desc_t target;
973 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
974 return libmc_rpc_get_ent_space(&target, path);
977int mcRename(
int port,
int slot,
const char* oldName,
const char* newName)
979 libmc_target_desc_t target;
981 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
982 return libmc_rpc_rename(&target, oldName, newName);
987 libmc_target_desc_t target;
989 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
990 return libmc_rpc_erase_block(&target, block, mode);
993int mcReadPage(
int port,
int slot,
unsigned int page,
void *buffer)
995 libmc_target_desc_t target;
997 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
998 return libmc_rpc_read_page(&target, page, buffer);
1003 libmc_target_desc_t target;
1005 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
1006 return libmc_rpc_write_page(&target, page, buffer);
1011 libmc_target_desc_t target;
1013 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1014 return libmc_rpc_change_thread_priority(&target, level);
1019 libmc_target_desc_t target;
1021 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1022 return libmc_rpc_sync(&target, mode, cmd, result);
1027 libmc_target_desc_t target;
1029 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1030 return libmc_rpc_reset(&target);
1035 libmc_target_desc_t target;
1038 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1039 return libmc_rpc_init(&target);
1044 libmc_target_desc_t target;
1046 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1047 return libmc_rpc_get_info(&target, type, free, format);
1050int xfromOpen(
int port,
int slot,
const char *name,
int mode)
1052 libmc_target_desc_t target;
1054 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1055 return libmc_rpc_open(&target, name, mode);
1060 libmc_target_desc_t target;
1062 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1063 return libmc_rpc_close(&target);
1068 libmc_target_desc_t target;
1070 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1071 return libmc_rpc_seek(&target, offset, origin);
1076 libmc_target_desc_t target;
1078 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1079 return libmc_rpc_read(&target, buffer, size);
1084 libmc_target_desc_t target;
1086 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1087 return libmc_rpc_write(&target, buffer, size);
1092 libmc_target_desc_t target;
1094 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1095 return libmc_rpc_flush(&target);
1100 libmc_target_desc_t target;
1102 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1103 return libmc_rpc_mkdir(&target, name);
1106int xfromChdir(
int port,
int slot,
const char* newDir,
char* currentDir)
1108 libmc_target_desc_t target;
1110 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1111 return libmc_rpc_chdir(&target, newDir, currentDir);
1114int xfromGetDir(
int port,
int slot,
const char *name,
unsigned mode,
int maxent, sceMcTblGetDir* table)
1116 libmc_target_desc_t target;
1118 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1119 return libmc_rpc_getdir(&target, name, mode, maxent, table);
1122int xfromSetFileInfo(
int port,
int slot,
const char* name,
const sceMcTblGetDir* info,
unsigned flags)
1124 libmc_target_desc_t target;
1126 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1127 return libmc_rpc_setfileinfo(&target, name, info, flags);
1132 libmc_target_desc_t target;
1134 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1135 return libmc_rpc_delete(&target, name);
1140 libmc_target_desc_t target;
1142 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1143 return libmc_rpc_format(&target);
1148 libmc_target_desc_t target;
1150 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1151 return libmc_rpc_unformat(&target);
1156 libmc_target_desc_t target;
1158 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1159 return libmc_rpc_get_ent_space(&target, path);
1162int xfromRename(
int port,
int slot,
const char* oldName,
const char* newName)
1164 libmc_target_desc_t target;
1166 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1167 return libmc_rpc_rename(&target, oldName, newName);
1172 libmc_target_desc_t target;
1174 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1175 return libmc_rpc_erase_block(&target, block, mode);
1180 libmc_target_desc_t target;
1182 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1183 return libmc_rpc_read_page(&target, page, buffer);
1188 libmc_target_desc_t target;
1190 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1191 return libmc_rpc_write_page(&target, page, buffer);
1196 libmc_target_desc_t target;
1198 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1199 return libmc_rpc_change_thread_priority(&target, level);
1204 libmc_target_desc_t target;
1206 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1207 return libmc_rpc_sync(&target, mode, cmd, result);
1212 libmc_target_desc_t target;
1214 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1215 return libmc_rpc_reset(&target);
int mcGetEntSpace(int port, int slot, const char *path)
int xfromWrite(int fd, const void *buffer, int size)
int mcUnformat(int port, int slot)
int xfromMkDir(int port, int slot, const char *name)
int mcSeek(int fd, int offset, int origin)
int xfromChangeThreadPriority(int level)
int mcRead(int fd, void *buffer, int size)
int xfromSync(int mode, int *cmd, int *result)
int mcMkDir(int port, int slot, const char *name)
int xfromSetFileInfo(int port, int slot, const char *name, const sceMcTblGetDir *info, unsigned flags)
int mcWritePage(int port, int slot, int page, const void *buffer)
int mcEraseBlock(int port, int slot, int block, int mode)
int xfromDelete(int port, int slot, const char *name)
int mcOpen(int port, int slot, const char *name, int mode)
int mcRename(int port, int slot, const char *oldName, const char *newName)
int mcChdir(int port, int slot, const char *newDir, char *currentDir)
int mcSetFileInfo(int port, int slot, const char *name, const sceMcTblGetDir *info, unsigned flags)
int mcReadPage(int port, int slot, unsigned int page, void *buffer)
int xfromRename(int port, int slot, const char *oldName, const char *newName)
int mcGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir *table)
int xfromGetInfo(int port, int slot, int *type, int *free, int *format)
int xfromGetEntSpace(int port, int slot, const char *path)
int xfromSeek(int fd, int offset, int origin)
int mcGetInfo(int port, int slot, int *type, int *free, int *format)
int xfromWritePage(int port, int slot, int page, const void *buffer)
int xfromChdir(int port, int slot, const char *newDir, char *currentDir)
int mcDelete(int port, int slot, const char *name)
int xfromEraseBlock(int port, int slot, int block, int mode)
int mcFormat(int port, int slot)
int xfromFormat(int port, int slot)
int xfromUnformat(int port, int slot)
int mcWrite(int fd, const void *buffer, int size)
int xfromReadPage(int port, int slot, unsigned int page, void *buffer)
int mcChangeThreadPriority(int level)
int mcSync(int mode, int *cmd, int *result)
int xfromGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir *table)
int xfromRead(int fd, void *buffer, int size)
int xfromOpen(int port, int slot, const char *name, int mode)