int main(int argc, char *argv[]) { struct local_drm_i915_reg_read reg_read; int ret, fd; uint64_t val; fd = drm_open_any(); reg_read.offset = 0x2358; ret = drmIoctl(fd, REG_READ_IOCTL, ®_read); if (errno == EINVAL) exit(77); else if (ret) exit(EXIT_FAILURE); val = timer_query(fd); sleep(1); if (timer_query(fd) == val) { fprintf(stderr, "Timer isn't moving, probably busted\n"); exit(EXIT_FAILURE); } /* bad reg */ reg_read.offset = 0x12345678; ret = drmIoctl(fd, REG_READ_IOCTL, ®_read); handle_bad(ret, errno, EINVAL, "bad register"); close(fd); exit(EXIT_SUCCESS); }
static void post_mortem(const volatile void* p, unsigned len_bytes, unsigned start_n, ci_uint8 expected_seed, int start_off) { unsigned seed, n; unsigned bad_i = 0, i = 0, len; const ci_uint8* pdw; ci_uint8 expected_n; pdw = (const ci_uint8*) p; while( len_bytes - i >= 4 ) { seed = pdw[i]; n = pdw[i + 1] + 1; if( pdw[i + 2] != seed || pdw[i + 3] != (ci_uint8) (n - 3) ) { seed = pdw[i + 1]; n = pdw[i]; if( pdw[i + 3] != seed || pdw[i + 2] != (ci_uint8) (n - 2) ) { ++i; continue; } } len = find_valid_extent(pdw + i, seed, n, len_bytes - i); ci_assert(len >= 4); expected_n = (ci_uint8) (start_n - i); if( bad_i != i ) handle_bad(pdw, bad_i, i, start_off); if( seed == expected_seed && (n & 0xff) == expected_n ) ci_log("[0x%04x->%04x] okay (bytes=%04u seed=0x%02x n=0x%02x)", start_off+i, start_off+i+len-1, len, seed, (unsigned) expected_n); else ci_log("[0x%04x->%04x] patn (bytes=%04u seed=0x%02x{%02x} " "n=0x%02x{%02x})", start_off+i, start_off+i+len-1, len, seed, expected_seed, n & 0xff, (unsigned) expected_n); i += len; bad_i = i; } if( i < len_bytes || bad_i != i ) handle_bad(pdw, bad_i, len_bytes, start_off); }