11#include "irx_imports.h"
16IRX_ID(
"IOP_MSIF_rpc_interface", 2, 7);
34 unsigned int buffersize;
35 unsigned int stacksize;
55 int m_rdata_table_len;
57 int m_client_table_len;
58 int m_rdata_table_idx;
79 char m_probunused_unkx21;
108 int m_eebuf_or_threadstate;
193static int g_first_inited;
194static int g_pkt_table[512];
195static int g_client_table[512];
198int _start(
int ac,
char **av)
202 printf(
"Multi-thread available sifrpc module...\n");
203 return RegisterLibraryEntries(&_exp_msifrpc) ? MODULE_NO_RESIDENT_END : MODULE_RESIDENT_END;
206void sceSifMInitRpc(
unsigned int mode)
212 if ( g_first_inited )
215 while ( !sceSifGetSreg(1) )
219 delayth_1 = DelayThread(10000);
221 printf(
"return value of DelayThread() is %d\n", delayth_1);
227 g_msif_data.m_rdata_table = (int)g_pkt_table;
228 g_msif_data.m_rdata_table_len = 32;
229 g_msif_data.m_client_table = (int)g_client_table;
230 g_msif_data.m_client_table_len = 32;
231 g_msif_data.m_rdata_table_idx = 0;
232 g_msif_data.field_0 = 1;
233 g_msif_data.g_mserv_entries_ll = 0;
234 sceSifAddCmdHandler(0x80000019, (SifCmdHandler_t)sif_cmdh_bindrpcparam_80000019, &g_msif_data);
235 sceSifAddCmdHandler(0x8000001A, (SifCmdHandler_t)sif_cmdh_callrpc_8000001A, &g_msif_data);
236 sceSifAddCmdHandler(0x8000001D, (SifCmdHandler_t)sif_cmdh_unbindrpc_8000001D, &g_msif_data);
240 while ( !sceSifSendCmd(0x80000001, g_pkt_table, 24, 0, 0, 0) )
242 while ( !sceSifGetSreg(1) )
246 delayth_2 = DelayThread(10000);
248 printf(
"return value of DelayThread() is %d\n", delayth_2);
255 int m_rdata_table_idx;
256 int m_rdata_table_len;
259 m_rdata_table_idx =
rpc_data->m_rdata_table_idx;
260 m_rdata_table_len =
rpc_data->m_rdata_table_len;
261 index_calc = m_rdata_table_idx % m_rdata_table_len;
262 if ( m_rdata_table_len == -1 && (
unsigned int)m_rdata_table_idx == 0x80000000 )
264 rpc_data->m_rdata_table_idx = index_calc + 1;
265 return rpc_data->m_rdata_table + (index_calc << 6);
270 return (rid >= 0 && rid < rpc_data->m_client_table_len) ? (
rpc_data->m_client_table + (rid << 6)) :
278 for ( g_mserv_entries_ll = msd->g_mserv_entries_ll; g_mserv_entries_ll && g_mserv_entries_ll->command != cmd;
279 g_mserv_entries_ll = g_mserv_entries_ll->next )
281 return g_mserv_entries_ll;
284static unsigned int alarm_cb_cmd_80000018_1(
void *pkt)
286 return isceSifSendCmd(0x80000018, pkt, 64, 0, 0, 0) ? 0 : 0xF000;
295 mserve_entry = do_get_mserve_entry(data->m_fromee_cmd, harg);
303 printf(
"AllocSysMemory() failed.\n");
307 msgdat->m_probunused_unkx21 = 0;
308 msgdat->m_in_cmd = 0x80000019;
309 msgdat->m_msg2.m_pkt_addr = data->m_pkt_addr;
310 msgdat->m_msg2.m_msif_data = harg;
311 msgdat->m_msg2.m_mserve_entry = mserve_entry;
312 msgdat->m_msg2.m_eebuf_cd = data->m_cd;
313 msgdat->m_msg2.m_buffersize = data->m_buffersize;
314 msgdat->m_msg2.m_stacksize = data->m_stacksize;
315 msgdat->m_msg2.m_priority = data->m_priority;
316 iSendMbx(mserve_entry->mbxid, msgdat);
320 fpacket->pkt_addr = data->m_pkt_addr;
321 fpacket->sid = 0x80000019;
322 fpacket->m_eebuf_or_threadstate = 0;
323 fpacket->m_eeserver = 0;
324 fpacket->m_toee_unkxb = 0;
325 fpacket->cd = data->m_cd;
326 if ( !isceSifSendCmd(0x80000018, fpacket, 64, 0, 0, 0) )
330 iSetAlarm(&sysclks, (
unsigned int (*)(
void *))alarm_cb_cmd_80000018_1, fpacket);
334static unsigned int alarm_cb_cmd_80000018_2(
void *pkt)
336 return isceSifSendCmd(0x80000018, pkt, 64, 0, 0, 0) ? 0 : 0xF000;
346 mserve_entry = do_get_mserve_entry(data->m_command, harg);
347 if ( !mserve_entry || (data->m_sd->sentry != mserve_entry) )
351 else if ( !data->m_sd->base->sleep )
362 printf(
"AllocSysMemory() failed.\n");
366 msgboxdat->m_probunused_unkx21 = 0;
367 msgboxdat->m_in_cmd = 0x8000001D;
368 msgboxdat->m_msg2.m_pkt_addr = data->m_pkt_addr;
369 msgboxdat->m_msg2.m_msif_data = harg;
370 msgboxdat->m_msg2.m_mserve_entry = mserve_entry;
371 msgboxdat->m_msg2.m_sd = data->m_sd;
372 msgboxdat->m_msg2.m_eebuf_cd = data->m_cd;
373 iSendMbx(mserve_entry->mbxid, msgboxdat);
377 fpacket->pkt_addr = data->m_pkt_addr;
378 fpacket->sid = 0x8000001D;
379 fpacket->m_eebuf_or_threadstate = threadstate_tmp;
380 fpacket->m_eeserver = 0;
381 fpacket->m_toee_unkxb = 0;
382 fpacket->cd = data->m_cd;
383 if ( !isceSifSendCmd(0x80000018, fpacket, 64, 0, 0, 0) )
386 alarmdat.lo = 0xF000;
387 iSetAlarm(&alarmdat, (
unsigned int (*)(
void *))alarm_cb_cmd_80000018_2, fpacket);
394 if ( data->m_sd->base->start )
395 data->m_sd->base->end->next = data->m_sd;
397 data->m_sd->base->start = data->m_sd;
398 data->m_sd->base->end = data->m_sd;
399 data->m_sd->paddr = data->m_paddr;
400 data->m_sd->client = data->m_cd;
401 data->m_sd->fno = data->m_fno;
402 data->m_sd->size = data->m_size;
403 data->m_sd->receive = data->m_receive;
404 data->m_sd->rsize = data->m_rsize;
405 data->m_sd->rmode = data->m_rmode;
406 data->m_sd->rid = data->m_rid;
407 if ( data->m_sd->base->key >= 0 && !data->m_sd->base->active )
408 iWakeupThread(data->m_sd->base->key);
423 if ( g_msif_data.m_active_queue )
425 for ( i = g_msif_data.m_active_queue; i->next; i = i->next )
431 g_msif_data.m_active_queue = qd;
444 server1 = sd->sentry->serve_list;
447 sd->sentry->serve_list = server1->next;
456 server2 = server1->next;
459 server1->next = sd->next;
462 server1 = server1->next;
475 queue1 = g_msif_data.m_active_queue;
478 g_msif_data.m_active_queue = queue1->next;
485 queue2 = queue1->next;
488 queue1->next = queue2->next;
491 queue1 = queue1->next;
504 qd->active = start ? 1 : 0;
507 qd->start = start->next;
522 sentry_ret = sd->sentry->func(sd->fno, sd->func_buff, sd->size);
524 size_extra = sd->rsize;
526 fpacket2 = (sd->rid & 4) ? (
SifMRpcRendPkt_t *)sif_mrpc_get_fpacket2(&g_msif_data, (sd->rid >> 16) & 0xFFFF) :
529 fpacket2->cid = 0x8000001A;
530 fpacket2->cd = sd->client;
534 while ( !sceSifSendCmd(0x80000018, fpacket2, 64, sentry_ret, sd->receive, size_extra) )
541 fpacket2->rpc_id = 0;
542 fpacket2->rec_id = 0;
543 if ( size_extra > 0 )
546 dmat[0].src = sentry_ret;
547 dmat[0].size = size_extra;
549 dmat[0].dest = sd->receive;
551 dmat[adddmat].src = fpacket2;
552 dmat[adddmat].size = 64;
553 dmat[adddmat].attr = 0;
554 dmat[adddmat].dest = sd->paddr;
561 dmaid = sceSifSetDma(dmat, adddmat + 1);
565 for ( i = 0xFFFF; i != 0; i -= 1 )
577 next_request = do_msif_get_next_request(qd);
580 do_msif_exec_request(next_request);
602 printf(
"AllocSysMemory() failed.\n");
605 printf(
"AllocSysMemory() failed.\n");
606 funcbuf = AllocSysMemory(0, msgboxdat->m_msg2.m_buffersize, 0);
608 printf(
"AllocSysMemory() failed.\n");
610 do_set_rpc_queue(qd, GetThreadId());
611 sd->func_buff = funcbuf;
614 sd->sentry = msgboxdat->m_msg2.m_mserve_entry;
618 fpacket = (
SifMRpcCallPkt_t *)sif_mrpc_get_fpacket(msgboxdat->m_msg2.m_msif_data);
620 fpacket->pkt_addr = msgboxdat->m_msg2.m_pkt_addr;
621 fpacket->rpc_number = 0x80000019;
623 fpacket->recvbuf = funcbuf;
624 fpacket->recv_size = 0;
625 fpacket->cd = msgboxdat->m_msg2.m_eebuf_cd;
626 while ( !sceSifSendCmd(0x80000018, fpacket, 64, 0, 0, 0) )
629 FreeSysMemory(msgboxdat);
631 do_msif_rpc_loop(qd);
649 ReferThreadStatus(0, &thinfo);
650 ChangeThreadPriority(0, 16);
656 mbxparam.attr = MBA_THFIFO;
659 se->mbxid = CreateMbx(&mbxparam);
665 g_mserv_entries_ll = g_msif_data.g_mserv_entries_ll;
666 if ( g_mserv_entries_ll )
668 while ( g_mserv_entries_ll->next )
669 g_mserv_entries_ll = g_mserv_entries_ll->next;
670 g_mserv_entries_ll->next = se;
674 g_msif_data.g_mserv_entries_ll = se;
681 mbxrecv = ReceiveMbx((
void **)&arg, se->mbxid);
684 if ( mbxrecv != KE_WAIT_DELETE )
686 printf(
"ReceiveMbx() failed.\n");
690 printf(
"msifrpc: quit\n");
691 ChangeThreadPriority(0, thinfo.currentPriority);
695 switch ( arg->m_in_cmd )
698 thparam_1.thread = (void (*)(
void *))thread_proc_80000019;
699 thparam_1.attr = TH_C;
700 thparam_1.stacksize = arg->m_msg2.m_stacksize;
701 thparam_1.priority = arg->m_msg2.m_priority;
702 thid_1 = CreateThread(&thparam_1);
704 printf(
"StartThread() failed.\n");
706 StartThread(thid_1, arg);
709 termthread_1 = TerminateThread(arg->m_msg2.m_sd->base->key);
711 Kprintf(
"TerminateThread(): ret = %d\n", termthread_1);
712 delthread_1 = DeleteThread(arg->m_msg2.m_sd->base->key);
715 if ( delthread_1 == KE_NOT_DORMANT )
718 Kprintf(
"DeleteThread(): ret = %d\n", delthread_1);
723 do_sif_remove_rpc_queue(arg->m_msg2.m_sd->base);
725 FreeSysMemory(arg->m_msg2.m_sd->base);
726 FreeSysMemory(arg->m_msg2.m_sd->func_buff);
728 do_msif_remove_rpc(arg->m_msg2.m_sd);
730 FreeSysMemory(arg->m_msg2.m_sd);
735 (arg->m_msg2.m_sd->rid & 4) ?
736 (
SifMRpcBindPkt_t *)sif_mrpc_get_fpacket2(arg->m_msg2.m_msif_data, (arg->m_msg2.m_sd->rid >> 16) & 0xFFFF) :
739 fpacket2->pkt_addr = arg->m_msg2.m_pkt_addr;
740 fpacket2->sid = 0x8000001D;
741 fpacket2->m_eebuf_or_threadstate = delthread_1;
742 fpacket2->m_eeserver = 0;
743 fpacket2->m_toee_unkxb = 0;
744 fpacket2->cd = arg->m_msg2.m_eebuf_cd;
745 while ( !sceSifSendCmd(0x80000018, fpacket2, 64, 0, 0, 0) )
757int sceSifMTermRpc(
int request,
int flags)
765 cur_entry = g_msif_data.g_mserv_entries_ll;
767 while ( cur_entry && cur_entry->command !=
request )
769 tmp_entry = cur_entry;
770 cur_entry = cur_entry->next;
775 tmp_entry->next = cur_entry->next;
777 g_msif_data.g_mserv_entries_ll = cur_entry->next;
782 DeleteMbx(cur_entry->mbxid);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)