cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xen_shinfo_test.c (24060B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * svm_vmcall_test
      4 *
      5 * Copyright © 2021 Amazon.com, Inc. or its affiliates.
      6 *
      7 * Xen shared_info / pvclock testing
      8 */
      9
     10#include "test_util.h"
     11#include "kvm_util.h"
     12#include "processor.h"
     13
     14#include <stdint.h>
     15#include <time.h>
     16#include <sched.h>
     17#include <signal.h>
     18
     19#include <sys/eventfd.h>
     20
     21#define VCPU_ID		5
     22
     23#define SHINFO_REGION_GVA	0xc0000000ULL
     24#define SHINFO_REGION_GPA	0xc0000000ULL
     25#define SHINFO_REGION_SLOT	10
     26
     27#define DUMMY_REGION_GPA	(SHINFO_REGION_GPA + (2 * PAGE_SIZE))
     28#define DUMMY_REGION_SLOT	11
     29
     30#define SHINFO_ADDR	(SHINFO_REGION_GPA)
     31#define PVTIME_ADDR	(SHINFO_REGION_GPA + PAGE_SIZE)
     32#define RUNSTATE_ADDR	(SHINFO_REGION_GPA + PAGE_SIZE + 0x20)
     33#define VCPU_INFO_ADDR	(SHINFO_REGION_GPA + 0x40)
     34
     35#define SHINFO_VADDR	(SHINFO_REGION_GVA)
     36#define RUNSTATE_VADDR	(SHINFO_REGION_GVA + PAGE_SIZE + 0x20)
     37#define VCPU_INFO_VADDR	(SHINFO_REGION_GVA + 0x40)
     38
     39#define EVTCHN_VECTOR	0x10
     40
     41#define EVTCHN_TEST1 15
     42#define EVTCHN_TEST2 66
     43#define EVTCHN_TIMER 13
     44
     45static struct kvm_vm *vm;
     46
     47#define XEN_HYPERCALL_MSR	0x40000000
     48
     49#define MIN_STEAL_TIME		50000
     50
     51#define __HYPERVISOR_set_timer_op	15
     52#define __HYPERVISOR_sched_op		29
     53#define __HYPERVISOR_event_channel_op	32
     54
     55#define SCHEDOP_poll			3
     56
     57#define EVTCHNOP_send			4
     58
     59#define EVTCHNSTAT_interdomain		2
     60
     61struct evtchn_send {
     62	u32 port;
     63};
     64
     65struct sched_poll {
     66	u32 *ports;
     67	unsigned int nr_ports;
     68	u64 timeout;
     69};
     70
     71struct pvclock_vcpu_time_info {
     72	u32   version;
     73	u32   pad0;
     74	u64   tsc_timestamp;
     75	u64   system_time;
     76	u32   tsc_to_system_mul;
     77	s8    tsc_shift;
     78	u8    flags;
     79	u8    pad[2];
     80} __attribute__((__packed__)); /* 32 bytes */
     81
     82struct pvclock_wall_clock {
     83	u32   version;
     84	u32   sec;
     85	u32   nsec;
     86} __attribute__((__packed__));
     87
     88struct vcpu_runstate_info {
     89    uint32_t state;
     90    uint64_t state_entry_time;
     91    uint64_t time[4];
     92};
     93
     94struct arch_vcpu_info {
     95    unsigned long cr2;
     96    unsigned long pad; /* sizeof(vcpu_info_t) == 64 */
     97};
     98
     99struct vcpu_info {
    100	uint8_t evtchn_upcall_pending;
    101	uint8_t evtchn_upcall_mask;
    102	unsigned long evtchn_pending_sel;
    103	struct arch_vcpu_info arch;
    104	struct pvclock_vcpu_time_info time;
    105}; /* 64 bytes (x86) */
    106
    107struct shared_info {
    108	struct vcpu_info vcpu_info[32];
    109	unsigned long evtchn_pending[64];
    110	unsigned long evtchn_mask[64];
    111	struct pvclock_wall_clock wc;
    112	uint32_t wc_sec_hi;
    113	/* arch_shared_info here */
    114};
    115
    116#define RUNSTATE_running  0
    117#define RUNSTATE_runnable 1
    118#define RUNSTATE_blocked  2
    119#define RUNSTATE_offline  3
    120
    121static const char *runstate_names[] = {
    122	"running",
    123	"runnable",
    124	"blocked",
    125	"offline"
    126};
    127
    128struct {
    129	struct kvm_irq_routing info;
    130	struct kvm_irq_routing_entry entries[2];
    131} irq_routes;
    132
    133bool guest_saw_irq;
    134
    135static void evtchn_handler(struct ex_regs *regs)
    136{
    137	struct vcpu_info *vi = (void *)VCPU_INFO_VADDR;
    138	vi->evtchn_upcall_pending = 0;
    139	vi->evtchn_pending_sel = 0;
    140	guest_saw_irq = true;
    141
    142	GUEST_SYNC(0x20);
    143}
    144
    145static void guest_wait_for_irq(void)
    146{
    147	while (!guest_saw_irq)
    148		__asm__ __volatile__ ("rep nop" : : : "memory");
    149	guest_saw_irq = false;
    150}
    151
    152static void guest_code(void)
    153{
    154	struct vcpu_runstate_info *rs = (void *)RUNSTATE_VADDR;
    155
    156	__asm__ __volatile__(
    157		"sti\n"
    158		"nop\n"
    159	);
    160
    161	/* Trigger an interrupt injection */
    162	GUEST_SYNC(0);
    163
    164	guest_wait_for_irq();
    165
    166	/* Test having the host set runstates manually */
    167	GUEST_SYNC(RUNSTATE_runnable);
    168	GUEST_ASSERT(rs->time[RUNSTATE_runnable] != 0);
    169	GUEST_ASSERT(rs->state == 0);
    170
    171	GUEST_SYNC(RUNSTATE_blocked);
    172	GUEST_ASSERT(rs->time[RUNSTATE_blocked] != 0);
    173	GUEST_ASSERT(rs->state == 0);
    174
    175	GUEST_SYNC(RUNSTATE_offline);
    176	GUEST_ASSERT(rs->time[RUNSTATE_offline] != 0);
    177	GUEST_ASSERT(rs->state == 0);
    178
    179	/* Test runstate time adjust */
    180	GUEST_SYNC(4);
    181	GUEST_ASSERT(rs->time[RUNSTATE_blocked] == 0x5a);
    182	GUEST_ASSERT(rs->time[RUNSTATE_offline] == 0x6b6b);
    183
    184	/* Test runstate time set */
    185	GUEST_SYNC(5);
    186	GUEST_ASSERT(rs->state_entry_time >= 0x8000);
    187	GUEST_ASSERT(rs->time[RUNSTATE_runnable] == 0);
    188	GUEST_ASSERT(rs->time[RUNSTATE_blocked] == 0x6b6b);
    189	GUEST_ASSERT(rs->time[RUNSTATE_offline] == 0x5a);
    190
    191	/* sched_yield() should result in some 'runnable' time */
    192	GUEST_SYNC(6);
    193	GUEST_ASSERT(rs->time[RUNSTATE_runnable] >= MIN_STEAL_TIME);
    194
    195	/* Attempt to deliver a *masked* interrupt */
    196	GUEST_SYNC(7);
    197
    198	/* Wait until we see the bit set */
    199	struct shared_info *si = (void *)SHINFO_VADDR;
    200	while (!si->evtchn_pending[0])
    201		__asm__ __volatile__ ("rep nop" : : : "memory");
    202
    203	/* Now deliver an *unmasked* interrupt */
    204	GUEST_SYNC(8);
    205
    206	guest_wait_for_irq();
    207
    208	/* Change memslots and deliver an interrupt */
    209	GUEST_SYNC(9);
    210
    211	guest_wait_for_irq();
    212
    213	/* Deliver event channel with KVM_XEN_HVM_EVTCHN_SEND */
    214	GUEST_SYNC(10);
    215
    216	guest_wait_for_irq();
    217
    218	GUEST_SYNC(11);
    219
    220	/* Our turn. Deliver event channel (to ourselves) with
    221	 * EVTCHNOP_send hypercall. */
    222	unsigned long rax;
    223	struct evtchn_send s = { .port = 127 };
    224	__asm__ __volatile__ ("vmcall" :
    225			      "=a" (rax) :
    226			      "a" (__HYPERVISOR_event_channel_op),
    227			      "D" (EVTCHNOP_send),
    228			      "S" (&s));
    229
    230	GUEST_ASSERT(rax == 0);
    231
    232	guest_wait_for_irq();
    233
    234	GUEST_SYNC(12);
    235
    236	/* Deliver "outbound" event channel to an eventfd which
    237	 * happens to be one of our own irqfds. */
    238	s.port = 197;
    239	__asm__ __volatile__ ("vmcall" :
    240			      "=a" (rax) :
    241			      "a" (__HYPERVISOR_event_channel_op),
    242			      "D" (EVTCHNOP_send),
    243			      "S" (&s));
    244
    245	GUEST_ASSERT(rax == 0);
    246
    247	guest_wait_for_irq();
    248
    249	GUEST_SYNC(13);
    250
    251	/* Set a timer 100ms in the future. */
    252	__asm__ __volatile__ ("vmcall" :
    253			      "=a" (rax) :
    254			      "a" (__HYPERVISOR_set_timer_op),
    255			      "D" (rs->state_entry_time + 100000000));
    256	GUEST_ASSERT(rax == 0);
    257
    258	GUEST_SYNC(14);
    259
    260	/* Now wait for the timer */
    261	guest_wait_for_irq();
    262
    263	GUEST_SYNC(15);
    264
    265	/* The host has 'restored' the timer. Just wait for it. */
    266	guest_wait_for_irq();
    267
    268	GUEST_SYNC(16);
    269
    270	/* Poll for an event channel port which is already set */
    271	u32 ports[1] = { EVTCHN_TIMER };
    272	struct sched_poll p = {
    273		.ports = ports,
    274		.nr_ports = 1,
    275		.timeout = 0,
    276	};
    277
    278	__asm__ __volatile__ ("vmcall" :
    279			      "=a" (rax) :
    280			      "a" (__HYPERVISOR_sched_op),
    281			      "D" (SCHEDOP_poll),
    282			      "S" (&p));
    283
    284	GUEST_ASSERT(rax == 0);
    285
    286	GUEST_SYNC(17);
    287
    288	/* Poll for an unset port and wait for the timeout. */
    289	p.timeout = 100000000;
    290	__asm__ __volatile__ ("vmcall" :
    291			      "=a" (rax) :
    292			      "a" (__HYPERVISOR_sched_op),
    293			      "D" (SCHEDOP_poll),
    294			      "S" (&p));
    295
    296	GUEST_ASSERT(rax == 0);
    297
    298	GUEST_SYNC(18);
    299
    300	/* A timer will wake the masked port we're waiting on, while we poll */
    301	p.timeout = 0;
    302	__asm__ __volatile__ ("vmcall" :
    303			      "=a" (rax) :
    304			      "a" (__HYPERVISOR_sched_op),
    305			      "D" (SCHEDOP_poll),
    306			      "S" (&p));
    307
    308	GUEST_ASSERT(rax == 0);
    309
    310	GUEST_SYNC(19);
    311
    312	/* A timer wake an *unmasked* port which should wake us with an
    313	 * actual interrupt, while we're polling on a different port. */
    314	ports[0]++;
    315	p.timeout = 0;
    316	__asm__ __volatile__ ("vmcall" :
    317			      "=a" (rax) :
    318			      "a" (__HYPERVISOR_sched_op),
    319			      "D" (SCHEDOP_poll),
    320			      "S" (&p));
    321
    322	GUEST_ASSERT(rax == 0);
    323
    324	guest_wait_for_irq();
    325
    326	GUEST_SYNC(20);
    327
    328	/* Timer should have fired already */
    329	guest_wait_for_irq();
    330
    331	GUEST_SYNC(21);
    332}
    333
    334static int cmp_timespec(struct timespec *a, struct timespec *b)
    335{
    336	if (a->tv_sec > b->tv_sec)
    337		return 1;
    338	else if (a->tv_sec < b->tv_sec)
    339		return -1;
    340	else if (a->tv_nsec > b->tv_nsec)
    341		return 1;
    342	else if (a->tv_nsec < b->tv_nsec)
    343		return -1;
    344	else
    345		return 0;
    346}
    347struct vcpu_info *vinfo;
    348
    349static void handle_alrm(int sig)
    350{
    351	if (vinfo)
    352		printf("evtchn_upcall_pending 0x%x\n", vinfo->evtchn_upcall_pending);
    353	vcpu_dump(stdout, vm, VCPU_ID, 0);
    354	TEST_FAIL("IRQ delivery timed out");
    355}
    356
    357int main(int argc, char *argv[])
    358{
    359	struct timespec min_ts, max_ts, vm_ts;
    360	bool verbose;
    361
    362	verbose = argc > 1 && (!strncmp(argv[1], "-v", 3) ||
    363			       !strncmp(argv[1], "--verbose", 10));
    364
    365	int xen_caps = kvm_check_cap(KVM_CAP_XEN_HVM);
    366	if (!(xen_caps & KVM_XEN_HVM_CONFIG_SHARED_INFO) ) {
    367		print_skip("KVM_XEN_HVM_CONFIG_SHARED_INFO not available");
    368		exit(KSFT_SKIP);
    369	}
    370
    371	bool do_runstate_tests = !!(xen_caps & KVM_XEN_HVM_CONFIG_RUNSTATE);
    372	bool do_eventfd_tests = !!(xen_caps & KVM_XEN_HVM_CONFIG_EVTCHN_2LEVEL);
    373	bool do_evtchn_tests = do_eventfd_tests && !!(xen_caps & KVM_XEN_HVM_CONFIG_EVTCHN_SEND);
    374
    375	clock_gettime(CLOCK_REALTIME, &min_ts);
    376
    377	vm = vm_create_default(VCPU_ID, 0, (void *) guest_code);
    378	vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid());
    379
    380	/* Map a region for the shared_info page */
    381	vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
    382				    SHINFO_REGION_GPA, SHINFO_REGION_SLOT, 2, 0);
    383	virt_map(vm, SHINFO_REGION_GVA, SHINFO_REGION_GPA, 2);
    384
    385	struct shared_info *shinfo = addr_gpa2hva(vm, SHINFO_VADDR);
    386
    387	int zero_fd = open("/dev/zero", O_RDONLY);
    388	TEST_ASSERT(zero_fd != -1, "Failed to open /dev/zero");
    389
    390	struct kvm_xen_hvm_config hvmc = {
    391		.flags = KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL,
    392		.msr = XEN_HYPERCALL_MSR,
    393	};
    394
    395	/* Let the kernel know that we *will* use it for sending all
    396	 * event channels, which lets it intercept SCHEDOP_poll */
    397	if (do_evtchn_tests)
    398		hvmc.flags |= KVM_XEN_HVM_CONFIG_EVTCHN_SEND;
    399
    400	vm_ioctl(vm, KVM_XEN_HVM_CONFIG, &hvmc);
    401
    402	struct kvm_xen_hvm_attr lm = {
    403		.type = KVM_XEN_ATTR_TYPE_LONG_MODE,
    404		.u.long_mode = 1,
    405	};
    406	vm_ioctl(vm, KVM_XEN_HVM_SET_ATTR, &lm);
    407
    408	struct kvm_xen_hvm_attr ha = {
    409		.type = KVM_XEN_ATTR_TYPE_SHARED_INFO,
    410		.u.shared_info.gfn = SHINFO_REGION_GPA / PAGE_SIZE,
    411	};
    412	vm_ioctl(vm, KVM_XEN_HVM_SET_ATTR, &ha);
    413
    414	/*
    415	 * Test what happens when the HVA of the shinfo page is remapped after
    416	 * the kernel has a reference to it. But make sure we copy the clock
    417	 * info over since that's only set at setup time, and we test it later.
    418	 */
    419	struct pvclock_wall_clock wc_copy = shinfo->wc;
    420	void *m = mmap(shinfo, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_PRIVATE, zero_fd, 0);
    421	TEST_ASSERT(m == shinfo, "Failed to map /dev/zero over shared info");
    422	shinfo->wc = wc_copy;
    423
    424	struct kvm_xen_vcpu_attr vi = {
    425		.type = KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO,
    426		.u.gpa = VCPU_INFO_ADDR,
    427	};
    428	vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &vi);
    429
    430	struct kvm_xen_vcpu_attr pvclock = {
    431		.type = KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO,
    432		.u.gpa = PVTIME_ADDR,
    433	};
    434	vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &pvclock);
    435
    436	struct kvm_xen_hvm_attr vec = {
    437		.type = KVM_XEN_ATTR_TYPE_UPCALL_VECTOR,
    438		.u.vector = EVTCHN_VECTOR,
    439	};
    440	vm_ioctl(vm, KVM_XEN_HVM_SET_ATTR, &vec);
    441
    442	vm_init_descriptor_tables(vm);
    443	vcpu_init_descriptor_tables(vm, VCPU_ID);
    444	vm_install_exception_handler(vm, EVTCHN_VECTOR, evtchn_handler);
    445
    446	if (do_runstate_tests) {
    447		struct kvm_xen_vcpu_attr st = {
    448			.type = KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR,
    449			.u.gpa = RUNSTATE_ADDR,
    450		};
    451		vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &st);
    452	}
    453
    454	int irq_fd[2] = { -1, -1 };
    455
    456	if (do_eventfd_tests) {
    457		irq_fd[0] = eventfd(0, 0);
    458		irq_fd[1] = eventfd(0, 0);
    459
    460		/* Unexpected, but not a KVM failure */
    461		if (irq_fd[0] == -1 || irq_fd[1] == -1)
    462			do_evtchn_tests = do_eventfd_tests = false;
    463	}
    464
    465	if (do_eventfd_tests) {
    466		irq_routes.info.nr = 2;
    467
    468		irq_routes.entries[0].gsi = 32;
    469		irq_routes.entries[0].type = KVM_IRQ_ROUTING_XEN_EVTCHN;
    470		irq_routes.entries[0].u.xen_evtchn.port = EVTCHN_TEST1;
    471		irq_routes.entries[0].u.xen_evtchn.vcpu = VCPU_ID;
    472		irq_routes.entries[0].u.xen_evtchn.priority = KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL;
    473
    474		irq_routes.entries[1].gsi = 33;
    475		irq_routes.entries[1].type = KVM_IRQ_ROUTING_XEN_EVTCHN;
    476		irq_routes.entries[1].u.xen_evtchn.port = EVTCHN_TEST2;
    477		irq_routes.entries[1].u.xen_evtchn.vcpu = VCPU_ID;
    478		irq_routes.entries[1].u.xen_evtchn.priority = KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL;
    479
    480		vm_ioctl(vm, KVM_SET_GSI_ROUTING, &irq_routes);
    481
    482		struct kvm_irqfd ifd = { };
    483
    484		ifd.fd = irq_fd[0];
    485		ifd.gsi = 32;
    486		vm_ioctl(vm, KVM_IRQFD, &ifd);
    487
    488		ifd.fd = irq_fd[1];
    489		ifd.gsi = 33;
    490		vm_ioctl(vm, KVM_IRQFD, &ifd);
    491
    492		struct sigaction sa = { };
    493		sa.sa_handler = handle_alrm;
    494		sigaction(SIGALRM, &sa, NULL);
    495	}
    496
    497	struct kvm_xen_vcpu_attr tmr = {
    498		.type = KVM_XEN_VCPU_ATTR_TYPE_TIMER,
    499		.u.timer.port = EVTCHN_TIMER,
    500		.u.timer.priority = KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL,
    501		.u.timer.expires_ns = 0
    502	};
    503
    504	if (do_evtchn_tests) {
    505		struct kvm_xen_hvm_attr inj = {
    506			.type = KVM_XEN_ATTR_TYPE_EVTCHN,
    507			.u.evtchn.send_port = 127,
    508			.u.evtchn.type = EVTCHNSTAT_interdomain,
    509			.u.evtchn.flags = 0,
    510			.u.evtchn.deliver.port.port = EVTCHN_TEST1,
    511			.u.evtchn.deliver.port.vcpu = VCPU_ID + 1,
    512			.u.evtchn.deliver.port.priority = KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL,
    513		};
    514		vm_ioctl(vm, KVM_XEN_HVM_SET_ATTR, &inj);
    515
    516		/* Test migration to a different vCPU */
    517		inj.u.evtchn.flags = KVM_XEN_EVTCHN_UPDATE;
    518		inj.u.evtchn.deliver.port.vcpu = VCPU_ID;
    519		vm_ioctl(vm, KVM_XEN_HVM_SET_ATTR, &inj);
    520
    521		inj.u.evtchn.send_port = 197;
    522		inj.u.evtchn.deliver.eventfd.port = 0;
    523		inj.u.evtchn.deliver.eventfd.fd = irq_fd[1];
    524		inj.u.evtchn.flags = 0;
    525		vm_ioctl(vm, KVM_XEN_HVM_SET_ATTR, &inj);
    526
    527		vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);
    528	}
    529	vinfo = addr_gpa2hva(vm, VCPU_INFO_VADDR);
    530	vinfo->evtchn_upcall_pending = 0;
    531
    532	struct vcpu_runstate_info *rs = addr_gpa2hva(vm, RUNSTATE_ADDR);
    533	rs->state = 0x5a;
    534
    535	bool evtchn_irq_expected = false;
    536
    537	for (;;) {
    538		volatile struct kvm_run *run = vcpu_state(vm, VCPU_ID);
    539		struct ucall uc;
    540
    541		vcpu_run(vm, VCPU_ID);
    542
    543		TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
    544			    "Got exit_reason other than KVM_EXIT_IO: %u (%s)\n",
    545			    run->exit_reason,
    546			    exit_reason_str(run->exit_reason));
    547
    548		switch (get_ucall(vm, VCPU_ID, &uc)) {
    549		case UCALL_ABORT:
    550			TEST_FAIL("%s", (const char *)uc.args[0]);
    551			/* NOT REACHED */
    552		case UCALL_SYNC: {
    553			struct kvm_xen_vcpu_attr rst;
    554			long rundelay;
    555
    556			if (do_runstate_tests)
    557				TEST_ASSERT(rs->state_entry_time == rs->time[0] +
    558					    rs->time[1] + rs->time[2] + rs->time[3],
    559					    "runstate times don't add up");
    560
    561			switch (uc.args[1]) {
    562			case 0:
    563				if (verbose)
    564					printf("Delivering evtchn upcall\n");
    565				evtchn_irq_expected = true;
    566				vinfo->evtchn_upcall_pending = 1;
    567				break;
    568
    569			case RUNSTATE_runnable...RUNSTATE_offline:
    570				TEST_ASSERT(!evtchn_irq_expected, "Event channel IRQ not seen");
    571				if (!do_runstate_tests)
    572					goto done;
    573				if (verbose)
    574					printf("Testing runstate %s\n", runstate_names[uc.args[1]]);
    575				rst.type = KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_CURRENT;
    576				rst.u.runstate.state = uc.args[1];
    577				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &rst);
    578				break;
    579
    580			case 4:
    581				if (verbose)
    582					printf("Testing RUNSTATE_ADJUST\n");
    583				rst.type = KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADJUST;
    584				memset(&rst.u, 0, sizeof(rst.u));
    585				rst.u.runstate.state = (uint64_t)-1;
    586				rst.u.runstate.time_blocked =
    587					0x5a - rs->time[RUNSTATE_blocked];
    588				rst.u.runstate.time_offline =
    589					0x6b6b - rs->time[RUNSTATE_offline];
    590				rst.u.runstate.time_runnable = -rst.u.runstate.time_blocked -
    591					rst.u.runstate.time_offline;
    592				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &rst);
    593				break;
    594
    595			case 5:
    596				if (verbose)
    597					printf("Testing RUNSTATE_DATA\n");
    598				rst.type = KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_DATA;
    599				memset(&rst.u, 0, sizeof(rst.u));
    600				rst.u.runstate.state = RUNSTATE_running;
    601				rst.u.runstate.state_entry_time = 0x6b6b + 0x5a;
    602				rst.u.runstate.time_blocked = 0x6b6b;
    603				rst.u.runstate.time_offline = 0x5a;
    604				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &rst);
    605				break;
    606
    607			case 6:
    608				if (verbose)
    609					printf("Testing steal time\n");
    610				/* Yield until scheduler delay exceeds target */
    611				rundelay = get_run_delay() + MIN_STEAL_TIME;
    612				do {
    613					sched_yield();
    614				} while (get_run_delay() < rundelay);
    615				break;
    616
    617			case 7:
    618				if (!do_eventfd_tests)
    619					goto done;
    620				if (verbose)
    621					printf("Testing masked event channel\n");
    622				shinfo->evtchn_mask[0] = 1UL << EVTCHN_TEST1;
    623				eventfd_write(irq_fd[0], 1UL);
    624				alarm(1);
    625				break;
    626
    627			case 8:
    628				if (verbose)
    629					printf("Testing unmasked event channel\n");
    630				/* Unmask that, but deliver the other one */
    631				shinfo->evtchn_pending[0] = 0;
    632				shinfo->evtchn_mask[0] = 0;
    633				eventfd_write(irq_fd[1], 1UL);
    634				evtchn_irq_expected = true;
    635				alarm(1);
    636				break;
    637
    638			case 9:
    639				TEST_ASSERT(!evtchn_irq_expected,
    640					    "Expected event channel IRQ but it didn't happen");
    641				shinfo->evtchn_pending[1] = 0;
    642				if (verbose)
    643					printf("Testing event channel after memslot change\n");
    644				vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
    645							    DUMMY_REGION_GPA, DUMMY_REGION_SLOT, 1, 0);
    646				eventfd_write(irq_fd[0], 1UL);
    647				evtchn_irq_expected = true;
    648				alarm(1);
    649				break;
    650
    651			case 10:
    652				TEST_ASSERT(!evtchn_irq_expected,
    653					    "Expected event channel IRQ but it didn't happen");
    654				if (!do_evtchn_tests)
    655					goto done;
    656
    657				shinfo->evtchn_pending[0] = 0;
    658				if (verbose)
    659					printf("Testing injection with KVM_XEN_HVM_EVTCHN_SEND\n");
    660
    661				struct kvm_irq_routing_xen_evtchn e;
    662				e.port = EVTCHN_TEST2;
    663				e.vcpu = VCPU_ID;
    664				e.priority = KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL;
    665
    666				vm_ioctl(vm, KVM_XEN_HVM_EVTCHN_SEND, &e);
    667				evtchn_irq_expected = true;
    668				alarm(1);
    669				break;
    670
    671			case 11:
    672				TEST_ASSERT(!evtchn_irq_expected,
    673					    "Expected event channel IRQ but it didn't happen");
    674				shinfo->evtchn_pending[1] = 0;
    675
    676				if (verbose)
    677					printf("Testing guest EVTCHNOP_send direct to evtchn\n");
    678				evtchn_irq_expected = true;
    679				alarm(1);
    680				break;
    681
    682			case 12:
    683				TEST_ASSERT(!evtchn_irq_expected,
    684					    "Expected event channel IRQ but it didn't happen");
    685				shinfo->evtchn_pending[0] = 0;
    686
    687				if (verbose)
    688					printf("Testing guest EVTCHNOP_send to eventfd\n");
    689				evtchn_irq_expected = true;
    690				alarm(1);
    691				break;
    692
    693			case 13:
    694				TEST_ASSERT(!evtchn_irq_expected,
    695					    "Expected event channel IRQ but it didn't happen");
    696				shinfo->evtchn_pending[1] = 0;
    697
    698				if (verbose)
    699					printf("Testing guest oneshot timer\n");
    700				break;
    701
    702			case 14:
    703				memset(&tmr, 0, sizeof(tmr));
    704				tmr.type = KVM_XEN_VCPU_ATTR_TYPE_TIMER;
    705				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_GET_ATTR, &tmr);
    706				TEST_ASSERT(tmr.u.timer.port == EVTCHN_TIMER,
    707					    "Timer port not returned");
    708				TEST_ASSERT(tmr.u.timer.priority == KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL,
    709					    "Timer priority not returned");
    710				TEST_ASSERT(tmr.u.timer.expires_ns > rs->state_entry_time,
    711					    "Timer expiry not returned");
    712				evtchn_irq_expected = true;
    713				alarm(1);
    714				break;
    715
    716			case 15:
    717				TEST_ASSERT(!evtchn_irq_expected,
    718					    "Expected event channel IRQ but it didn't happen");
    719				shinfo->evtchn_pending[0] = 0;
    720
    721				if (verbose)
    722					printf("Testing restored oneshot timer\n");
    723
    724				tmr.u.timer.expires_ns = rs->state_entry_time + 100000000,
    725				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);
    726				evtchn_irq_expected = true;
    727				alarm(1);
    728				break;
    729
    730			case 16:
    731				TEST_ASSERT(!evtchn_irq_expected,
    732					    "Expected event channel IRQ but it didn't happen");
    733
    734				if (verbose)
    735					printf("Testing SCHEDOP_poll with already pending event\n");
    736				shinfo->evtchn_pending[0] = shinfo->evtchn_mask[0] = 1UL << EVTCHN_TIMER;
    737				alarm(1);
    738				break;
    739
    740			case 17:
    741				if (verbose)
    742					printf("Testing SCHEDOP_poll timeout\n");
    743				shinfo->evtchn_pending[0] = 0;
    744				alarm(1);
    745				break;
    746
    747			case 18:
    748				if (verbose)
    749					printf("Testing SCHEDOP_poll wake on masked event\n");
    750
    751				tmr.u.timer.expires_ns = rs->state_entry_time + 100000000,
    752				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);
    753				alarm(1);
    754				break;
    755
    756			case 19:
    757				shinfo->evtchn_pending[0] = shinfo->evtchn_mask[0] = 0;
    758				if (verbose)
    759					printf("Testing SCHEDOP_poll wake on unmasked event\n");
    760
    761				evtchn_irq_expected = true;
    762				tmr.u.timer.expires_ns = rs->state_entry_time + 100000000;
    763				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);
    764
    765				/* Read it back and check the pending time is reported correctly */
    766				tmr.u.timer.expires_ns = 0;
    767				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_GET_ATTR, &tmr);
    768				TEST_ASSERT(tmr.u.timer.expires_ns == rs->state_entry_time + 100000000,
    769					    "Timer not reported pending");
    770				alarm(1);
    771				break;
    772
    773			case 20:
    774				TEST_ASSERT(!evtchn_irq_expected,
    775					    "Expected event channel IRQ but it didn't happen");
    776				/* Read timer and check it is no longer pending */
    777				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_GET_ATTR, &tmr);
    778				TEST_ASSERT(!tmr.u.timer.expires_ns, "Timer still reported pending");
    779
    780				shinfo->evtchn_pending[0] = 0;
    781				if (verbose)
    782					printf("Testing timer in the past\n");
    783
    784				evtchn_irq_expected = true;
    785				tmr.u.timer.expires_ns = rs->state_entry_time - 100000000ULL;
    786				vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);
    787				alarm(1);
    788				break;
    789
    790			case 21:
    791				TEST_ASSERT(!evtchn_irq_expected,
    792					    "Expected event channel IRQ but it didn't happen");
    793				goto done;
    794
    795			case 0x20:
    796				TEST_ASSERT(evtchn_irq_expected, "Unexpected event channel IRQ");
    797				evtchn_irq_expected = false;
    798				break;
    799			}
    800			break;
    801		}
    802		case UCALL_DONE:
    803			goto done;
    804		default:
    805			TEST_FAIL("Unknown ucall 0x%lx.", uc.cmd);
    806		}
    807	}
    808
    809 done:
    810	alarm(0);
    811	clock_gettime(CLOCK_REALTIME, &max_ts);
    812
    813	/*
    814	 * Just a *really* basic check that things are being put in the
    815	 * right place. The actual calculations are much the same for
    816	 * Xen as they are for the KVM variants, so no need to check.
    817	 */
    818	struct pvclock_wall_clock *wc;
    819	struct pvclock_vcpu_time_info *ti, *ti2;
    820
    821	wc = addr_gpa2hva(vm, SHINFO_REGION_GPA + 0xc00);
    822	ti = addr_gpa2hva(vm, SHINFO_REGION_GPA + 0x40 + 0x20);
    823	ti2 = addr_gpa2hva(vm, PVTIME_ADDR);
    824
    825	if (verbose) {
    826		printf("Wall clock (v %d) %d.%09d\n", wc->version, wc->sec, wc->nsec);
    827		printf("Time info 1: v %u tsc %" PRIu64 " time %" PRIu64 " mul %u shift %u flags %x\n",
    828		       ti->version, ti->tsc_timestamp, ti->system_time, ti->tsc_to_system_mul,
    829		       ti->tsc_shift, ti->flags);
    830		printf("Time info 2: v %u tsc %" PRIu64 " time %" PRIu64 " mul %u shift %u flags %x\n",
    831		       ti2->version, ti2->tsc_timestamp, ti2->system_time, ti2->tsc_to_system_mul,
    832		       ti2->tsc_shift, ti2->flags);
    833	}
    834
    835	vm_ts.tv_sec = wc->sec;
    836	vm_ts.tv_nsec = wc->nsec;
    837	TEST_ASSERT(wc->version && !(wc->version & 1),
    838		    "Bad wallclock version %x", wc->version);
    839	TEST_ASSERT(cmp_timespec(&min_ts, &vm_ts) <= 0, "VM time too old");
    840	TEST_ASSERT(cmp_timespec(&max_ts, &vm_ts) >= 0, "VM time too new");
    841
    842	TEST_ASSERT(ti->version && !(ti->version & 1),
    843		    "Bad time_info version %x", ti->version);
    844	TEST_ASSERT(ti2->version && !(ti2->version & 1),
    845		    "Bad time_info version %x", ti->version);
    846
    847	if (do_runstate_tests) {
    848		/*
    849		 * Fetch runstate and check sanity. Strictly speaking in the
    850		 * general case we might not expect the numbers to be identical
    851		 * but in this case we know we aren't running the vCPU any more.
    852		 */
    853		struct kvm_xen_vcpu_attr rst = {
    854			.type = KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_DATA,
    855		};
    856		vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_GET_ATTR, &rst);
    857
    858		if (verbose) {
    859			printf("Runstate: %s(%d), entry %" PRIu64 " ns\n",
    860			       rs->state <= RUNSTATE_offline ? runstate_names[rs->state] : "unknown",
    861			       rs->state, rs->state_entry_time);
    862			for (int i = RUNSTATE_running; i <= RUNSTATE_offline; i++) {
    863				printf("State %s: %" PRIu64 " ns\n",
    864				       runstate_names[i], rs->time[i]);
    865			}
    866		}
    867		TEST_ASSERT(rs->state == rst.u.runstate.state, "Runstate mismatch");
    868		TEST_ASSERT(rs->state_entry_time == rst.u.runstate.state_entry_time,
    869			    "State entry time mismatch");
    870		TEST_ASSERT(rs->time[RUNSTATE_running] == rst.u.runstate.time_running,
    871			    "Running time mismatch");
    872		TEST_ASSERT(rs->time[RUNSTATE_runnable] == rst.u.runstate.time_runnable,
    873			    "Runnable time mismatch");
    874		TEST_ASSERT(rs->time[RUNSTATE_blocked] == rst.u.runstate.time_blocked,
    875			    "Blocked time mismatch");
    876		TEST_ASSERT(rs->time[RUNSTATE_offline] == rst.u.runstate.time_offline,
    877			    "Offline time mismatch");
    878
    879		TEST_ASSERT(rs->state_entry_time == rs->time[0] +
    880			    rs->time[1] + rs->time[2] + rs->time[3],
    881			    "runstate times don't add up");
    882	}
    883	kvm_vm_free(vm);
    884	return 0;
    885}