void testCharDeviceIo(const wchar_t *name) { handle_t file; fileop_t op; uint32_t key; file = FsOpen(name, FILE_READ); if (file == NULL) wprintf(L"Failed to open %s\n", name); else { op.event = EvtCreate(false); op.bytes = 0; wprintf(L"op = %p op.event = %u sig = %u\n", &op, op.event, EvtIsSignalled(op.event)); if (op.event != NULL) { while (true) { status_t ret; ret = FsReadAsync(file, &key, 0, sizeof(key), &op); if (ret > 0) break; else if (ret == SIOPENDING) { DbgWrite(L"Wait start\n", 11); /*while (EvtIsSignalled(op.event))*/ ThrWaitHandle(op.event); DbgWrite(L"Wait end\n", 9); ret = op.result; } /*wprintf(L"op.result = %d op.bytes = %u\n", op.result, op.bytes);*/ if (ret == SIOPENDING) wprintf(L"op.result is still SIOPENDING\n"); else { if (ret > 0 || op.bytes == 0) break; wprintf(L"%c", (wchar_t) key); if (key == 27) break; } op.bytes = 0; } DbgWrite(L"Finished\n", 9); wprintf(L"Finished: op.result = %d, op.bytes = %u\n", op.result, op.bytes); HndClose(op.event); } } HndClose(file); }
bool FsRead(handle_t file, void *buf, uint64_t offset, size_t bytes, size_t *bytes_read) { fileop_t op; status_t ret; op.event = FsAllocSyncIoEvent(); ret = FsReadAsync(file, buf, offset, bytes, &op); if (ret > 0) { FsFreeSyncIoEvent(op.event); errno = ret; return false; } else if (ret == SIOPENDING) { if (!ThrWaitHandle(op.event)) DbgWrite(L"FsRead: ThrWaitHandle failed\n", 21); ret = op.result; } FsFreeSyncIoEvent(op.event); if (bytes_read != 0) *bytes_read = op.bytes; if (ret != 0) { if (ret == SIOPENDING) DbgWrite(L"FsRead: still pending\n", 22); errno = ret; return false; } else return true; }
static IMG_BOOL PDumpWriteILock(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32Count, IMG_UINT32 ui32Flags) { IMG_UINT32 ui32Written = 0; if ((psStream == IMG_NULL) || PDumpSuspended() || ((ui32Flags & PDUMP_FLAGS_NEVER) != 0)) { PVR_DPF((PVR_DBG_MESSAGE, "PDumpWriteILock: Failed to write 0x%x bytes to stream 0x%x", ui32Count, (IMG_UINT32)psStream)); return IMG_TRUE; } if (psStream == gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]) { IMG_UINT32 ui32ParamOutPos = gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]); if (ui32ParamOutPos + ui32Count > MAX_FILE_SIZE) { if ((gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2] && PDumpWriteString2("\r\n-- Splitting pdump output file\r\n\r\n", ui32Flags))) { DbgSetMarker(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2], ui32ParamOutPos); gsDBGPdumpState.ui32ParamFileNum++; } } } ui32Written = DbgWrite(psStream, pui8Data, ui32Count, ui32Flags); if (ui32Written == 0xFFFFFFFF) { return IMG_FALSE; } return IMG_TRUE; }
int vwprintf(const wchar_t* fmt, va_list ptr) { int ret; wprintf_buf_t buf; buf.ch = buf.buffer; ret = dowprintf(wdprintfhelp, &buf, fmt, ptr); if (buf.ch > buf.buffer) DbgWrite(buf.buffer, buf.ch - buf.buffer); return ret; }
static IMG_BOOL PDumpWriteILock(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32Count, IMG_UINT32 ui32Flags) { IMG_UINT32 ui32Written = 0; IMG_UINT32 ui32Off = 0; if ((psStream == IMG_NULL) || PDumpSuspended() || ((ui32Flags & PDUMP_FLAGS_NEVER) != 0)) { return IMG_TRUE; } if (psStream == gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]) { IMG_UINT32 ui32ParamOutPos = gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]); if (ui32ParamOutPos + ui32Count > MAX_FILE_SIZE) { if ((gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2] && PDumpWriteString2("\r\n-- Splitting pdump output file\r\n\r\n", ui32Flags))) { DbgSetMarker(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2], ui32ParamOutPos); gsDBGPdumpState.ui32ParamFileNum++; } } } while (((IMG_UINT32) ui32Count > 0) && (ui32Written != 0xFFFFFFFF)) { ui32Written = DbgWrite(psStream, &pui8Data[ui32Off], ui32Count, ui32Flags); if (ui32Written == 0) { OSReleaseThreadQuanta(); } if (ui32Written != 0xFFFFFFFF) { ui32Off += ui32Written; ui32Count -= ui32Written; } } if (ui32Written == 0xFFFFFFFF) { return IMG_FALSE; } return IMG_TRUE; }
void testBlockDeviceIo(const wchar_t *name) { handle_t file; unsigned i, j; fileop_t op; wchar_t *ch; file = FsOpen(name, FILE_READ); if (file == NULL) wprintf(L"Failed to open %s\n", name); else { op.event = EvtCreate(false); for (j = 0; j < 1; j++) { status_t ret; wprintf(/*L"\x1b[2J"*/ L"\x1b[%um", (j % 8) + 30); ret = FsReadAsync(file, key, 9 * 512, sizeof(key), &op); if (ret > 0) break; else if (ret == SIOPENDING) { ThrWaitHandle(op.event); ret = op.result; } if (ret == SIOPENDING) wprintf(L"op.result is still SIOPENDING\n"); else if (ret == 0 && op.bytes > 0) { wprintf(L"Read %u bytes\n", op.bytes); ch = str; for (i = 0; i < op.bytes; i++) { swprintf(ch, L"%02X", key[i]); ch += 2; } _cputws(str, op.bytes * 2); /*for (i = 0; i < op.bytes; i++) wprintf(L"%02X", key[i]);*/ } else break; } DbgWrite(L"Finished\n", 9); wprintf(L"Finished: op.result = %d, op.bytes = %u\n", op.result, op.bytes); HndClose(op.event); } HndClose(file); }
static bool wdprintfhelp(void *cookie, const wchar_t* str, size_t len) { wprintf_buf_t *buf; buf = cookie; if (buf->ch + len > buf->buffer + _countof(buf->buffer)) { DbgWrite(buf->buffer, buf->ch - buf->buffer); buf->ch = buf->buffer; } memcpy(buf->ch, str, sizeof(wchar_t) * len); buf->ch += len; return true; }
static IMG_BOOL PDumpWriteILock(struct DBG_STREAM *psStream, u8 *pui8Data, u32 ui32Count, u32 ui32Flags) { u32 ui32Written = 0; u32 ui32Off = 0; if (!psStream || gui32PDumpSuspended || (ui32Flags & PDUMP_FLAGS_NEVER)) return IMG_TRUE; if (psStream == gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]) { u32 ui32ParamOutPos = gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState. psStream [PDUMP_STREAM_PARAM2]); if (ui32ParamOutPos + ui32Count > MAX_FILE_SIZE) if ((gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2] && PDumpWriteString2 ("\r\n-- Splitting pdump output file\r\n\r\n", ui32Flags))) { DbgSetMarker(gsDBGPdumpState. psStream[PDUMP_STREAM_PARAM2], ui32ParamOutPos); gsDBGPdumpState.ui32ParamFileNum++; } } while (((u32) ui32Count > 0) && (ui32Written != 0xFFFFFFFF)) { ui32Written = DbgWrite(psStream, &pui8Data[ui32Off], ui32Count, ui32Flags); if (ui32Written == 0) OSReleaseThreadQuanta(); if (ui32Written != 0xFFFFFFFF) { ui32Off += ui32Written; ui32Count -= ui32Written; } } if (ui32Written == 0xFFFFFFFF) return IMG_FALSE; return IMG_TRUE; }