sort: 5

SIF RPC Commands

80000000h: Change SADDR

struct SifSaddrPkt
{
  struct SifCmdHeader header;
  void* buff;
}

This just changes the EE's receive buffer on the IOP side. Used when SifInitRpc is called more than once.

80000001h: Set SREG

struct SifCmdSRegData
{
  SifCmdHeader header;
  int	index;
  uint value;
}

Sets a software SIF register - that is, a variable in memory rather than an I/O register.
Used by the IOP during SIF RPC initialization to tell the EE what the IOP has stored for the EE's receive buffer.

80000002h: SIFCMD Init

struct SifInitPkt
{
  struct SifCmdHeader header; //NOTE: The "opt" field is used by the IOP.
  void* buff;
}

This command is sent twice by the EE during SIFRPC initialization, the first with opt=0 and the second with opt=1.
When opt=0, buff is used as the EE's SIF0 receive address, and the IOP sets SMFLG to 20000h.
When opt=1, the IOP finishes SIFRPC initialization.

80000003h: Reboot IOP

struct SifIopResetPkt
{
  struct SifCmdHeader header;
  int	arglen; //Length of the command
  int	mode; //Bit 31 enables debug logging, unknown what other values do
  char arg[80]; //The command to be passed to MODLOAD
}

See BIOS IOP REBOOT for details on the reboot procedure.

80000008h: Request End

struct SifRpcRendPkt
{
   struct SifCmdHeader sifcmd;
   int rec_id;
   void	*pkt_addr;
   int rpc_id;
   struct SifRpcClientData *client;
   uint cid; //ID of the command sent by the other side (e.g. the command that triggered a REND)
   struct SifRpcServerData *server;
   void	*buff, *cbuff;
}

80000009h: Bind

struct SifRpcBindPkt
{
   struct SifCmdHeader sifcmd;
   int rec_id;
   void *pkt_addr;
   int rpc_id;
   struct SifRpcClientData *client;
   int sid; //ID of the server
}

8000000Ah: Call

struct SifRpcCallPkt
{
   struct SifCmdHeader sifcmd;
   int rec_id;	
   void *pkt_addr;
   int rpc_id;
   struct SifRpcClientData *client;
   int rpc_number; //ID of the function to call on the server
   int send_size; //Size of data to send to the server
   void *receive; //Buffer to hold reply data from the server
   int recv_size; //Size of reply buffer
   int rmode;
   struct SifRpcServerData *server;
}

8000000Ch: Get other data

struct SifRpcOtherDataPkt
{
   struct SifCmdHeader sifcmd;
   int rec_id;
   void *pkt_addr;
   int rpc_id;

   struct SifRpcReceiveData *receive;
   void *src;
   void *dest;
   int size;
}

Used by a server to request more data from a client, which replies with an END packet.