diff options
author | Rob Austein <sra@hactrn.net> | 2015-05-21 00:17:33 -0400 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2015-05-21 00:17:33 -0400 |
commit | e2de6b1f6d220fc2481b19bd1ed203b493d2db18 (patch) | |
tree | 47135c32d1586d53812d12419db691330b92ff32 /hal_io_eim.c | |
parent | 6d805ea76b2b8556b25ec846fada6f3c0b7f71f6 (diff) |
Copy Joachim's EIM timeout change, make timeout configurable at
compile time. Detect not-multiple-of-four-byte errors before they
trigger an infinite loop. Remove printfs() that don't belong in
library code, along with an unnecessary malloc(). Other minor
cleanup.
Diffstat (limited to 'hal_io_eim.c')
-rw-r--r-- | hal_io_eim.c | 190 |
1 files changed, 90 insertions, 100 deletions
diff --git a/hal_io_eim.c b/hal_io_eim.c index 6f9e159..5936d0c 100644 --- a/hal_io_eim.c +++ b/hal_io_eim.c @@ -47,21 +47,20 @@ static int debug = 0; static int inited = 0; -/* ---------------- EIM low-level code ---------------- */ +#ifndef EIM_IO_TIMEOUT +#define EIM_IO_TIMEOUT 100000000 +#endif static hal_error_t init(void) { - if (inited) - return HAL_OK; + if (inited) + return HAL_OK; - if (eim_setup() != 0) { - if (debug) - fprintf(stderr, "[ EIM setup failed ]\n"); - return HAL_ERROR_IO_SETUP_FAILED; - } + if (eim_setup() != 0) + return HAL_ERROR_IO_SETUP_FAILED; - inited = 1; - return HAL_OK; + inited = 1; + return HAL_OK; } /* translate cryptech register number to EIM address @@ -75,143 +74,134 @@ static hal_error_t init(void) */ static off_t eim_offset(off_t offset) { - return EIM_BASE_ADDR + ((offset & ~0x1fff) << 3) + ((offset & 0x1fff) << 2); + return EIM_BASE_ADDR + ((offset & ~0x1fff) << 3) + ((offset & 0x1fff) << 2); } -/* ---------------- test-case low-level code ---------------- */ - void hal_io_set_debug(int onoff) { - debug = onoff; + debug = onoff; } static void dump(char *label, const uint8_t *buf, size_t len) { - if (debug) { - int i; - printf("%s [", label); - for (i = 0; i < len; ++i) - printf(" %02x", buf[i]); - printf(" ]\n"); - } + if (debug) { + size_t i; + printf("%s [", label); + for (i = 0; i < len; ++i) + printf(" %02x", buf[i]); + printf(" ]\n"); + } } hal_error_t hal_io_write(off_t offset, const uint8_t *buf, size_t len) { - hal_error_t err; + hal_error_t err; - if ((err = init()) != HAL_OK) - return err; + if (len % 4 != 0) + return HAL_ERROR_IO_BAD_COUNT; - dump("write ", buf, len); + if ((err = init()) != HAL_OK) + return err; - offset = eim_offset(offset); - for (; len > 0; offset += 4, buf += 4, len -= 4) { - uint32_t val; - val = htonl(*(uint32_t *)buf); - eim_write_32(offset, &val); - } + dump("write ", buf, len); - return HAL_OK; + offset = eim_offset(offset); + for (; len > 0; offset += 4, buf += 4, len -= 4) { + uint32_t val; + val = htonl(*(uint32_t *)buf); + eim_write_32(offset, &val); + } + + return HAL_OK; } hal_error_t hal_io_read(off_t offset, uint8_t *buf, size_t len) { - uint8_t *rbuf = buf; - int rlen = len; - hal_error_t err; - - if ((err = init()) != HAL_OK) - return err; - - offset = eim_offset(offset); - for (; rlen > 0; offset += 4, rbuf += 4, rlen -= 4) { - uint32_t val; - eim_read_32(offset, &val); - *(uint32_t *)rbuf = ntohl(val); - } + uint8_t *rbuf = buf; + int rlen = len; + hal_error_t err; - dump("read ", buf, len); + if (len % 4 != 0) + return HAL_ERROR_IO_BAD_COUNT; - return HAL_OK; + if ((err = init()) != HAL_OK) + return err; + + offset = eim_offset(offset); + for (; rlen > 0; offset += 4, rbuf += 4, rlen -= 4) { + uint32_t val; + eim_read_32(offset, &val); + *(uint32_t *)rbuf = ntohl(val); + } + + dump("read ", buf, len); + + return HAL_OK; } hal_error_t hal_io_expected(off_t offset, const uint8_t *expected, size_t len) { - hal_error_t err; - uint8_t *buf; - int i; - - buf = malloc(len); - if (buf == NULL) { - perror("malloc"); - return HAL_ERROR_MEMORY; - } - dump("expect", expected, len); - - if ((err = hal_io_read(offset, buf, len)) != HAL_OK) - goto errout; - - for (i = 0; i < len; ++i) { - if (buf[i] != expected[i]) { - fprintf(stderr, "response byte %d: expected 0x%02x, got 0x%02x\n", - i, expected[i], buf[i]); - err = HAL_ERROR_IO_UNEXPECTED; - goto errout; - } - } + hal_error_t err; + uint8_t buf[4]; + size_t i; - free(buf); - return HAL_OK; + if (len % 4 != 0) + return HAL_ERROR_IO_BAD_COUNT; -errout: - free(buf); - return err; + dump("expect", expected, len); + + for (i = 0; i < len; i++) { + if ((i & 3) == 0 && (err = hal_io_read(offset, buf, sizeof(buf))) != HAL_OK) + return err; + if (buf[i & 3] != expected[i]) + return HAL_ERROR_IO_UNEXPECTED; + } + + return HAL_OK; } hal_error_t hal_io_init(off_t offset) { - uint8_t buf[4] = { 0, 0, 0, CTRL_INIT }; - - return hal_io_write(offset, buf, 4); + uint8_t buf[4] = { 0, 0, 0, CTRL_INIT }; + return hal_io_write(offset, buf, sizeof(buf)); } hal_error_t hal_io_next(off_t offset) { - uint8_t buf[4] = { 0, 0, 0, CTRL_NEXT }; - - return hal_io_write(offset, buf, 4); + uint8_t buf[4] = { 0, 0, 0, CTRL_NEXT }; + return hal_io_write(offset, buf, sizeof(buf)); } hal_error_t hal_io_wait(off_t offset, uint8_t status, int *count) { - hal_error_t err; - uint8_t buf[4]; - int i; - - for (i = 1; ; ++i) { - if (count && (*count > 0) && (i >= *count)) { - fprintf(stderr, "hal_io_wait timed out\n"); - return HAL_ERROR_IO_TIMEOUT; - } - if ((err = hal_io_read(offset, buf, 4)) != HAL_OK) - return err; - if (buf[3] & status) { - if (count) - *count = i; - return HAL_OK; - } + hal_error_t err; + uint8_t buf[4]; + int i; + + for (i = 1; ; ++i) { + + if (count && (*count > 0) && (i >= *count)) + return HAL_ERROR_IO_TIMEOUT; + + if ((err = hal_io_read(offset, buf, sizeof(buf))) != HAL_OK) + return err; + + if ((buf[3] & status) != 0) { + if (count) + *count = i; + return HAL_OK; } + } } hal_error_t hal_io_wait_ready(off_t offset) { - int limit = 256; - return hal_io_wait(offset, STATUS_READY, &limit); + int limit = EIM_IO_TIMEOUT; + return hal_io_wait(offset, STATUS_READY, &limit); } hal_error_t hal_io_wait_valid(off_t offset) { - int limit = 256; - return hal_io_wait(offset, STATUS_VALID, &limit); + int limit = EIM_IO_TIMEOUT; + return hal_io_wait(offset, STATUS_VALID, &limit); } |