Skip to content

Commit

Permalink
Improvements of JpcspTrace:
Browse files Browse the repository at this point in the history
- allow JpcspTrace to be enabled in the VSH
- added logging of "IN" and "OUT" prefix when using the "!" parameter
option
- added new parameters types for pspNetSockAddrInternet and videocodec
  • Loading branch information
gid15 committed Jan 13, 2017
1 parent 76be21e commit a434c0f
Show file tree
Hide file tree
Showing 7 changed files with 237 additions and 36 deletions.
Binary file modified ms0/JpcspTrace/JpcspTrace.prx
Binary file not shown.
Binary file modified ms0/JpcspTrace/JpcspTraceUser.prx
Binary file not shown.
4 changes: 4 additions & 0 deletions ms0/JpcspTrace/README.txt
Expand Up @@ -87,6 +87,10 @@ The format of the file JpcspTrace.config is the following:
- e: log the parameter value as a Mpeg EP structure (16 bytes long)
- a: log the parameter value as a SceMpegAu structure (24 bytes long, see sceMpeg)
- t: log the parameter value as a SceMp4TrackSampleBuf structure (240 bytes long, see sceMp4)
- I: log the parameter value as a pspNetSockAddrInternet structure (8 bytes long, see sceNetInet)
- B: log the parameter value as a pointer to a memory buffer having its length
stored into the next parameter value
- V: log the parameter value as a video codec structure as used in sceVideocodec
- !: this flag is not a parameter type but indicates that the syscall parameters have
to be logged before and after the syscall (i.e. twice). By default, the parameters
are only logged after the syscall.
Expand Down
205 changes: 183 additions & 22 deletions ms0/JpcspTrace/common.c
Expand Up @@ -49,6 +49,14 @@ int (* referMutex)(SceUID, SceKernelMutexInfo *) = NULL;
SceKernelMutexInfo mutexInfo;
#endif

#if DUMP_VIDEOCODEC_FRAMES
int videocodecFrame = 0;
#endif

#if DUMP_sceMpegBaseCscAvc_CALLS
int sceMpegBaseCscAvcCall = 0;
#endif

int (* ioOpen)(const char *s, int flags, int permissions) = userIoOpen;
int (* ioWrite)(SceUID id, const void *data, int size) = userIoWrite;
int (* ioClose)(SceUID id) = userIoClose;
Expand Down Expand Up @@ -338,6 +346,13 @@ void printLogSS(const char *s1, const char *s2, const char *s3, const char *s4,
writeLog(buffer, s - buffer);
}

char *flushBuffer(char *buffer, char *s) {
*s++ = '\n';
writeLog(buffer, s - buffer);

return buffer;
}

void printLogMem(const char *s1, int addr, int length) {
int i, j;
int lineStart;
Expand All @@ -360,9 +375,8 @@ void printLogMem(const char *s1, int addr, int length) {
}
*s++ = c;
}
s = append(s, "<\n");
writeLog(buffer, s - buffer);
s = buffer;
*s++ = '<';
s = flushBuffer(buffer, s);
lineStart = i;
} else {
s = append(s, " ");
Expand All @@ -371,8 +385,7 @@ void printLogMem(const char *s1, int addr, int length) {
s = appendHexNoPrefix(s, _lb(addr + i), 2);
}
}
s = append(s, "\n");
writeLog(buffer, s - buffer);
flushBuffer(buffer, s);
}

#ifdef DEBUG_UTILITY_SAVEDATA
Expand Down Expand Up @@ -467,9 +480,7 @@ void utilityOskLog(char *buffer, const SyscallInfo *syscallInfo, u32 param) {
s = append(s, ", result=");
s = appendHex(s, _lw((int) utilityOskParams + 28), 8);
}
s = append(s, "\n");
writeLog(buffer, s - buffer);
s = buffer;
s = flushBuffer(buffer, s);

printLogMem("Params ", (int) utilityOskParams, _lw((int) utilityOskParams + 0));
}
Expand Down Expand Up @@ -503,8 +514,7 @@ void utilityMsgLog(char *buffer, const SyscallInfo *syscallInfo, u32 param) {
s = append(s, ", result=");
s = appendHex(s, _lw((int) utilityMsgParams + 28), 8);
}
s = append(s, "\n");
writeLog(buffer, s - buffer);
flushBuffer(buffer, s);

#if 0
s = buffer;
Expand Down Expand Up @@ -541,9 +551,8 @@ char *syscallLogMem(char *buffer, char *s, int addr, int length) {
}
*s++ = c;
}
s = append(s, "<\n");
writeLog(buffer, s - buffer);
s = buffer;
*s++ = '<';
s = flushBuffer(buffer, s);
lineStart = i;
} else {
*s++ = ' ';
Expand Down Expand Up @@ -587,11 +596,14 @@ void logStackUsage(const SyscallInfo *syscallInfo) {
printLogSH("Stack usage ", syscallInfo->name, ": ", stackUsage, "\n");
}

void syscallLog(const SyscallInfo *syscallInfo, const u32 *parameters, u64 result, u32 ra, u32 sp, u32 gp) {
char buffer[200];

void syscallLog(const SyscallInfo *syscallInfo, int inOut, const u32 *parameters, u64 result, u32 ra, u32 sp, u32 gp) {
char buffer[250];
char *s = buffer;
int i;
int length;
int videocodec = 0;
int videocodecType = -1;

// Don't log our own sceIoWrite and sceIoClose
if ((syscallInfo->nid == NID_sceIoWrite || IS_sceIoClose_NID(syscallInfo->nid)) && parameters[0] == commonInfo->logFd) {
Expand Down Expand Up @@ -638,6 +650,12 @@ void syscallLog(const SyscallInfo *syscallInfo, const u32 *parameters, u64 resul
*s++ = ' ';
}

if (inOut < 0) {
s = append(s, "IN ");
} else if (inOut > 0) {
s = append(s, "OUT ");
}

if (logRa) {
s = appendHex(s, ra, 0);
*s++ = ' ';
Expand Down Expand Up @@ -703,21 +721,164 @@ void syscallLog(const SyscallInfo *syscallInfo, const u32 *parameters, u64 resul
s = syscallLogMem(buffer, s, parameter, 24);
break;
case TYPE_MP4_TRACK:
s = syscallLogMem(buffer, s, parameter, 240);
s = syscallLogMem(buffer, s, parameter, 384);
break;
case TYPE_SOCK_ADDR_INTERNET:
// the address is not 32-bit aligned
s = appendHex(s, parameter, 8);
if (parameter != 0) {
*s++ = '(';
s = append(s, "len=");
s = appendInt(s, _lb(parameter), 0);
s = append(s, ", family=");
s = appendInt(s, _lb(parameter + 1), 0);
s = append(s, ", port=");
s = appendInt(s, (_lb(parameter + 2) << 8) | _lb(parameter + 3), 0);
s = append(s, ", addr=");
s = appendInt(s, _lb(parameter + 4), 0);
s = append(s, ".");
s = appendInt(s, _lb(parameter + 5), 0);
s = append(s, ".");
s = appendInt(s, _lb(parameter + 6), 0);
s = append(s, ".");
s = appendInt(s, _lb(parameter + 7), 0);
*s++ = ')';
}
#if 0
// sceNetInetConnect on port 80 ?
if (syscallInfo->nid == 0x410B34AA && _lb(parameter + 2) == 0 && _lb(parameter + 3) == 80) {
_sb(192, parameter + 4);
_sb(168, parameter + 5);
_sb( 1, parameter + 6);
_sb( 3, parameter + 7);
}
#endif
break;
case TYPE_BUFFER_AND_LENGTH:
if (i + 1 < syscallInfo->numParams) {
s = syscallLogMem(buffer, s, parameter, parameters[i + 1]);
}
break;
case TYPE_VIDEOCODEC:
s = appendHex(s, parameter, 8);
videocodec = parameter;
if (i + 1 < syscallInfo->numParams) {
videocodecType = parameters[i + 1];
}
break;
}
}
*s++ = ' ';
*s++ = '=';
*s++ = ' ';
s = appendHex(s, (int) result, 0);

// Do not log the result at "IN" when logging before and after the syscall
if (inOut >= 0) {
*s++ = ' ';
*s++ = '=';
*s++ = ' ';
s = appendHex(s, (int) result, 0);
}

#if DEBUG_MUTEX
s = mutexLog(s, syscallInfo, parameters, result);
#endif

*s++ = '\n';
writeLog(buffer, s - buffer);
s = flushBuffer(buffer, s);

#if DUMP_sceMpegBaseCscAvc_CALLS
if (syscallInfo->nid == NID_sceMpegBaseCscAvc) {
char *fileName = buffer;
s = append(buffer, "ms0:/tmp/sceMpegBaseCscAvc.");
s = appendInt(s, sceMpegBaseCscAvcCall, 0);
SceUID fd = ioOpen(fileName, PSP_O_WRONLY | PSP_O_CREAT, 0777);
if (fd >= 0) {
int bufferWidth = parameters[2];
int height = _lw(parameters[3] + 0);
int size = (bufferWidth * (height << 4)) << 2;
int addr = parameters[0] | 0x40000000; // Uncached video memory
while (size > 0) {
int length = commonInfo->maxLogBufferLength;
if (length > size) {
length = size;
}
memcpy(commonInfo->logBuffer, (void *) addr, length);
length = ioWrite(fd, commonInfo->logBuffer, length);
if (length <= 0) {
break;
}
size -= length;
addr += length;
}
ioClose(fd);
}
s = flushBuffer(buffer, s);
sceMpegBaseCscAvcCall++;
}
#endif

if (videocodec != 0) {
s = syscallLogMem(buffer, s, videocodec, 96);
s = flushBuffer(buffer, s);

int buffer2 = _lw(videocodec + 16);
if (buffer2 != 0) {
s = append(s, "Buffer2 Offset 16 ");
s = syscallLogMem(buffer, s, buffer2, 40);
s = flushBuffer(buffer, s);
}

if (videocodecType == 0) {
int yuv = _lw(videocodec + 44);
if (yuv != 0) {
s = append(s, "Yuv Offset 44 ");
s = syscallLogMem(buffer, s, yuv, 44);
s = flushBuffer(buffer, s);

#if DUMP_VIDEOCODEC_FRAMES
// Has video frame?
if (syscallInfo->nid == NID_sceVideocodecDecode && _lw(yuv + 32)) {
char *fileName = buffer;
s = append(buffer, "ms0:/tmp/videocodecFrame.");
s = appendInt(s, videocodecFrame, 0);
SceUID fd = ioOpen(fileName, PSP_O_WRONLY | PSP_O_CREAT, 0777);
if (fd >= 0) {
int size = _lw(yuv + 28) + (_lw(yuv + 28) - _lw(yuv + 20)) - _lw(yuv + 0);
ioWrite(fd, (void *) (_lw(yuv + 0) | 0x80000000), size);
ioClose(fd);
}
s = buffer;
videocodecFrame++;
}
#endif

int buffer1 = _lw(yuv + 36);
if (buffer1 != 0) {
s = append(s, "Yuv.buffer1 Offset 36 ");
s = syscallLogMem(buffer, s, buffer1, 36);
s = flushBuffer(buffer, s);
}

int buffer2 = _lw(yuv + 40);
if (buffer2 != 0) {
s = append(s, "Yuv.buffer2 Offset 40 ");
s = syscallLogMem(buffer, s, buffer2, 32);
s = flushBuffer(buffer, s);
}
}

int buffer3 = _lw(videocodec + 48);
if (buffer3 != 0) {
s = append(s, "Buffer3 Offset 48 ");
s = syscallLogMem(buffer, s, buffer3, 40);
s = flushBuffer(buffer, s);
}

int decodeSEI = _lw(videocodec + 80);
if (decodeSEI != 0) {
s = append(s, "DecodeSEI Offset 80 ");
s = syscallLogMem(buffer, s, decodeSEI, 36);
s = flushBuffer(buffer, s);
}
}
}

#if DEBUG_UTILITY_SAVEDATA
utilitySavedataLog(buffer, syscallInfo, parameters[0]);
Expand Down
23 changes: 15 additions & 8 deletions ms0/JpcspTrace/common.h
Expand Up @@ -21,20 +21,25 @@ along with Jpcsp. If not, see <http://www.gnu.org/licenses/>.
#define DEBUG_UTILITY_OSK 1
#define DEBUG_UTILITY_MSG 1
#define DEFAULT_LOG_BUFFER_SIZE 8*1024
#define DUMP_VIDEOCODEC_FRAMES 0
#define DUMP_sceMpegBaseCscAvc_CALLS 0

#define ALIGN_UP(n, alignment) (((n) + ((alignment) - 1)) & ~((alignment) - 1))

#define TYPE_HEX32 0
#define TYPE_INT32 1
#define TYPE_STRING 2
#define TYPE_POINTER32 3
#define TYPE_POINTER64 4
#define TYPE_VARSTRUCT 5
#define TYPE_FONT_INFO 6
#define TYPE_POINTER32 3
#define TYPE_POINTER64 4
#define TYPE_VARSTRUCT 5
#define TYPE_FONT_INFO 6
#define TYPE_FONT_CHAR_INFO 7
#define TYPE_MPEG_EP 8
#define TYPE_MPEG_AU 9
#define TYPE_MP4_TRACK 10
#define TYPE_MPEG_EP 8
#define TYPE_MPEG_AU 9
#define TYPE_MP4_TRACK 10
#define TYPE_SOCK_ADDR_INTERNET 11
#define TYPE_BUFFER_AND_LENGTH 12
#define TYPE_VIDEOCODEC 13

#define FLAG_LOG_BEFORE_CALL (1 << 0)
#define FLAG_LOG_AFTER_CALL (1 << 1)
Expand All @@ -46,6 +51,8 @@ along with Jpcsp. If not, see <http://www.gnu.org/licenses/>.
#define NID_sceIoClose 0x810C4BC3
#define NID_sceIoOpen_stargate 0x7C8EFE7D
#define NID_sceIoClose_stargate 0x747A373E
#define NID_sceVideocodecDecode 0xDBA273FA
#define NID_sceMpegBaseCscAvc 0x91929A21

#define IS_sceIoOpen_NID(nid) ((nid) == NID_sceIoOpen || (nid) == NID_sceIoOpen_stargate)
#define IS_sceIoClose_NID(nid) ((nid) == NID_sceIoClose || (nid) == NID_sceIoClose_stargate)
Expand Down Expand Up @@ -96,7 +103,7 @@ void printLogSH(const char *s1, const char *s2, const char *s3, int hex, const c
void printLogHS(const char *s1, int hex, const char *s2, const char *s3, const char *s4);
void printLogSS(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5);
void printLogMem(const char *s1, int addr, int length);
void syscallLog(const SyscallInfo *syscallInfo, const u32 *parameters, u64 result, u32 ra, u32 sp, u32 gp);
void syscallLog(const SyscallInfo *syscallInfo, int inOut, const u32 *parameters, u64 result, u32 ra, u32 sp, u32 gp);
int userIoOpen(const char *s, int flags, int permissions);
int userIoWrite(SceUID id, const void *data, int size);
int userIoClose(SceUID id);
Expand Down

0 comments on commit a434c0f

Please sign in to comment.