17d36db35SAvi Kivity #include "libcflat.h" 27d36db35SAvi Kivity #include "smp.h" 3850479e3SJason Wang #include "processor.h" 47d641cc5SAvi Kivity #include "atomic.h" 5456c55bcSAndrew Jones #include "pci.h" 65292dbf7SMichael S. Tsirkin #include "x86/vm.h" 75292dbf7SMichael S. Tsirkin #include "x86/desc.h" 8a5d12b9fSPaolo Bonzini #include "x86/acpi.h" 97d36db35SAvi Kivity 105292dbf7SMichael S. Tsirkin struct test { 115292dbf7SMichael S. Tsirkin void (*func)(void); 125292dbf7SMichael S. Tsirkin const char *name; 135292dbf7SMichael S. Tsirkin int (*valid)(void); 145292dbf7SMichael S. Tsirkin int parallel; 155292dbf7SMichael S. Tsirkin bool (*next)(struct test *); 165292dbf7SMichael S. Tsirkin }; 175292dbf7SMichael S. Tsirkin 187d36db35SAvi Kivity #define GOAL (1ull << 30) 197d36db35SAvi Kivity 20eda71b28SAvi Kivity static int nr_cpus; 21eda71b28SAvi Kivity 22850479e3SJason Wang static void cpuid_test(void) 237d36db35SAvi Kivity { 247d36db35SAvi Kivity asm volatile ("push %%"R "bx; cpuid; pop %%"R "bx" 257d36db35SAvi Kivity : : : "eax", "ecx", "edx"); 267d36db35SAvi Kivity } 277d36db35SAvi Kivity 287d36db35SAvi Kivity static void vmcall(void) 297d36db35SAvi Kivity { 307d36db35SAvi Kivity unsigned long a = 0, b, c, d; 317d36db35SAvi Kivity 327d36db35SAvi Kivity asm volatile ("vmcall" : "+a"(a), "=b"(b), "=c"(c), "=d"(d)); 337d36db35SAvi Kivity } 347d36db35SAvi Kivity 355fecf5d8SWill Auld #define MSR_TSC_ADJUST 0x3b 367d36db35SAvi Kivity #define MSR_EFER 0xc0000080 377d36db35SAvi Kivity #define EFER_NX_MASK (1ull << 11) 387d36db35SAvi Kivity 395ada505aSJason Wang #ifdef __x86_64__ 407d36db35SAvi Kivity static void mov_from_cr8(void) 417d36db35SAvi Kivity { 427d36db35SAvi Kivity unsigned long cr8; 437d36db35SAvi Kivity 447d36db35SAvi Kivity asm volatile ("mov %%cr8, %0" : "=r"(cr8)); 457d36db35SAvi Kivity } 467d36db35SAvi Kivity 477d36db35SAvi Kivity static void mov_to_cr8(void) 487d36db35SAvi Kivity { 497d36db35SAvi Kivity unsigned long cr8 = 0; 507d36db35SAvi Kivity 517d36db35SAvi Kivity asm volatile ("mov %0, %%cr8" : : "r"(cr8)); 527d36db35SAvi Kivity } 535ada505aSJason Wang #endif 547d36db35SAvi Kivity 557d36db35SAvi Kivity static int is_smp(void) 567d36db35SAvi Kivity { 577d36db35SAvi Kivity return cpu_count() > 1; 587d36db35SAvi Kivity } 597d36db35SAvi Kivity 607d36db35SAvi Kivity static void nop(void *junk) 617d36db35SAvi Kivity { 627d36db35SAvi Kivity } 637d36db35SAvi Kivity 647d36db35SAvi Kivity static void ipi(void) 657d36db35SAvi Kivity { 667d36db35SAvi Kivity on_cpu(1, nop, 0); 677d36db35SAvi Kivity } 687d36db35SAvi Kivity 697d36db35SAvi Kivity static void ipi_halt(void) 707d36db35SAvi Kivity { 717d36db35SAvi Kivity unsigned long long t; 727d36db35SAvi Kivity 737d36db35SAvi Kivity on_cpu(1, nop, 0); 747d36db35SAvi Kivity t = rdtsc() + 2000; 757d36db35SAvi Kivity while (rdtsc() < t) 767d36db35SAvi Kivity ; 777d36db35SAvi Kivity } 787d36db35SAvi Kivity 79a5d12b9fSPaolo Bonzini int pm_tmr_blk; 807d36db35SAvi Kivity static void inl_pmtimer(void) 817d36db35SAvi Kivity { 82a5d12b9fSPaolo Bonzini inl(pm_tmr_blk); 837d36db35SAvi Kivity } 847d36db35SAvi Kivity 8500bfecaaSPaolo Bonzini static void inl_nop_qemu(void) 8600bfecaaSPaolo Bonzini { 8700bfecaaSPaolo Bonzini inl(0x1234); 8800bfecaaSPaolo Bonzini } 8900bfecaaSPaolo Bonzini 9000bfecaaSPaolo Bonzini static void inl_nop_kernel(void) 9100bfecaaSPaolo Bonzini { 9200bfecaaSPaolo Bonzini inb(0x4d0); 9300bfecaaSPaolo Bonzini } 9400bfecaaSPaolo Bonzini 9500bfecaaSPaolo Bonzini static void outl_elcr_kernel(void) 9600bfecaaSPaolo Bonzini { 97f22a66a1SAndrew Jones outb(0, 0x4d0); 9800bfecaaSPaolo Bonzini } 9900bfecaaSPaolo Bonzini 1008a544409SPaolo Bonzini static void mov_dr(void) 1018a544409SPaolo Bonzini { 1028a544409SPaolo Bonzini asm volatile("mov %0, %%dr7" : : "r" (0x400L)); 1038a544409SPaolo Bonzini } 1048a544409SPaolo Bonzini 105eda71b28SAvi Kivity static void ple_round_robin(void) 106eda71b28SAvi Kivity { 107eda71b28SAvi Kivity struct counter { 108eda71b28SAvi Kivity volatile int n1; 109eda71b28SAvi Kivity int n2; 110eda71b28SAvi Kivity } __attribute__((aligned(64))); 111eda71b28SAvi Kivity static struct counter counters[64] = { { -1, 0 } }; 112eda71b28SAvi Kivity int me = smp_id(); 113eda71b28SAvi Kivity int you; 114eda71b28SAvi Kivity volatile struct counter *p = &counters[me]; 115eda71b28SAvi Kivity 116eda71b28SAvi Kivity while (p->n1 == p->n2) 117eda71b28SAvi Kivity asm volatile ("pause"); 118eda71b28SAvi Kivity 119eda71b28SAvi Kivity p->n2 = p->n1; 120eda71b28SAvi Kivity you = me + 1; 121eda71b28SAvi Kivity if (you == nr_cpus) 122eda71b28SAvi Kivity you = 0; 123eda71b28SAvi Kivity ++counters[you].n1; 124eda71b28SAvi Kivity } 125eda71b28SAvi Kivity 1265fecf5d8SWill Auld static void rd_tsc_adjust_msr(void) 1275fecf5d8SWill Auld { 1285fecf5d8SWill Auld rdmsr(MSR_TSC_ADJUST); 1295fecf5d8SWill Auld } 1305fecf5d8SWill Auld 1315fecf5d8SWill Auld static void wr_tsc_adjust_msr(void) 1325fecf5d8SWill Auld { 1335fecf5d8SWill Auld wrmsr(MSR_TSC_ADJUST, 0x0); 1345fecf5d8SWill Auld } 1355fecf5d8SWill Auld 1365292dbf7SMichael S. Tsirkin static struct pci_test { 1375292dbf7SMichael S. Tsirkin unsigned iobar; 1385292dbf7SMichael S. Tsirkin unsigned ioport; 1395292dbf7SMichael S. Tsirkin volatile void *memaddr; 1405292dbf7SMichael S. Tsirkin volatile void *mem; 1415292dbf7SMichael S. Tsirkin int test_idx; 1425292dbf7SMichael S. Tsirkin uint32_t data; 1435292dbf7SMichael S. Tsirkin uint32_t offset; 1445292dbf7SMichael S. Tsirkin } pci_test = { 1455292dbf7SMichael S. Tsirkin .test_idx = -1 1465292dbf7SMichael S. Tsirkin }; 1475292dbf7SMichael S. Tsirkin 1485292dbf7SMichael S. Tsirkin static void pci_mem_testb(void) 1495292dbf7SMichael S. Tsirkin { 1505292dbf7SMichael S. Tsirkin *(volatile uint8_t *)pci_test.mem = pci_test.data; 1515292dbf7SMichael S. Tsirkin } 1525292dbf7SMichael S. Tsirkin 1535292dbf7SMichael S. Tsirkin static void pci_mem_testw(void) 1545292dbf7SMichael S. Tsirkin { 1555292dbf7SMichael S. Tsirkin *(volatile uint16_t *)pci_test.mem = pci_test.data; 1565292dbf7SMichael S. Tsirkin } 1575292dbf7SMichael S. Tsirkin 1585292dbf7SMichael S. Tsirkin static void pci_mem_testl(void) 1595292dbf7SMichael S. Tsirkin { 1605292dbf7SMichael S. Tsirkin *(volatile uint32_t *)pci_test.mem = pci_test.data; 1615292dbf7SMichael S. Tsirkin } 1625292dbf7SMichael S. Tsirkin 1635292dbf7SMichael S. Tsirkin static void pci_io_testb(void) 1645292dbf7SMichael S. Tsirkin { 165f22a66a1SAndrew Jones outb(pci_test.data, pci_test.ioport); 1665292dbf7SMichael S. Tsirkin } 1675292dbf7SMichael S. Tsirkin 1685292dbf7SMichael S. Tsirkin static void pci_io_testw(void) 1695292dbf7SMichael S. Tsirkin { 170f22a66a1SAndrew Jones outw(pci_test.data, pci_test.ioport); 1715292dbf7SMichael S. Tsirkin } 1725292dbf7SMichael S. Tsirkin 1735292dbf7SMichael S. Tsirkin static void pci_io_testl(void) 1745292dbf7SMichael S. Tsirkin { 175f22a66a1SAndrew Jones outl(pci_test.data, pci_test.ioport); 1765292dbf7SMichael S. Tsirkin } 1775292dbf7SMichael S. Tsirkin 1785292dbf7SMichael S. Tsirkin static uint8_t ioreadb(unsigned long addr, bool io) 1795292dbf7SMichael S. Tsirkin { 1805292dbf7SMichael S. Tsirkin if (io) { 1815292dbf7SMichael S. Tsirkin return inb(addr); 1825292dbf7SMichael S. Tsirkin } else { 1835292dbf7SMichael S. Tsirkin return *(volatile uint8_t *)addr; 1845292dbf7SMichael S. Tsirkin } 1855292dbf7SMichael S. Tsirkin } 1865292dbf7SMichael S. Tsirkin 1875292dbf7SMichael S. Tsirkin static uint32_t ioreadl(unsigned long addr, bool io) 1885292dbf7SMichael S. Tsirkin { 1895292dbf7SMichael S. Tsirkin /* Note: assumes little endian */ 1905292dbf7SMichael S. Tsirkin if (io) { 1915292dbf7SMichael S. Tsirkin return inl(addr); 1925292dbf7SMichael S. Tsirkin } else { 1935292dbf7SMichael S. Tsirkin return *(volatile uint32_t *)addr; 1945292dbf7SMichael S. Tsirkin } 1955292dbf7SMichael S. Tsirkin } 1965292dbf7SMichael S. Tsirkin 1975292dbf7SMichael S. Tsirkin static void iowriteb(unsigned long addr, uint8_t data, bool io) 1985292dbf7SMichael S. Tsirkin { 1995292dbf7SMichael S. Tsirkin if (io) { 200f22a66a1SAndrew Jones outb(data, addr); 2015292dbf7SMichael S. Tsirkin } else { 2025292dbf7SMichael S. Tsirkin *(volatile uint8_t *)addr = data; 2035292dbf7SMichael S. Tsirkin } 2045292dbf7SMichael S. Tsirkin } 2055292dbf7SMichael S. Tsirkin 2065292dbf7SMichael S. Tsirkin static bool pci_next(struct test *test, unsigned long addr, bool io) 2075292dbf7SMichael S. Tsirkin { 2085292dbf7SMichael S. Tsirkin int i; 2095292dbf7SMichael S. Tsirkin uint8_t width; 2105292dbf7SMichael S. Tsirkin 2115292dbf7SMichael S. Tsirkin if (!pci_test.memaddr) { 2125292dbf7SMichael S. Tsirkin test->func = NULL; 2135292dbf7SMichael S. Tsirkin return true; 2145292dbf7SMichael S. Tsirkin } 2155292dbf7SMichael S. Tsirkin pci_test.test_idx++; 2165292dbf7SMichael S. Tsirkin iowriteb(addr + offsetof(struct pci_test_dev_hdr, test), 2175292dbf7SMichael S. Tsirkin pci_test.test_idx, io); 2185292dbf7SMichael S. Tsirkin width = ioreadb(addr + offsetof(struct pci_test_dev_hdr, width), 2195292dbf7SMichael S. Tsirkin io); 2205292dbf7SMichael S. Tsirkin switch (width) { 2215292dbf7SMichael S. Tsirkin case 1: 2225292dbf7SMichael S. Tsirkin test->func = io ? pci_io_testb : pci_mem_testb; 2235292dbf7SMichael S. Tsirkin break; 2245292dbf7SMichael S. Tsirkin case 2: 2255292dbf7SMichael S. Tsirkin test->func = io ? pci_io_testw : pci_mem_testw; 2265292dbf7SMichael S. Tsirkin break; 2275292dbf7SMichael S. Tsirkin case 4: 2285292dbf7SMichael S. Tsirkin test->func = io ? pci_io_testl : pci_mem_testl; 2295292dbf7SMichael S. Tsirkin break; 2305292dbf7SMichael S. Tsirkin default: 2315292dbf7SMichael S. Tsirkin /* Reset index for purposes of the next test */ 2325292dbf7SMichael S. Tsirkin pci_test.test_idx = -1; 2335292dbf7SMichael S. Tsirkin test->func = NULL; 2345292dbf7SMichael S. Tsirkin return false; 2355292dbf7SMichael S. Tsirkin } 2365292dbf7SMichael S. Tsirkin pci_test.data = ioreadl(addr + offsetof(struct pci_test_dev_hdr, data), 2375292dbf7SMichael S. Tsirkin io); 2385292dbf7SMichael S. Tsirkin pci_test.offset = ioreadl(addr + offsetof(struct pci_test_dev_hdr, 2395292dbf7SMichael S. Tsirkin offset), io); 2405292dbf7SMichael S. Tsirkin for (i = 0; i < pci_test.offset; ++i) { 2415292dbf7SMichael S. Tsirkin char c = ioreadb(addr + offsetof(struct pci_test_dev_hdr, 2425292dbf7SMichael S. Tsirkin name) + i, io); 2435292dbf7SMichael S. Tsirkin if (!c) { 2445292dbf7SMichael S. Tsirkin break; 2455292dbf7SMichael S. Tsirkin } 2465292dbf7SMichael S. Tsirkin printf("%c",c); 2475292dbf7SMichael S. Tsirkin } 2485292dbf7SMichael S. Tsirkin printf(":"); 2495292dbf7SMichael S. Tsirkin return true; 2505292dbf7SMichael S. Tsirkin } 2515292dbf7SMichael S. Tsirkin 2525292dbf7SMichael S. Tsirkin static bool pci_mem_next(struct test *test) 2535292dbf7SMichael S. Tsirkin { 2545292dbf7SMichael S. Tsirkin bool ret; 2555292dbf7SMichael S. Tsirkin ret = pci_next(test, ((unsigned long)pci_test.memaddr), false); 2565292dbf7SMichael S. Tsirkin if (ret) { 2575292dbf7SMichael S. Tsirkin pci_test.mem = pci_test.memaddr + pci_test.offset; 2585292dbf7SMichael S. Tsirkin } 2595292dbf7SMichael S. Tsirkin return ret; 2605292dbf7SMichael S. Tsirkin } 2615292dbf7SMichael S. Tsirkin 2625292dbf7SMichael S. Tsirkin static bool pci_io_next(struct test *test) 2635292dbf7SMichael S. Tsirkin { 2645292dbf7SMichael S. Tsirkin bool ret; 2655292dbf7SMichael S. Tsirkin ret = pci_next(test, ((unsigned long)pci_test.iobar), true); 2665292dbf7SMichael S. Tsirkin if (ret) { 2675292dbf7SMichael S. Tsirkin pci_test.ioport = pci_test.iobar + pci_test.offset; 2685292dbf7SMichael S. Tsirkin } 2695292dbf7SMichael S. Tsirkin return ret; 2705292dbf7SMichael S. Tsirkin } 2715292dbf7SMichael S. Tsirkin 2725292dbf7SMichael S. Tsirkin static struct test tests[] = { 273850479e3SJason Wang { cpuid_test, "cpuid", .parallel = 1, }, 2747d36db35SAvi Kivity { vmcall, "vmcall", .parallel = 1, }, 2755ada505aSJason Wang #ifdef __x86_64__ 2767d36db35SAvi Kivity { mov_from_cr8, "mov_from_cr8", .parallel = 1, }, 2777d36db35SAvi Kivity { mov_to_cr8, "mov_to_cr8" , .parallel = 1, }, 2785ada505aSJason Wang #endif 2797d36db35SAvi Kivity { inl_pmtimer, "inl_from_pmtimer", .parallel = 1, }, 28000bfecaaSPaolo Bonzini { inl_nop_qemu, "inl_from_qemu", .parallel = 1 }, 28100bfecaaSPaolo Bonzini { inl_nop_kernel, "inl_from_kernel", .parallel = 1 }, 28200bfecaaSPaolo Bonzini { outl_elcr_kernel, "outl_to_kernel", .parallel = 1 }, 2838a544409SPaolo Bonzini { mov_dr, "mov_dr", .parallel = 1 }, 2847d36db35SAvi Kivity { ipi, "ipi", is_smp, .parallel = 0, }, 2857d36db35SAvi Kivity { ipi_halt, "ipi+halt", is_smp, .parallel = 0, }, 286eda71b28SAvi Kivity { ple_round_robin, "ple-round-robin", .parallel = 1 }, 2875fecf5d8SWill Auld { wr_tsc_adjust_msr, "wr_tsc_adjust_msr", .parallel = 1 }, 2885fecf5d8SWill Auld { rd_tsc_adjust_msr, "rd_tsc_adjust_msr", .parallel = 1 }, 2895292dbf7SMichael S. Tsirkin { NULL, "pci-mem", .parallel = 0, .next = pci_mem_next }, 2905292dbf7SMichael S. Tsirkin { NULL, "pci-io", .parallel = 0, .next = pci_io_next }, 2917d36db35SAvi Kivity }; 2927d36db35SAvi Kivity 2937d36db35SAvi Kivity unsigned iterations; 2947d641cc5SAvi Kivity static atomic_t nr_cpus_done; 2957d36db35SAvi Kivity 2967d36db35SAvi Kivity static void run_test(void *_func) 2977d36db35SAvi Kivity { 2987d36db35SAvi Kivity int i; 2997d36db35SAvi Kivity void (*func)(void) = _func; 3007d36db35SAvi Kivity 3017d36db35SAvi Kivity for (i = 0; i < iterations; ++i) 3027d36db35SAvi Kivity func(); 3037d36db35SAvi Kivity 3047d641cc5SAvi Kivity atomic_inc(&nr_cpus_done); 3057d36db35SAvi Kivity } 3067d36db35SAvi Kivity 3075292dbf7SMichael S. Tsirkin static bool do_test(struct test *test) 3087d36db35SAvi Kivity { 3097d36db35SAvi Kivity int i; 3107d36db35SAvi Kivity unsigned long long t1, t2; 3115292dbf7SMichael S. Tsirkin void (*func)(void); 3127d36db35SAvi Kivity 3137d36db35SAvi Kivity iterations = 32; 3147d36db35SAvi Kivity 3157d36db35SAvi Kivity if (test->valid && !test->valid()) { 3167d36db35SAvi Kivity printf("%s (skipped)\n", test->name); 3175292dbf7SMichael S. Tsirkin return false; 3185292dbf7SMichael S. Tsirkin } 3195292dbf7SMichael S. Tsirkin 3205292dbf7SMichael S. Tsirkin if (test->next && !test->next(test)) { 3215292dbf7SMichael S. Tsirkin return false; 3225292dbf7SMichael S. Tsirkin } 3235292dbf7SMichael S. Tsirkin 3245292dbf7SMichael S. Tsirkin func = test->func; 3255292dbf7SMichael S. Tsirkin if (!func) { 3265292dbf7SMichael S. Tsirkin printf("%s (skipped)\n", test->name); 3275292dbf7SMichael S. Tsirkin return false; 3287d36db35SAvi Kivity } 3297d36db35SAvi Kivity 3307d36db35SAvi Kivity do { 3317d36db35SAvi Kivity iterations *= 2; 3327d36db35SAvi Kivity t1 = rdtsc(); 3337d36db35SAvi Kivity 3347d36db35SAvi Kivity if (!test->parallel) { 3357d36db35SAvi Kivity for (i = 0; i < iterations; ++i) 3367d36db35SAvi Kivity func(); 3377d36db35SAvi Kivity } else { 3387d641cc5SAvi Kivity atomic_set(&nr_cpus_done, 0); 3397d36db35SAvi Kivity for (i = cpu_count(); i > 0; i--) 3407d36db35SAvi Kivity on_cpu_async(i-1, run_test, func); 3417d641cc5SAvi Kivity while (atomic_read(&nr_cpus_done) < cpu_count()) 3427d36db35SAvi Kivity ; 3437d36db35SAvi Kivity } 3447d36db35SAvi Kivity t2 = rdtsc(); 3457d36db35SAvi Kivity } while ((t2 - t1) < GOAL); 3467d36db35SAvi Kivity printf("%s %d\n", test->name, (int)((t2 - t1) / iterations)); 3475292dbf7SMichael S. Tsirkin return test->next; 3487d36db35SAvi Kivity } 3497d36db35SAvi Kivity 3507d36db35SAvi Kivity static void enable_nx(void *junk) 3517d36db35SAvi Kivity { 352e46b32aaSAvi Kivity if (cpuid(0x80000001).d & (1 << 20)) 3537d36db35SAvi Kivity wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_NX_MASK); 3547d36db35SAvi Kivity } 3557d36db35SAvi Kivity 3560b267183SAvi Kivity bool test_wanted(struct test *test, char *wanted[], int nwanted) 3570b267183SAvi Kivity { 3580b267183SAvi Kivity int i; 3590b267183SAvi Kivity 3600b267183SAvi Kivity if (!nwanted) 3610b267183SAvi Kivity return true; 3620b267183SAvi Kivity 3630b267183SAvi Kivity for (i = 0; i < nwanted; ++i) 3640b267183SAvi Kivity if (strcmp(wanted[i], test->name) == 0) 3650b267183SAvi Kivity return true; 3660b267183SAvi Kivity 3670b267183SAvi Kivity return false; 3680b267183SAvi Kivity } 3690b267183SAvi Kivity 3700b267183SAvi Kivity int main(int ac, char **av) 3717d36db35SAvi Kivity { 372a5d12b9fSPaolo Bonzini struct fadt_descriptor_rev1 *fadt; 3737d36db35SAvi Kivity int i; 374f1abb07bSAlexander Gordeev unsigned long membar = 0; 3755292dbf7SMichael S. Tsirkin pcidevaddr_t pcidev; 3767d36db35SAvi Kivity 3777d36db35SAvi Kivity smp_init(); 3785292dbf7SMichael S. Tsirkin setup_vm(); 379eda71b28SAvi Kivity nr_cpus = cpu_count(); 3807d36db35SAvi Kivity 3817d36db35SAvi Kivity for (i = cpu_count(); i > 0; i--) 3827d36db35SAvi Kivity on_cpu(i-1, enable_nx, 0); 3837d36db35SAvi Kivity 384a5d12b9fSPaolo Bonzini fadt = find_acpi_table_addr(FACP_SIGNATURE); 385a5d12b9fSPaolo Bonzini pm_tmr_blk = fadt->pm_tmr_blk; 386a5d12b9fSPaolo Bonzini printf("PM timer port is %x\n", pm_tmr_blk); 387a5d12b9fSPaolo Bonzini 388289ebf8fSAndrew Jones pcidev = pci_find_dev(PCI_VENDOR_ID_REDHAT, PCI_DEVICE_ID_REDHAT_TEST); 389d3a8ad49SAndrew Jones if (pcidev != PCIDEVADDR_INVALID) { 390289ebf8fSAndrew Jones for (i = 0; i < PCI_TESTDEV_NUM_BARS; i++) { 3915292dbf7SMichael S. Tsirkin if (!pci_bar_is_valid(pcidev, i)) { 3925292dbf7SMichael S. Tsirkin continue; 3935292dbf7SMichael S. Tsirkin } 3945292dbf7SMichael S. Tsirkin if (pci_bar_is_memory(pcidev, i)) { 395*647f92c7SAlexander Gordeev membar = pci_bar_get_addr(pcidev, i); 396f1abb07bSAlexander Gordeev pci_test.memaddr = ioremap(membar, PAGE_SIZE); 3975292dbf7SMichael S. Tsirkin } else { 398*647f92c7SAlexander Gordeev pci_test.iobar = pci_bar_get_addr(pcidev, i); 3995292dbf7SMichael S. Tsirkin } 4005292dbf7SMichael S. Tsirkin } 4015292dbf7SMichael S. Tsirkin printf("pci-testdev at 0x%x membar %lx iobar %x\n", 4025292dbf7SMichael S. Tsirkin pcidev, membar, pci_test.iobar); 4035292dbf7SMichael S. Tsirkin } 4045292dbf7SMichael S. Tsirkin 4057d36db35SAvi Kivity for (i = 0; i < ARRAY_SIZE(tests); ++i) 4060b267183SAvi Kivity if (test_wanted(&tests[i], av + 1, ac - 1)) 4075292dbf7SMichael S. Tsirkin while (do_test(&tests[i])) {} 4087d36db35SAvi Kivity 4097d36db35SAvi Kivity return 0; 4107d36db35SAvi Kivity } 411