29 enum MC_RPCCMD_NUMBERS
31 MC_RPCCMD_INIT = 0x00,
47 MC_RPCCMD_CHECK_BLOCK,
48 MC_RPCCMD_ERASE_BLOCK = 0x0E,
53 static const int mcRpcCmd[2][17] =
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];
156 unsigned int m_current_command;
166 MC_INTERFACE_SIO2 = 0,
187 #define LIBMC_PRE_CHECK_FLAG_ONLY_TYPE 1
189 static 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); \
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)
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;
234 static 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;
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;
272 *(ep->m_p_type) = ptr->type;
275 *(ep->m_p_free) = ptr->free;
278 *(ep->m_p_format) = ptr->formatted;
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];
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];
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;
328 static void libmc_ReadAlignFunction(
void *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);
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);
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;
485 static 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);
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 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;
526 return libmc_post_rpc(target, MC_RPCCMD_OPEN, 0, NULL, NULL);
531 LIBMC_PRE_RPC(target, 0, 0);
534 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
536 return libmc_post_rpc(target, MC_RPCCMD_CLOSE, 1, NULL, NULL);
541 LIBMC_PRE_RPC(target, 0, 0);
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;
548 return libmc_post_rpc(target, MC_RPCCMD_SEEK, 1, NULL, NULL);
553 LIBMC_PRE_RPC(target, 0, 0);
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);
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);
567 static int libmc_rpc_write(
const libmc_target_desc_t *target,
const void *buffer,
int size)
571 LIBMC_PRE_RPC(target, 0, 0);
574 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
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;
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) ));
587 for (i = 0; i < target->m_interface_data->m_name_desc_param.m_desc_param.origin; i++)
589 target->m_interface_data->m_name_desc_param.m_desc_param.data[i] = *(
char*)((
const u8 *)buffer+i);
593 return libmc_post_rpc(target, MC_RPCCMD_WRITE, 1, NULL, NULL);
598 LIBMC_PRE_RPC(target, 0, 0);
601 target->m_interface_data->m_name_desc_param.m_desc_param.fd = target->m_fd;
603 return libmc_post_rpc(target, MC_RPCCMD_FLUSH, 1, NULL, NULL);
610 ret = libmc_rpc_open(target, name, 0x40);
612 target->m_interface_data->m_current_command = MC_FUNC_MK_DIR;
616 static int libmc_rpc_chdir(
const libmc_target_desc_t *target,
const char* newDir,
char* currentDir)
618 LIBMC_PRE_RPC(target, 0, 0);
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);
630 return libmc_post_rpc(target, MC_RPCCMD_CH_DIR, 0, (SifRpcEndFunc_t)
mcStoreDir, &target->m_interface_data->m_extra_end_param);
635 LIBMC_PRE_RPC(target, 0, 0);
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;
647 return libmc_post_rpc(target, MC_RPCCMD_GET_DIR, 0, NULL, NULL);
652 LIBMC_PRE_RPC(target, 0, 0);
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;
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));
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;
665 return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
670 LIBMC_PRE_RPC(target, 0, 0);
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;
679 return libmc_post_rpc(target, MC_RPCCMD_DELETE, 0, NULL, NULL);
684 LIBMC_PRE_RPC(target, 0, 0);
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;
690 return libmc_post_rpc(target, MC_RPCCMD_FORMAT, 1, NULL, NULL);
695 LIBMC_PRE_RPC(target, 0, 0);
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;
701 return libmc_post_rpc(target, MC_RPCCMD_UNFORMAT, 1, NULL, NULL);
706 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
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;
714 return libmc_post_rpc(target, MC_RPCCMD_GET_ENT, 0, NULL, NULL);
717 static int libmc_rpc_rename(
const libmc_target_desc_t *target,
const char* oldName,
const char* newName)
720 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
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;
733 return libmc_post_rpc(target, MC_RPCCMD_SET_INFO, 0, NULL, NULL);
738 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
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;
745 return libmc_post_rpc(target, MC_RPCCMD_ERASE_BLOCK, 1, NULL, NULL);
748 static int libmc_rpc_read_page(
const libmc_target_desc_t *target,
unsigned int page,
void *buffer)
750 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
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);
758 sceSifWriteBackDCache(buffer, 0x200);
760 return libmc_post_rpc(target, MC_RPCCMD_READ_PAGE, 1, &libmc_ReadAlignFunction, UNCACHED_SEG(&target->m_interface_data->m_extra_send_recv_param));
763 static int libmc_rpc_write_page(
const libmc_target_desc_t *target,
int page,
const void *buffer)
767 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_MC);
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;
774 sceSifWriteBackDCache((
void*)buffer, 512);
776 if ((misaligned=(
unsigned int)buffer&0xF)!=0)
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);
782 return libmc_post_rpc(target, MC_RPCCMD_WRITE_PAGE, 1, NULL, NULL);
789 LIBMC_PRE_RPC(target, LIBMC_PRE_CHECK_FLAG_ONLY_TYPE, MC_TYPE_XMC);
794 return libmc_post_rpc(target, MC_RPCCMD_CHG_PRITY, 1, NULL, NULL);
797 static int libmc_rpc_sync(
const libmc_target_desc_t *target,
int mode,
int *cmd,
int *result)
802 if (target->m_interface_data->m_current_command == MC_FUNC_NONE)
806 funcIsExecuting = sceSifCheckStatRpc(&target->m_interface_data->m_client_data);
811 while (sceSifCheckStatRpc(&target->m_interface_data->m_client_data))
814 for (i=0; i<100000; i++)
823 *cmd = target->m_interface_data->m_current_command;
826 if (funcIsExecuting == 1)
830 target->m_interface_data->m_current_command = MC_FUNC_NONE;
834 *result = target->m_interface_data->m_rpc_rdata.m_result;
843 memset(&(target->m_interface_data->m_client_data), 0,
sizeof(target->m_interface_data->m_client_data));
848 for (i = 0; i < (
sizeof(g_libmc_internal_data.m_interface_data)/
sizeof(g_libmc_internal_data.m_interface_data[0])); i += 1)
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));
861 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
862 return libmc_rpc_init(&target);
865 int mcGetInfo(
int port,
int slot,
int* type,
int* free,
int* format)
869 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
870 return libmc_rpc_get_info(&target, type, free, format);
873 int mcOpen(
int port,
int slot,
const char *name,
int mode)
877 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
878 return libmc_rpc_open(&target, name, mode);
885 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
886 return libmc_rpc_close(&target);
889 int mcSeek(
int fd,
int offset,
int origin)
893 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
894 return libmc_rpc_seek(&target, offset, origin);
897 int mcRead(
int fd,
void *buffer,
int size)
901 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
902 return libmc_rpc_read(&target, buffer, size);
905 int mcWrite(
int fd,
const void *buffer,
int size)
909 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
910 return libmc_rpc_write(&target, buffer, size);
917 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, fd);
918 return libmc_rpc_flush(&target);
921 int mcMkDir(
int port,
int slot,
const char* name)
925 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
926 return libmc_rpc_mkdir(&target, name);
929 int mcChdir(
int port,
int slot,
const char* newDir,
char* currentDir)
933 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
934 return libmc_rpc_chdir(&target, newDir, currentDir);
941 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
942 return libmc_rpc_getdir(&target, name, mode, maxent, table);
949 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
950 return libmc_rpc_setfileinfo(&target, name,
info, flags);
957 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
958 return libmc_rpc_delete(&target, name);
965 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
966 return libmc_rpc_format(&target);
973 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
974 return libmc_rpc_unformat(&target);
981 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
982 return libmc_rpc_get_ent_space(&target, path);
985 int mcRename(
int port,
int slot,
const char* oldName,
const char* newName)
989 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
990 return libmc_rpc_rename(&target, oldName, newName);
997 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
998 return libmc_rpc_erase_block(&target, block, mode);
1001 int mcReadPage(
int port,
int slot,
unsigned int page,
void *buffer)
1005 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
1006 return libmc_rpc_read_page(&target, page, buffer);
1013 libmc_setup_target(&target, MC_INTERFACE_SIO2, port, slot, 0);
1014 return libmc_rpc_write_page(&target, page, buffer);
1021 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1022 return libmc_rpc_change_thread_priority(&target, level);
1029 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1030 return libmc_rpc_sync(&target, mode, cmd, result);
1037 libmc_setup_target(&target, MC_INTERFACE_SIO2, 0, 0, 0);
1038 return libmc_rpc_reset(&target);
1046 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1047 return libmc_rpc_init(&target);
1054 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1055 return libmc_rpc_get_info(&target, type, free, format);
1058 int xfromOpen(
int port,
int slot,
const char *name,
int mode)
1062 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1063 return libmc_rpc_open(&target, name, mode);
1070 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1071 return libmc_rpc_close(&target);
1078 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1079 return libmc_rpc_seek(&target, offset, origin);
1086 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1087 return libmc_rpc_read(&target, buffer, size);
1094 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1095 return libmc_rpc_write(&target, buffer, size);
1102 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, fd);
1103 return libmc_rpc_flush(&target);
1110 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1111 return libmc_rpc_mkdir(&target, name);
1114 int xfromChdir(
int port,
int slot,
const char* newDir,
char* currentDir)
1118 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1119 return libmc_rpc_chdir(&target, newDir, currentDir);
1126 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1127 return libmc_rpc_getdir(&target, name, mode, maxent, table);
1134 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1135 return libmc_rpc_setfileinfo(&target, name,
info, flags);
1142 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1143 return libmc_rpc_delete(&target, name);
1150 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1151 return libmc_rpc_format(&target);
1158 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1159 return libmc_rpc_unformat(&target);
1166 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1167 return libmc_rpc_get_ent_space(&target, path);
1170 int xfromRename(
int port,
int slot,
const char* oldName,
const char* newName)
1174 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1175 return libmc_rpc_rename(&target, oldName, newName);
1182 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1183 return libmc_rpc_erase_block(&target, block, mode);
1190 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1191 return libmc_rpc_read_page(&target, page, buffer);
1198 libmc_setup_target(&target, MC_INTERFACE_DEV9, port, slot, 0);
1199 return libmc_rpc_write_page(&target, page, buffer);
1206 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1207 return libmc_rpc_change_thread_priority(&target, level);
1214 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1215 return libmc_rpc_sync(&target, mode, cmd, result);
1222 libmc_setup_target(&target, MC_INTERFACE_DEV9, 0, 0, 0);
1223 return libmc_rpc_reset(&target);