26 #define RPC_PACKET_SIZE 64
29 #define PACKET_F_ALLOC 0x01
31 static inline void rpc_packet_free(
void *packet)
54 extern struct rpc_data _sif_rpc_data;
59 #ifdef F__rpc_get_packet
72 for (rid = 0; rid < len; rid++, packet = (
SifRpcPktHeader_t *)(((
unsigned char *)packet) + RPC_PACKET_SIZE)) {
91 packet->pkt_addr = packet;
100 #ifdef F__rpc_get_fpacket
106 rpc_data->rdata_table_idx = index + 1;
108 return (
void *)(
rpc_data->rdata_table + (index * RPC_PACKET_SIZE));
112 #ifdef F_sceSifBindRpc
124 cd->hdr.pkt_addr = bind;
125 cd->hdr.rpc_id = bind->rpc_id;
126 cd->hdr.sema_id = -1;
129 bind->pkt_addr = bind;
133 if (!sceSifSendCmd(SIF_CMD_RPC_BIND, bind, RPC_PACKET_SIZE, NULL, NULL, 0)) {
134 rpc_packet_free(bind);
143 cd->hdr.sema_id = CreateSema(&sema);
144 if (cd->hdr.sema_id < 0) {
145 rpc_packet_free(bind);
149 if (!sceSifSendCmd(SIF_CMD_RPC_BIND, bind, RPC_PACKET_SIZE, NULL, NULL, 0)) {
150 rpc_packet_free(bind);
151 DeleteSema(cd->hdr.sema_id);
155 WaitSema(cd->hdr.sema_id);
156 DeleteSema(cd->hdr.sema_id);
162 #ifdef F_sceSifCallRpc
164 int ssize,
void *recvbuf,
int rsize, SifRpcEndFunc_t end_function,
void *end_param)
173 cd->hdr.pkt_addr = call;
174 cd->hdr.rpc_id = call->rpc_id;
175 cd->hdr.sema_id = -1;
176 cd->end_function = end_function;
177 cd->end_param = end_param;
179 call->rpc_number = rpc_number;
180 call->send_size = ssize;
181 call->recvbuf = recvbuf;
182 call->recv_size = rsize;
184 call->pkt_addr = call;
186 call->sd = cd->server;
190 sceSifWriteBackDCache(sendbuf, ssize);
192 sceSifWriteBackDCache(recvbuf, rsize);
199 if (!sceSifSendCmd(SIF_CMD_RPC_CALL, call, RPC_PACKET_SIZE, sendbuf, cd->buf, ssize)) {
200 rpc_packet_free(call);
209 cd->hdr.sema_id = CreateSema(&sema);
210 if (cd->hdr.sema_id < 0) {
211 rpc_packet_free(call);
215 if (!sceSifSendCmd(SIF_CMD_RPC_CALL, call, RPC_PACKET_SIZE, sendbuf, cd->buf, ssize)) {
216 rpc_packet_free(call);
217 DeleteSema(cd->hdr.sema_id);
221 WaitSema(cd->hdr.sema_id);
222 DeleteSema(cd->hdr.sema_id);
228 #ifdef F_sceSifGetOtherData
238 rd->hdr.pkt_addr = other;
239 rd->hdr.rpc_id = other->rpc_id;
240 rd->hdr.sema_id = -1;
248 if (!sceSifSendCmd(SIF_CMD_RPC_RDATA, other, RPC_PACKET_SIZE, NULL, NULL, 0)) {
249 rpc_packet_free(other);
258 rd->hdr.sema_id = CreateSema(&sema);
259 if (rd->hdr.sema_id < 0) {
260 rpc_packet_free(other);
264 if (!sceSifSendCmd(SIF_CMD_RPC_RDATA, other, RPC_PACKET_SIZE, NULL, NULL, 0)) {
265 rpc_packet_free(other);
266 DeleteSema(rd->hdr.sema_id);
270 WaitSema(rd->hdr.sema_id);
271 DeleteSema(rd->hdr.sema_id);
297 if (
request->cid == SIF_CMD_RPC_CALL) {
298 if (cd->end_function)
299 cd->end_function(cd->end_param);
300 }
else if (
request->cid == SIF_CMD_RPC_BIND) {
306 if (cd->hdr.sema_id >= 0)
307 iSignalSema(cd->hdr.sema_id);
309 rpc_packet_free(cd->hdr.pkt_addr);
310 cd->hdr.pkt_addr = NULL;
324 if ((u32)(sd->sid) == sid)
342 rend = _rpc_get_fpacket(data);
343 rend->pkt_addr = bind->pkt_addr;
345 rend->cid = SIF_CMD_RPC_BIND;
347 sd = search_svdata(bind->sid, data);
355 rend->cbuf = sd->cbuf;
358 isceSifSendCmd(SIF_CMD_RPC_END, rend, RPC_PACKET_SIZE, NULL, NULL, 0);
370 base->end->next = sd;
375 sd->pkt_addr =
request->pkt_addr;
377 sd->rpc_number =
request->rpc_number;
379 sd->recvbuf =
request->recvbuf;
380 sd->rsize =
request->recv_size;
384 if (base->thread_id < 0 || base->active != 0)
387 iWakeupThread(base->thread_id);
396 rend->pkt_addr = rdata->pkt_addr;
398 rend->cid = SIF_CMD_RPC_RDATA;
400 isceSifSendCmd(SIF_CMD_RPC_END, rend, RPC_PACKET_SIZE, rdata->src, rdata->dest, rdata->size);
403 void sceSifInitRpc(
int mode)
420 _sif_rpc_data.pid = 1;
422 _sif_rpc_data.pkt_table = UNCACHED_SEG(pkt_table);
423 _sif_rpc_data.pkt_table_len =
sizeof(pkt_table) /
sizeof(pkt_table[0]);
424 _sif_rpc_data.rdata_table = UNCACHED_SEG(rdata_table);
425 _sif_rpc_data.rdata_table_len =
sizeof(rdata_table) /
sizeof(rdata_table[0]);
426 _sif_rpc_data.client_table = UNCACHED_SEG(client_table);
427 _sif_rpc_data.client_table_len =
sizeof(client_table) /
sizeof(client_table[0]);
429 _sif_rpc_data.rdata_table_idx = 0;
437 for (rid = 0; rid < len; rid++, packet = (
SifRpcPktHeader_t *)(((
unsigned char *)packet) + RPC_PACKET_SIZE)) {
438 rpc_packet_free(packet);
442 sceSifAddCmdHandler(SIF_CMD_RPC_END, (
void *)_request_end, &_sif_rpc_data);
443 sceSifAddCmdHandler(SIF_CMD_RPC_BIND, (
void *)_request_bind, &_sif_rpc_data);
444 sceSifAddCmdHandler(SIF_CMD_RPC_CALL, (
void *)_request_call, &_sif_rpc_data);
445 sceSifAddCmdHandler(SIF_CMD_RPC_RDATA, (
void *)_request_rdata, &_sif_rpc_data);
448 if (sceSifGetReg(SIF_SYSREG_RPCINIT))
451 cmdp = (u32 *)&((u8 *)_sif_rpc_data.pkt_table)[64];
453 sceSifSendCmd(SIF_CMD_INIT_CMD, cmdp, 16, NULL, NULL, 0);
457 sceSifSetReg(SIF_SYSREG_RPCINIT, 1);
460 void sceSifExitRpc(
void)
467 #ifdef F_sceSifRegisterRpc
484 if (!(server =
qd->link)) {
487 while (server->link != NULL) {
488 server = server->link;
498 #ifdef F_sceSifRemoveRpc
505 if ((server =
qd->link) == sd) {
506 qd->link = server->link;
508 while (server != NULL) {
509 if (server->link == sd) {
510 server->link = sd->link;
514 server = server->link;
524 #ifdef F_sceSifSetRpcQueue
531 qd->thread_id = thread_id;
538 if (_sif_rpc_data.active_queue == NULL) {
539 _sif_rpc_data.active_queue =
qd;
541 queue = _sif_rpc_data.active_queue;
543 while (queue->next != NULL)
553 #ifdef F_sceSifRemoveRpcQueue
560 if ((queue = _sif_rpc_data.active_queue) ==
qd) {
561 _sif_rpc_data.active_queue = queue->next;
563 while (queue != NULL) {
564 if (queue->next ==
qd) {
565 queue->next =
qd->next;
579 #ifdef F_sceSifGetNextRequest
589 qd->start = sd->next;
600 #ifdef F_sceSifExecRequest
603 if (rid < 0 || rid < rpc_data->client_table_len)
606 return rpc_data->client_table + (rid * RPC_PACKET_SIZE);
614 rec = sd->func(sd->rpc_number, sd->buf, sd->size);
617 sceSifWriteBackDCache(sd->buf, sd->size);
620 sceSifWriteBackDCache(rec, sd->rsize);
626 _rpc_get_fpacket2(&_sif_rpc_data, (sd->rid >> 16) & 0xffff);
629 _rpc_get_fpacket(&_sif_rpc_data);
633 rend->cd = sd->client;
634 rend->cid = SIF_CMD_RPC_CALL;
637 if (!sceSifSendCmd(SIF_CMD_RPC_END, rend, RPC_PACKET_SIZE, rec, sd->recvbuf,
647 dmat.dest = sd->recvbuf;
648 dmat.size = sd->rsize;
652 dmat.dest = sd->pkt_addr;
657 while (!sceSifSetDma(&dmat, 1))
662 #ifdef F_sceSifRpcLoop
668 while ((sd = sceSifGetNextRequest(
qd)))
669 sceSifExecRequest(sd);
676 #ifdef F_sceSifCheckStatRpc
684 if (cd->hdr.rpc_id != (u32)(packet->rpc_id))