diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/bio/debug.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/bio/debug.c b/lib/bio/debug.c index 631747d5..8f04871f 100644 --- a/lib/bio/debug.c +++ b/lib/bio/debug.c @@ -45,6 +45,8 @@ STATIC_COMMAND_START STATIC_COMMAND("bio", "block io debug commands", &cmd_bio) STATIC_COMMAND_END(bio); +#define DMA_ALIGNMENT (CACHE_LINE) + static int cmd_bio(int argc, const cmd_args *argv) { int rc = 0; @@ -288,7 +290,7 @@ usage: static bool is_valid_block(bdev_t *device, bnum_t block_num, uint8_t* pattern, size_t pattern_length) { - uint8_t *block_contents = malloc(device->block_size); + uint8_t *block_contents = memalign(DMA_ALIGNMENT, device->block_size); ssize_t n_bytes = device->read_block(device, block_contents, block_num, 1); if (n_bytes < 0 || n_bytes != (ssize_t)device->block_size) { @@ -331,13 +333,19 @@ static ssize_t erase_test(bdev_t *device) return num_invalid_blocks; } +static uint8_t get_signature(uint32_t word) +{ + uint8_t* sigptr = (uint8_t*)(&word); + return sigptr[0] ^ sigptr[1] ^ sigptr[2] ^ sigptr[3]; +} + // returns the number of blocks where the write was not successful. static ssize_t write_test(bdev_t *device) { - uint8_t *test_buffer = malloc(device->block_size); + uint8_t *test_buffer = memalign(DMA_ALIGNMENT, device->block_size); for (bnum_t bnum = 0; bnum < device->block_count; bnum++) { - memset(test_buffer, (uint8_t)bnum, device->block_size); + memset(test_buffer, get_signature(bnum), device->block_size); ssize_t err = bio_write_block(device, test_buffer, bnum, 1); if (err < 0) { free(test_buffer); @@ -348,7 +356,7 @@ static ssize_t write_test(bdev_t *device) size_t num_errors = 0; uint8_t expected_pattern[1]; for (bnum_t bnum = 0; bnum < device->block_count; bnum++) { - expected_pattern[0] = (uint8_t)bnum; + expected_pattern[0] = get_signature(bnum); if (!is_valid_block(device, bnum, expected_pattern, sizeof(expected_pattern))) { num_errors++; } |