1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
#include <revolution.h>
#include "global.h"
#include <cstring>
#if SDK_AUG2010
#define IPC_REQ_MAX 0x60
#define IPC_PATH_MAX 0x30
#else
#define IPC_REQ_MAX 0x20
#endif
#if SDK_AUG2010
// either release or debug config does something weird to swap the order of these in .bss
#if VERSION == VERSION_SHIELD_DEBUG
static IOSResourceRequest* IpcReqPtrArray[IPC_REQ_MAX] = {0};
static IOSResourceRequest IpcReqArray[IPC_REQ_MAX] = {0};
#else
static IOSResourceRequest IpcReqArray[IPC_REQ_MAX] = {0};
static IOSResourceRequest* IpcReqPtrArray[IPC_REQ_MAX] = {0};
#endif
static OSTime IpcStartTimeArray[IPC_REQ_MAX];
static char IpcHandlePathBuf[0x80][0x30];
static char IpcOpenPathBuf[IPC_REQ_MAX][0x30];
#else
static s32 IpcFdArray[IPC_REQ_MAX] = {0};
static u32 IpcReqPtrArray[IPC_REQ_MAX] = {0};
#endif
static u32 IpcNumPendingReqs = 0;
static u32 IpcNumUnIssuedReqs = 0;
#if SDK_AUG2010
static void AddReqInfo(IOSResourceRequest* req);
static void DelReqInfo(IOSResourceRequest* req);
#else
static void AddReqInfo(IOSResourceRequest* req, s32 fd);
static void DelReqInfo(IOSResourceRequest* req, s32 fd);
#endif
void IPCiProfInit(void) {
u32 i;
IpcNumPendingReqs = 0;
IpcNumUnIssuedReqs = 0;
for (i = 0; i < IPC_REQ_MAX; ++i) {
#if SDK_AUG2010
IpcReqPtrArray[i] = 0;
IpcStartTimeArray[i] = 0;
#else
IpcReqPtrArray[i] = 0;
IpcFdArray[i] = -1;
#endif
}
#if SDK_AUG2010
memset(IpcHandlePathBuf, 0, sizeof(IpcHandlePathBuf));
memset(IpcOpenPathBuf, 0, sizeof(IpcOpenPathBuf));
memset(IpcReqArray, 0, sizeof(IpcReqArray));
#endif
}
void IPCiProfQueueReq(void* req, s32 handle) {
++IpcNumPendingReqs;
++IpcNumUnIssuedReqs;
#if SDK_AUG2010
AddReqInfo((IOSResourceRequest*)req);
#else
AddReqInfo((IOSResourceRequest*)req, handle);
#endif
}
void IPCiProfAck(void) {
--IpcNumUnIssuedReqs;
}
void IPCiProfReply(void* req, s32 handle) {
--IpcNumPendingReqs;
#if SDK_AUG2010
DelReqInfo((IOSResourceRequest*)req);
#else
DelReqInfo((IOSResourceRequest*)req, handle);
#endif
}
#if SDK_AUG2010
static void AddReqInfo(IOSResourceRequest* req) {
u32 i;
for (i = 0; i < IPC_REQ_MAX; i++) {
if (!IpcReqPtrArray[i]) {
BOOL irqEnabled = OSDisableInterrupts();
IpcReqPtrArray[i] = req;
IpcReqArray[i] = *req;
IpcStartTimeArray[i] = OSGetTime();
if (IpcReqArray[i].cmd == 1) {
const char* path_p_virt = (const char*)OSPhysicalToCached((u32)IpcReqArray[i].args.open.path);
strncpy(IpcOpenPathBuf[i], path_p_virt,
IPC_PATH_MAX - 1);
IpcOpenPathBuf[i][IPC_PATH_MAX - 1] = '\0';
IpcReqArray[i].args.open.path = (u8*)IpcOpenPathBuf[i];
}
OSRestoreInterrupts(irqEnabled);
break;
}
}
}
static void DelReqInfo(IOSResourceRequest* req) {
u32 i;
for (i = 0; i < IPC_REQ_MAX; i++) {
if (req == IpcReqPtrArray[i] && req->handle == IpcReqArray[i].cmd) {
BOOL irqEnabled = OSDisableInterrupts();
if (IpcReqArray[i].cmd == 1) {
if (req->status >= 0) {
strncpy(IpcHandlePathBuf[req->status],
(const char*)IpcReqArray[i].args.open.path, IPC_PATH_MAX - 1);
IpcHandlePathBuf[req->status][IPC_PATH_MAX - 1] = '\0';
memset(&IpcOpenPathBuf[i], 0, IPC_PATH_MAX);
}
}
if (IpcReqArray[i].cmd == 2) {
memset(&IpcHandlePathBuf[IpcReqArray[i].handle], 0, IPC_PATH_MAX);
}
IpcReqPtrArray[i] = NULL;
memset(&IpcReqArray[i], 0, sizeof(IOSResourceRequest));
IpcStartTimeArray[i] = 0;
OSRestoreInterrupts(irqEnabled);
break;
}
}
}
#else
static void AddReqInfo(IOSResourceRequest* ptr, s32 fd) {
u32 i;
for (i = 0; i < 32; ++i) {
if (IpcReqPtrArray[i] == 0 && IpcFdArray[i] == -1) {
IpcReqPtrArray[i] = (u32)ptr;
IpcFdArray[i] = fd;
break;
}
}
}
static void DelReqInfo(IOSResourceRequest* ptr, s32 fd) {
u32 i;
for (i = 0; i < 32; ++i) {
if (IpcReqPtrArray[i] == (u32)ptr && IpcFdArray[i] == fd) {
IpcReqPtrArray[i] = 0;
IpcFdArray[i] = -1;
break;
}
}
}
#endif
|