15 int m_sbuff[16] __attribute__((__aligned__(64)));
16 SifRpcClientData_t m_cd __attribute__((__aligned__(64)));
17 SifRpcEndFunc_t m_endfunc;
22int sceSdRemoteInit(
void)
24 if (HasIopRebootedSinceLastCall())
25 memset(&g_libsdr_data.m_cd, 0,
sizeof(g_libsdr_data.m_cd));
28 if (sceSifBindRpc(&g_libsdr_data.m_cd, sce_SDR_DEV, 0) < 0)
31 if (g_libsdr_data.m_cd.server != NULL)
39int sceSdTransToIOP(
void *eeaddr,
void *iopaddr, u32 size, u32 blocking)
41 SifDmaTransfer_t dmat[1];
47 dmat[0].dest = iopaddr;
51 while (!(trid = sceSifSetDma(dmat,
sizeof(dmat)/
sizeof(dmat[0]))));
54 while (sceSifDmaStat(trid) >= 0);
59SifRpcEndFunc_t sceSdCallBack(SifRpcEndFunc_t endfunc)
61 SifRpcEndFunc_t old_endfunc;
63 old_endfunc = g_libsdr_data.m_endfunc;
64 g_libsdr_data.m_endfunc = endfunc;
69int sceSdRemote(
int arg0, ...)
74 SifRpcEndFunc_t endfunc;
77 const void *old_handler;
81 cmd = va_arg(ap,
int);
82 g_libsdr_data.m_sbuff[0] = (uiptr)g_libsdr_data.m_sbuff;
83 for (i = 1; i < 7; i += 1)
84 g_libsdr_data.m_sbuff[i] = va_arg(ap,
int);
86 blocking = blocking ? 0 : SIF_RPC_M_NOWAIT;
87 endfunc = blocking ? g_libsdr_data.m_endfunc : NULL;
91 case rSdSetTransCallback:
92 old_handler = SdrSetTransInterruptCallback(g_libsdr_data.m_sbuff[1] ? 1 : 0, (
void *)(uiptr)g_libsdr_data.m_sbuff[2]);
94 case rSdSetIRQCallback:
95 old_handler = SdrSetIRQInterruptCallback((
void *)(uiptr)g_libsdr_data.m_sbuff[1]);
97 case rSdSetTransIntrHandler:
98 old_handler = SdrSetTransInterruptHandler(g_libsdr_data.m_sbuff[1] ? 1 : 0, (
void *)(uiptr)g_libsdr_data.m_sbuff[2], (
void *)(uiptr)g_libsdr_data.m_sbuff[3]);
100 case rSdSetSpu2IntrHandler:
101 old_handler = SdrSetIRQInterruptHandler((
void *)(uiptr)g_libsdr_data.m_sbuff[1], (
void *)(uiptr)g_libsdr_data.m_sbuff[2]);
111 case rSdSetEffectAttr:
112 case rSdSetEffectMode:
113 case rSdSetEffectModeParams:
114 sceSifCallRpc(&g_libsdr_data.m_cd, cmd | g_libsdr_data.m_sbuff[1], blocking, (
void *)(uiptr)g_libsdr_data.m_sbuff[2], 64, &g_libsdr_data.m_sbuff[0],
sizeof(g_libsdr_data.m_sbuff), endfunc, &g_libsdr_data.m_sbuff[0]);
115 ret = g_libsdr_data.m_sbuff[0];
117 case rSdGetEffectAttr:
118 sceSifCallRpc(&g_libsdr_data.m_cd, cmd | g_libsdr_data.m_sbuff[1], blocking, &g_libsdr_data.m_sbuff[0],
sizeof(g_libsdr_data.m_sbuff), (
void *)(uiptr)g_libsdr_data.m_sbuff[2], 64, endfunc, (
void *)(uiptr)g_libsdr_data.m_sbuff[2]);
121 case rSdProcBatchEx2:
126 batch_p = (sceSdBatch *)g_libsdr_data.m_sbuff[1];
127 batch_p[0].entry = g_libsdr_data.m_sbuff[2];
128 if (cmd == rSdProcBatchEx2)
129 batch_p[0].value = g_libsdr_data.m_sbuff[5];
130 retptr = (
void *)(uiptr)g_libsdr_data.m_sbuff[3];
131 retptr_sz = retptr ? g_libsdr_data.m_sbuff[4] : (int)
sizeof(ret);
134 sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[1],
sizeof(sceSdBatch) * (g_libsdr_data.m_sbuff[2] + 1), retptr, retptr_sz, endfunc, &g_libsdr_data.m_sbuff[0]);
138 case rSdUserCommand0:
139 case rSdUserCommand1:
140 case rSdUserCommand2:
141 case rSdUserCommand3:
142 case rSdUserCommand4:
143 case rSdUserCommand5:
144 case rSdUserCommand6:
145 case rSdUserCommand7:
146 case rSdUserCommand8:
147 case rSdUserCommand9:
148 case rSdUserCommandA:
149 case rSdUserCommandB:
150 case rSdUserCommandC:
151 case rSdUserCommandD:
152 case rSdUserCommandE:
153 case rSdUserCommandF:
154 sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[1], g_libsdr_data.m_sbuff[2], &g_libsdr_data.m_sbuff[0], 16, endfunc, &g_libsdr_data.m_sbuff[0]);
155 ret = g_libsdr_data.m_sbuff[0];
158 sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[0],
sizeof(g_libsdr_data.m_sbuff), &g_libsdr_data.m_sbuff[0], 16, endfunc, &g_libsdr_data.m_sbuff[0]);
159 ret = g_libsdr_data.m_sbuff[0];
165 case rSdSetTransCallback:
166 case rSdSetIRQCallback:
167 case rSdSetTransIntrHandler:
168 case rSdSetSpu2IntrHandler:
169 ret = (int)(uiptr)old_handler;