1d2f938fdSPatrick Mooney /*
2d2f938fdSPatrick Mooney  * This file and its contents are supplied under the terms of the
3d2f938fdSPatrick Mooney  * Common Development and Distribution License ("CDDL"), version 1.0.
4d2f938fdSPatrick Mooney  * You may only use this file in accordance with the terms of version
5d2f938fdSPatrick Mooney  * 1.0 of the CDDL.
6d2f938fdSPatrick Mooney  *
7d2f938fdSPatrick Mooney  * A full copy of the text of the CDDL should have accompanied this
8d2f938fdSPatrick Mooney  * source.  A copy of the CDDL is also available via the Internet at
9d2f938fdSPatrick Mooney  * http://www.illumos.org/license/CDDL.
10d2f938fdSPatrick Mooney  */
11d2f938fdSPatrick Mooney 
12d2f938fdSPatrick Mooney /*
13d2f938fdSPatrick Mooney  * Copyright 2022 Oxide Computer Company
14d2f938fdSPatrick Mooney  */
15d2f938fdSPatrick Mooney 
16d2f938fdSPatrick Mooney #include <stdio.h>
17d2f938fdSPatrick Mooney #include <unistd.h>
18d2f938fdSPatrick Mooney #include <stdlib.h>
19d2f938fdSPatrick Mooney #include <strings.h>
20d2f938fdSPatrick Mooney #include <libgen.h>
21d2f938fdSPatrick Mooney #include <assert.h>
22*32640292SAndy Fiddaman #include <errno.h>
23d2f938fdSPatrick Mooney 
24d2f938fdSPatrick Mooney #include <sys/types.h>
25d2f938fdSPatrick Mooney #include <sys/sysmacros.h>
26d2f938fdSPatrick Mooney #include <sys/debug.h>
27d2f938fdSPatrick Mooney #include <sys/vmm.h>
28d2f938fdSPatrick Mooney #include <sys/vmm_dev.h>
29d2f938fdSPatrick Mooney #include <vmmapi.h>
30d2f938fdSPatrick Mooney 
31d2f938fdSPatrick Mooney #include "in_guest.h"
32d2f938fdSPatrick Mooney 
33d2f938fdSPatrick Mooney int
main(int argc,char * argv[])34d2f938fdSPatrick Mooney main(int argc, char *argv[])
35d2f938fdSPatrick Mooney {
36d2f938fdSPatrick Mooney 	const char *test_suite_name = basename(argv[0]);
37d2f938fdSPatrick Mooney 	struct vmctx *ctx = NULL;
38*32640292SAndy Fiddaman 	struct vcpu *vcpu;
39d2f938fdSPatrick Mooney 	int err;
40d2f938fdSPatrick Mooney 
41d2f938fdSPatrick Mooney 	ctx = test_initialize(test_suite_name);
42d2f938fdSPatrick Mooney 
43*32640292SAndy Fiddaman 	if ((vcpu = vm_vcpu_open(ctx, 0)) == NULL) {
44*32640292SAndy Fiddaman 		test_fail_errno(errno, "Could not open vcpu0");
45*32640292SAndy Fiddaman 	}
46*32640292SAndy Fiddaman 
47*32640292SAndy Fiddaman 	err = test_setup_vcpu(vcpu, MEM_LOC_PAYLOAD, MEM_LOC_STACK);
48d2f938fdSPatrick Mooney 	if (err != 0) {
49d2f938fdSPatrick Mooney 		test_fail_errno(err, "Could not initialize vcpu0");
50d2f938fdSPatrick Mooney 	}
51d2f938fdSPatrick Mooney 
52d2f938fdSPatrick Mooney 	struct vm_entry ventry = { 0 };
53d2f938fdSPatrick Mooney 	struct vm_exit vexit = { 0 };
54d2f938fdSPatrick Mooney 	const uint32_t expected_code = 0x01020304;
55d2f938fdSPatrick Mooney 	const uint64_t expected_wval = 0x05060708090a0b0c;
56d2f938fdSPatrick Mooney 
57d2f938fdSPatrick Mooney 	do {
58d2f938fdSPatrick Mooney 		const enum vm_exit_kind kind =
59*32640292SAndy Fiddaman 		    test_run_vcpu(vcpu, &ventry, &vexit);
60d2f938fdSPatrick Mooney 		switch (kind) {
61d2f938fdSPatrick Mooney 		case VEK_REENTR:
62d2f938fdSPatrick Mooney 			break;
63d2f938fdSPatrick Mooney 		case VEK_UNHANDLED:
64d2f938fdSPatrick Mooney 			/* Look for wrmsr of test value */
65d2f938fdSPatrick Mooney 			if (vexit.exitcode != VM_EXITCODE_WRMSR) {
66d2f938fdSPatrick Mooney 				test_fail_vmexit(&vexit);
67d2f938fdSPatrick Mooney 			}
68d2f938fdSPatrick Mooney 			if (vexit.u.msr.code != expected_code) {
69d2f938fdSPatrick Mooney 				test_fail_msg("code %08x != %08x\n",
70d2f938fdSPatrick Mooney 				    vexit.u.msr.code, expected_code);
71d2f938fdSPatrick Mooney 			}
72d2f938fdSPatrick Mooney 			if (vexit.u.msr.wval != expected_wval) {
73d2f938fdSPatrick Mooney 				test_fail_msg("wval %lx != %lx\n",
74d2f938fdSPatrick Mooney 				    vexit.u.msr.wval, expected_wval);
75d2f938fdSPatrick Mooney 			}
76d2f938fdSPatrick Mooney 			test_pass();
77d2f938fdSPatrick Mooney 			break;
78d2f938fdSPatrick Mooney 
79d2f938fdSPatrick Mooney 		case VEK_TEST_PASS:
80d2f938fdSPatrick Mooney 		case VEK_TEST_FAIL:
81d2f938fdSPatrick Mooney 		default:
82d2f938fdSPatrick Mooney 			test_fail_vmexit(&vexit);
83d2f938fdSPatrick Mooney 			break;
84d2f938fdSPatrick Mooney 		}
85d2f938fdSPatrick Mooney 	} while (true);
86d2f938fdSPatrick Mooney }
87