17d36db35SAvi Kivity #include "libcflat.h" 27d36db35SAvi Kivity #include "smp.h" 3850479e3SJason Wang #include "processor.h" 47d641cc5SAvi Kivity #include "atomic.h" 5*456c55bcSAndrew Jones #include "pci.h" 65292dbf7SMichael S. Tsirkin #include "x86/vm.h" 75292dbf7SMichael S. Tsirkin #include "x86/desc.h" 8a5d12b9fSPaolo Bonzini #include "x86/acpi.h" 9f22a66a1SAndrew Jones #include "x86/io.h" 107d36db35SAvi Kivity 115292dbf7SMichael S. Tsirkin struct test { 125292dbf7SMichael S. Tsirkin void (*func)(void); 135292dbf7SMichael S. Tsirkin const char *name; 145292dbf7SMichael S. Tsirkin int (*valid)(void); 155292dbf7SMichael S. Tsirkin int parallel; 165292dbf7SMichael S. Tsirkin bool (*next)(struct test *); 175292dbf7SMichael S. Tsirkin }; 185292dbf7SMichael S. Tsirkin 197d36db35SAvi Kivity #define GOAL (1ull << 30) 207d36db35SAvi Kivity 21eda71b28SAvi Kivity static int nr_cpus; 22eda71b28SAvi Kivity 23850479e3SJason Wang static void cpuid_test(void) 247d36db35SAvi Kivity { 257d36db35SAvi Kivity asm volatile ("push %%"R "bx; cpuid; pop %%"R "bx" 267d36db35SAvi Kivity : : : "eax", "ecx", "edx"); 277d36db35SAvi Kivity } 287d36db35SAvi Kivity 297d36db35SAvi Kivity static void vmcall(void) 307d36db35SAvi Kivity { 317d36db35SAvi Kivity unsigned long a = 0, b, c, d; 327d36db35SAvi Kivity 337d36db35SAvi Kivity asm volatile ("vmcall" : "+a"(a), "=b"(b), "=c"(c), "=d"(d)); 347d36db35SAvi Kivity } 357d36db35SAvi Kivity 365fecf5d8SWill Auld #define MSR_TSC_ADJUST 0x3b 377d36db35SAvi Kivity #define MSR_EFER 0xc0000080 387d36db35SAvi Kivity #define EFER_NX_MASK (1ull << 11) 397d36db35SAvi Kivity 405ada505aSJason Wang #ifdef __x86_64__ 417d36db35SAvi Kivity static void mov_from_cr8(void) 427d36db35SAvi Kivity { 437d36db35SAvi Kivity unsigned long cr8; 447d36db35SAvi Kivity 457d36db35SAvi Kivity asm volatile ("mov %%cr8, %0" : "=r"(cr8)); 467d36db35SAvi Kivity } 477d36db35SAvi Kivity 487d36db35SAvi Kivity static void mov_to_cr8(void) 497d36db35SAvi Kivity { 507d36db35SAvi Kivity unsigned long cr8 = 0; 517d36db35SAvi Kivity 527d36db35SAvi Kivity asm volatile ("mov %0, %%cr8" : : "r"(cr8)); 537d36db35SAvi Kivity } 545ada505aSJason Wang #endif 557d36db35SAvi Kivity 567d36db35SAvi Kivity static int is_smp(void) 577d36db35SAvi Kivity { 587d36db35SAvi Kivity return cpu_count() > 1; 597d36db35SAvi Kivity } 607d36db35SAvi Kivity 617d36db35SAvi Kivity static void nop(void *junk) 627d36db35SAvi Kivity { 637d36db35SAvi Kivity } 647d36db35SAvi Kivity 657d36db35SAvi Kivity static void ipi(void) 667d36db35SAvi Kivity { 677d36db35SAvi Kivity on_cpu(1, nop, 0); 687d36db35SAvi Kivity } 697d36db35SAvi Kivity 707d36db35SAvi Kivity static void ipi_halt(void) 717d36db35SAvi Kivity { 727d36db35SAvi Kivity unsigned long long t; 737d36db35SAvi Kivity 747d36db35SAvi Kivity on_cpu(1, nop, 0); 757d36db35SAvi Kivity t = rdtsc() + 2000; 767d36db35SAvi Kivity while (rdtsc() < t) 777d36db35SAvi Kivity ; 787d36db35SAvi Kivity } 797d36db35SAvi Kivity 80a5d12b9fSPaolo Bonzini int pm_tmr_blk; 817d36db35SAvi Kivity static void inl_pmtimer(void) 827d36db35SAvi Kivity { 83a5d12b9fSPaolo Bonzini inl(pm_tmr_blk); 847d36db35SAvi Kivity } 857d36db35SAvi Kivity 8600bfecaaSPaolo Bonzini static void inl_nop_qemu(void) 8700bfecaaSPaolo Bonzini { 8800bfecaaSPaolo Bonzini inl(0x1234); 8900bfecaaSPaolo Bonzini } 9000bfecaaSPaolo Bonzini 9100bfecaaSPaolo Bonzini static void inl_nop_kernel(void) 9200bfecaaSPaolo Bonzini { 9300bfecaaSPaolo Bonzini inb(0x4d0); 9400bfecaaSPaolo Bonzini } 9500bfecaaSPaolo Bonzini 9600bfecaaSPaolo Bonzini static void outl_elcr_kernel(void) 9700bfecaaSPaolo Bonzini { 98f22a66a1SAndrew Jones outb(0, 0x4d0); 9900bfecaaSPaolo Bonzini } 10000bfecaaSPaolo Bonzini 1018a544409SPaolo Bonzini static void mov_dr(void) 1028a544409SPaolo Bonzini { 1038a544409SPaolo Bonzini asm volatile("mov %0, %%dr7" : : "r" (0x400L)); 1048a544409SPaolo Bonzini } 1058a544409SPaolo Bonzini 106eda71b28SAvi Kivity static void ple_round_robin(void) 107eda71b28SAvi Kivity { 108eda71b28SAvi Kivity struct counter { 109eda71b28SAvi Kivity volatile int n1; 110eda71b28SAvi Kivity int n2; 111eda71b28SAvi Kivity } __attribute__((aligned(64))); 112eda71b28SAvi Kivity static struct counter counters[64] = { { -1, 0 } }; 113eda71b28SAvi Kivity int me = smp_id(); 114eda71b28SAvi Kivity int you; 115eda71b28SAvi Kivity volatile struct counter *p = &counters[me]; 116eda71b28SAvi Kivity 117eda71b28SAvi Kivity while (p->n1 == p->n2) 118eda71b28SAvi Kivity asm volatile ("pause"); 119eda71b28SAvi Kivity 120eda71b28SAvi Kivity p->n2 = p->n1; 121eda71b28SAvi Kivity you = me + 1; 122eda71b28SAvi Kivity if (you == nr_cpus) 123eda71b28SAvi Kivity you = 0; 124eda71b28SAvi Kivity ++counters[you].n1; 125eda71b28SAvi Kivity } 126eda71b28SAvi Kivity 1275fecf5d8SWill Auld static void rd_tsc_adjust_msr(void) 1285fecf5d8SWill Auld { 1295fecf5d8SWill Auld rdmsr(MSR_TSC_ADJUST); 1305fecf5d8SWill Auld } 1315fecf5d8SWill Auld 1325fecf5d8SWill Auld static void wr_tsc_adjust_msr(void) 1335fecf5d8SWill Auld { 1345fecf5d8SWill Auld wrmsr(MSR_TSC_ADJUST, 0x0); 1355fecf5d8SWill Auld } 1365fecf5d8SWill Auld 1375292dbf7SMichael S. Tsirkin struct pci_test_dev_hdr { 1385292dbf7SMichael S. Tsirkin uint8_t test; 1395292dbf7SMichael S. Tsirkin uint8_t width; 1405292dbf7SMichael S. Tsirkin uint8_t pad0[2]; 1415292dbf7SMichael S. Tsirkin uint32_t offset; 1425292dbf7SMichael S. Tsirkin uint32_t data; 1435292dbf7SMichael S. Tsirkin uint32_t count; 1445292dbf7SMichael S. Tsirkin uint8_t name[]; 1455292dbf7SMichael S. Tsirkin }; 1465292dbf7SMichael S. Tsirkin 1475292dbf7SMichael S. Tsirkin static struct pci_test { 1485292dbf7SMichael S. Tsirkin unsigned iobar; 1495292dbf7SMichael S. Tsirkin unsigned ioport; 1505292dbf7SMichael S. Tsirkin volatile void *memaddr; 1515292dbf7SMichael S. Tsirkin volatile void *mem; 1525292dbf7SMichael S. Tsirkin int test_idx; 1535292dbf7SMichael S. Tsirkin uint32_t data; 1545292dbf7SMichael S. Tsirkin uint32_t offset; 1555292dbf7SMichael S. Tsirkin } pci_test = { 1565292dbf7SMichael S. Tsirkin .test_idx = -1 1575292dbf7SMichael S. Tsirkin }; 1585292dbf7SMichael S. Tsirkin 1595292dbf7SMichael S. Tsirkin static void pci_mem_testb(void) 1605292dbf7SMichael S. Tsirkin { 1615292dbf7SMichael S. Tsirkin *(volatile uint8_t *)pci_test.mem = pci_test.data; 1625292dbf7SMichael S. Tsirkin } 1635292dbf7SMichael S. Tsirkin 1645292dbf7SMichael S. Tsirkin static void pci_mem_testw(void) 1655292dbf7SMichael S. Tsirkin { 1665292dbf7SMichael S. Tsirkin *(volatile uint16_t *)pci_test.mem = pci_test.data; 1675292dbf7SMichael S. Tsirkin } 1685292dbf7SMichael S. Tsirkin 1695292dbf7SMichael S. Tsirkin static void pci_mem_testl(void) 1705292dbf7SMichael S. Tsirkin { 1715292dbf7SMichael S. Tsirkin *(volatile uint32_t *)pci_test.mem = pci_test.data; 1725292dbf7SMichael S. Tsirkin } 1735292dbf7SMichael S. Tsirkin 1745292dbf7SMichael S. Tsirkin static void pci_io_testb(void) 1755292dbf7SMichael S. Tsirkin { 176f22a66a1SAndrew Jones outb(pci_test.data, pci_test.ioport); 1775292dbf7SMichael S. Tsirkin } 1785292dbf7SMichael S. Tsirkin 1795292dbf7SMichael S. Tsirkin static void pci_io_testw(void) 1805292dbf7SMichael S. Tsirkin { 181f22a66a1SAndrew Jones outw(pci_test.data, pci_test.ioport); 1825292dbf7SMichael S. Tsirkin } 1835292dbf7SMichael S. Tsirkin 1845292dbf7SMichael S. Tsirkin static void pci_io_testl(void) 1855292dbf7SMichael S. Tsirkin { 186f22a66a1SAndrew Jones outl(pci_test.data, pci_test.ioport); 1875292dbf7SMichael S. Tsirkin } 1885292dbf7SMichael S. Tsirkin 1895292dbf7SMichael S. Tsirkin static uint8_t ioreadb(unsigned long addr, bool io) 1905292dbf7SMichael S. Tsirkin { 1915292dbf7SMichael S. Tsirkin if (io) { 1925292dbf7SMichael S. Tsirkin return inb(addr); 1935292dbf7SMichael S. Tsirkin } else { 1945292dbf7SMichael S. Tsirkin return *(volatile uint8_t *)addr; 1955292dbf7SMichael S. Tsirkin } 1965292dbf7SMichael S. Tsirkin } 1975292dbf7SMichael S. Tsirkin 1985292dbf7SMichael S. Tsirkin static uint32_t ioreadl(unsigned long addr, bool io) 1995292dbf7SMichael S. Tsirkin { 2005292dbf7SMichael S. Tsirkin /* Note: assumes little endian */ 2015292dbf7SMichael S. Tsirkin if (io) { 2025292dbf7SMichael S. Tsirkin return inl(addr); 2035292dbf7SMichael S. Tsirkin } else { 2045292dbf7SMichael S. Tsirkin return *(volatile uint32_t *)addr; 2055292dbf7SMichael S. Tsirkin } 2065292dbf7SMichael S. Tsirkin } 2075292dbf7SMichael S. Tsirkin 2085292dbf7SMichael S. Tsirkin static void iowriteb(unsigned long addr, uint8_t data, bool io) 2095292dbf7SMichael S. Tsirkin { 2105292dbf7SMichael S. Tsirkin if (io) { 211f22a66a1SAndrew Jones outb(data, addr); 2125292dbf7SMichael S. Tsirkin } else { 2135292dbf7SMichael S. Tsirkin *(volatile uint8_t *)addr = data; 2145292dbf7SMichael S. Tsirkin } 2155292dbf7SMichael S. Tsirkin } 2165292dbf7SMichael S. Tsirkin 2175292dbf7SMichael S. Tsirkin static bool pci_next(struct test *test, unsigned long addr, bool io) 2185292dbf7SMichael S. Tsirkin { 2195292dbf7SMichael S. Tsirkin int i; 2205292dbf7SMichael S. Tsirkin uint8_t width; 2215292dbf7SMichael S. Tsirkin 2225292dbf7SMichael S. Tsirkin if (!pci_test.memaddr) { 2235292dbf7SMichael S. Tsirkin test->func = NULL; 2245292dbf7SMichael S. Tsirkin return true; 2255292dbf7SMichael S. Tsirkin } 2265292dbf7SMichael S. Tsirkin pci_test.test_idx++; 2275292dbf7SMichael S. Tsirkin iowriteb(addr + offsetof(struct pci_test_dev_hdr, test), 2285292dbf7SMichael S. Tsirkin pci_test.test_idx, io); 2295292dbf7SMichael S. Tsirkin width = ioreadb(addr + offsetof(struct pci_test_dev_hdr, width), 2305292dbf7SMichael S. Tsirkin io); 2315292dbf7SMichael S. Tsirkin switch (width) { 2325292dbf7SMichael S. Tsirkin case 1: 2335292dbf7SMichael S. Tsirkin test->func = io ? pci_io_testb : pci_mem_testb; 2345292dbf7SMichael S. Tsirkin break; 2355292dbf7SMichael S. Tsirkin case 2: 2365292dbf7SMichael S. Tsirkin test->func = io ? pci_io_testw : pci_mem_testw; 2375292dbf7SMichael S. Tsirkin break; 2385292dbf7SMichael S. Tsirkin case 4: 2395292dbf7SMichael S. Tsirkin test->func = io ? pci_io_testl : pci_mem_testl; 2405292dbf7SMichael S. Tsirkin break; 2415292dbf7SMichael S. Tsirkin default: 2425292dbf7SMichael S. Tsirkin /* Reset index for purposes of the next test */ 2435292dbf7SMichael S. Tsirkin pci_test.test_idx = -1; 2445292dbf7SMichael S. Tsirkin test->func = NULL; 2455292dbf7SMichael S. Tsirkin return false; 2465292dbf7SMichael S. Tsirkin } 2475292dbf7SMichael S. Tsirkin pci_test.data = ioreadl(addr + offsetof(struct pci_test_dev_hdr, data), 2485292dbf7SMichael S. Tsirkin io); 2495292dbf7SMichael S. Tsirkin pci_test.offset = ioreadl(addr + offsetof(struct pci_test_dev_hdr, 2505292dbf7SMichael S. Tsirkin offset), io); 2515292dbf7SMichael S. Tsirkin for (i = 0; i < pci_test.offset; ++i) { 2525292dbf7SMichael S. Tsirkin char c = ioreadb(addr + offsetof(struct pci_test_dev_hdr, 2535292dbf7SMichael S. Tsirkin name) + i, io); 2545292dbf7SMichael S. Tsirkin if (!c) { 2555292dbf7SMichael S. Tsirkin break; 2565292dbf7SMichael S. Tsirkin } 2575292dbf7SMichael S. Tsirkin printf("%c",c); 2585292dbf7SMichael S. Tsirkin } 2595292dbf7SMichael S. Tsirkin printf(":"); 2605292dbf7SMichael S. Tsirkin return true; 2615292dbf7SMichael S. Tsirkin } 2625292dbf7SMichael S. Tsirkin 2635292dbf7SMichael S. Tsirkin static bool pci_mem_next(struct test *test) 2645292dbf7SMichael S. Tsirkin { 2655292dbf7SMichael S. Tsirkin bool ret; 2665292dbf7SMichael S. Tsirkin ret = pci_next(test, ((unsigned long)pci_test.memaddr), false); 2675292dbf7SMichael S. Tsirkin if (ret) { 2685292dbf7SMichael S. Tsirkin pci_test.mem = pci_test.memaddr + pci_test.offset; 2695292dbf7SMichael S. Tsirkin } 2705292dbf7SMichael S. Tsirkin return ret; 2715292dbf7SMichael S. Tsirkin } 2725292dbf7SMichael S. Tsirkin 2735292dbf7SMichael S. Tsirkin static bool pci_io_next(struct test *test) 2745292dbf7SMichael S. Tsirkin { 2755292dbf7SMichael S. Tsirkin bool ret; 2765292dbf7SMichael S. Tsirkin ret = pci_next(test, ((unsigned long)pci_test.iobar), true); 2775292dbf7SMichael S. Tsirkin if (ret) { 2785292dbf7SMichael S. Tsirkin pci_test.ioport = pci_test.iobar + pci_test.offset; 2795292dbf7SMichael S. Tsirkin } 2805292dbf7SMichael S. Tsirkin return ret; 2815292dbf7SMichael S. Tsirkin } 2825292dbf7SMichael S. Tsirkin 2835292dbf7SMichael S. Tsirkin static struct test tests[] = { 284850479e3SJason Wang { cpuid_test, "cpuid", .parallel = 1, }, 2857d36db35SAvi Kivity { vmcall, "vmcall", .parallel = 1, }, 2865ada505aSJason Wang #ifdef __x86_64__ 2877d36db35SAvi Kivity { mov_from_cr8, "mov_from_cr8", .parallel = 1, }, 2887d36db35SAvi Kivity { mov_to_cr8, "mov_to_cr8" , .parallel = 1, }, 2895ada505aSJason Wang #endif 2907d36db35SAvi Kivity { inl_pmtimer, "inl_from_pmtimer", .parallel = 1, }, 29100bfecaaSPaolo Bonzini { inl_nop_qemu, "inl_from_qemu", .parallel = 1 }, 29200bfecaaSPaolo Bonzini { inl_nop_kernel, "inl_from_kernel", .parallel = 1 }, 29300bfecaaSPaolo Bonzini { outl_elcr_kernel, "outl_to_kernel", .parallel = 1 }, 2948a544409SPaolo Bonzini { mov_dr, "mov_dr", .parallel = 1 }, 2957d36db35SAvi Kivity { ipi, "ipi", is_smp, .parallel = 0, }, 2967d36db35SAvi Kivity { ipi_halt, "ipi+halt", is_smp, .parallel = 0, }, 297eda71b28SAvi Kivity { ple_round_robin, "ple-round-robin", .parallel = 1 }, 2985fecf5d8SWill Auld { wr_tsc_adjust_msr, "wr_tsc_adjust_msr", .parallel = 1 }, 2995fecf5d8SWill Auld { rd_tsc_adjust_msr, "rd_tsc_adjust_msr", .parallel = 1 }, 3005292dbf7SMichael S. Tsirkin { NULL, "pci-mem", .parallel = 0, .next = pci_mem_next }, 3015292dbf7SMichael S. Tsirkin { NULL, "pci-io", .parallel = 0, .next = pci_io_next }, 3027d36db35SAvi Kivity }; 3037d36db35SAvi Kivity 3047d36db35SAvi Kivity unsigned iterations; 3057d641cc5SAvi Kivity static atomic_t nr_cpus_done; 3067d36db35SAvi Kivity 3077d36db35SAvi Kivity static void run_test(void *_func) 3087d36db35SAvi Kivity { 3097d36db35SAvi Kivity int i; 3107d36db35SAvi Kivity void (*func)(void) = _func; 3117d36db35SAvi Kivity 3127d36db35SAvi Kivity for (i = 0; i < iterations; ++i) 3137d36db35SAvi Kivity func(); 3147d36db35SAvi Kivity 3157d641cc5SAvi Kivity atomic_inc(&nr_cpus_done); 3167d36db35SAvi Kivity } 3177d36db35SAvi Kivity 3185292dbf7SMichael S. Tsirkin static bool do_test(struct test *test) 3197d36db35SAvi Kivity { 3207d36db35SAvi Kivity int i; 3217d36db35SAvi Kivity unsigned long long t1, t2; 3225292dbf7SMichael S. Tsirkin void (*func)(void); 3237d36db35SAvi Kivity 3247d36db35SAvi Kivity iterations = 32; 3257d36db35SAvi Kivity 3267d36db35SAvi Kivity if (test->valid && !test->valid()) { 3277d36db35SAvi Kivity printf("%s (skipped)\n", test->name); 3285292dbf7SMichael S. Tsirkin return false; 3295292dbf7SMichael S. Tsirkin } 3305292dbf7SMichael S. Tsirkin 3315292dbf7SMichael S. Tsirkin if (test->next && !test->next(test)) { 3325292dbf7SMichael S. Tsirkin return false; 3335292dbf7SMichael S. Tsirkin } 3345292dbf7SMichael S. Tsirkin 3355292dbf7SMichael S. Tsirkin func = test->func; 3365292dbf7SMichael S. Tsirkin if (!func) { 3375292dbf7SMichael S. Tsirkin printf("%s (skipped)\n", test->name); 3385292dbf7SMichael S. Tsirkin return false; 3397d36db35SAvi Kivity } 3407d36db35SAvi Kivity 3417d36db35SAvi Kivity do { 3427d36db35SAvi Kivity iterations *= 2; 3437d36db35SAvi Kivity t1 = rdtsc(); 3447d36db35SAvi Kivity 3457d36db35SAvi Kivity if (!test->parallel) { 3467d36db35SAvi Kivity for (i = 0; i < iterations; ++i) 3477d36db35SAvi Kivity func(); 3487d36db35SAvi Kivity } else { 3497d641cc5SAvi Kivity atomic_set(&nr_cpus_done, 0); 3507d36db35SAvi Kivity for (i = cpu_count(); i > 0; i--) 3517d36db35SAvi Kivity on_cpu_async(i-1, run_test, func); 3527d641cc5SAvi Kivity while (atomic_read(&nr_cpus_done) < cpu_count()) 3537d36db35SAvi Kivity ; 3547d36db35SAvi Kivity } 3557d36db35SAvi Kivity t2 = rdtsc(); 3567d36db35SAvi Kivity } while ((t2 - t1) < GOAL); 3577d36db35SAvi Kivity printf("%s %d\n", test->name, (int)((t2 - t1) / iterations)); 3585292dbf7SMichael S. Tsirkin return test->next; 3597d36db35SAvi Kivity } 3607d36db35SAvi Kivity 3617d36db35SAvi Kivity static void enable_nx(void *junk) 3627d36db35SAvi Kivity { 363e46b32aaSAvi Kivity if (cpuid(0x80000001).d & (1 << 20)) 3647d36db35SAvi Kivity wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_NX_MASK); 3657d36db35SAvi Kivity } 3667d36db35SAvi Kivity 3670b267183SAvi Kivity bool test_wanted(struct test *test, char *wanted[], int nwanted) 3680b267183SAvi Kivity { 3690b267183SAvi Kivity int i; 3700b267183SAvi Kivity 3710b267183SAvi Kivity if (!nwanted) 3720b267183SAvi Kivity return true; 3730b267183SAvi Kivity 3740b267183SAvi Kivity for (i = 0; i < nwanted; ++i) 3750b267183SAvi Kivity if (strcmp(wanted[i], test->name) == 0) 3760b267183SAvi Kivity return true; 3770b267183SAvi Kivity 3780b267183SAvi Kivity return false; 3790b267183SAvi Kivity } 3800b267183SAvi Kivity 3810b267183SAvi Kivity int main(int ac, char **av) 3827d36db35SAvi Kivity { 383a5d12b9fSPaolo Bonzini struct fadt_descriptor_rev1 *fadt; 3847d36db35SAvi Kivity int i; 3855292dbf7SMichael S. Tsirkin unsigned long membar = 0, base, offset; 3865292dbf7SMichael S. Tsirkin void *m; 3875292dbf7SMichael S. Tsirkin pcidevaddr_t pcidev; 3887d36db35SAvi Kivity 3897d36db35SAvi Kivity smp_init(); 3905292dbf7SMichael S. Tsirkin setup_vm(); 391eda71b28SAvi Kivity nr_cpus = cpu_count(); 3927d36db35SAvi Kivity 3937d36db35SAvi Kivity for (i = cpu_count(); i > 0; i--) 3947d36db35SAvi Kivity on_cpu(i-1, enable_nx, 0); 3957d36db35SAvi Kivity 396a5d12b9fSPaolo Bonzini fadt = find_acpi_table_addr(FACP_SIGNATURE); 397a5d12b9fSPaolo Bonzini pm_tmr_blk = fadt->pm_tmr_blk; 398a5d12b9fSPaolo Bonzini printf("PM timer port is %x\n", pm_tmr_blk); 399a5d12b9fSPaolo Bonzini 4005292dbf7SMichael S. Tsirkin pcidev = pci_find_dev(0x1b36, 0x0005); 4015292dbf7SMichael S. Tsirkin if (pcidev) { 4025292dbf7SMichael S. Tsirkin for (i = 0; i < 2; i++) { 4035292dbf7SMichael S. Tsirkin if (!pci_bar_is_valid(pcidev, i)) { 4045292dbf7SMichael S. Tsirkin continue; 4055292dbf7SMichael S. Tsirkin } 4065292dbf7SMichael S. Tsirkin if (pci_bar_is_memory(pcidev, i)) { 4075292dbf7SMichael S. Tsirkin membar = pci_bar_addr(pcidev, i); 4085292dbf7SMichael S. Tsirkin base = membar & ~4095; 4095292dbf7SMichael S. Tsirkin offset = membar - base; 4105292dbf7SMichael S. Tsirkin m = alloc_vpages(1); 4115292dbf7SMichael S. Tsirkin 4125292dbf7SMichael S. Tsirkin install_page((void *)read_cr3(), base, m); 4135292dbf7SMichael S. Tsirkin pci_test.memaddr = m + offset; 4145292dbf7SMichael S. Tsirkin } else { 4155292dbf7SMichael S. Tsirkin pci_test.iobar = pci_bar_addr(pcidev, i); 4165292dbf7SMichael S. Tsirkin } 4175292dbf7SMichael S. Tsirkin } 4185292dbf7SMichael S. Tsirkin printf("pci-testdev at 0x%x membar %lx iobar %x\n", 4195292dbf7SMichael S. Tsirkin pcidev, membar, pci_test.iobar); 4205292dbf7SMichael S. Tsirkin } 4215292dbf7SMichael S. Tsirkin 4227d36db35SAvi Kivity for (i = 0; i < ARRAY_SIZE(tests); ++i) 4230b267183SAvi Kivity if (test_wanted(&tests[i], av + 1, ac - 1)) 4245292dbf7SMichael S. Tsirkin while (do_test(&tests[i])) {} 4257d36db35SAvi Kivity 4267d36db35SAvi Kivity return 0; 4277d36db35SAvi Kivity } 428