Skip to content

Commit af21262

Browse files
committed
refactor: SIF API EE, IOP merge
Apply changed definitions to SIF and kernel related libraries Make argument and member names consistent (except those needed for compatibility) Add alignment to variables that need it
1 parent 748cd5c commit af21262

File tree

16 files changed

+791
-903
lines changed

16 files changed

+791
-903
lines changed

common/include/sifcmd-common.h

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
/*
2+
# _____ ___ ____ ___ ____
3+
# ____| | ____| | | |____|
4+
# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5+
#-----------------------------------------------------------------------
6+
# Copyright ps2dev - http://www.ps2dev.org
7+
# Licenced under Academic Free License version 2.0
8+
# Review ps2sdk README & LICENSE files for further details.
9+
*/
10+
11+
/**
12+
* @file
13+
* Common definitions for SIF CMD.
14+
*/
15+
16+
#ifndef __SIFCMD_COMMON_H__
17+
#define __SIFCMD_COMMON_H__
18+
19+
#include <tamtypes.h>
20+
21+
/** SIF command. */
22+
typedef struct t_SifCmdHeader
23+
{
24+
/** Packet size. Min: 1x16 (header only), max: 7*16 */
25+
u32 psize : 8;
26+
/** Payload size */
27+
u32 dsize : 24;
28+
/** Destination address for payload. Can be NULL if there is no payload. */
29+
void *dest;
30+
/** Function number of function to call. */
31+
int cid;
32+
/** Can be freely used. */
33+
u32 opt;
34+
} SifCmdHeader_t;
35+
36+
/** System functions */
37+
#define SIF_CMD_ID_SYSTEM 0x80000000
38+
39+
#define SIF_CMD_CHANGE_SADDR (SIF_CMD_ID_SYSTEM | 0)
40+
#define SIF_CMD_SET_SREG (SIF_CMD_ID_SYSTEM | 1)
41+
#define SIF_CMD_INIT_CMD (SIF_CMD_ID_SYSTEM | 2)
42+
#define SIF_CMD_RESET_CMD (SIF_CMD_ID_SYSTEM | 3)
43+
#define SIF_CMD_RPC_END (SIF_CMD_ID_SYSTEM | 8)
44+
#define SIF_CMD_RPC_BIND (SIF_CMD_ID_SYSTEM | 9)
45+
#define SIF_CMD_RPC_CALL (SIF_CMD_ID_SYSTEM | 10)
46+
#define SIF_CMD_RPC_RDATA (SIF_CMD_ID_SYSTEM | 12)
47+
48+
/** System SREG */
49+
#define SIF_SREG_RPCINIT 0
50+
51+
/** Structure for remotely (over the SIF) changing the value of a software register (SREG).
52+
* There are 32 software registers (0 - 31). Registers 0-7 are used by the system.
53+
*/
54+
typedef struct t_SifCmdSRegData
55+
{
56+
SifCmdHeader_t header;
57+
int index;
58+
unsigned int value;
59+
} SifCmdSRegData_t;
60+
61+
#ifdef __cplusplus
62+
extern "C"
63+
#endif
64+
typedef void (*SifCmdHandler_t)(void *data, void *harg);
65+
66+
typedef struct t_SifCmdHandlerData
67+
{
68+
SifCmdHandler_t handler;
69+
void *harg;
70+
} SifCmdHandlerData_t;
71+
72+
typedef struct t_SifCmdSysHandlerData
73+
{
74+
SifCmdHandler_t handler;
75+
void *harg;
76+
void *unknown08;
77+
} SifCmdSysHandlerData_t;
78+
79+
/** Triggers an IOP reboot */
80+
#define RESET_ARG_MAX 79
81+
82+
typedef struct _iop_reset_pkt
83+
{
84+
struct t_SifCmdHeader header;
85+
int arglen;
86+
int mode;
87+
char arg[RESET_ARG_MAX + 1];
88+
} SifCmdResetData_t;
89+
90+
#ifdef __cplusplus
91+
extern "C" {
92+
#endif
93+
94+
extern void sceSifInitCmd(void);
95+
extern void sceSifExitCmd(void);
96+
extern unsigned int sceSifGetSreg(int sreg);
97+
extern void sceSifSetSreg(int sreg, unsigned int value);
98+
extern void sceSifSetCmdBuffer(SifCmdHandlerData_t *db, int size);
99+
extern void sceSifSetSysCmdBuffer(SifCmdSysHandlerData_t *db, int size);
100+
extern void sceSifAddCmdHandler(int cid, SifCmdHandler_t handler, void *harg);
101+
extern void sceSifRemoveCmdHandler(int cid);
102+
extern unsigned int sceSifSendCmd(int cid, void *packet, int packet_size, void *src_extra,
103+
void *dest_extra, int size_extra);
104+
extern unsigned int isceSifSendCmd(int cid, void *packet, int packet_size, void *src_extra,
105+
void *dest_extra, int size_extra);
106+
107+
#ifdef _EE
108+
extern void sceSifWriteBackDCache(void *ptr, int size); // EE only
109+
#endif
110+
#ifdef _IOP
111+
extern unsigned int sceSifSendCmdIntr(int cid, void *packet, int packet_size, void *src_extra,
112+
void *dest_extra, int size_extra, void (*completioncb)(void *userdata), void *userdata);
113+
extern unsigned int isceSifSendCmdIntr(int cid, void *packet, int packet_size, void *src_extra,
114+
void *dest_extra, int size_extra, void (*completioncb)(void *userdata), void *userdata);
115+
#endif
116+
117+
#ifdef __cplusplus
118+
}
119+
#endif
120+
121+
// For backwards compatibility purposes
122+
#define SifInitCmd(...) sceSifInitCmd(__VA_ARGS__)
123+
#define SifExitCmd(...) sceSifExitCmd(__VA_ARGS__)
124+
#define SifGetSreg(...) sceSifGetSreg(__VA_ARGS__)
125+
#define SifSetCmdBuffer(...) sceSifSetCmdBuffer(__VA_ARGS__)
126+
#define SifAddCmdHandler(...) sceSifAddCmdHandler(__VA_ARGS__)
127+
#define SifRemoveCmdHandler(...) sceSifRemoveCmdHandler(__VA_ARGS__)
128+
#define SifSendCmd(...) sceSifSendCmd(__VA_ARGS__)
129+
#define iSifSendCmd(...) isceSifSendCmd(__VA_ARGS__)
130+
#define SifWriteBackDCache(...) sceSifWriteBackDCache(__VA_ARGS__)
131+
132+
// Send mode bits
133+
/** Called within an interrupt context */
134+
#define SIF_CMD_M_INTR 0x01
135+
/** Write back D-cache for extended data */
136+
#define SIF_CMD_M_WBDC 0x04
137+
138+
#endif /* __SIFCMD_COMMON_H__ */

common/include/sifrpc-common.h

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
/*
2+
# _____ ___ ____ ___ ____
3+
# ____| | ____| | | |____|
4+
# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5+
#-----------------------------------------------------------------------
6+
# Copyright ps2dev - http://www.ps2dev.org
7+
# Licenced under Academic Free License version 2.0
8+
# Review ps2sdk README & LICENSE files for further details.
9+
*/
10+
11+
/**
12+
* @file
13+
* Common defintions for SIF RPC.
14+
*/
15+
16+
#ifndef __SIFRPC_COMMON_H__
17+
#define __SIFRPC_COMMON_H__
18+
19+
#include <sifcmd-common.h>
20+
21+
/* Modes for bind() and call() */
22+
/** Don't wait for end function */
23+
#define SIF_RPC_M_NOWAIT 0x01
24+
/** Don't write back the D cache */
25+
#define SIF_RPC_M_NOWBDC 0x02
26+
27+
#ifdef __cplusplus
28+
extern "C" {
29+
#endif
30+
31+
typedef void *(*SifRpcFunc_t)(int fno, void *buffer, int length);
32+
typedef void (*SifRpcEndFunc_t)(void *end_param);
33+
34+
#ifdef __cplusplus
35+
}
36+
#endif
37+
38+
typedef struct t_SifRpcPktHeader
39+
{
40+
struct t_SifCmdHeader sifcmd;
41+
int rec_id;
42+
void *pkt_addr;
43+
int rpc_id;
44+
} SifRpcPktHeader_t;
45+
46+
typedef struct t_SifRpcRendPkt
47+
{
48+
struct t_SifCmdHeader sifcmd;
49+
int rec_id; /* 04 */
50+
void *pkt_addr; /* 05 */
51+
int rpc_id; /* 06 */
52+
53+
struct t_SifRpcClientData *cd; /* 7 */
54+
u32 cid; /* 8 */
55+
struct t_SifRpcServerData *sd; /* 9 */
56+
void *buf, /* 10 */
57+
*cbuf; /* 11 */
58+
} SifRpcRendPkt_t;
59+
60+
typedef struct t_SifRpcOtherDataPkt
61+
{
62+
struct t_SifCmdHeader sifcmd;
63+
int rec_id; /* 04 */
64+
void *pkt_addr; /* 05 */
65+
int rpc_id; /* 06 */
66+
67+
struct t_SifRpcReceiveData *recvbuf; /* 07 */
68+
void *src; /* 08 */
69+
void *dest; /* 09 */
70+
int size; /* 10 */
71+
} SifRpcOtherDataPkt_t;
72+
73+
typedef struct t_SifRpcBindPkt
74+
{
75+
struct t_SifCmdHeader sifcmd;
76+
int rec_id; /* 04 */
77+
void *pkt_addr; /* 05 */
78+
int rpc_id; /* 06 */
79+
struct t_SifRpcClientData *cd; /* 07 */
80+
int sid; /* 08 */
81+
} SifRpcBindPkt_t;
82+
83+
typedef struct t_SifRpcCallPkt
84+
{
85+
struct t_SifCmdHeader sifcmd;
86+
int rec_id; /* 04 */
87+
void *pkt_addr; /* 05 */
88+
int rpc_id; /* 06 */
89+
struct t_SifRpcClientData *cd; /* 07 */
90+
int rpc_number; /* 08 */
91+
int send_size; /* 09 */
92+
void *recvbuf; /* 10 */
93+
int recv_size; /* 11 */
94+
int rmode; /* 12 */
95+
struct t_SifRpcServerData *sd; /* 13 */
96+
} SifRpcCallPkt_t;
97+
98+
typedef struct t_SifRpcServerData
99+
{
100+
int sid; /* 04 00 */
101+
102+
SifRpcFunc_t func; /* 05 01 */
103+
void *buf; /* 06 02 */
104+
int size; /* 07 03 */
105+
106+
SifRpcFunc_t cfunc; /* 08 04 */
107+
void *cbuf; /* 09 05 */
108+
int size2; /* 10 06 */
109+
110+
struct t_SifRpcClientData *client; /* 11 07 */
111+
void *pkt_addr; /* 12 08 */
112+
int rpc_number; /* 13 09 */
113+
114+
void *recvbuf; /* 14 10 */
115+
int rsize; /* 15 11 */
116+
int rmode; /* 16 12 */
117+
int rid; /* 17 13 */
118+
119+
struct t_SifRpcServerData *link; /* 18 14 */
120+
struct t_SifRpcServerData *next; /* 19 15 */
121+
struct t_SifRpcDataQueue *base; /* 20 16 */
122+
} SifRpcServerData_t;
123+
124+
125+
typedef struct t_SifRpcHeader
126+
{
127+
void *pkt_addr; /* 04 00 */
128+
u32 rpc_id; /* 05 01 */
129+
int sema_id; /* 06 02 */
130+
u32 mode; /* 07 03 */
131+
} SifRpcHeader_t;
132+
133+
134+
typedef struct t_SifRpcClientData
135+
{
136+
struct t_SifRpcHeader hdr;
137+
u32 command; /* 04 08 */
138+
void *buf, /* 05 09 */
139+
*cbuf; /* 06 10 */
140+
SifRpcEndFunc_t end_function; /* 07 11 */
141+
void *end_param; /* 08 12 */
142+
struct t_SifRpcServerData *server; /* 09 13 */
143+
} SifRpcClientData_t;
144+
145+
typedef struct t_SifRpcReceiveData
146+
{
147+
struct t_SifRpcHeader hdr;
148+
void *src, /* 04 */
149+
*dest; /* 05 */
150+
int size; /* 06 */
151+
} SifRpcReceiveData_t;
152+
153+
typedef struct t_SifRpcDataQueue
154+
{
155+
int thread_id, /* 00 */
156+
active; /* 01 */
157+
struct t_SifRpcServerData *link, /* 02 */
158+
*start, /* 03 */
159+
*end; /* 04 */
160+
struct t_SifRpcDataQueue *next; /* 05 */
161+
} SifRpcDataQueue_t;
162+
163+
#ifdef __cplusplus
164+
extern "C" {
165+
#endif
166+
167+
extern void sceSifInitRpc(int mode);
168+
#ifdef _EE
169+
extern void sceSifExitRpc(void);
170+
#endif
171+
172+
/* SIF RPC client API */
173+
extern int sceSifBindRpc(SifRpcClientData_t *cd, int sid, int mode);
174+
extern int sceSifCallRpc(SifRpcClientData_t *cd, int rpc_number, int mode, void *sendbuf,
175+
int ssize, void *recvbuf, int rsize, SifRpcEndFunc_t end_function, void *end_param);
176+
177+
extern void sceSifRegisterRpc(SifRpcServerData_t *sd, int sid, SifRpcFunc_t func, void *buf,
178+
SifRpcFunc_t cfunc, void *cbuf, SifRpcDataQueue_t *qd);
179+
180+
extern int sceSifCheckStatRpc(SifRpcClientData_t *cd);
181+
182+
/* SIF RPC server API */
183+
extern void sceSifSetRpcQueue(SifRpcDataQueue_t *qd, int thread_id);
184+
extern SifRpcServerData_t *sceSifGetNextRequest(SifRpcDataQueue_t *qd);
185+
extern void sceSifExecRequest(SifRpcServerData_t *sd);
186+
extern void sceSifRpcLoop(SifRpcDataQueue_t *qd);
187+
188+
extern int sceSifGetOtherData(SifRpcReceiveData_t *rd, void *src, void *dest, int size, int mode);
189+
190+
extern SifRpcServerData_t *sceSifRemoveRpc(SifRpcServerData_t *sd, SifRpcDataQueue_t *qd);
191+
extern SifRpcDataQueue_t *sceSifRemoveRpcQueue(SifRpcDataQueue_t *qd);
192+
#ifdef _IOP
193+
extern void sceSifSetSif1CB(void (*func)(void *userdata), void *userdata);
194+
extern void sceSifClearSif1CB(void);
195+
#endif
196+
197+
#ifdef __cplusplus
198+
}
199+
#endif
200+
201+
// For backwards compatibility purposes
202+
#define SifInitRpc(...) sceSifInitRpc(__VA_ARGS__)
203+
#define SifExitRpc(...) sceSifExitRpc(__VA_ARGS__)
204+
#define SifBindRpc(...) sceSifBindRpc(__VA_ARGS__)
205+
#define SifCallRpc(...) sceSifCallRpc(__VA_ARGS__)
206+
#define SifRegisterRpc(...) sceSifRegisterRpc(__VA_ARGS__)
207+
#define SifCheckStatRpc(...) sceSifCheckStatRpc(__VA_ARGS__)
208+
#define SifSetRpcQueue(...) sceSifSetRpcQueue(__VA_ARGS__)
209+
#define SifGetNextRequest(...) sceSifGetNextRequest(__VA_ARGS__)
210+
#define SifExecRequest(...) sceSifExecRequest(__VA_ARGS__)
211+
#define SifRpcLoop(...) sceSifRpcLoop(__VA_ARGS__)
212+
#define SifRpcGetOtherData(...) sceSifGetOtherData(__VA_ARGS__)
213+
#define SifRemoveRpc(...) sceSifRemoveRpc(__VA_ARGS__)
214+
#define SifRemoveRpcQueue(...) sceSifRemoveRpcQueue(__VA_ARGS__)
215+
216+
#endif /* __SIFRPC_COMMON_H__ */

0 commit comments

Comments
 (0)