31 MC_RPCCMD_INIT = 0x00,
47 MC_RPCCMD_CHECK_BLOCK,
48 MC_RPCCMD_ERASE_BLOCK = 0x0E,
141static int* g_pType = NULL;
142static int* g_pFree = NULL;
143static int* g_pFormat = NULL;
173 *g_pType = ptr->type;
176 *g_pFree = ptr->free;
178 if(g_pFormat != NULL)
179 *g_pFormat = (ptr->type == MC_TYPE_NONE || g_rdata.result == -2) ? 0 : 1;
182 *g_pType = ptrNew->type;
185 *g_pFree = ptrNew->free;
187 if(g_pFormat != NULL)
188 *g_pFormat = ptrNew->formatted;
204 for(i = 0,dest = (u8*)ptr->dest1; i < ptr->size1; i++)
205 dest[i] = ptr->src1[i];
206 for(i = 0,dest = (u8*)ptr->dest2; i < ptr->size2; i++)
207 dest[i] = ptr->src2[i];
209 for(i = 0,dest = (u8*)ptrNew->dest1; i < ptrNew->size1; i++)
210 dest[i] = ptrNew->src1[i];
211 for(i = 0,dest = (u8*)ptrNew->dest2; i < ptrNew->size2; i++)
212 dest[i] = ptrNew->src2[i];
222 char *currentDir = UNCACHED_SEG(curDir);
223 len = strlen(currentDir);
225 len = strlen(currentDir+1023);
226 memcpy(arg, currentDir, len);
227 *(currentDir+len) = 0;
235 static int _rb_count = 0;
252 if((ret=sceSifBindRpc(&g_cdata, 0x80000400, 0)) < 0)
255 printf(
"libmc: bind error\n");
260 if(g_cdata.server == NULL)
263 while (g_cdata.server == NULL);
271 g_descParam.fd = 0xFFFFFFFF;
272 sceSifCallRpc(&g_cdata,
mcRpcCmd[MC_TYPE_XMC][MC_RPCCMD_FLUSH], 0, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, NULL, NULL);
273 sceSifCallRpc(&g_cdata,
mcRpcCmd[MC_TYPE_MC][MC_RPCCMD_FLUSH], 0, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, NULL, NULL);
275 printf(
"libmc: using XMCMAN & XMCSERV\n");
281 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_INIT], 0, &g_descParam,
sizeof(g_descParam), &g_rdata, 12, NULL, NULL)) < 0)
285 printf(
"libmc: initialisation error\n");
291 if (!err && rpcStat->result == sceMcResDeniedPermit)
299 if (rpcStat->mcserv_version < 0x205)
302 printf(
"libmc: mcserv is too old (%x)\n", rpcStat->mcserv_version);
308 if (rpcStat->mcman_version < 0x206)
311 printf(
"libmc: mcman is too old (%x)\n", rpcStat->mcman_version);
319 ret = rpcStat->result;
322 if (err && rpcStat->result == sceMcResDeniedPermit)
329 printf(
"libmc: using MCMAN & MCSERV\n");
332 g_descParam.offset = -217;
335 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_INIT], 0, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, NULL, NULL)) < 0)
339 printf(
"libmc: initialisation error\n");
345 if (!err && rpcStat->result == sceMcResDeniedPermit)
352 ret = g_rdata.result;
368int mcGetInfo(
int port,
int slot,
int* type,
int* free,
int* format)
382 g_descParam.port = port;
383 g_descParam.slot = slot;
384 g_descParam.size = (type) ? 1 : 0;
385 g_descParam.offset = (free) ? 1 : 0;
386 g_descParam.origin = (format) ? 1 : 0;
387 g_descParam.param = endParameter;
391 g_descParam.port = port;
392 g_descParam.slot = slot;
393 g_descParam.size = (format) ? 1 : 0;
394 g_descParam.offset = (free) ? 1 : 0;
395 g_descParam.origin = (type) ? 1 : 0;
396 g_descParam.param = endParameter;
401 sceSifWriteBackDCache(endParameter, 192);
410int mcOpen(
int port,
int slot,
const char *name,
int mode)
422 g_nameParam.port = port;
423 g_nameParam.slot = slot;
424 g_nameParam.flags = mode;
425 strncpy(g_nameParam.name, name, 1023);
426 g_nameParam.name[1023] = 0;
456int mcSeek(
int fd,
int offset,
int origin)
469 g_descParam.offset = offset;
470 g_descParam.origin = origin;
479int mcRead(
int fd,
void *buffer,
int size)
492 g_descParam.size = size;
493 g_descParam.buffer = buffer;
494 g_descParam.param = endParameter;
495 sceSifWriteBackDCache(buffer, size);
496 sceSifWriteBackDCache(endParameter, 192);
505int mcWrite(
int fd,
const void *buffer,
int size)
520 g_descParam.size = 0;
521 g_descParam.origin = size;
522 g_descParam.buffer = 0;
526 g_descParam.size = size - ( ((int)((
const u8 *)buffer-1) & 0xFFFFFFF0) - (
int)((
const u8 *)buffer-16) );
527 g_descParam.origin = ( ((int)((
const u8 *)buffer-1) & 0xFFFFFFF0) - (
int)((
const u8 *)buffer-16) );
528 g_descParam.buffer = (
void*)((
int)(
const u8 *)buffer + ( ((
int)((
const u8 *)buffer-1) & 0xFFFFFFF0) - (
int)((
const u8 *)buffer-16) ));
530 for(i=0; i<g_descParam.origin; i++)
532 g_descParam.data[i] = *(
char*)((
const u8 *)buffer+i);
564int mcMkDir(
int port,
int slot,
const char* name)
566 int ret =
mcOpen(port, slot, name, 0x40);
573int mcChdir(
int port,
int slot,
const char* newDir,
char* currentDir)
585 g_nameParam.port = port;
586 g_nameParam.slot = slot;
587 g_nameParam.curdir = curDir;
588 strncpy(g_nameParam.name, newDir, 1023);
589 g_nameParam.name[1023] = 0;
590 sceSifWriteBackDCache(curDir, 1024);
611 g_nameParam.port = port;
612 g_nameParam.slot = slot;
613 g_nameParam.flags = mode;
614 g_nameParam.maxent = maxent;
615 g_nameParam.mcT = table;
616 strncpy(g_nameParam.name, name, 1023);
617 g_nameParam.name[1023] = 0;
621 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_GET_DIR],
SIF_RPC_M_NOWAIT, &g_nameParam,
sizeof(g_nameParam), &g_rdata, 4, NULL, NULL)) != 0)
639 g_nameParam.port = port;
640 g_nameParam.slot = slot;
641 g_nameParam.flags = flags;
642 g_nameParam.mcT = &g_fileInfoBuff;
645 strncpy(g_nameParam.name, name, 1023);
646 g_nameParam.name[1023] = 0;
650 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_SET_INFO],
SIF_RPC_M_NOWAIT, &g_nameParam,
sizeof(g_nameParam), &g_rdata, 4, NULL, NULL)) != 0)
668 g_nameParam.port = port;
669 g_nameParam.slot = slot;
670 g_nameParam.flags = 0;
671 strncpy(g_nameParam.name, name, 1023);
672 g_nameParam.name[1023] = 0;
675 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_DELETE],
SIF_RPC_M_NOWAIT, &g_nameParam,
sizeof(g_nameParam), &g_rdata, 4, NULL, NULL)) != 0)
693 g_descParam.port = port;
694 g_descParam.slot = slot;
697 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_FORMAT],
SIF_RPC_M_NOWAIT, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, NULL, NULL)) != 0)
715 g_descParam.port = port;
716 g_descParam.slot = slot;
719 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_UNFORMAT],
SIF_RPC_M_NOWAIT, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, NULL, NULL)) != 0)
737 g_nameParam.port = port;
738 g_nameParam.slot = slot;
739 strncpy(g_nameParam.name, path, 1023);
740 g_nameParam.name[1023] = 0;
743 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_GET_ENT],
SIF_RPC_M_NOWAIT, &g_nameParam,
sizeof(g_nameParam), &g_rdata, 4, NULL, NULL)) != 0)
749int mcRename(
int port,
int slot,
const char* oldName,
const char* newName)
761 g_nameParam.port = port;
762 g_nameParam.slot = slot;
763 g_nameParam.flags = 0x10;
764 g_nameParam.mcT = &g_fileInfoBuff;
765 strncpy(g_nameParam.name, oldName, 1023);
766 g_nameParam.name[1023] = 0;
767 strncpy((
char*)g_fileInfoBuff.EntryName, newName, 31);
768 g_fileInfoBuff.EntryName[31] = 0;
772 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_SET_INFO],
SIF_RPC_M_NOWAIT, &g_nameParam,
sizeof(g_nameParam), &g_rdata, 4, NULL, NULL)) != 0)
788 g_descParam.port=port;
789 g_descParam.slot=slot;
790 g_descParam.offset=block;
791 g_descParam.origin=mode;
793 if((result = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_ERASE_BLOCK],
SIF_RPC_M_NOWAIT, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, NULL, NULL))==0){
805 unsigned char data1[16];
806 unsigned char data2[16];
807 unsigned char padding[16];
813 unsigned int misaligned;
815 if((misaligned=(
unsigned int)data->dest1&0xF)!=0){
816 memcpy(UNCACHED_SEG(data->dest1), UNCACHED_SEG(data->data1), 16-misaligned);
817 memcpy(UNCACHED_SEG((
unsigned int)data->dest1+(16-misaligned)), UNCACHED_SEG((
unsigned int)data->data1+(16-misaligned)+0x1F0), misaligned);
821int mcReadPage(
int port,
int slot,
unsigned int page,
void *buffer){
832 g_descParam.port=port;
833 g_descParam.slot=slot;
834 g_descParam.buffer=buffer;
835 g_descParam.param=&libmc_ReadPageAlignData;
837 sceSifWriteBackDCache(buffer, 0x200);
839 if((result = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_READ_PAGE],
SIF_RPC_M_NOWAIT, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, (
void*)&libmc_ReadAlignFunction, UNCACHED_SEG(&libmc_ReadPageAlignData)))==0){
847 int result, misaligned;
857 g_descParam.port=port;
858 g_descParam.slot=slot;
859 g_descParam.buffer=(
void*)buffer;
861 sceSifWriteBackDCache((
void*)buffer, 512);
863 if((misaligned=(
unsigned int)buffer&0xF)!=0){
864 memcpy(g_descParam.data, buffer, 16-misaligned);
865 memcpy((
void*)(g_descParam.data+(16-misaligned)), (
void*)((
const u8 *)buffer+(16-misaligned)+0x1F0), misaligned);
868 if((result = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_WRITE_PAGE],
SIF_RPC_M_NOWAIT, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, NULL, NULL))==0){
892 if((ret = sceSifCallRpc(&g_cdata,
mcRpcCmd[
g_mcType][MC_RPCCMD_CHG_PRITY],
SIF_RPC_M_NOWAIT, &g_descParam,
sizeof(g_descParam), &g_rdata, 4, NULL, NULL)) != 0)
898int mcSync(
int mode,
int *cmd,
int *result)
907 funcIsExecuting = sceSifCheckStatRpc(&g_cdata);
912 while(sceSifCheckStatRpc(&g_cdata))
915 for(i=0; i<100000; i++)
927 if(funcIsExecuting == 1)
935 *result = g_rdata.result;
943 g_cdata.server = NULL;
int mcGetEntSpace(int port, int slot, const char *path)
int mcUnformat(int port, int slot)
int mcSeek(int fd, int offset, int origin)
int mcRead(int fd, void *buffer, int size)
int mcMkDir(int port, int slot, const char *name)
static const int mcRpcCmd[2][17]
int mcWritePage(int port, int slot, int page, const void *buffer)
int mcEraseBlock(int port, int slot, int block, int mode)
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 mcGetDir(int port, int slot, const char *name, unsigned mode, int maxent, sceMcTblGetDir *table)
static void mcStoreDir(void *arg)
static void mcReadFixAlign(void *data_raw)
static void mcGetInfoApdx(void *info)
int mcGetInfo(int port, int slot, int *type, int *free, int *format)
int mcDelete(int port, int slot, const char *name)
int mcFormat(int port, int slot)
int mcWrite(int fd, const void *buffer, int size)
int mcChangeThreadPriority(int level)
int mcSync(int mode, int *cmd, int *result)
static unsigned int g_currentCmd