From e2d628bc2a08f1728a837b3229e31541abe5e137 Mon Sep 17 00:00:00 2001 From: ufrisk Date: Mon, 6 Nov 2017 21:27:31 +0100 Subject: [PATCH] Version 2.5 --- pcileech/Android.mk | 2 +- pcileech/Makefile | 2 +- pcileech/device.c | 4 - pcileech/device605_601.c | 142 +++++----- pcileech/device605_tcp.c | 98 +++---- pcileech/device605_uart.c | 413 ------------------------------ pcileech/device605_uart.h | 17 -- pcileech/help.c | 4 +- pcileech/kmd.c | 6 +- pcileech/pcileech.c | 2 - pcileech/pcileech.h | 1 - pcileech/pcileech.vcxproj | 2 - pcileech/pcileech.vcxproj.filters | 6 - pcileech/tlp.c | 74 ++++-- pcileech/tlp.h | 17 +- pcileech_files/pcileech | Bin 160512 -> 160432 bytes pcileech_files/pcileech.exe | Bin 307200 -> 303104 bytes readme.md | 6 +- 18 files changed, 207 insertions(+), 589 deletions(-) delete mode 100644 pcileech/device605_uart.c delete mode 100644 pcileech/device605_uart.h diff --git a/pcileech/Android.mk b/pcileech/Android.mk index ad5bd1e..626397b 100644 --- a/pcileech/Android.mk +++ b/pcileech/Android.mk @@ -14,7 +14,7 @@ LOCAL_CFLAGS := -D ANDROID LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -llog -g LOCAL_C_INCLUDES := bionic -LOCAL_SRC_FILES:= pcileech.c oscompatibility.c device.c device3380.c device605_uart.c device605_601.c device605_tcp.c executor.c extra.c help.c kmd.c memdump.c mempatch.c statistics.c tlp.c util.c vfs.c +LOCAL_SRC_FILES:= pcileech.c oscompatibility.c device.c device3380.c device605_601.c device605_tcp.c executor.c extra.c help.c kmd.c memdump.c mempatch.c statistics.c tlp.c util.c vfs.c LOCAL_MODULE := pcileech LOCAL_SHARED_LIBRARIES += libusb1.0 diff --git a/pcileech/Makefile b/pcileech/Makefile index c083d97..b6eb9c8 100644 --- a/pcileech/Makefile +++ b/pcileech/Makefile @@ -1,7 +1,7 @@ CC=gcc CFLAGS=-I. -D LINUX -pthread `pkg-config libusb-1.0 --libs --cflags` DEPS = pcileech.h -OBJ = pcileech oscompatibility.o pcileech.o device.o device3380.o device605_uart.o device605_601.o device605_tcp.o executor.o extra.o help.o kmd.o memdump.o mempatch.o statistics.o tlp.o util.o vfs.o +OBJ = pcileech oscompatibility.o pcileech.o device.o device3380.o device605_601.o device605_tcp.o executor.o extra.o help.o kmd.o memdump.o mempatch.o statistics.o tlp.o util.o vfs.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/pcileech/device.c b/pcileech/device.c index e86ed90..0eacdd6 100644 --- a/pcileech/device.c +++ b/pcileech/device.c @@ -7,7 +7,6 @@ #include "kmd.h" #include "statistics.h" #include "device3380.h" -#include "device605_uart.h" #include "device605_601.h" #include "device605_tcp.h" @@ -157,9 +156,6 @@ BOOL DeviceOpen(_Inout_ PPCILEECH_CONTEXT ctx) if(PCILEECH_DEVICE_SP605_FT601 == ctx->cfg->dev.tp || PCILEECH_DEVICE_NA == ctx->cfg->dev.tp) { result = Device605_601_Open(ctx); } - if(PCILEECH_DEVICE_SP605_UART == ctx->cfg->dev.tp) { - result = Device605_UART_Open(ctx); - } if(PCILEECH_DEVICE_SP605_TCP == ctx->cfg->dev.tp) { result = Device605_TCP_Open(ctx); } diff --git a/pcileech/device605_601.c b/pcileech/device605_601.c index 448bed1..1732ec6 100644 --- a/pcileech/device605_601.c +++ b/pcileech/device605_601.c @@ -14,30 +14,30 @@ // FPGA/SP605/FT601 defines below. //------------------------------------------------------------------------------- -#define FPGA_CFG_RX_VALID 0x77000000 -#define FPGA_CFG_RX_VALID_MASK 0xff070000 -#define FPGA_CMD_RX_VALID 0x77020000 -#define FPGA_CMD_RX_VALID_MASK 0xff070000 - -#define FPGA_TLP_RX_VALID 0x77030000 -#define FPGA_TLP_RX_VALID_MASK 0xff030000 -#define FPGA_TLP_RX_VALID_LAST 0x77070000 -#define FPGA_TLP_RX_VALID_LAST_MASK 0xff070000 - -#define FPGA_TLP_TX_VALID 0x77030000 -#define FPGA_TLP_TX_VALID_LAST 0x77070000 -#define FPGA_LOOP_TX_VALID 0x77010000 +#define FPGA_TLP_TX_VALID 0x77000000 +#define FPGA_TLP_TX_VALID_LAST 0x77040000 +#define FPGA_LOOP_TX_VALID 0x77020000 #define SP605_601_PROBE_MAXPAGES 0x400 -#define SP605_601_MAX_SIZE_RX 0x0001e000 // in data bytes (excl. overhead/TLP headers) -#define SP605_601_MAX_SIZE_TX 0x00002000 // in total data (incl. overhead/TLP headers) +#define SP605_601_MAX_SIZE_RX 0x0001f000 // in data bytes (excl. overhead/TLP headers) +#define SP605_601_MAX_SIZE_TX 0x00002000 // in total data (incl. overhead/TLP headers) + +#define FPGA_CMD_VERSION 0x01 +#define FPGA_CMD_PCIE_STATUS 0x02 #define ENDIAN_SWAP_WORD(x) (x = (x << 8) | (x >> 8)) #define ENDIAN_SWAP_DWORD(x) (x = (x << 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x >> 24)) +// Delay in uS. DELAY_READ=300, DELAY_WRITE=150 -> 85MB/s. +// Values below are a bit more conservative for hw tolerance reasons. +#define DELAY_READ 400 +#define DELAY_WRITE 175 +#define DELAY_PROBE 500 + typedef struct tdDEVICE_CONTEXT_SP605_601 { WORD wDeviceId; WORD wFpgaVersion; + WORD wFpgaStatus; BOOL isPrintTlp; PTLP_CALLBACK_BUF_MRd pMRdBuffer; struct { @@ -130,29 +130,43 @@ VOID Device605_601_Close(_Inout_ PPCILEECH_CONTEXT ctxPcileech) VOID Device605_601_GetDeviceID_FpgaVersion(_In_ PDEVICE_CONTEXT_SP605_601 ctx) { DWORD status; - DWORD cbTX, cbRX, i, dwStatus, dwData; + DWORD cbTX, cbRX, i, j; PBYTE pbRX = LocalAlloc(0, 0x01000000); + DWORD dwStatus, dwData, cdwCfg = 0; + PDWORD pdwData; BYTE pbTX[24] = { // cfg read addr 0 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x77, // cmd msg: version - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, - // mirror msg -> at least something to read back -> no ft601 freeze. - 0xff, 0xee, 0xdd, 0xcc, 0x00, 0x00, 0x01, 0x77 + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x77, + // cmd msg: PCIe status + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x77 }; status = ctx->dev.pfnFT_WritePipe(ctx->dev.hFTDI, 0x02, pbTX, 24, &cbTX, NULL); if(status) { goto fail; } status = ctx->dev.pfnFT_ReadPipe(ctx->dev.hFTDI, 0x82, pbRX, 0x01000000, &cbRX, NULL); - if(status || cbRX < 16) { goto fail; } - for(i = 0; i < cbRX - 7; i += 8) { - dwData = *(PDWORD)(pbRX + i); - dwStatus = *(PDWORD)(pbRX + i + 4); - if(!ctx->wDeviceId && (FPGA_CFG_RX_VALID == (FPGA_CFG_RX_VALID_MASK & dwStatus))) { - ctx->wDeviceId = dwStatus & 0xffff; - } - if(!ctx->wFpgaVersion && (FPGA_CMD_RX_VALID == (FPGA_CMD_RX_VALID_MASK & dwStatus))) { - ctx->wFpgaVersion = dwData & 0xffff; - ENDIAN_SWAP_WORD(ctx->wFpgaVersion); + if(status) { goto fail; } + for(i = 0; i < cbRX; i += 32) { + dwStatus = *(PDWORD)(pbRX + i); + pdwData = (PDWORD)(pbRX + i + 4); + if((dwStatus & 0xf0000000) != 0xe0000000) { continue; } + for(j = 0; j < 7; j++) { + dwData = *pdwData; + if((dwStatus & 0x03) == 0x03) { // CMD REPLY (or filler) + if((dwData >> 24) == FPGA_CMD_VERSION) { // FPGA bitstream version + ctx->wFpgaVersion = (WORD)dwData; + } + if((dwData >> 24) == FPGA_CMD_PCIE_STATUS) { // PCIe status + ctx->wFpgaStatus = (WORD)dwData; + } + } + if((dwStatus & 0x03) == 0x01) { // PCIe CFG REPLY + if(((++cdwCfg % 2) == 0) && (WORD)dwData) { // DeviceID + ctx->wDeviceId = (WORD)dwData; + } + } + pdwData++; + dwStatus >>= 4; } } fail: @@ -198,41 +212,41 @@ BOOL Device605_601_TxTlp(_In_ PDEVICE_CONTEXT_SP605_601 ctx, _In_ PBYTE pbTlp, _ VOID Device605_601_RxTlpSynchronous(_In_ PDEVICE_CONTEXT_SP605_601 ctx) { DWORD status; - DWORD dwTlp, dwStatus; - DWORD i, cdwTlp = 0; + DWORD i, j, cdwTlp = 0; BYTE pbTlp[TLP_RX_MAX_SIZE]; PDWORD pdwTlp = (PDWORD)pbTlp; PDWORD pdwRx = (PDWORD)ctx->rxbuf.pb; - + DWORD dwStatus, *pdwData; status = ctx->dev.pfnFT_ReadPipe(ctx->dev.hFTDI, 0x82, ctx->rxbuf.pb, ctx->rxbuf.cbMax, &ctx->rxbuf.cb, NULL); if(status) { ctx->dev.pfnFT_AbortPipe(ctx->dev.hFTDI, 0x82); return; } - if((ctx->rxbuf.cb % 8) && (ctx->rxbuf.cb > 4)) { - printf("Device Info: SP605 / FT601: Bad read from device. Should not happen!\n"); - return; - } - for(i = 0; i < ctx->rxbuf.cb / sizeof(QWORD); i++) { // index in 64-bit (QWORD) - dwTlp = pdwRx[i << 1]; - dwStatus = pdwRx[1 + (i << 1)]; - if(FPGA_TLP_RX_VALID == (FPGA_TLP_RX_VALID_MASK & dwStatus)) { - pdwTlp[cdwTlp] = dwTlp; - cdwTlp++; - if(cdwTlp >= TLP_RX_MAX_SIZE / sizeof(DWORD)) { return; } - } - if(FPGA_TLP_RX_VALID_LAST == (FPGA_TLP_RX_VALID_LAST_MASK & dwStatus)) { - if(cdwTlp >= 3) { - if(ctx->isPrintTlp) { - TLP_Print(pbTlp, cdwTlp << 2, FALSE); - } - if(ctx->hRxTlpCallbackFn) { - ctx->hRxTlpCallbackFn(ctx->pMRdBuffer, pbTlp, cdwTlp << 2, NULL); + for(i = 0; i < ctx->rxbuf.cb; i += 32) { // index in 64-bit (QWORD) + dwStatus = *(PDWORD)(ctx->rxbuf.pb + i); + pdwData = (PDWORD)(ctx->rxbuf.pb + i + 4); + if((dwStatus & 0xf0000000) != 0xe0000000) { continue; } + for(j = 0; j < 7; j++) { + if((dwStatus & 0x03) == 0x00) { // PCIe TLP + pdwTlp[cdwTlp] = *pdwData; + cdwTlp++; + if(cdwTlp >= TLP_RX_MAX_SIZE / sizeof(DWORD)) { return; } + } + if((dwStatus & 0x07) == 0x04) { // PCIe TLP and LAST + if(cdwTlp >= 3) { + if(ctx->isPrintTlp) { + TLP_Print(pbTlp, cdwTlp << 2, FALSE); + } + if(ctx->hRxTlpCallbackFn) { + ctx->hRxTlpCallbackFn(ctx->pMRdBuffer, pbTlp, cdwTlp << 2, NULL); + } + } else { + printf("Device Info: SP605 / FT601: Bad PCIe TLP received! Should not happen!\n"); } - } else { - printf("Device Info: SP605 / FT601: Bad PCIe TLP received! Should not happen!\n"); + cdwTlp = 0; } - cdwTlp = 0; + pdwData++; + dwStatus >>= 4; } } } @@ -242,7 +256,7 @@ BOOL Device605_601_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwA PDEVICE_CONTEXT_SP605_601 ctx = (PDEVICE_CONTEXT_SP605_601)ctxPcileech->hDevice; TLP_CALLBACK_BUF_MRd rxbuf; DWORD tx[4], o, i; - BOOL is32; + BOOL is32, isFlush; PTLP_HDR_MRdWr64 hdrRd64 = (PTLP_HDR_MRdWr64)tx; PTLP_HDR_MRdWr32 hdrRd32 = (PTLP_HDR_MRdWr32)tx; if(cb > SP605_601_MAX_SIZE_RX) { return FALSE; } @@ -280,10 +294,16 @@ BOOL Device605_601_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwA for(i = 0; i < 4; i++) { ENDIAN_SWAP_DWORD(tx[i]); } - Device605_601_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, TRUE, (o % 0x8000 == 0x7000)); + isFlush = ((o % 0x8000) == 0x7000); + if(isFlush) { + Device605_601_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, FALSE, TRUE); + usleep(DELAY_WRITE); + } else { + Device605_601_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, FALSE, FALSE); + } } Device605_601_TxTlp(ctx, NULL, 0, TRUE, TRUE); - usleep(300); + usleep(DELAY_READ); Device605_601_RxTlpSynchronous(ctx); ctx->pMRdBuffer = NULL; return rxbuf.cb >= rxbuf.cbMax; @@ -340,7 +360,7 @@ VOID Device605_601_ProbeDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qw Device605_601_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, FALSE, (i % 24 == 0)); } Device605_601_TxTlp(ctx, NULL, 0, TRUE, TRUE); - usleep(300); + usleep(DELAY_PROBE); Device605_601_RxTlpSynchronous(ctx); ctx->hRxTlpCallbackFn = NULL; ctx->pMRdBuffer = NULL; @@ -445,7 +465,7 @@ BOOL Device605_601_Open(_Inout_ PPCILEECH_CONTEXT ctxPcileech) if(!ctx->dev.hFTDI) { goto fail; } Device605_601_GetDeviceID_FpgaVersion(ctx); if(!ctx->wDeviceId) { goto fail; } - ctx->rxbuf.cbMax = (DWORD)(2.3 * SP605_601_MAX_SIZE_RX); // buffer size tuned to lowest possible (+margin) for performance. + ctx->rxbuf.cbMax = (DWORD)(1.25 * SP605_601_MAX_SIZE_RX + 0x1000); // buffer size tuned to lowest possible (+margin) for performance. ctx->rxbuf.pb = LocalAlloc(0, ctx->rxbuf.cbMax); if(!ctx->rxbuf.pb) { goto fail; } ctx->txbuf.cbMax = SP605_601_MAX_SIZE_TX + 0x10000; @@ -478,7 +498,7 @@ BOOL Device605_601_Open(_Inout_ PPCILEECH_CONTEXT ctxPcileech) BOOL Device605_601_Open(_Inout_ PPCILEECH_CONTEXT ctx) { - if(ctx->cfg->dev.tp == PCILEECH_DEVICE_SP605_UART) { + if(ctx->cfg->dev.tp == PCILEECH_DEVICE_SP605_FT601) { printf("SP605 / FT601: Failed. Device currently only supported in PCILeech for Windows."); } return FALSE; diff --git a/pcileech/device605_tcp.c b/pcileech/device605_tcp.c index f627647..fff9dc9 100644 --- a/pcileech/device605_tcp.c +++ b/pcileech/device605_tcp.c @@ -5,6 +5,7 @@ #ifdef WIN32 #include +#include #pragma comment(lib, "ws2_32.lib") @@ -59,7 +60,7 @@ PCIE_CTL; #define TLP_RX_SIZE 128 #define TLP_RX_MAX_SIZE 1024 -#define SP605_PROBE_MAXPAGES 1024 +#define SP605_PROBE_MAXPAGES 1 #define SP605_TCP_MAX_SIZE_RX 0x00001000 #define SP605_TCP_MAX_SIZE_TX 0x00001000 @@ -157,7 +158,7 @@ BOOL Device605_TCP_TxTlp(_In_ PDEVICE_CONTEXT_SP605_TCP ctx, _In_ PBYTE pbTlp, _ } // prepare transmit buffer pbTx = ctx->txbuf.pb + ctx->txbuf.cb; - cbTx = sizeof(PCIE_CTL) * cbTlp; + cbTx = sizeof(PCIE_CTL) * (cbTlp / sizeof(DWORD)); for (Tx = (PCIE_CTL *)pbTx, i = 0; i < cbTlp; Tx++, i += 4) { Tx->data = ENDIAN_SWAP_DWORD(*(PDWORD)(pbTlp + i)); Tx->flags = PCIE_F_HAS_DATA; @@ -170,7 +171,7 @@ BOOL Device605_TCP_TxTlp(_In_ PDEVICE_CONTEXT_SP605_TCP ctx, _In_ PBYTE pbTlp, _ // transmit if (ctx->txbuf.cb && (fFlush || (ctx->txbuf.cb > ctx->txbuf.cbMax - 0x1000))) { while (Total < ctx->txbuf.cb) { - len = send(ctx->Sock, (const char *)ctx->txbuf.pb + Total, ctx->txbuf.cb - Total, 0); + len = send(ctx->Sock, (const char *)(ctx->txbuf.pb + Total), ctx->txbuf.cb - Total, 0); if (len == 0 || len == SOCKET_ERROR) { fprintf(stderr, "ERROR: send() fails\n"); return FALSE; @@ -182,41 +183,33 @@ BOOL Device605_TCP_TxTlp(_In_ PDEVICE_CONTEXT_SP605_TCP ctx, _In_ PBYTE pbTlp, _ return TRUE; } -BOOL Device605_TCP_RxTlpSynchronous(_In_ PDEVICE_CONTEXT_SP605_TCP ctx) +VOID Device605_TCP_RxTlpSynchronous(_In_ PDEVICE_CONTEXT_SP605_TCP ctx) { DWORD i = 0, cdwTlp = 0, Total = 0, len; - PCIE_CTL Rx, Tx; + PCIE_CTL *pRx, Tx; BYTE pbTlp[TLP_RX_MAX_SIZE]; PDWORD pdwTlp = (PDWORD)pbTlp; - PDWORD pdwRx = (PDWORD)ctx->rxbuf.pb; + //PDWORD pdwRx = (PDWORD)ctx->rxbuf.pb; + // Request Replies Tx.flags = PCIE_F_RECV_REPLY | PCIE_F_TIMEOUT; Tx.data = 0; - while (Total < sizeof(Tx)) { - len = send(ctx->Sock, (const char *)&Tx + Total, sizeof(Tx) - Total, 0); - if (len == 0 || len == SOCKET_ERROR) { - fprintf(stderr, "ERROR: send() fails\n"); - return FALSE; - } - Total += len; + len = send(ctx->Sock, (const char *)&Tx, sizeof(Tx), 0); + if(len == 0 || len == SOCKET_ERROR) { + fprintf(stderr, "ERROR: send() fails\n"); + return; } - while (cdwTlp < TLP_RX_MAX_SIZE / sizeof(DWORD)) { - Total = 0; - while (Total < sizeof(Rx)) { - len = recv(ctx->Sock, (char *)&Rx + Total, sizeof(Rx) - Total, 0); - if (len == 0 || len == SOCKET_ERROR) { - fprintf(stderr, "ERROR: recv() fails\n"); - return FALSE; - } - Total += len; - } - if (Rx.flags & PCIE_F_ERROR) { + // Receive Data + ctx->rxbuf.cb = recv(ctx->Sock, ctx->rxbuf.pb, ctx->rxbuf.cbMax, 0); + pRx = (PCIE_CTL*)ctx->rxbuf.pb; + for(i = 0; i < ctx->rxbuf.cb; i += sizeof(PCIE_CTL)) { + if(pRx->flags & PCIE_F_ERROR) { fprintf(stderr, "ERROR: failed to receive TLP\n"); - return FALSE; + return; } - if (!(Rx.flags & PCIE_F_HAS_DATA)) { return FALSE; } - pdwTlp[cdwTlp] = ENDIAN_SWAP_DWORD(Rx.data); + if(!(pRx->flags & PCIE_F_HAS_DATA)) { return; } + pdwTlp[cdwTlp] = ENDIAN_SWAP_DWORD(pRx->data); cdwTlp++; - if (Rx.flags & PCIE_F_TLAST) { + if(pRx->flags & PCIE_F_TLAST) { if (cdwTlp >= 3) { if (ctx->isPrintTlp) { TLP_Print(pbTlp, cdwTlp << 2, FALSE); @@ -224,15 +217,14 @@ BOOL Device605_TCP_RxTlpSynchronous(_In_ PDEVICE_CONTEXT_SP605_TCP ctx) if (ctx->hRxTlpCallbackFn) { ctx->hRxTlpCallbackFn(ctx->pMRdBuffer, pbTlp, cdwTlp << 2, NULL); } - } - else { + } else { fprintf(stderr, "WARNING: BAD PCIe TLP RECEIVED! THIS SHOULD NOT HAPPEN!\n"); - return FALSE; + return; } - break; + cdwTlp = 0; } + pRx++; } - return TRUE; } BOOL Device605_TCP_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb) @@ -250,11 +242,10 @@ BOOL Device605_TCP_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwA // prepare ctx->pMRdBuffer = &rxbuf; ctx->hRxTlpCallbackFn = TLP_CallbackMRd; + rxbuf.cb = 0; + rxbuf.pb = pb; // transmit TLPs while (o < cb) { - rxbuf.cb = 0; - rxbuf.pb = pb + o; - rxbuf.cbMax = TLP_RX_SIZE; memset(tx, 0, 16); is32 = qwAddr + o < 0x100000000; if (is32) { @@ -279,22 +270,16 @@ BOOL Device605_TCP_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwA for (i = 0; i < 4; i++) { ENDIAN_SWAP_DWORD(tx[i]); } - if (!Device605_TCP_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, TRUE) || - !Device605_TCP_RxTlpSynchronous(ctx)) { - ctx->hRxTlpCallbackFn = NULL; - ctx->pMRdBuffer = NULL; - return FALSE; + if (!Device605_TCP_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, TRUE)) { + break; } - if (rxbuf.cb == 0) { - ctx->hRxTlpCallbackFn = NULL; - ctx->pMRdBuffer = NULL; - return FALSE; - } - o += rxbuf.cb; + o += TLP_RX_SIZE; + rxbuf.cbMax = o; + Device605_TCP_RxTlpSynchronous(ctx); } ctx->hRxTlpCallbackFn = NULL; - ctx->pMRdBuffer = NULL; - return TRUE; + ctx->pMRdBuffer = NULL; + return rxbuf.cb >= cb; } VOID Device605_TCP_ProbeDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwAddr, _In_ DWORD cPages, _Out_ __bcount(cPages) PBYTE pbResultMap) @@ -346,11 +331,10 @@ VOID Device605_TCP_ProbeDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qw for (j = 0; j < 4; j++) { ENDIAN_SWAP_DWORD(tx[j]); } - if(!Device605_TCP_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, TRUE) || !Device605_TCP_RxTlpSynchronous(ctx)) { - goto err; - } - } -err: + Device605_TCP_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, FALSE); + } + Device605_TCP_TxTlp(ctx, NULL, 0, TRUE); + Device605_TCP_RxTlpSynchronous(ctx); ctx->hRxTlpCallbackFn = NULL; ctx->pMRdBuffer = NULL; } @@ -433,9 +417,7 @@ BOOL Device605_TCP_ListenTlp(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ DWORD d return FALSE; } Sleep(10); - if (!Device605_TCP_RxTlpSynchronous(ctx)) { - return FALSE; - } + Device605_TCP_RxTlpSynchronous(ctx); } return TRUE; } @@ -468,7 +450,7 @@ BOOL Device605_TCP_Open(_Inout_ PPCILEECH_CONTEXT ctxPcileech) if (!ctx->Sock) { goto fail; } ctx->wDeviceId = Device605_TCP_GetDeviceID(ctx); if (!ctx->wDeviceId) { goto fail; } - ctx->rxbuf.cbMax = (DWORD)(2.3 * SP605_TCP_MAX_SIZE_RX); + ctx->rxbuf.cbMax = (DWORD)(1.5 * SP605_TCP_MAX_SIZE_RX * 0x1000); ctx->rxbuf.pb = LocalAlloc(0, ctx->rxbuf.cbMax); if (!ctx->rxbuf.pb) { goto fail; } ctx->txbuf.cbMax = SP605_TCP_MAX_SIZE_TX + 0x10000; diff --git a/pcileech/device605_uart.c b/pcileech/device605_uart.c deleted file mode 100644 index 312d3e6..0000000 --- a/pcileech/device605_uart.c +++ /dev/null @@ -1,413 +0,0 @@ -// device605_uart.c : implementation related to the Xilinx SP605 dev board flashed with @d_olex early access bitstream. (UART communication). -// -// (c) Ulf Frisk, 2017 -// Author: Ulf Frisk, pcileech@frizk.net -// -#ifdef WIN32 - -#include "device605_uart.h" -#include "device.h" -#include "tlp.h" - -//------------------------------------------------------------------------------- -// SP605 defines below. -//------------------------------------------------------------------------------- - -#define COM_PORT_CFG "COM4" -#define COM_PORT_PCIE "COM3" -#define SP605_STATUS_TX_CONT 0x000000c0 -#define SP605_STATUS_TX_END 0x010000c0 -#define SP605_STATUS_MASK_VALID 0x00000080 -#define SP605_STATUS_MASK_END 0x01000000 -#define SP605_COM_TIMEOUT 100 // milliseconds -#define SP605_READ_TIMEOUT 500 // milliseconds -#define SP605_PROBE_TIMEOUT 350 // milliseconds -#define SP605_PROBE_MAXPAGES 1024 - -#define ENDIAN_SWAP_DWORD(x) (x = (x << 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x >> 24)) - -typedef struct tdDEVICE_CONTEXT_SP605 { - HANDLE hCommCfg; - HANDLE hCommPcie; - HANDLE hThreadRx; - WORD wDeviceId; - BOOL isTerminateThreadRx; - BOOL isPrintTlp; - OVERLAPPED oTx; - OVERLAPPED oRx; - OVERLAPPED oCfg; - HANDLE hRxBufferEvent; - PTLP_CALLBACK_BUF_MRd pMRdBuffer; - BOOL(*hRxTlpCallbackFn)(_Inout_ PTLP_CALLBACK_BUF_MRd pBufferMrd, _In_ PBYTE pb, _In_ DWORD cb, _In_opt_ HANDLE hEventCompleted); -} DEVICE_CONTEXT_SP605, *PDEVICE_CONTEXT_SP605; - -//------------------------------------------------------------------------------- -// SP605 implementation below. -//------------------------------------------------------------------------------- - -VOID Device605_UART_Close(_Inout_ PPCILEECH_CONTEXT ctx) -{ - PDEVICE_CONTEXT_SP605 ctx605 = (PDEVICE_CONTEXT_SP605)ctx->hDevice; - if(!ctx605) { return; } - if(ctx605->hThreadRx) { - ctx605->isTerminateThreadRx = TRUE; - WaitForSingleObject(ctx605->hThreadRx, INFINITE); - } - if(ctx605->hRxBufferEvent) { - WaitForSingleObject(ctx605->hRxBufferEvent, INFINITE); - while(ctx605->pMRdBuffer) { SwitchToThread(); } - CloseHandle(ctx605->hRxBufferEvent); - } - if(ctx605->hCommCfg) { CloseHandle(ctx605->hCommCfg); } - if(ctx605->hCommPcie) { CloseHandle(ctx605->hCommPcie); } - if(ctx605->oTx.hEvent) { CloseHandle(ctx605->oTx.hEvent); }; - if(ctx605->oRx.hEvent) { CloseHandle(ctx605->oRx.hEvent); }; - if(ctx605->oCfg.hEvent) { CloseHandle(ctx605->oCfg.hEvent); }; - LocalFree(ctx605); - ctx->hDevice = 0; -} - -HANDLE Device605_UART_Open_COM(_In_ LPSTR szCOM) -{ - DCB dcb = { 0 }; - HANDLE hComm; - dcb.DCBlength = sizeof(DCB); - if(!BuildCommDCBW(L"921600,n,8,1", &dcb)) { return 0; } - hComm = CreateFileA(szCOM, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); - if(hComm == INVALID_HANDLE_VALUE) { return 0; } - if(!SetCommState(hComm, &dcb)) { - CloseHandle(hComm); - return 0; - } - return hComm; -} - -WORD Device605_UART_GetDeviceID(_In_ PDEVICE_CONTEXT_SP605 ctx605) -{ - DWORD dw, txrx[] = { 0x00000000, 0x00000000 }; - if(!WriteFile(ctx605->hCommCfg, txrx, sizeof(txrx), &dw, &ctx605->oCfg)) { - if(ERROR_IO_PENDING != GetLastError()) { return 0; } - if(WAIT_TIMEOUT == WaitForSingleObject(ctx605->oCfg.hEvent, SP605_COM_TIMEOUT)) { return 0; } - } - if(!ReadFile(ctx605->hCommCfg, txrx, sizeof(txrx), &dw, &ctx605->oCfg)) { - if(ERROR_IO_PENDING != GetLastError()) { return 0; } - if(WAIT_TIMEOUT == WaitForSingleObject(ctx605->oCfg.hEvent, SP605_COM_TIMEOUT)) { return 0; } - if(!GetOverlappedResult(ctx605->hCommCfg, &ctx605->oCfg, &dw, FALSE)) { return 0; } - } - return (WORD)_byteswap_ulong(txrx[0]); -} - -BOOL Device605_UART_TxTlp(_In_ PDEVICE_CONTEXT_SP605 ctx605, _In_ PBYTE pbTlp, _In_ DWORD cbTlp) -{ - DWORD pdwTx[1024], cTx, i, dwTxed; - if(!cbTlp) { return TRUE; } - if((cbTlp & 0x3) || (cbTlp > 2048)) { return FALSE; } - if(ctx605->isPrintTlp) { - TLP_Print(pbTlp, cbTlp, TRUE); - } - // prepare transmit buffer - cTx = cbTlp >> 1; - for(i = 0; i < cTx; i += 2) { - pdwTx[i] = SP605_STATUS_TX_CONT; - pdwTx[i + 1] = *(PDWORD)(pbTlp + (i << 1)); - } - pdwTx[cTx - 2] = SP605_STATUS_TX_END; - // transmit - return - WriteFile(ctx605->hCommPcie, pdwTx, cTx << 2, &dwTxed, &ctx605->oTx) || - (GetLastError() == ERROR_IO_PENDING && GetOverlappedResult(ctx605->hCommPcie, &ctx605->oTx, &dwTxed, TRUE)); -} - -VOID Device605_UART_RxTlp_Thread(_In_ PDEVICE_CONTEXT_SP605 ctx605) -{ - DWORD rx[2], dwTlp[1024], cbRead, dwResult, cdwTlp = 0; - while(!ctx605->isTerminateThreadRx) { - if(!ReadFile(ctx605->hCommPcie, rx, 2 * sizeof(DWORD), &cbRead, &ctx605->oRx)) { - if(GetLastError() != ERROR_IO_PENDING) { goto fail; } - while(TRUE) { - dwResult = WaitForSingleObject(ctx605->oRx.hEvent, SP605_COM_TIMEOUT); - if(ctx605->isTerminateThreadRx) { goto fail; } - if(dwResult == WAIT_OBJECT_0) { break; } - if(dwResult == WAIT_TIMEOUT) { continue; } - ctx605->isTerminateThreadRx = TRUE; - return; - } - if(!GetOverlappedResult(ctx605->hCommPcie, &ctx605->oRx, &cbRead, FALSE)) { goto fail; } - } - if(!(rx[0] & SP605_STATUS_MASK_VALID)) { goto fail; } - dwTlp[cdwTlp] = rx[1]; - cdwTlp++; - if(rx[0] & SP605_STATUS_MASK_END) { - if(cdwTlp >= 3) { - if(ctx605->isPrintTlp) { - TLP_Print((PBYTE)dwTlp, cdwTlp << 2, FALSE); - } - if(ctx605->hRxTlpCallbackFn && ctx605->pMRdBuffer) { - ctx605->hRxTlpCallbackFn(ctx605->pMRdBuffer, (PBYTE)dwTlp, cdwTlp << 2, ctx605->hRxBufferEvent); - } - } - cdwTlp = 0; - } - if(cdwTlp >= 1024) { goto fail; } - } -fail: - ctx605->isTerminateThreadRx = TRUE; -} - -BOOL Device605_UART_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb) -{ - PDEVICE_CONTEXT_SP605 ctx605 = (PDEVICE_CONTEXT_SP605)ctx->hDevice; - TLP_CALLBACK_BUF_MRd rxbuf; - DWORD tx[4], o, i; - BOOL is32; - PTLP_HDR_MRdWr64 hdrRd64 = (PTLP_HDR_MRdWr64)tx; - PTLP_HDR_MRdWr32 hdrRd32 = (PTLP_HDR_MRdWr32)tx; - if(cb > 0x00004000) { return FALSE; } - if(qwAddr % 0x1000) { return FALSE; } - if((cb >= 0x1000) && (cb % 0x1000)) { return FALSE; } - if((cb < 0x1000) && (cb % 0x8)) { return FALSE; } - // prepare - rxbuf.cb = 0; - rxbuf.pb = pb; - rxbuf.cbMax = cb; - ctx605->pMRdBuffer = &rxbuf; - ResetEvent(ctx605->hRxBufferEvent); - ctx605->hRxTlpCallbackFn = TLP_CallbackMRd; - // transmit TLPs - for(o = 0; o < cb; o += 0x1000) { - memset(tx, 0, 16); - is32 = qwAddr + o < 0x100000000; - if(is32) { - hdrRd32->h.TypeFmt = TLP_MRd32; - hdrRd32->h.Length = (WORD)((cb < 0x1000) ? cb >> 2 : 0); - hdrRd32->RequesterID = ctx605->wDeviceId; - hdrRd32->Tag = (BYTE)(o >> 12); - hdrRd32->FirstBE = 0xf; - hdrRd32->LastBE = 0xf; - hdrRd32->Address = (DWORD)(qwAddr + o); - } else { - hdrRd64->h.TypeFmt = TLP_MRd64; - hdrRd64->h.Length = (WORD)((cb < 0x1000) ? cb >> 2 : 0); - hdrRd64->RequesterID = ctx605->wDeviceId; - hdrRd64->Tag = (BYTE)(o >> 12); - hdrRd64->FirstBE = 0xf; - hdrRd64->LastBE = 0xf; - hdrRd64->AddressHigh = (DWORD)((qwAddr + o) >> 32); - hdrRd64->AddressLow = (DWORD)(qwAddr + o); - } - for(i = 0; i < 4; i++) { - ENDIAN_SWAP_DWORD(tx[i]); - } - Device605_UART_TxTlp(ctx605, (PBYTE)tx, is32 ? 12 : 16); - } - // wait for result - WaitForSingleObject(ctx605->hRxBufferEvent, SP605_READ_TIMEOUT); - ctx605->hRxTlpCallbackFn = NULL; - ctx605->pMRdBuffer = NULL; - SetEvent(ctx605->hRxBufferEvent); - return rxbuf.cb >= rxbuf.cbMax; -} - -VOID Device605_UART_ProbeDMA(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _In_ DWORD cPages, _Out_ __bcount(cPages) PBYTE pbResultMap) -{ - DWORD i, j; - PDEVICE_CONTEXT_SP605 ctx605 = (PDEVICE_CONTEXT_SP605)ctx->hDevice; - TLP_CALLBACK_BUF_MRd rxbuf; - DWORD tx[4]; - BOOL is32; - PTLP_HDR_MRdWr64 hdrRd64 = (PTLP_HDR_MRdWr64)tx; - PTLP_HDR_MRdWr32 hdrRd32 = (PTLP_HDR_MRdWr32)tx; - // split probe into processing chunks if too large... - while(cPages > SP605_PROBE_MAXPAGES) { - Device605_UART_ProbeDMA(ctx, qwAddr, SP605_PROBE_MAXPAGES, pbResultMap); - cPages -= SP605_PROBE_MAXPAGES; - pbResultMap += SP605_PROBE_MAXPAGES; - qwAddr += SP605_PROBE_MAXPAGES << 12; - } - memset(pbResultMap, 0, cPages); - // prepare - rxbuf.cb = 0; - rxbuf.pb = pbResultMap; - rxbuf.cbMax = cPages; - ctx605->pMRdBuffer = &rxbuf; - ResetEvent(ctx605->hRxBufferEvent); - ctx605->hRxTlpCallbackFn = TLP_CallbackMRdProbe; - // transmit TLPs - for(i = 0; i < cPages; i++) { - memset(tx, 0, 16); - is32 = qwAddr + (i << 12) < 0x100000000; - if(is32) { - hdrRd32->h.TypeFmt = TLP_MRd32; - hdrRd32->h.Length = 1; - hdrRd32->RequesterID = ctx605->wDeviceId; - hdrRd32->FirstBE = 0xf; - hdrRd32->LastBE = 0; - hdrRd32->Address = (DWORD)(qwAddr + (i << 12) + ((i & 0x1f) << 2)); // 5 low address bits coded into the dword read. - hdrRd32->Tag = (BYTE)((i >> 5) & 0x1f); // 5 high address bits coded into tag. - } else { - hdrRd64->h.TypeFmt = TLP_MRd64; - hdrRd64->h.Length = 1; - hdrRd64->RequesterID = ctx605->wDeviceId; - hdrRd64->FirstBE = 0xf; - hdrRd64->LastBE = 0; - hdrRd64->AddressHigh = (DWORD)((qwAddr + (i << 12)) >> 32); - hdrRd64->AddressLow = (DWORD)(qwAddr + (i << 12) + ((i & 0x1f) << 2)); // 5 low address bits coded into the dword read. - hdrRd64->Tag = (BYTE)((i >> 5) & 0x1f); // 5 high address bits coded into tag. - } - for(j = 0; j < 4; j++) { - ENDIAN_SWAP_DWORD(tx[j]); - } - Device605_UART_TxTlp(ctx605, (PBYTE)tx, is32 ? 12 : 16); - } - // wait for result - WaitForSingleObject(ctx605->hRxBufferEvent, SP605_PROBE_TIMEOUT); - ctx605->hRxTlpCallbackFn = NULL; - ctx605->pMRdBuffer = NULL; - SetEvent(ctx605->hRxBufferEvent); -} - -BOOL Device605_UART_WriteDMA_TXP(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwA, _In_ BYTE bFirstBE, _In_ BYTE bLastBE, _In_ PBYTE pb, _In_ DWORD cb) -{ - PDEVICE_CONTEXT_SP605 ctx605 = (PDEVICE_CONTEXT_SP605)ctx->hDevice; - DWORD txbuf[36], i, cbTlp; - PBYTE pbTlp = (PBYTE)txbuf; - PTLP_HDR_MRdWr32 hdrWr32 = (PTLP_HDR_MRdWr32)txbuf; - PTLP_HDR_MRdWr64 hdrWr64 = (PTLP_HDR_MRdWr64)txbuf; - memset(pbTlp, 0, 16); - if(qwA < 0x100000000) { - hdrWr32->h.TypeFmt = TLP_MWr32; - hdrWr32->h.Length = (WORD)(cb + 3) >> 2; - hdrWr32->FirstBE = bFirstBE; - hdrWr32->LastBE = bLastBE; - hdrWr32->RequesterID = ctx605->wDeviceId; - hdrWr32->Address = (DWORD)qwA; - for(i = 0; i < 3; i++) { - ENDIAN_SWAP_DWORD(txbuf[i]); - } - memcpy(pbTlp + 12, pb, cb); - cbTlp = (12 + cb + 3) & ~0x3; - } else { - hdrWr64->h.TypeFmt = TLP_MWr64; - hdrWr64->h.Length = (WORD)(cb + 3) >> 2; - hdrWr64->FirstBE = bFirstBE; - hdrWr64->LastBE = bLastBE; - hdrWr64->RequesterID = ctx605->wDeviceId; - hdrWr64->AddressHigh = (DWORD)(qwA >> 32); - hdrWr64->AddressLow = (DWORD)qwA; - for(i = 0; i < 4; i++) { - ENDIAN_SWAP_DWORD(txbuf[i]); - } - memcpy(pbTlp + 16, pb, cb); - cbTlp = (16 + cb + 3) & ~0x3; - } - return Device605_UART_TxTlp(ctx605, pbTlp, cbTlp); -} - -BOOL Device605_UART_WriteDMA(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwA, _In_ PBYTE pb, _In_ DWORD cb) -{ - BOOL result = TRUE; - BYTE be, pbb[4]; - DWORD cbtx; - if(cb > 0x00004000) { return FALSE; } - // TX 1st dword if not aligned - if(cb && (qwA & 0x3)) { - be = (cb < 3) ? (0xf >> (4 - cb)) : 0xf; - be <<= qwA & 0x3; - cbtx = min(cb, 4 - (qwA & 0x3)); - memcpy(pbb + (qwA & 0x3), pb, cbtx); - result = Device605_UART_WriteDMA_TXP(ctx, qwA & ~0x3, be, 0, pbb, 4); - pb += cbtx; - cb -= cbtx; - qwA += cbtx; - } - // TX as 128-byte packets (aligned to 128-byte boundaries) - while(result && cb) { - cbtx = min(128 - (qwA & 0x7f), cb); - be = (cbtx & 0x3) ? (0xf >> (4 - (cbtx & 0x3))) : 0xf; - result = (cbtx <= 4) ? - Device605_UART_WriteDMA_TXP(ctx, qwA, be, 0, pb, 4) : - Device605_UART_WriteDMA_TXP(ctx, qwA, 0xf, be, pb, cbtx); - pb += cbtx; - cb -= cbtx; - qwA += cbtx; - } - return result; -} - -BOOL Device605_UART_ListenTlp(_Inout_ PPCILEECH_CONTEXT ctx, _In_ DWORD dwTime) -{ - Sleep(dwTime); - return TRUE; -} - -BOOL Device605_UART_WriteTlp(_Inout_ PPCILEECH_CONTEXT ctx, _In_ PBYTE pbTlp, _In_ DWORD cbTlp) -{ - return Device605_UART_TxTlp((PDEVICE_CONTEXT_SP605)ctx->hDevice, pbTlp, cbTlp); -} - -BOOL Device605_UART_Open(_Inout_ PPCILEECH_CONTEXT ctx) -{ - DWORD i; - CHAR szCOM[] = { 'C', 'O', 'M', 'x', 0 }; - PDEVICE_CONTEXT_SP605 ctx605; - ctx605 = LocalAlloc(LMEM_ZEROINIT, sizeof(DEVICE_CONTEXT_SP605)); - if(!ctx605) { return FALSE; } - ctx->hDevice = (HANDLE)ctx605; - // open COM ports - for(i = 1; i <= 9; i++) { - szCOM[3] = (CHAR)('0' + i); - if(!ctx605->hCommPcie) { - ctx605->hCommPcie = Device605_UART_Open_COM(szCOM); - } else { - ctx605->hCommCfg = Device605_UART_Open_COM(szCOM); - if(ctx605->hCommCfg) { break; } - } - } - if(!ctx605->hCommPcie || !ctx605->hCommCfg) { goto fail; } - SetupComm(ctx605->hCommPcie, 0x8000, 0x8000); - ctx605->oTx.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if(!ctx605->oTx.hEvent) { goto fail; } - ctx605->oRx.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if(!ctx605->oRx.hEvent) { goto fail; } - ctx605->oCfg.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if(!ctx605->oCfg.hEvent) { goto fail; } - ctx605->hRxBufferEvent = CreateEvent(NULL, TRUE, TRUE, NULL); - if(!ctx605->hRxBufferEvent) { goto fail; } - ctx605->wDeviceId = Device605_UART_GetDeviceID(ctx605); - if(!ctx605->wDeviceId) { goto fail; } - ctx605->isPrintTlp = ctx->cfg->fVerboseExtra; - ctx605->hThreadRx = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Device605_UART_RxTlp_Thread, ctx605, 0, NULL); // start rx thread, must be last in open - if(!ctx605->hThreadRx) { goto fail; } - // set callback functions and fix up config - ctx->cfg->dev.tp = PCILEECH_DEVICE_SP605_UART; - ctx->cfg->dev.qwMaxSizeDmaIo = 0x4000; - ctx->cfg->dev.qwAddrMaxNative = 0x0000ffffffffffff; - ctx->cfg->dev.fPartialPageReadSupported = TRUE; - ctx->cfg->dev.pfnClose = Device605_UART_Close; - ctx->cfg->dev.pfnProbeDMA = Device605_UART_ProbeDMA; - ctx->cfg->dev.pfnReadDMA = Device605_UART_ReadDMA; - ctx->cfg->dev.pfnWriteDMA = Device605_UART_WriteDMA; - ctx->cfg->dev.pfnWriteTlp = Device605_UART_WriteTlp; - ctx->cfg->dev.pfnListenTlp = Device605_UART_ListenTlp; - // return - if(ctx->cfg->fVerbose) { printf("Device Info: SP605 / UART.\n"); } - return TRUE; -fail: - Device605_UART_Close(ctx); - return FALSE; -} - -#endif /* WIN32 */ -#if defined(LINUX) || defined(ANDROID) - -#include "device605_uart.h" - -BOOL Device605_UART_Open(_Inout_ PPCILEECH_CONTEXT ctx) -{ - if(ctx->cfg->dev.tp == PCILEECH_DEVICE_SP605_UART) { - printf("SP605 / UART: Failed. Device currently only supported in PCILeech for Windows."); - } - return FALSE; -} - -#endif /* LINUX || ANDROID */ diff --git a/pcileech/device605_uart.h b/pcileech/device605_uart.h deleted file mode 100644 index 9496bc7..0000000 --- a/pcileech/device605_uart.h +++ /dev/null @@ -1,17 +0,0 @@ -// device605_uart.h : definitions related to the Xilinx SP605 dev board flashed with @d_olex early access bitstream. (UART communication). -// -// (c) Ulf Frisk, 2017 -// Author: Ulf Frisk, pcileech@frizk.net -// -#ifndef __DEVICE605_UART_H__ -#define __DEVICE605_UART_H__ -#include "pcileech.h" - -/* -* Open a connection to the SP605/UART PCILeech flashed device. -* -- ctx -* -- result -*/ -BOOL Device605_UART_Open(_Inout_ PPCILEECH_CONTEXT ctx); - -#endif /* __DEVICE605_UART_H__ */ diff --git a/pcileech/help.c b/pcileech/help.c index 4752f27..0f3793f 100644 --- a/pcileech/help.c +++ b/pcileech/help.c @@ -91,7 +91,7 @@ VOID Help_ShowGeneral() " Wait occurs after any other actions have been completed. \n" \ " -device: force the use of a specific hardware device instead of auto-detect.\n" \ " Affects all modes and commands. \n" \ - " Valid options: USB3380, SP605_UART, SP605_FT601, SP605_TCP \n" \ + " Valid options: USB3380, SP605_FT601, SP605_TCP \n" \ " -device-addr: Remote address for -device SP605_TCP. \n" \ " -device-port: Remote TCP port for -device SP605_TCP. Default value: 28472. \n" \ " -help: show help about the selected command or implant and then exit \n" \ @@ -140,7 +140,7 @@ VOID Help_ShowInfo() printf( " PCILEECH INFORMATION \n" \ " PCILeech (c) 2016, 2017 Ulf Frisk \n" \ - " Version: 2.4 \n" \ + " Version: 2.5 \n" \ " License: GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 \n" \ " Contact information: pcileech@frizk.net \n" \ " System requirements: 64-bit Windows 7, 10 or Linux. \n" \ diff --git a/pcileech/kmd.c b/pcileech/kmd.c index 382e576..a97fe3a 100644 --- a/pcileech/kmd.c +++ b/pcileech/kmd.c @@ -392,13 +392,11 @@ QWORD KMD_Linux48KernelBaseSeek(_Inout_ PPCILEECH_CONTEXT ctx) // assumed to end with 0x100 0x00's. for(; qwA <= qwAddrMax; qwA += 0x00200000) { ps.qwAddr = qwA; - // only read partial page to speed up SP605 if connected via UART - // TODO: investigate if this is slower/faster than reading whole pages on FPGA solution. if(!DeviceReadDMA(ctx, qwA, pb, ctx->cfg->fPartialPageReadSupported ? 0x400 : 0x1000, 0)) { - ps.cPageFail += 512; + PageStatUpdate(&ps, qwA, 0, 512); continue; } - ps.cPageSuccess += 512; + PageStatUpdate(&ps, qwA, 512, 0); // Search for GenuineIntel and AuthenticAMD strings. isGenuineIntel = isAuthenticAMD = FALSE; for(i = 0; i < 0x400; i++) { diff --git a/pcileech/pcileech.c b/pcileech/pcileech.c index 635d248..06a0c44 100644 --- a/pcileech/pcileech.c +++ b/pcileech/pcileech.c @@ -118,8 +118,6 @@ BOOL PCILeechConfigIntialize(_In_ DWORD argc, _In_ char* argv[], _Inout_ PPCILEE ctx->cfg->dev.tp = PCILEECH_DEVICE_NA; if(0 == _stricmp(argv[i + 1], "usb3380")) { ctx->cfg->dev.tp = PCILEECH_DEVICE_USB3380; - } else if(0 == _stricmp(argv[i + 1], "sp605_uart")) { - ctx->cfg->dev.tp = PCILEECH_DEVICE_SP605_UART; } else if(0 == _stricmp(argv[i + 1], "sp605_ft601")) { ctx->cfg->dev.tp = PCILEECH_DEVICE_SP605_FT601; } else if(0 == _stricmp(argv[i + 1], "sp605_tcp")) { diff --git a/pcileech/pcileech.h b/pcileech/pcileech.h index f556eb8..9769433 100644 --- a/pcileech/pcileech.h +++ b/pcileech/pcileech.h @@ -47,7 +47,6 @@ typedef enum tdActionType { typedef enum tdPCILEECH_DEVICE_TYPE { PCILEECH_DEVICE_NA, PCILEECH_DEVICE_USB3380, - PCILEECH_DEVICE_SP605_UART, PCILEECH_DEVICE_SP605_FT601, PCILEECH_DEVICE_SP605_TCP } PCILEECH_DEVICE_TYPE; diff --git a/pcileech/pcileech.vcxproj b/pcileech/pcileech.vcxproj index b0335d9..a64e37f 100644 --- a/pcileech/pcileech.vcxproj +++ b/pcileech/pcileech.vcxproj @@ -87,7 +87,6 @@ - @@ -108,7 +107,6 @@ - diff --git a/pcileech/pcileech.vcxproj.filters b/pcileech/pcileech.vcxproj.filters index f413df9..17d6a0a 100644 --- a/pcileech/pcileech.vcxproj.filters +++ b/pcileech/pcileech.vcxproj.filters @@ -69,9 +69,6 @@ Header Files - - Header Files - Header Files @@ -122,9 +119,6 @@ Source Files - - Source Files - Source Files diff --git a/pcileech/tlp.c b/pcileech/tlp.c index ead02d8..8258597 100644 --- a/pcileech/tlp.c +++ b/pcileech/tlp.c @@ -9,54 +9,98 @@ VOID TLP_Print(_In_ PBYTE pbTlp, _In_ DWORD cbTlp, _In_ BOOL isTx) { DWORD i; + LPSTR tp = ""; BYTE pb[0x1000]; PDWORD buf = (PDWORD)pb; PTLP_HDR hdr = (PTLP_HDR)pb; PTLP_HDR_CplD hdrC; PTLP_HDR_MRdWr32 hdrM32; PTLP_HDR_MRdWr64 hdrM64; + PTLP_HDR_Cfg hdrCfg; if(cbTlp < 12 || cbTlp > 0x1000 || cbTlp & 0x3) { return; } for(i = 0; i < cbTlp; i += 4) { buf[i >> 2] = _byteswap_ulong(*(PDWORD)(pbTlp + i)); } - if(hdr->TypeFmt == TLP_CplD) { + if((hdr->TypeFmt == TLP_Cpl) || (hdr->TypeFmt == TLP_CplD) || (hdr->TypeFmt == TLP_CplLk) || (hdr->TypeFmt == TLP_CplDLk)) { + if(hdr->TypeFmt == TLP_Cpl) { tp = "Cpl: "; } + if(hdr->TypeFmt == TLP_CplD) { tp = "CplD: "; } + if(hdr->TypeFmt == TLP_CplLk) { tp = "CplLk: "; } + if(hdr->TypeFmt == TLP_CplDLk) { tp = "CplDLk:"; } hdrC = (PTLP_HDR_CplD)pb; printf( - "\n%s: CplD: ReqID: %04x CplID: %04x Status: %01x BC: %03x Tag: %02x LowAddr: %02x", - (isTx ? "TX" : "RX"), - hdrC->RequesterID, - hdrC->CompleterID, - hdrC->Status, - hdrC->ByteCount, - hdrC->Tag, + "\n%s: %s Len: %03x ReqID: %04x CplID: %04x Status: %01x BC: %03x Tag: %02x LowAddr: %02x", + (isTx ? "TX" : "RX"), + tp, + hdr->Length, + hdrC->RequesterID, + hdrC->CompleterID, + hdrC->Status, + hdrC->ByteCount, + hdrC->Tag, hdrC->LowerAddress ); - } else if(hdr->TypeFmt == TLP_MRd32 || hdr->TypeFmt == TLP_MWr32) { + } else if((hdr->TypeFmt == TLP_MRd32) || (hdr->TypeFmt == TLP_MWr32)) { hdrM32 = (PTLP_HDR_MRdWr32)pb; printf( - "\n%s: %s: ReqID: %04x BE_FL: %01x%01x Tag: %02x Addr: %08x", + "\n%s: %s Len: %03x ReqID: %04x BE_FL: %01x%01x Tag: %02x Addr: %08x", (isTx ? "TX" : "RX"), - (hdr->TypeFmt == TLP_MRd32) ? "MRd32" : "MWr32", + (hdr->TypeFmt == TLP_MRd32) ? "MRd32: " : "MWr32: ", + hdr->Length, hdrM32->RequesterID, hdrM32->FirstBE, hdrM32->LastBE, hdrM32->Tag, hdrM32->Address); - } else if(hdr->TypeFmt == TLP_MRd64 || hdr->TypeFmt == TLP_MWr64) { + } else if((hdr->TypeFmt == TLP_MRd64) || (hdr->TypeFmt == TLP_MWr64)) { hdrM64 = (PTLP_HDR_MRdWr64)pb; printf( - "\n%s: %s: ReqID: %04x BE_FL: %01x%01x Tag: %02x Addr: %016llx", + "\n%s: %s Len: %03x ReqID: %04x BE_FL: %01x%01x Tag: %02x Addr: %016llx", (isTx ? "TX" : "RX"), - (hdr->TypeFmt == TLP_MRd64) ? "MRd64" : "MWr64", + (hdr->TypeFmt == TLP_MRd64) ? "MRd64: " : "MWr64: ", + hdr->Length, hdrM64->RequesterID, hdrM64->FirstBE, hdrM64->LastBE, hdrM64->Tag, ((QWORD)hdrM64->AddressHigh << 32) + hdrM64->AddressLow ); + } else if((hdr->TypeFmt == TLP_IORd) || (hdr->TypeFmt == TLP_IOWr)) { + hdrM32 = (PTLP_HDR_MRdWr32)pb; // same format for IO Rd/Wr + printf( + "\n%s: %s Len: %03x ReqID: %04x BE_FL: %01x%01x Tag: %02x Addr: %08x", + (isTx ? "TX" : "RX"), + (hdr->TypeFmt == TLP_IORd) ? "IORd: " : "IOWr: ", + hdr->Length, + hdrM32->RequesterID, + hdrM32->FirstBE, + hdrM32->LastBE, + hdrM32->Tag, + hdrM32->Address + ); + } else if((hdr->TypeFmt == TLP_CfgRd0) || (hdr->TypeFmt == TLP_CfgRd1) || (hdr->TypeFmt == TLP_CfgWr0) || (hdr->TypeFmt == TLP_CfgWr1)) { + if(hdr->TypeFmt == TLP_CfgRd0) { tp = "CfgRd0:"; } + if(hdr->TypeFmt == TLP_CfgRd1) { tp = "CfgRd1:"; } + if(hdr->TypeFmt == TLP_CfgWr0) { tp = "CfgWr0:"; } + if(hdr->TypeFmt == TLP_CfgWr1) { tp = "CfgWr1:"; } + hdrCfg = (PTLP_HDR_Cfg)pb; + printf( + "\n%s: %s Len: %03x ReqID: %04x BE_FL: %01x%01x Tag: %02x Dev: %i:%i.%i ExtRegNum: %01x RegNum: %02x", + (isTx ? "TX" : "RX"), + tp, + hdr->Length, + hdrCfg->RequesterID, + hdrCfg->FirstBE, + hdrCfg->LastBE, + hdrCfg->Tag, + hdrCfg->BusNum, + hdrCfg->DeviceNum, + hdrCfg->FunctionNum, + hdrCfg->ExtRegNum, + hdrCfg->RegNum + ); } else { printf( - "\n%s: TLP??: TypeFmt: %02x dwLen: %03x", + "\n%s: TLP???: TypeFmt: %02x dwLen: %03x", (isTx ? "TX" : "RX"), hdr->TypeFmt, hdr->Length diff --git a/pcileech/tlp.h b/pcileech/tlp.h index 35add20..c2b35e7 100644 --- a/pcileech/tlp.h +++ b/pcileech/tlp.h @@ -22,7 +22,7 @@ #define TLP_Cpl 0x0A #define TLP_CplD 0x4A #define TLP_CplLk 0x0B -#define TLP_CplLkD 0x4B +#define TLP_CplDLk 0x4B typedef struct tdTLP_HDR { WORD Length : 10; @@ -67,6 +67,21 @@ typedef struct tdTLP_HDR_CplD { WORD RequesterID; } TLP_HDR_CplD, *PTLP_HDR_CplD; +typedef struct tdTLP_HDR_Cfg { + TLP_HDR h; + BYTE FirstBE : 4; + BYTE LastBE : 4; + BYTE Tag; + WORD RequesterID; + BYTE _R1 : 2; + BYTE RegNum : 6; + BYTE ExtRegNum : 4; + BYTE _R2 : 4; + BYTE FunctionNum : 3; + BYTE DeviceNum : 5; + BYTE BusNum; +} TLP_HDR_Cfg, *PTLP_HDR_Cfg; + /* * Print a PCIe TLP packet on the screen in a human readable format. * -- pbTlp = complete TLP packet (header+data) diff --git a/pcileech_files/pcileech b/pcileech_files/pcileech index 45a9c102aa8bd507e3e5df026ef699529b1b9b62..f616eef93e12404ba47729611bebbc713601ba64 100644 GIT binary patch delta 26079 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 delta 26064 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 diff --git a/pcileech_files/pcileech.exe b/pcileech_files/pcileech.exe index cba942e7e8762246ac9391a1557115a30af6fc4e..55d67b3e9b2b0afaa9e17edf0085e83f4013a9bf 100644 GIT binary patch delta 71293 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

YW`h`09 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 delta 74861 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