1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Check decoding of KVM_* commands of ioctl syscall using /dev/kvm API.
3*cf84ac9aSAndroid Build Coastguard Worker * Based on kvmtest.c from https://lwn.net/Articles/658512/
4*cf84ac9aSAndroid Build Coastguard Worker *
5*cf84ac9aSAndroid Build Coastguard Worker * kvmtest.c author: Josh Triplett <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2015 Intel Corporation
7*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2017-2018 The strace developers.
8*cf84ac9aSAndroid Build Coastguard Worker *
9*cf84ac9aSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
10*cf84ac9aSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to
11*cf84ac9aSAndroid Build Coastguard Worker * deal in the Software without restriction, including without limitation the
12*cf84ac9aSAndroid Build Coastguard Worker * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
13*cf84ac9aSAndroid Build Coastguard Worker * sell copies of the Software, and to permit persons to whom the Software is
14*cf84ac9aSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
15*cf84ac9aSAndroid Build Coastguard Worker *
16*cf84ac9aSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in
17*cf84ac9aSAndroid Build Coastguard Worker * all copies or substantial portions of the Software.
18*cf84ac9aSAndroid Build Coastguard Worker *
19*cf84ac9aSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21*cf84ac9aSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22*cf84ac9aSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23*cf84ac9aSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24*cf84ac9aSAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25*cf84ac9aSAndroid Build Coastguard Worker * IN THE SOFTWARE.
26*cf84ac9aSAndroid Build Coastguard Worker */
27*cf84ac9aSAndroid Build Coastguard Worker
28*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
29*cf84ac9aSAndroid Build Coastguard Worker
30*cf84ac9aSAndroid Build Coastguard Worker #if defined HAVE_LINUX_KVM_H \
31*cf84ac9aSAndroid Build Coastguard Worker && defined HAVE_STRUCT_KVM_CPUID2 \
32*cf84ac9aSAndroid Build Coastguard Worker && defined HAVE_STRUCT_KVM_REGS \
33*cf84ac9aSAndroid Build Coastguard Worker && defined HAVE_STRUCT_KVM_SREGS \
34*cf84ac9aSAndroid Build Coastguard Worker && defined HAVE_STRUCT_KVM_USERSPACE_MEMORY_REGION \
35*cf84ac9aSAndroid Build Coastguard Worker &&(defined __x86_64__ || defined __i386__)
36*cf84ac9aSAndroid Build Coastguard Worker
37*cf84ac9aSAndroid Build Coastguard Worker # include <fcntl.h>
38*cf84ac9aSAndroid Build Coastguard Worker # include <stdint.h>
39*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
40*cf84ac9aSAndroid Build Coastguard Worker # include <stdlib.h>
41*cf84ac9aSAndroid Build Coastguard Worker # include <string.h>
42*cf84ac9aSAndroid Build Coastguard Worker # include <sys/ioctl.h>
43*cf84ac9aSAndroid Build Coastguard Worker # include <sys/mman.h>
44*cf84ac9aSAndroid Build Coastguard Worker # include <unistd.h>
45*cf84ac9aSAndroid Build Coastguard Worker # include <linux/kvm.h>
46*cf84ac9aSAndroid Build Coastguard Worker
47*cf84ac9aSAndroid Build Coastguard Worker # ifndef KVM_MAX_CPUID_ENTRIES
48*cf84ac9aSAndroid Build Coastguard Worker # define KVM_MAX_CPUID_ENTRIES 80
49*cf84ac9aSAndroid Build Coastguard Worker # endif
50*cf84ac9aSAndroid Build Coastguard Worker
51*cf84ac9aSAndroid Build Coastguard Worker #include "xlat.h"
52*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/kvm_cpuid_flags.h"
53*cf84ac9aSAndroid Build Coastguard Worker
54*cf84ac9aSAndroid Build Coastguard Worker static int
kvm_ioctl(int fd,unsigned long cmd,const char * cmd_str,void * arg)55*cf84ac9aSAndroid Build Coastguard Worker kvm_ioctl(int fd, unsigned long cmd, const char *cmd_str, void *arg)
56*cf84ac9aSAndroid Build Coastguard Worker {
57*cf84ac9aSAndroid Build Coastguard Worker int rc = ioctl(fd, cmd, arg);
58*cf84ac9aSAndroid Build Coastguard Worker if (rc < 0)
59*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_skip("%s", cmd_str);
60*cf84ac9aSAndroid Build Coastguard Worker return rc;
61*cf84ac9aSAndroid Build Coastguard Worker }
62*cf84ac9aSAndroid Build Coastguard Worker
63*cf84ac9aSAndroid Build Coastguard Worker #define KVM_IOCTL(fd_, cmd_, arg_) \
64*cf84ac9aSAndroid Build Coastguard Worker kvm_ioctl((fd_), (cmd_), #cmd_, (arg_))
65*cf84ac9aSAndroid Build Coastguard Worker
66*cf84ac9aSAndroid Build Coastguard Worker static const char dev[] = "/dev/kvm";
67*cf84ac9aSAndroid Build Coastguard Worker static const char vm_dev[] = "anon_inode:kvm-vm";
68*cf84ac9aSAndroid Build Coastguard Worker static char vcpu_dev[] = "anon_inode:kvm-vcpu:0";
69*cf84ac9aSAndroid Build Coastguard Worker static size_t page_size;
70*cf84ac9aSAndroid Build Coastguard Worker
71*cf84ac9aSAndroid Build Coastguard Worker extern const char code[];
72*cf84ac9aSAndroid Build Coastguard Worker extern const unsigned short code_size;
73*cf84ac9aSAndroid Build Coastguard Worker
74*cf84ac9aSAndroid Build Coastguard Worker __asm__(
75*cf84ac9aSAndroid Build Coastguard Worker ".type code, @object \n"
76*cf84ac9aSAndroid Build Coastguard Worker "code: \n"
77*cf84ac9aSAndroid Build Coastguard Worker " mov $0xd80003f8, %edx \n"
78*cf84ac9aSAndroid Build Coastguard Worker " mov $'\n', %al \n"
79*cf84ac9aSAndroid Build Coastguard Worker " out %al, (%dx) \n"
80*cf84ac9aSAndroid Build Coastguard Worker " hlt \n"
81*cf84ac9aSAndroid Build Coastguard Worker ".size code, . - code \n"
82*cf84ac9aSAndroid Build Coastguard Worker ".type code_size, @object \n"
83*cf84ac9aSAndroid Build Coastguard Worker "code_size: \n"
84*cf84ac9aSAndroid Build Coastguard Worker " .short . - code \n"
85*cf84ac9aSAndroid Build Coastguard Worker ".size code_size, . - code_size \n"
86*cf84ac9aSAndroid Build Coastguard Worker );
87*cf84ac9aSAndroid Build Coastguard Worker
88*cf84ac9aSAndroid Build Coastguard Worker static void
print_kvm_segment(const struct kvm_segment * seg)89*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(const struct kvm_segment *seg)
90*cf84ac9aSAndroid Build Coastguard Worker {
91*cf84ac9aSAndroid Build Coastguard Worker printf("{base=%#jx, limit=%u, selector=%u, type=%u, present=%u, "
92*cf84ac9aSAndroid Build Coastguard Worker "dpl=%u, db=%u, s=%u, l=%u, g=%u, avl=%u}",
93*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) seg->base, seg->limit, seg->selector, seg->type,
94*cf84ac9aSAndroid Build Coastguard Worker seg->present, seg->dpl, seg->db, seg->s, seg->l, seg->g,
95*cf84ac9aSAndroid Build Coastguard Worker seg->avl);
96*cf84ac9aSAndroid Build Coastguard Worker }
97*cf84ac9aSAndroid Build Coastguard Worker
98*cf84ac9aSAndroid Build Coastguard Worker static void
print_kvm_sregs(const struct kvm_sregs * sregs)99*cf84ac9aSAndroid Build Coastguard Worker print_kvm_sregs(const struct kvm_sregs *sregs)
100*cf84ac9aSAndroid Build Coastguard Worker {
101*cf84ac9aSAndroid Build Coastguard Worker printf("{cs=");
102*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(&sregs->cs);
103*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
104*cf84ac9aSAndroid Build Coastguard Worker printf(", ds=");
105*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(&sregs->ds);
106*cf84ac9aSAndroid Build Coastguard Worker printf(", es=");
107*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(&sregs->es);
108*cf84ac9aSAndroid Build Coastguard Worker printf(", fs=");
109*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(&sregs->fs);
110*cf84ac9aSAndroid Build Coastguard Worker printf(", gs=");
111*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(&sregs->gs);
112*cf84ac9aSAndroid Build Coastguard Worker printf(", ss=");
113*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(&sregs->ss);
114*cf84ac9aSAndroid Build Coastguard Worker printf(", tr=");
115*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(&sregs->tr);
116*cf84ac9aSAndroid Build Coastguard Worker printf(", ldt=");
117*cf84ac9aSAndroid Build Coastguard Worker print_kvm_segment(&sregs->ldt);
118*cf84ac9aSAndroid Build Coastguard Worker printf(", gdt={base=%#jx, limit=%u}, idt={base=%#jx, limit=%u}, "
119*cf84ac9aSAndroid Build Coastguard Worker "cr0=%llu, cr2=%llu, cr3=%llu, cr4=%llu, cr8=%llu, efer=%llu, "
120*cf84ac9aSAndroid Build Coastguard Worker "apic_base=%#jx", (uintmax_t) sregs->gdt.base, sregs->gdt.limit,
121*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) sregs->idt.base, sregs->idt.limit, sregs->cr0,
122*cf84ac9aSAndroid Build Coastguard Worker sregs->cr2, sregs->cr3, sregs->cr4, sregs->cr8, sregs->efer,
123*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t)sregs->apic_base);
124*cf84ac9aSAndroid Build Coastguard Worker printf(", interrupt_bitmap=[");
125*cf84ac9aSAndroid Build Coastguard Worker for (size_t i = 0; i < ARRAY_SIZE(sregs->interrupt_bitmap); i++) {
126*cf84ac9aSAndroid Build Coastguard Worker if (i)
127*cf84ac9aSAndroid Build Coastguard Worker printf(", ");
128*cf84ac9aSAndroid Build Coastguard Worker printf("%#jx", (uintmax_t) sregs->interrupt_bitmap[i]);
129*cf84ac9aSAndroid Build Coastguard Worker }
130*cf84ac9aSAndroid Build Coastguard Worker printf("]");
131*cf84ac9aSAndroid Build Coastguard Worker #else
132*cf84ac9aSAndroid Build Coastguard Worker printf(", ...");
133*cf84ac9aSAndroid Build Coastguard Worker #endif
134*cf84ac9aSAndroid Build Coastguard Worker printf("}");
135*cf84ac9aSAndroid Build Coastguard Worker }
136*cf84ac9aSAndroid Build Coastguard Worker
137*cf84ac9aSAndroid Build Coastguard Worker static void
print_kvm_regs(const struct kvm_regs * regs)138*cf84ac9aSAndroid Build Coastguard Worker print_kvm_regs(const struct kvm_regs *regs)
139*cf84ac9aSAndroid Build Coastguard Worker {
140*cf84ac9aSAndroid Build Coastguard Worker printf("{rax=%#jx", (uintmax_t) regs->rax);
141*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
142*cf84ac9aSAndroid Build Coastguard Worker printf(", rbx=%#jx, rcx=%#jx, rdx=%#jx, rsi=%#jx, rdi=%#jx",
143*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->rbx, (uintmax_t) regs->rcx,
144*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->rdx, (uintmax_t) regs->rsi,
145*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->rdi);
146*cf84ac9aSAndroid Build Coastguard Worker #else
147*cf84ac9aSAndroid Build Coastguard Worker printf(", ...");
148*cf84ac9aSAndroid Build Coastguard Worker #endif
149*cf84ac9aSAndroid Build Coastguard Worker printf(", rsp=%#jx, rbp=%#jx", (uintmax_t) regs->rsp,
150*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->rbp);
151*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
152*cf84ac9aSAndroid Build Coastguard Worker printf(", r8=%#jx, r9=%#jx, r10=%#jx, r11=%#jx, r12=%#jx, r13=%#jx"
153*cf84ac9aSAndroid Build Coastguard Worker ", r14=%#jx, r15=%#jx",
154*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->r8, (uintmax_t) regs->r9,
155*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->r10, (uintmax_t) regs->r11,
156*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->r12, (uintmax_t) regs->r13,
157*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->r14, (uintmax_t) regs->r15);
158*cf84ac9aSAndroid Build Coastguard Worker #else
159*cf84ac9aSAndroid Build Coastguard Worker printf(", ...");
160*cf84ac9aSAndroid Build Coastguard Worker #endif
161*cf84ac9aSAndroid Build Coastguard Worker printf(", rip=%#jx, rflags=%#jx}", (uintmax_t) regs->rip,
162*cf84ac9aSAndroid Build Coastguard Worker (uintmax_t) regs->rflags);
163*cf84ac9aSAndroid Build Coastguard Worker }
164*cf84ac9aSAndroid Build Coastguard Worker
165*cf84ac9aSAndroid Build Coastguard Worker # define need_print_KVM_RUN 1
166*cf84ac9aSAndroid Build Coastguard Worker
167*cf84ac9aSAndroid Build Coastguard Worker static void
168*cf84ac9aSAndroid Build Coastguard Worker print_KVM_RUN(const int fd, const char *const dev, const unsigned int reason);
169*cf84ac9aSAndroid Build Coastguard Worker
170*cf84ac9aSAndroid Build Coastguard Worker static void
run_kvm(const int vcpu_fd,struct kvm_run * const run,const size_t mmap_size,void * const mem)171*cf84ac9aSAndroid Build Coastguard Worker run_kvm(const int vcpu_fd, struct kvm_run *const run, const size_t mmap_size,
172*cf84ac9aSAndroid Build Coastguard Worker void *const mem)
173*cf84ac9aSAndroid Build Coastguard Worker {
174*cf84ac9aSAndroid Build Coastguard Worker /* Initialize CS to point at 0, via a read-modify-write of sregs. */
175*cf84ac9aSAndroid Build Coastguard Worker struct kvm_sregs sregs;
176*cf84ac9aSAndroid Build Coastguard Worker KVM_IOCTL(vcpu_fd, KVM_GET_SREGS, &sregs);
177*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_GET_SREGS, ", vcpu_fd, vcpu_dev);
178*cf84ac9aSAndroid Build Coastguard Worker print_kvm_sregs(&sregs);
179*cf84ac9aSAndroid Build Coastguard Worker printf(") = 0\n");
180*cf84ac9aSAndroid Build Coastguard Worker
181*cf84ac9aSAndroid Build Coastguard Worker sregs.cs.base = 0;
182*cf84ac9aSAndroid Build Coastguard Worker sregs.cs.selector = 0;
183*cf84ac9aSAndroid Build Coastguard Worker KVM_IOCTL(vcpu_fd, KVM_SET_SREGS, &sregs);
184*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_SET_SREGS, ", vcpu_fd, vcpu_dev);
185*cf84ac9aSAndroid Build Coastguard Worker print_kvm_sregs(&sregs);
186*cf84ac9aSAndroid Build Coastguard Worker printf(") = 0\n");
187*cf84ac9aSAndroid Build Coastguard Worker
188*cf84ac9aSAndroid Build Coastguard Worker /*
189*cf84ac9aSAndroid Build Coastguard Worker * Initialize registers: instruction pointer for our code, addends,
190*cf84ac9aSAndroid Build Coastguard Worker * and initial flags required by x86 architecture.
191*cf84ac9aSAndroid Build Coastguard Worker */
192*cf84ac9aSAndroid Build Coastguard Worker struct kvm_regs regs = {
193*cf84ac9aSAndroid Build Coastguard Worker .rip = page_size,
194*cf84ac9aSAndroid Build Coastguard Worker .rax = 2,
195*cf84ac9aSAndroid Build Coastguard Worker .rbx = 2,
196*cf84ac9aSAndroid Build Coastguard Worker .rflags = 0x2,
197*cf84ac9aSAndroid Build Coastguard Worker };
198*cf84ac9aSAndroid Build Coastguard Worker KVM_IOCTL(vcpu_fd, KVM_SET_REGS, ®s);
199*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_SET_REGS, ", vcpu_fd, vcpu_dev);
200*cf84ac9aSAndroid Build Coastguard Worker print_kvm_regs(®s);
201*cf84ac9aSAndroid Build Coastguard Worker printf(") = 0\n");
202*cf84ac9aSAndroid Build Coastguard Worker
203*cf84ac9aSAndroid Build Coastguard Worker /* Copy the code */
204*cf84ac9aSAndroid Build Coastguard Worker memcpy(mem, code, code_size);
205*cf84ac9aSAndroid Build Coastguard Worker
206*cf84ac9aSAndroid Build Coastguard Worker const char *p = "\n";
207*cf84ac9aSAndroid Build Coastguard Worker
208*cf84ac9aSAndroid Build Coastguard Worker /* Repeatedly run code and handle VM exits. */
209*cf84ac9aSAndroid Build Coastguard Worker for (;;) {
210*cf84ac9aSAndroid Build Coastguard Worker KVM_IOCTL(vcpu_fd, KVM_RUN, NULL);
211*cf84ac9aSAndroid Build Coastguard Worker print_KVM_RUN(vcpu_fd, vcpu_dev, run->exit_reason);
212*cf84ac9aSAndroid Build Coastguard Worker
213*cf84ac9aSAndroid Build Coastguard Worker switch (run->exit_reason) {
214*cf84ac9aSAndroid Build Coastguard Worker case KVM_EXIT_HLT:
215*cf84ac9aSAndroid Build Coastguard Worker if (p)
216*cf84ac9aSAndroid Build Coastguard Worker error_msg_and_fail("premature KVM_EXIT_HLT");
217*cf84ac9aSAndroid Build Coastguard Worker return;
218*cf84ac9aSAndroid Build Coastguard Worker case KVM_EXIT_IO:
219*cf84ac9aSAndroid Build Coastguard Worker if (run->io.direction == KVM_EXIT_IO_OUT
220*cf84ac9aSAndroid Build Coastguard Worker && run->io.size == 1
221*cf84ac9aSAndroid Build Coastguard Worker && run->io.port == 0x03f8
222*cf84ac9aSAndroid Build Coastguard Worker && run->io.count == 1
223*cf84ac9aSAndroid Build Coastguard Worker && run->io.data_offset < mmap_size
224*cf84ac9aSAndroid Build Coastguard Worker && p && *p == ((char *) run)[run->io.data_offset])
225*cf84ac9aSAndroid Build Coastguard Worker p = NULL;
226*cf84ac9aSAndroid Build Coastguard Worker else
227*cf84ac9aSAndroid Build Coastguard Worker error_msg_and_fail("unhandled KVM_EXIT_IO");
228*cf84ac9aSAndroid Build Coastguard Worker break;
229*cf84ac9aSAndroid Build Coastguard Worker case KVM_EXIT_MMIO:
230*cf84ac9aSAndroid Build Coastguard Worker error_msg_and_fail("Got an unexpected MMIO exit:"
231*cf84ac9aSAndroid Build Coastguard Worker " phys_addr %#llx,"
232*cf84ac9aSAndroid Build Coastguard Worker " data %02x %02x %02x %02x"
233*cf84ac9aSAndroid Build Coastguard Worker " %02x %02x %02x %02x,"
234*cf84ac9aSAndroid Build Coastguard Worker " len %u, is_write %hhu",
235*cf84ac9aSAndroid Build Coastguard Worker (unsigned long long) run->mmio.phys_addr,
236*cf84ac9aSAndroid Build Coastguard Worker run->mmio.data[0], run->mmio.data[1],
237*cf84ac9aSAndroid Build Coastguard Worker run->mmio.data[2], run->mmio.data[3],
238*cf84ac9aSAndroid Build Coastguard Worker run->mmio.data[4], run->mmio.data[5],
239*cf84ac9aSAndroid Build Coastguard Worker run->mmio.data[6], run->mmio.data[7],
240*cf84ac9aSAndroid Build Coastguard Worker run->mmio.len, run->mmio.is_write);
241*cf84ac9aSAndroid Build Coastguard Worker
242*cf84ac9aSAndroid Build Coastguard Worker default:
243*cf84ac9aSAndroid Build Coastguard Worker error_msg_and_fail("exit_reason = %#x",
244*cf84ac9aSAndroid Build Coastguard Worker run->exit_reason);
245*cf84ac9aSAndroid Build Coastguard Worker }
246*cf84ac9aSAndroid Build Coastguard Worker }
247*cf84ac9aSAndroid Build Coastguard Worker }
248*cf84ac9aSAndroid Build Coastguard Worker
249*cf84ac9aSAndroid Build Coastguard Worker static int
vcpu_dev_should_have_cpuid(int fd)250*cf84ac9aSAndroid Build Coastguard Worker vcpu_dev_should_have_cpuid(int fd)
251*cf84ac9aSAndroid Build Coastguard Worker {
252*cf84ac9aSAndroid Build Coastguard Worker int r = 0;
253*cf84ac9aSAndroid Build Coastguard Worker char *filename = NULL;
254*cf84ac9aSAndroid Build Coastguard Worker char buf[sizeof(vcpu_dev)];
255*cf84ac9aSAndroid Build Coastguard Worker
256*cf84ac9aSAndroid Build Coastguard Worker if (asprintf(&filename, "/proc/%d/fd/%d", getpid(), fd) < 0)
257*cf84ac9aSAndroid Build Coastguard Worker error_msg_and_fail("asprintf");
258*cf84ac9aSAndroid Build Coastguard Worker
259*cf84ac9aSAndroid Build Coastguard Worker if (readlink(filename, buf, sizeof(buf)) == sizeof(buf) - 1
260*cf84ac9aSAndroid Build Coastguard Worker && (memcmp(buf, vcpu_dev, sizeof(buf) - 1) == 0))
261*cf84ac9aSAndroid Build Coastguard Worker r = 1;
262*cf84ac9aSAndroid Build Coastguard Worker free(filename);
263*cf84ac9aSAndroid Build Coastguard Worker return r;
264*cf84ac9aSAndroid Build Coastguard Worker }
265*cf84ac9aSAndroid Build Coastguard Worker
266*cf84ac9aSAndroid Build Coastguard Worker static void
print_cpuid_ioctl(int fd,const char * fd_dev,const char * ioctl_name,const struct kvm_cpuid2 * cpuid)267*cf84ac9aSAndroid Build Coastguard Worker print_cpuid_ioctl(int fd, const char *fd_dev,
268*cf84ac9aSAndroid Build Coastguard Worker const char *ioctl_name, const struct kvm_cpuid2 *cpuid)
269*cf84ac9aSAndroid Build Coastguard Worker {
270*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, %s, {nent=%u, entries=[",
271*cf84ac9aSAndroid Build Coastguard Worker fd, fd_dev, ioctl_name, cpuid->nent);
272*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
273*cf84ac9aSAndroid Build Coastguard Worker for (size_t i = 0; i < cpuid->nent; i++) {
274*cf84ac9aSAndroid Build Coastguard Worker if (i)
275*cf84ac9aSAndroid Build Coastguard Worker printf(", ");
276*cf84ac9aSAndroid Build Coastguard Worker printf("{function=%#x, index=%#x, flags=",
277*cf84ac9aSAndroid Build Coastguard Worker cpuid->entries[i].function, cpuid->entries[i].index);
278*cf84ac9aSAndroid Build Coastguard Worker printflags(kvm_cpuid_flags, cpuid->entries[i].flags,
279*cf84ac9aSAndroid Build Coastguard Worker "KVM_CPUID_FLAG_???");
280*cf84ac9aSAndroid Build Coastguard Worker printf(", eax=%#x, ebx=%#x, ecx=%#x, edx=%#x}",
281*cf84ac9aSAndroid Build Coastguard Worker cpuid->entries[i].eax, cpuid->entries[i].ebx,
282*cf84ac9aSAndroid Build Coastguard Worker cpuid->entries[i].ecx, cpuid->entries[i].edx);
283*cf84ac9aSAndroid Build Coastguard Worker }
284*cf84ac9aSAndroid Build Coastguard Worker #else
285*cf84ac9aSAndroid Build Coastguard Worker if (cpuid->nent)
286*cf84ac9aSAndroid Build Coastguard Worker printf("...");
287*cf84ac9aSAndroid Build Coastguard Worker #endif
288*cf84ac9aSAndroid Build Coastguard Worker printf("]}) = 0\n");
289*cf84ac9aSAndroid Build Coastguard Worker }
290*cf84ac9aSAndroid Build Coastguard Worker
291*cf84ac9aSAndroid Build Coastguard Worker int
main(void)292*cf84ac9aSAndroid Build Coastguard Worker main(void)
293*cf84ac9aSAndroid Build Coastguard Worker {
294*cf84ac9aSAndroid Build Coastguard Worker skip_if_unavailable("/proc/self/fd/");
295*cf84ac9aSAndroid Build Coastguard Worker
296*cf84ac9aSAndroid Build Coastguard Worker int kvm = open(dev, O_RDWR);
297*cf84ac9aSAndroid Build Coastguard Worker if (kvm < 0)
298*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_skip("open: %s", dev);
299*cf84ac9aSAndroid Build Coastguard Worker
300*cf84ac9aSAndroid Build Coastguard Worker /* Make sure we have the stable version of the API */
301*cf84ac9aSAndroid Build Coastguard Worker int ret = KVM_IOCTL(kvm, KVM_GET_API_VERSION, 0);
302*cf84ac9aSAndroid Build Coastguard Worker if (ret != KVM_API_VERSION)
303*cf84ac9aSAndroid Build Coastguard Worker error_msg_and_skip("KVM_GET_API_VERSION returned %d"
304*cf84ac9aSAndroid Build Coastguard Worker ", KVM_API_VERSION is %d",
305*cf84ac9aSAndroid Build Coastguard Worker kvm, KVM_API_VERSION);
306*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_GET_API_VERSION, 0) = %d\n",
307*cf84ac9aSAndroid Build Coastguard Worker kvm, dev, ret);
308*cf84ac9aSAndroid Build Coastguard Worker
309*cf84ac9aSAndroid Build Coastguard Worker ret = KVM_IOCTL(kvm, KVM_CHECK_EXTENSION,
310*cf84ac9aSAndroid Build Coastguard Worker (void *) (uintptr_t) KVM_CAP_USER_MEMORY);
311*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY) = %d\n",
312*cf84ac9aSAndroid Build Coastguard Worker kvm, dev, ret);
313*cf84ac9aSAndroid Build Coastguard Worker
314*cf84ac9aSAndroid Build Coastguard Worker int vm_fd = KVM_IOCTL(kvm, KVM_CREATE_VM, 0);
315*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_CREATE_VM, 0) = %d<%s>\n",
316*cf84ac9aSAndroid Build Coastguard Worker kvm, dev, vm_fd, vm_dev);
317*cf84ac9aSAndroid Build Coastguard Worker
318*cf84ac9aSAndroid Build Coastguard Worker /* Allocate one aligned page of guest memory to hold the code. */
319*cf84ac9aSAndroid Build Coastguard Worker page_size = get_page_size();
320*cf84ac9aSAndroid Build Coastguard Worker void *const mem = mmap(NULL, page_size, PROT_READ | PROT_WRITE,
321*cf84ac9aSAndroid Build Coastguard Worker MAP_SHARED | MAP_ANONYMOUS, -1, 0);
322*cf84ac9aSAndroid Build Coastguard Worker if (mem == MAP_FAILED)
323*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("mmap page");
324*cf84ac9aSAndroid Build Coastguard Worker
325*cf84ac9aSAndroid Build Coastguard Worker /* Map it to the second page frame (to avoid the real-mode IDT at 0). */
326*cf84ac9aSAndroid Build Coastguard Worker struct kvm_userspace_memory_region region = {
327*cf84ac9aSAndroid Build Coastguard Worker .slot = 0,
328*cf84ac9aSAndroid Build Coastguard Worker .guest_phys_addr = page_size,
329*cf84ac9aSAndroid Build Coastguard Worker .memory_size = page_size,
330*cf84ac9aSAndroid Build Coastguard Worker .userspace_addr = (uintptr_t) mem,
331*cf84ac9aSAndroid Build Coastguard Worker };
332*cf84ac9aSAndroid Build Coastguard Worker KVM_IOCTL(vm_fd, KVM_SET_USER_MEMORY_REGION, ®ion);
333*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_SET_USER_MEMORY_REGION"
334*cf84ac9aSAndroid Build Coastguard Worker ", {slot=0, flags=0, guest_phys_addr=%#lx, memory_size=%lu"
335*cf84ac9aSAndroid Build Coastguard Worker ", userspace_addr=%p}) = 0\n", vm_fd, vm_dev,
336*cf84ac9aSAndroid Build Coastguard Worker (unsigned long) page_size, (unsigned long) page_size, mem);
337*cf84ac9aSAndroid Build Coastguard Worker
338*cf84ac9aSAndroid Build Coastguard Worker int vcpu_fd = KVM_IOCTL(vm_fd, KVM_CREATE_VCPU, NULL);
339*cf84ac9aSAndroid Build Coastguard Worker if (!vcpu_dev_should_have_cpuid(vcpu_fd)) {
340*cf84ac9aSAndroid Build Coastguard Worker /*
341*cf84ac9aSAndroid Build Coastguard Worker * This is an older kernel that doesn't place a cpuid
342*cf84ac9aSAndroid Build Coastguard Worker * at the end of the dentry associated with vcpu_fd.
343*cf84ac9aSAndroid Build Coastguard Worker * Trim the cpuid part of vcpu_dev like:
344*cf84ac9aSAndroid Build Coastguard Worker * "anon_inode:kvm-vcpu:0" -> "anon_inode:kvm-vcpu"
345*cf84ac9aSAndroid Build Coastguard Worker */
346*cf84ac9aSAndroid Build Coastguard Worker vcpu_dev[strlen (vcpu_dev) - 2] = '\0';
347*cf84ac9aSAndroid Build Coastguard Worker #ifdef KVM_NO_CPUID_CALLBACK
348*cf84ac9aSAndroid Build Coastguard Worker KVM_NO_CPUID_CALLBACK;
349*cf84ac9aSAndroid Build Coastguard Worker #endif
350*cf84ac9aSAndroid Build Coastguard Worker }
351*cf84ac9aSAndroid Build Coastguard Worker
352*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_CREATE_VCPU, 0) = %d<%s>\n",
353*cf84ac9aSAndroid Build Coastguard Worker vm_fd, vm_dev, vcpu_fd, vcpu_dev);
354*cf84ac9aSAndroid Build Coastguard Worker
355*cf84ac9aSAndroid Build Coastguard Worker /* Map the shared kvm_run structure and following data. */
356*cf84ac9aSAndroid Build Coastguard Worker ret = KVM_IOCTL(kvm, KVM_GET_VCPU_MMAP_SIZE, NULL);
357*cf84ac9aSAndroid Build Coastguard Worker struct kvm_run *run;
358*cf84ac9aSAndroid Build Coastguard Worker if (ret < (int) sizeof(*run))
359*cf84ac9aSAndroid Build Coastguard Worker error_msg_and_fail("KVM_GET_VCPU_MMAP_SIZE returned %d < %d",
360*cf84ac9aSAndroid Build Coastguard Worker ret, (int) sizeof(*run));
361*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_GET_VCPU_MMAP_SIZE, 0) = %d\n",
362*cf84ac9aSAndroid Build Coastguard Worker kvm, dev, ret);
363*cf84ac9aSAndroid Build Coastguard Worker
364*cf84ac9aSAndroid Build Coastguard Worker const size_t mmap_size = (ret + page_size - 1) & -page_size;
365*cf84ac9aSAndroid Build Coastguard Worker run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE,
366*cf84ac9aSAndroid Build Coastguard Worker MAP_SHARED, vcpu_fd, 0);
367*cf84ac9aSAndroid Build Coastguard Worker if (run == MAP_FAILED)
368*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("mmap vcpu");
369*cf84ac9aSAndroid Build Coastguard Worker
370*cf84ac9aSAndroid Build Coastguard Worker size_t cpuid_nent = KVM_MAX_CPUID_ENTRIES;
371*cf84ac9aSAndroid Build Coastguard Worker struct kvm_cpuid2 *cpuid = tail_alloc(sizeof(*cpuid) +
372*cf84ac9aSAndroid Build Coastguard Worker cpuid_nent *
373*cf84ac9aSAndroid Build Coastguard Worker sizeof(*cpuid->entries));
374*cf84ac9aSAndroid Build Coastguard Worker
375*cf84ac9aSAndroid Build Coastguard Worker cpuid->nent = 0;
376*cf84ac9aSAndroid Build Coastguard Worker ioctl(kvm, KVM_GET_SUPPORTED_CPUID, cpuid);
377*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_GET_SUPPORTED_CPUID, %p) = -1 E2BIG (%m)\n",
378*cf84ac9aSAndroid Build Coastguard Worker kvm, dev, cpuid);
379*cf84ac9aSAndroid Build Coastguard Worker
380*cf84ac9aSAndroid Build Coastguard Worker cpuid->nent = cpuid_nent;
381*cf84ac9aSAndroid Build Coastguard Worker
382*cf84ac9aSAndroid Build Coastguard Worker KVM_IOCTL(kvm, KVM_GET_SUPPORTED_CPUID, cpuid);
383*cf84ac9aSAndroid Build Coastguard Worker print_cpuid_ioctl(kvm, dev, "KVM_GET_SUPPORTED_CPUID", cpuid);
384*cf84ac9aSAndroid Build Coastguard Worker
385*cf84ac9aSAndroid Build Coastguard Worker struct kvm_cpuid2 cpuid_tmp = { .nent = 0 };
386*cf84ac9aSAndroid Build Coastguard Worker KVM_IOCTL(vcpu_fd, KVM_SET_CPUID2, &cpuid_tmp);
387*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_SET_CPUID2, {nent=%u, entries=[]}) = 0\n",
388*cf84ac9aSAndroid Build Coastguard Worker vcpu_fd, vcpu_dev, cpuid_tmp.nent);
389*cf84ac9aSAndroid Build Coastguard Worker
390*cf84ac9aSAndroid Build Coastguard Worker KVM_IOCTL(vcpu_fd, KVM_SET_CPUID2, cpuid);
391*cf84ac9aSAndroid Build Coastguard Worker print_cpuid_ioctl(vcpu_fd, vcpu_dev, "KVM_SET_CPUID2", cpuid);
392*cf84ac9aSAndroid Build Coastguard Worker
393*cf84ac9aSAndroid Build Coastguard Worker ioctl(vcpu_fd, KVM_SET_CPUID2, NULL);
394*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(%d<%s>, KVM_SET_CPUID2, NULL) = -1 EFAULT (%m)\n",
395*cf84ac9aSAndroid Build Coastguard Worker vcpu_fd, vcpu_dev);
396*cf84ac9aSAndroid Build Coastguard Worker
397*cf84ac9aSAndroid Build Coastguard Worker run_kvm(vcpu_fd, run, mmap_size, mem);
398*cf84ac9aSAndroid Build Coastguard Worker
399*cf84ac9aSAndroid Build Coastguard Worker puts("+++ exited with 0 +++");
400*cf84ac9aSAndroid Build Coastguard Worker return 0;
401*cf84ac9aSAndroid Build Coastguard Worker }
402*cf84ac9aSAndroid Build Coastguard Worker
403*cf84ac9aSAndroid Build Coastguard Worker #else /* !HAVE_LINUX_KVM_H */
404*cf84ac9aSAndroid Build Coastguard Worker
405*cf84ac9aSAndroid Build Coastguard Worker SKIP_MAIN_UNDEFINED("HAVE_LINUX_KVM_H && HAVE_STRUCT_KVM_CPUID2 && "
406*cf84ac9aSAndroid Build Coastguard Worker "HAVE_STRUCT_KVM_REGS && HAVE_STRUCT_KVM_SREGS && "
407*cf84ac9aSAndroid Build Coastguard Worker "HAVE_STRUCT_KVM_USERSPACE_MEMORY_REGION && "
408*cf84ac9aSAndroid Build Coastguard Worker "(__x86_64__ || __i386__)")
409*cf84ac9aSAndroid Build Coastguard Worker
410*cf84ac9aSAndroid Build Coastguard Worker # define need_print_KVM_RUN 0
411*cf84ac9aSAndroid Build Coastguard Worker
412*cf84ac9aSAndroid Build Coastguard Worker #endif
413