/* Loop until signature in memory is OK. */ void boot_sector_test(QTestState *qts) { uint8_t signature_low; uint8_t signature_high; uint16_t signature; int i; /* Wait at most 600 seconds (test is slow with TCI and --enable-debug) */ #define TEST_DELAY (1 * G_USEC_PER_SEC / 10) #define TEST_CYCLES MAX((600 * G_USEC_PER_SEC / TEST_DELAY), 1) /* Poll until code has run and modified memory. Once it has we know BIOS * initialization is done. TODO: check that IP reached the halt * instruction. */ for (i = 0; i < TEST_CYCLES; ++i) { signature_low = qtest_readb(qts, SIGNATURE_ADDR); signature_high = qtest_readb(qts, SIGNATURE_ADDR + 1); signature = (signature_high << 8) | signature_low; if (signature == SIGNATURE) { break; } g_usleep(TEST_DELAY); } g_assert_cmphex(signature, ==, SIGNATURE); }
static void read_guest_mem_server(QTestState *qts, TestServer *s) { uint8_t *guest_mem; int i, j; size_t size; g_mutex_lock(&s->data_mutex); /* iterate all regions */ for (i = 0; i < s->fds_num; i++) { /* We'll check only the region statring at 0x0*/ if (s->memory.regions[i].guest_phys_addr != 0x0) { continue; } g_assert_cmpint(s->memory.regions[i].memory_size, >, 1024); size = s->memory.regions[i].memory_size + s->memory.regions[i].mmap_offset; guest_mem = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, s->fds[i], 0); g_assert(guest_mem != MAP_FAILED); guest_mem += (s->memory.regions[i].mmap_offset / sizeof(*guest_mem)); for (j = 0; j < 1024; j++) { uint32_t a = qtest_readb(qts, s->memory.regions[i].guest_phys_addr + j); uint32_t b = guest_mem[j]; g_assert_cmpint(a, ==, b); } munmap(guest_mem, s->memory.regions[i].memory_size); } g_mutex_unlock(&s->data_mutex); }