void utilitySavedataLog(char *buffer, const SyscallInfo *syscallInfo, u32 param) { char *s = buffer; if (syscallInfo->nid == 0x50C4CD57) { utilitySavedataParams = (void *) param; } int mode = _lw((int) utilitySavedataParams + 48); s = append(s, "mode="); s = appendInt(s, mode, 0); s = append(s, ", gameName="); s = append(s, utilitySavedataParams + 60); s = append(s, ", saveName="); s = append(s, utilitySavedataParams + 76); s = append(s, ", fileName="); s = append(s, utilitySavedataParams + 100); if (syscallInfo->nid == 0x9790B33C) { s = append(s, ", result="); s = appendHex(s, _lw((int) utilitySavedataParams + 28), 8); } s = append(s, "\n"); writeLog(buffer, s - buffer); s = buffer; printLogMem("Data ", _lw((int) utilitySavedataParams + 116), 16); printLogMem("Params ", (int) utilitySavedataParams, _lw((int) utilitySavedataParams + 0)); }
void utilityOskLog(char *buffer, const SyscallInfo *syscallInfo, u32 param) { char *s = buffer; if (syscallInfo->nid != 0xF6269B82 && syscallInfo->nid != 0x3DFAEBA9) { return; } if (syscallInfo->nid == 0xF6269B82) { utilityOskParams = (void *) param; } int oskDataAddr = _lw((int) utilityOskParams + 52); if (oskDataAddr != 0) { s = append(s, "inputMode="); s = appendHex(s, _lw(oskDataAddr + 0), 0); s = append(s, ", inputAttr="); s = appendHex(s, _lw(oskDataAddr + 4), 0); } if (syscallInfo->nid == 0x3DFAEBA9) { s = append(s, ", result="); s = appendHex(s, _lw((int) utilityOskParams + 28), 8); } s = append(s, "\n"); writeLog(buffer, s - buffer); s = buffer; printLogMem("Params ", (int) utilityOskParams, _lw((int) utilityOskParams + 0)); }
int pspDebugSioGetchar(void) { if(_lw(PSP_UART4_STAT) & PSP_UART_RXEMPTY) { return -1; } return _lw(PSP_UART4_FIFO); }
int sceHibariUnk14(u32 a) { u32 res; if (hibari_struct[0] == 0) { sceSysregSpiClkEnable(1); while (((*(volatile u32 *)0xbe5c000c) & 4)) { _lw(0xbe5c0008); } *(volatile u32 *)0xbe5c0004 = 2; asm("sync\n"); } hibari_struct[0]++; while (((*(volatile u32 *)0xbe5c000c) & 0x10)); while (((*(volatile u32 *)0xbe5c000c) & 4)) { _lw(0xbe5c0008); } hibari_struct[1] = a; hibari_struct[3] = -1; while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = ((a&0xFFFF) | 0x8000); while (!((*(volatile u32 *)0xbe5c000c) & 4)); _lw(0xbe5c0008); while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = 0xA000; while (!((*(volatile u32 *)0xbe5c000c) & 4)); res = (*(volatile u32 *)0xbe5c0008) & 0xFF; hibari_struct[0]--; if (hibari_struct[0] == 0) { while (((*(volatile u32 *)0xbe5c000c) & 0x10)); *(volatile u32 *)0xbe5c0004 = 0; asm("sync\n"); sceSysregSpiClkDisable(1); } return res; }
/* This MUST return 0 if there are no characters in the RX FIFO. */ int sbcall_getc() { if (_lw(EE_SIO_ISR) & 0xf00) return _lb(EE_SIO_RXFIFO); return 0; }
// Read out the interrupt state and clear it static int intr_handler(void *arg) { u32 stat; stat = _lw(0xBE500040); _sw(stat, 0xBE500044); sceKernelDisableIntr(PSP_HPREMOTE_INT); sceKernelSetEventFlag(g_eventflag, EVENT_SIO); return -1; }
static int sio_putc(int c) { /* Wait for free space in the TX FIFO. */ while (_lw(EE_SIO_ISR) & 0x8000) ; _sb(c, EE_SIO_TXFIFO); return c; }
int OnModuleStart( tSceModule * mod ) { log( "on module %s start\n", mod->modname ); if ( strcmp( mod->modname, "scePaf_Module" ) == 0 ) { parseDiff("/vsh/module/paf.prx", mod ); } else if ( strcmp( mod->modname, "sceVshCommonGui_Module" ) == 0 ) { parseDiff("/vsh/module/common_gui.prx", mod ); } else if ( strcmp( mod->modname, "vsh_module" ) == 0 ) { parseDiff("/vsh/module/vshmain.prx", mod ); } else if ( strcmp( mod->modname, "sysconf_plugin_module" ) == 0 ) { unsigned int offset = getSysconfOffset(); if ( fw_version == FW_500 ) { unsigned int addr = mod->text_addr + offset; char *sfx = (char *)addr; sfx[0] = 'C'; } else { unsigned int h_addr = _lw( mod->text_addr + offset ); unsigned int l_addr = _lw( mod->text_addr + offset + 0xC ); unsigned int addr = ( ( h_addr & 0xFFFF ) << 16 ) | ( l_addr & 0xFFFF ); char * sfx = "CTF"; _sw( *( unsigned int * )sfx, addr ); } sceKernelIcacheInvalidateAll(); sceKernelDcacheWritebackInvalidateAll(); log( "patched sysconf\n" ); } if ( !previous ) return 0; return previous( mod ); }
int sio_getc() { /* Do we have something in the RX FIFO? */ if (_lw(SIO_ISR) & 0xf00) { u8 b = _lb(SIO_RXFIFO); _sw(7, SIO_ISR); return b; } /* Return EOF. */ return -1; }
void * patchLoadExecVSHCommon( void * func ) { tSceModule * pMod = ( tSceModule * )sceKernelFindModuleByName( "sceLoadExec" ); if ( fw_version == FW_371 ) LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x0000121c; //same in standare/slim else if ( fw_version == FW_380 || fw_version == FW_390 ) LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x000014cc; //same in standare/slim else if ( fw_version == FW_401 ) LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x00001E1C; //same in standare/slim else if ( fw_version == FW_500 ) LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x00001E58; //verified in phat else if ( fw_version == FW_550 ) LoadExecVSHCommon_ori[0].addr = pMod->text_addr + 0x00001F3C; //same on slim & phat LoadExecVSHCommon_ori[1].addr = LoadExecVSHCommon_ori[0].addr + 4; LoadExecVSHCommon_ori[0].val = _lw( LoadExecVSHCommon_ori[0].addr ); LoadExecVSHCommon_ori[1].val = _lw( LoadExecVSHCommon_ori[1].addr ); MAKE_JUMP( LoadExecVSHCommon_ori[0].addr, func ); _sw( NOP, LoadExecVSHCommon_ori[1].addr ); sceKernelIcacheInvalidateAll(); sceKernelDcacheWritebackInvalidateAll(); return ( void * )LoadExecVSHCommon_ori[0].addr; }
int sceHibariUnk7(u32 a, u8 *p, int size) { int i; if (hibari_struct[0] == 0) { sceSysregSpiClkEnable(1); while (((*(volatile u32 *)0xbe5c000c) & 4)) { _lw(0xbe5c0008); } *(volatile u32 *)0xbe5c0004 = 2; asm("sync\n"); } hibari_struct[0]++; if (hibari_struct[1] != a) { while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = ((a&0xFFFF) | 0x8000); } for (i = 0; i < size; i++) { while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = (p[i] | 0x8100); a++; } hibari_struct[0]--; hibari_struct[1] = a; hibari_struct[3] = -1; if (hibari_struct[0] == 0) { while (((*(volatile u32 *)0xbe5c000c) & 0x10)); *(volatile u32 *)0xbe5c0004 = 0; asm("sync\n"); sceSysregSpiClkDisable(1); } return 0; }
int sio_putc(int c) { if((c == '\n') && (___last_sio_putc != '\r')) { // hack: if the character to be outputted is a '\n' // and the previously-outputted character is not a '\r', // output a '\r' first. sio_putc('\r'); } /* Block until we're ready to transmit. */ while ((_lw(SIO_ISR) & 0xf000) == 0x8000); _sb(c, SIO_TXFIFO); ___last_sio_putc = c; return c; }
int _start(int argc, char *argv[]) { iop_event_t event; int semid, evflg, res; if ((semid = CreateMutex(IOP_MUTEX_UNLOCKED)) < 0) { E_PRINTF("Unable to create %s (error %d).\n", "semaphore", semid); return 1; } eng_args.semid = semid; event.attr = event.bits = 0; if ((evflg = CreateEventFlag(&event)) < 0) { E_PRINTF("Unable to create %s (error %d).\n", "event flag", evflg); return 1; } eng_args.evflg = evflg; CpuEnableIntr(); DisableIntr(IOP_IRQ_DMA_DEV9, NULL); if ((res = RegisterIntrHandler(IOP_IRQ_DMA_DEV9, 1, dev9_dma_handler, &eng_args.evflg))) { E_PRINTF("Unable to register 0x%02x intr handler (error %d).\n", IOP_IRQ_DMA_DEV9, res); return 1; } _sw(_lw(0xbf801570) | 0x80, 0xbf801570); if ((res = ata_engine_init(&eng_args)) < 0) { E_PRINTF("Unable to initialize the %s DMA engine.\n", "ATA"); return 1; } if ((res = smap_engine_init(&eng_args)) < 0) { E_PRINTF("Unable to initialize the %s DMA engine.\n", "SMAP"); return 1; } M_PRINTF("ATA/SMAP DMA relay module initialized.\n"); return 0; }
int sceHibariUnk5(u16 a, u8 b) { if (hibari_struct[0] == 0) { sceSysregSpiClkEnable(1); while (((*(volatile u32 *)0xbe5c000c) & 4)) { _lw(0xbe5c0008); } *(volatile u32 *)0xbe5c0004 = 2; asm("sync\n"); } hibari_struct[0]++; while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = ((a&0xFFFF) | 0xC000); while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = (b | 0xC100); hibari_struct[1] = hibari_struct[3] = -1; hibari_struct[0]--; if (hibari_struct[0] == 0) { while (((*(volatile u32 *)0xbe5c000c) & 0x10)); *(volatile u32 *)0xbe5c0004 = 0; asm("sync\n"); sceSysregSpiClkDisable(1); } return 0; }
void printLogMem(const char *s1, int addr, int length) { int i, j; int lineStart; char buffer[100]; char *s = buffer; s = append(s, s1); s = appendHex(s, addr, 8); s = append(s, ":\n"); if (addr != 0) { lineStart = 0; for (i = 0; i < length; i += 4) { if (i > 0) { if ((i % 16) == 0) { s = append(s, " >"); for (j = lineStart; j < i; j++) { char c = _lb(addr + j); if (c < ' ' || c > '~') { c = '.'; } *s++ = c; } s = append(s, "<\n"); writeLog(buffer, s - buffer); s = buffer; lineStart = i; } else { s = append(s, ", "); } } s = appendHex(s, _lw(addr + i), 8); } } s = append(s, "\n"); writeLog(buffer, s - buffer); }
void utilityMsgLog(char *buffer, const SyscallInfo *syscallInfo, u32 param) { char *s = buffer; if (syscallInfo->nid != 0x2AD8E239 && syscallInfo->nid != 0x67AF3428) { return; } if (syscallInfo->nid == 0x2AD8E239) { utilityMsgParams = (void *) param; } s = append(s, "result="); s = appendHex(s, _lw((int) utilityMsgParams + 48), 0); s = append(s, ", mode="); s = appendHex(s, _lw((int) utilityMsgParams + 52), 0); s = append(s, ", errorValue="); s = appendHex(s, _lw((int) utilityMsgParams + 56), 0); s = append(s, ", options="); s = appendHex(s, _lw((int) utilityMsgParams + 572), 0); s = append(s, ", buttonPressed="); s = appendHex(s, _lw((int) utilityMsgParams + 576), 0); if (syscallInfo->nid == 0x67AF3428) { s = append(s, ", result="); s = appendHex(s, _lw((int) utilityMsgParams + 28), 8); } s = append(s, "\n"); writeLog(buffer, s - buffer); #if 0 s = buffer; s = append(s, "message="); s = append(s, utilityMsgParams + 60); s = append(s, "\n"); writeLog(buffer, s - buffer); printLogMem("Params ", (int) utilityMsgParams, _lw((int) utilityMsgParams + 0)); #endif }
int sceHibariUnk15(u32 a, u32 b) { u32 res; if (hibari_struct[0] == 0) { sceSysregSpiClkEnable(1); while (((*(volatile u32 *)0xbe5c000c) & 4)) { _lw(0xbe5c0008); } *(volatile u32 *)0xbe5c0004 = 2; asm("sync\n"); } hibari_struct[0]++; if (hibari_struct[2] != a) { while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = 0xEF; while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = (a | 0x0100) & 0xFFFF; hibari_struct[2] = a; } while (((*(volatile u32 *)0xbe5c000c) & 0x10)); while (((*(volatile u32 *)0xbe5c000c) & 4)) { _lw(0xbe5c0008); } hibari_struct[1] = -1; hibari_struct[3] = b; while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = (b&0xFFFF); while (!((*(volatile u32 *)0xbe5c000c) & 4)); _lw(0xbe5c0008); while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = 0x2000; while (!((*(volatile u32 *)0xbe5c000c) & 4)); res = (*(volatile u32 *)0xbe5c0008) & 0xFF; hibari_struct[0]--; if (hibari_struct[0] == 0) { while (((*(volatile u32 *)0xbe5c000c) & 0x10)); *(volatile u32 *)0xbe5c0004 = 0; asm("sync\n"); sceSysregSpiClkDisable(1); } return res; }
void SifInitCmd() { u32 packet[5]; /* Implicitly aligned to 16 bytes */ int i; static int _rb_count = 0; if(_rb_count != _iop_reboot_count) { _rb_count = _iop_reboot_count; if (sif0_id >= 0) { DisableDmac(5); RemoveDmacHandler(5, sif0_id); } init = 0; } if (init) return; DI(); _sif_cmd_data.pktbuf = UNCACHED_SEG(_sif_cmd_data.pktbuf); _sif_cmd_data.unused = UNCACHED_SEG(_sif_cmd_data.unused); for (i = 0; i < CMD_HANDLER_MAX; i++) { _sif_cmd_data.sys_cmd_handlers[i].handler = NULL; _sif_cmd_data.sys_cmd_handlers[i].harg = NULL; } for (i = 0; i < 32; i++) _sif_cmd_data.sregs[i] = 0; _sif_cmd_data.sys_cmd_handlers[0].handler = change_addr; _sif_cmd_data.sys_cmd_handlers[0].harg = &_sif_cmd_data; _sif_cmd_data.sys_cmd_handlers[1].handler = set_sreg; _sif_cmd_data.sys_cmd_handlers[1].harg = &_sif_cmd_data; EI(); FlushCache(0); if (_lw(DMAC_COMM_STAT) & STAT_SIF0) _sw(STAT_SIF0, DMAC_COMM_STAT); if (!(_lw(DMAC_SIF0_CHCR) & CHCR_STR)) SifSetDChain(); sif0_id = AddDmacHandler(5, _SifCmdIntHandler, 0); EnableDmac(5); init = 1; _sif_cmd_data.iopbuf = (void *)SifGetReg(0x80000000); if (_sif_cmd_data.iopbuf) { /* IOP SIF CMD is already initialized, so give it our new receive address. */ ((struct ca_pkt *)(packet))->buf = _sif_cmd_data.pktbuf; SifSendCmd(0x80000000, packet, sizeof packet, NULL, NULL, 0); } else { /* Sync */ while (!(SifGetReg(SIF_REG_SMFLAG) & 0x20000)) ; _sif_cmd_data.iopbuf = (void *)SifGetReg(SIF_REG_SUBADDR); SifSetReg(0x80000000, (u32)_sif_cmd_data.iopbuf); /* See the note above about struct cmd_data, and the use of this register. */ SifSetReg(0x80000001, (u32)&_sif_cmd_data); packet[3] = 0; packet[4] = (u32)_sif_cmd_data.pktbuf; SifSendCmd(0x80000002, packet, sizeof packet, NULL, NULL, 0); } }
/* 11 */ u32 sio2_stat70_get() { return _lw(SIO2_REG_STAT70); }
/* 13 */ u32 sio2_regN_get(int N) { return _lw(SIO2_REG_BASE + (N * 4)); }
void utilitySavedataLog(char *buffer, const SyscallInfo *syscallInfo, u32 param) { char *s = buffer; int fd; if (syscallInfo->nid != 0x50C4CD57 && syscallInfo->nid != 0x9790B33C) { return; } if (syscallInfo->nid == 0x50C4CD57) { utilitySavedataParams = (void *) param; } if (utilitySavedataParams == NULL) { return; } int mode = _lw((int) utilitySavedataParams + 48); s = append(s, "mode="); s = appendInt(s, mode, 0); s = append(s, ", gameName="); s = append(s, utilitySavedataParams + 60); s = append(s, ", saveName="); s = append(s, utilitySavedataParams + 76); s = append(s, ", fileName="); s = append(s, utilitySavedataParams + 100); if (syscallInfo->nid == 0x9790B33C) { s = append(s, ", result="); s = appendHex(s, _lw((int) utilitySavedataParams + 28), 8); } s = append(s, "\n"); writeLog(buffer, s - buffer); s = buffer; printLogMem("Data ", _lw((int) utilitySavedataParams + 116), 16); int fileListAddr = _lw((int) utilitySavedataParams + 1528); if (fileListAddr != 0 && mode == 12) { // MODE_FILES printLogMem("FileList ", fileListAddr, 36); if (syscallInfo->nid == 0x9790B33C) { // sceUtilitySavedataShutdownStart int saveFileSecureNumEntries = _lw(fileListAddr + 12); int saveFileNumEntries = _lw(fileListAddr + 16); int systemFileNumEntries = _lw(fileListAddr + 20); int saveFileSecureEntriesAddr = _lw(fileListAddr + 24); int saveFileEntriesAddr = _lw(fileListAddr + 28); int systemEntriesAddr = _lw(fileListAddr + 32); printLogMem("SecureEntries ", saveFileSecureEntriesAddr, saveFileSecureNumEntries * 80); printLogMem("NormalEntries ", saveFileEntriesAddr, saveFileNumEntries * 80); printLogMem("SystemEntries ", systemEntriesAddr, systemFileNumEntries * 80); } } printLogMem("Params ", (int) utilitySavedataParams, _lw((int) utilitySavedataParams + 0)); if (syscallInfo->nid == 0x9790B33C) { fd = ioOpen("ms0:/SavedataStruct.bin", PSP_O_WRONLY | PSP_O_CREAT | PSP_O_APPEND, 0777); ioWrite(fd, utilitySavedataParams, _lw((int) utilitySavedataParams + 0)); ioClose(fd); fd = ioOpen("ms0:/SavedataData.bin", PSP_O_WRONLY | PSP_O_CREAT | PSP_O_APPEND, 0777); ioWrite(fd, (void *) _lw((int) utilitySavedataParams + 116), _lw((int) utilitySavedataParams + 124)); ioClose(fd); } }
/* 14 */ u32 sio2_stat74_get() { return _lw(SIO2_REG_STAT74); }
/* 18 */ u32 sio2_unkn7c_get() { return _lw(SIO2_REG_UNKN7C); }
int sioGetchar(void) { if (_lw(PSP_UART4_STAT) & PSP_UART_RXEMPTY) return -1; else return _lw(PSP_UART4_FIFO); }
/* 16 */ u32 sio2_unkn78_get() { return _lw(SIO2_REG_UNKN78); }
static void sif_cmd_interrupt() { u128 packetbuf[8 + 1]; u128 *packet; volatile unsigned int packet_aligned; /* volatile needed, because caller doesn't respect stack alignment. */ u128 *pktbuf; cmd_data_t *cmd_data = &_sif_cmd_data; tge_sifcmd_header_t *header; sifCmdHandler_t *cmd_handlers = NULL; int size, pktquads, i = 0; uint32_t id; if (_lw(EE_DMAC_SIF0_CHCR) & 0x0100) { /* Interrupt to early. Transfer is still in process. */ #if defined(SBIOS_DEBUG) printf("sif_cmd_interrupt: transfer not finished\n"); #endif return; } /* Align packet or u128 copy will fail. */ packet_aligned = (unsigned int) packetbuf; packet_aligned += 16 - 1; packet_aligned &= ~(16 - 1); packet = (void *) packet_aligned; header = (tge_sifcmd_header_t *)cmd_data->pktbuf; size = (header->size & 0xff); if (size == 0) { printf("Bad paket size in IRQ.\n"); goto out; } /* TBD: Don't copy anything extra */ pktquads = (size + 30) >> 4; // TBD: + 16 - 1 should be enough for alignment. header->size = 0; if (pktquads) { pktbuf = (u128 *)cmd_data->pktbuf; while (pktquads--) { packet[i] = pktbuf[i]; i++; } } /* DMA buffer has been copied. Restart DMA. */ sbcall_sifsetdchain(); header = (tge_sifcmd_header_t *)packet; /* Get the command handler id and determine which handler list to dispatch from. */ #if defined(SBIOS_DEBUG) printf("fid 0x%x\n", header->fid); #endif id = header->fid & ~SYSTEM_CMD; if (header->fid & SYSTEM_CMD) { if (id < cmd_data->nr_sys_handlers) { cmd_handlers = cmd_data->sys_cmd_handlers; } } else { if (id < cmd_data->nr_usr_handlers) { cmd_handlers = cmd_data->usr_cmd_handlers; } } if ((cmd_handlers != NULL) && (cmd_handlers[id].handler != NULL)) { #if defined(SBIOS_DEBUG) printf("Callback 0x%x\n", (uint32_t) cmd_handlers[id].handler); #endif cmd_handlers[id].handler(packet, cmd_handlers[id].harg); } out: __asm__ volatile ("sync"); }
void syscallLog(const SyscallInfo *syscallInfo, const u32 *parameters, u64 result, u32 ra, const char *prefix) { char buffer[300]; char *s = buffer; int i, j, k; int length; int lineStart; // Don't log out own sceIoWrites. if (syscallInfo->nid == 0x42EC03AC && parameters[0] == commonInfo->logFd) { return; } if (logTimestamp) { pspTime time; if (sceRtcGetCurrentClockLocalTime(&time) == 0) { s = appendInt(s, time.hour, 2); *s++ = ':'; s = appendInt(s, time.minutes, 2); *s++ = ':'; s = appendInt(s, time.seconds, 2); *s++ = '.'; s = appendInt(s, time.microseconds, 6); *s++ = ' '; } } if (logThreadName) { SceKernelThreadInfo currentThreadInfo; currentThreadInfo.size = sizeof(currentThreadInfo); currentThreadInfo.name[0] = '\0'; sceKernelReferThreadStatus(0, ¤tThreadInfo); s = append(s, currentThreadInfo.name); *s++ = ' '; *s++ = '-'; *s++ = ' '; } if (logRa) { s = appendHex(s, ra, 0); *s++ = ' '; } s = append(s, prefix); s = append(s, syscallInfo->name); int types = syscallInfo->paramTypes; for (i = 0; i < syscallInfo->numParams; i++, types >>= 4) { if (i > 0) { *s++ = ','; } *s++ = ' '; int parameter = parameters[i]; switch (types & 0xF) { case TYPE_HEX32: s = appendHex(s, parameter, 0); break; case TYPE_INT32: s = appendInt(s, parameter, 0); break; case TYPE_STRING: s = appendHex(s, parameter, 8); if (parameter != 0) { *s++ = '('; *s++ = '\''; s = append(s, (char *) parameter); *s++ = '\''; *s++ = ')'; } break; case TYPE_POINTER32: s = appendHex(s, parameter, 8); if (parameter != 0) { *s++ = '('; s = appendHex(s, _lw(parameter), 0); *s++ = ')'; } break; case TYPE_POINTER64: s = appendHex(s, parameter, 8); if (parameter != 0) { *s++ = '('; s = appendHex(s, _lw(parameter), 8); *s++ = ' '; s = appendHex(s, _lw(parameter + 4), 8); *s++ = ')'; } break; case TYPE_VARSTRUCT: s = appendHex(s, parameter, 8); if (parameter != 0) { *s++ = ':'; *s++ = '\n'; writeLog(buffer, s - buffer); s = buffer; length = _lw(parameter); lineStart = 0; for (j = 0; j < length; j += 4) { if (j > 0) { if ((j % 16) == 0) { s = append(s, " >"); for (k = lineStart; k < j; k++) { char c = _lb(parameter + k); if (c < ' ' || c > '~') { c = '.'; } *s++ = c; } s = append(s, "<\n"); writeLog(buffer, s - buffer); s = buffer; lineStart = j; } else { *s++ = ','; *s++ = ' '; } } s = appendHex(s, _lw(parameter + j), 8); } } break; case TYPE_FIXSTRUCT: s = appendHex(s, parameter, 8); if (parameter != 0) { *s++ = ':'; *s++ = '\n'; writeLog(buffer, s - buffer); s = buffer; length = FIXSTRUCT_SIZE; lineStart = 0; for (j = 0; j < length; j += 4) { if (j > 0) { if ((j % 16) == 0) { s = append(s, " >"); for (k = lineStart; k < j; k++) { char c = _lb(parameter + k); if (c < ' ' || c > '~') { c = '.'; } *s++ = c; } s = append(s, "<\n"); writeLog(buffer, s - buffer); s = buffer; lineStart = j; } else { *s++ = ','; *s++ = ' '; } } s = appendHex(s, _lw(parameter + j), 8); } } break; } } *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); #if DEBUG_UTILITY_SAVEDATA utilitySavedataLog(buffer, syscallInfo, parameters[0]); #endif }
void pspDebugSioPutchar(int ch) { while(_lw(PSP_UART4_STAT) & PSP_UART_TXFULL); _sw(ch, PSP_UART4_FIFO); }
int sceHibariUnk8(u32 a, u32 b, u8 *p, int size) { int i; if (hibari_struct[0] == 0) { sceSysregSpiClkEnable(1); while (((*(volatile u32 *)0xbe5c000c) & 4)) { _lw(0xbe5c0008); } *(volatile u32 *)0xbe5c0004 = 2; asm("sync\n"); } hibari_struct[0]++; if (hibari_struct[2] != a && b != 0xEF) { while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = 0xEF; while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = (a | 0x0100) & 0xFFFF; hibari_struct[2] = a; hibari_struct[3] = -1; } if (hibari_struct[3] != b) { while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = (b&0xFFFF); } for (i = 0; i < size; i++) { if (b == 0xEF) { hibari_struct[2] = (u32)p[i]; } while (!((*(volatile u32 *)0xbe5c000c) & 2)); *(volatile u32 *)0xbe5c0008 = (p[i] | 0x0100); b++; } hibari_struct[0]--; hibari_struct[1] = -1; hibari_struct[3] = b; if (hibari_struct[0] == 0) { while (((*(volatile u32 *)0xbe5c000c) & 0x10)); *(volatile u32 *)0xbe5c0004 = 0; asm("sync\n"); sceSysregSpiClkDisable(1); } return 0; }
/* 22 */ u32 sio2_stat_get() { return _lw(SIO2_REG_STAT); }