1bf21cd93STycho Nightingale /*- 24c87aefeSPatrick Mooney * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 34c87aefeSPatrick Mooney * 4bf21cd93STycho Nightingale * Copyright (c) 2011 NetApp, Inc. 5bf21cd93STycho Nightingale * All rights reserved. 6bf21cd93STycho Nightingale * 7bf21cd93STycho Nightingale * Redistribution and use in source and binary forms, with or without 8bf21cd93STycho Nightingale * modification, are permitted provided that the following conditions 9bf21cd93STycho Nightingale * are met: 10bf21cd93STycho Nightingale * 1. Redistributions of source code must retain the above copyright 11bf21cd93STycho Nightingale * notice, this list of conditions and the following disclaimer. 12bf21cd93STycho Nightingale * 2. Redistributions in binary form must reproduce the above copyright 13bf21cd93STycho Nightingale * notice, this list of conditions and the following disclaimer in the 14bf21cd93STycho Nightingale * documentation and/or other materials provided with the distribution. 15bf21cd93STycho Nightingale * 16bf21cd93STycho Nightingale * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND 17bf21cd93STycho Nightingale * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18bf21cd93STycho Nightingale * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19bf21cd93STycho Nightingale * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE 20bf21cd93STycho Nightingale * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21bf21cd93STycho Nightingale * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22bf21cd93STycho Nightingale * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23bf21cd93STycho Nightingale * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24bf21cd93STycho Nightingale * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25bf21cd93STycho Nightingale * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26bf21cd93STycho Nightingale * SUCH DAMAGE. 27bf21cd93STycho Nightingale * 284c87aefeSPatrick Mooney * $FreeBSD$ 29bf21cd93STycho Nightingale */ 30bf21cd93STycho Nightingale /* 31bf21cd93STycho Nightingale * This file and its contents are supplied under the terms of the 32bf21cd93STycho Nightingale * Common Development and Distribution License ("CDDL"), version 1.0. 33bf21cd93STycho Nightingale * You may only use this file in accordance with the terms of version 34bf21cd93STycho Nightingale * 1.0 of the CDDL. 35bf21cd93STycho Nightingale * 36bf21cd93STycho Nightingale * A full copy of the text of the CDDL should have accompanied this 37bf21cd93STycho Nightingale * source. A copy of the CDDL is also available via the Internet at 38bf21cd93STycho Nightingale * http://www.illumos.org/license/CDDL. 39e0c0d44eSPatrick Mooney * 40bf21cd93STycho Nightingale * Copyright 2015 Pluribus Networks Inc. 414c87aefeSPatrick Mooney * Copyright 2019 Joyent, Inc. 42957246c9SPatrick Mooney * Copyright 2022 Oxide Computer Company 43bf21cd93STycho Nightingale */ 44bf21cd93STycho Nightingale 45bf21cd93STycho Nightingale #include <sys/cdefs.h> 464c87aefeSPatrick Mooney __FBSDID("$FreeBSD$"); 47bf21cd93STycho Nightingale 48bf21cd93STycho Nightingale #include <sys/param.h> 49bf21cd93STycho Nightingale #include <sys/types.h> 50bf21cd93STycho Nightingale #include <sys/sysctl.h> 51bf21cd93STycho Nightingale #include <sys/errno.h> 52bf21cd93STycho Nightingale #include <sys/mman.h> 534c87aefeSPatrick Mooney #include <sys/cpuset.h> 54957246c9SPatrick Mooney #include <sys/fp.h> 55bf21cd93STycho Nightingale 56bf21cd93STycho Nightingale #include <stdio.h> 57bf21cd93STycho Nightingale #include <stdlib.h> 584c87aefeSPatrick Mooney #include <stdbool.h> 594c87aefeSPatrick Mooney #include <string.h> 60bf21cd93STycho Nightingale #include <unistd.h> 61bf21cd93STycho Nightingale #include <libgen.h> 62bf21cd93STycho Nightingale #include <libutil.h> 63bf21cd93STycho Nightingale #include <fcntl.h> 64bf21cd93STycho Nightingale #include <getopt.h> 654c87aefeSPatrick Mooney #include <time.h> 66bf21cd93STycho Nightingale #include <assert.h> 674c87aefeSPatrick Mooney #include <libutil.h> 68bf21cd93STycho Nightingale 694c87aefeSPatrick Mooney #include <machine/cpufunc.h> 704c87aefeSPatrick Mooney #include <machine/specialreg.h> 71bf21cd93STycho Nightingale #include <machine/vmm.h> 724c87aefeSPatrick Mooney #include <machine/vmm_dev.h> 73*54cf5b63SPatrick Mooney #include <sys/vmm_data.h> 74bf21cd93STycho Nightingale #include <vmmapi.h> 75bf21cd93STycho Nightingale 764c87aefeSPatrick Mooney #include "amd/vmcb.h" 77bf21cd93STycho Nightingale #include "intel/vmcs.h" 78bf21cd93STycho Nightingale 79bf21cd93STycho Nightingale #define MB (1UL << 20) 80bf21cd93STycho Nightingale #define GB (1UL << 30) 81bf21cd93STycho Nightingale 82bf21cd93STycho Nightingale #define REQ_ARG required_argument 83bf21cd93STycho Nightingale #define NO_ARG no_argument 84bf21cd93STycho Nightingale #define OPT_ARG optional_argument 85bf21cd93STycho Nightingale 86bf21cd93STycho Nightingale static const char *progname; 87bf21cd93STycho Nightingale 88bf21cd93STycho Nightingale static void 894c87aefeSPatrick Mooney usage(bool cpu_intel) 90bf21cd93STycho Nightingale { 91bf21cd93STycho Nightingale 92bf21cd93STycho Nightingale (void)fprintf(stderr, 93bf21cd93STycho Nightingale "Usage: %s --vm=<vmname>\n" 94bf21cd93STycho Nightingale " [--cpu=<vcpu_number>]\n" 95bf21cd93STycho Nightingale " [--create]\n" 96bf21cd93STycho Nightingale " [--destroy]\n" 970e1453c3SPatrick Mooney " [--pmtmr-port=ioport]\n" 984c87aefeSPatrick Mooney " [--wrlock-cycle]\n" 99bf21cd93STycho Nightingale " [--get-all]\n" 100bf21cd93STycho Nightingale " [--get-stats]\n" 101bf21cd93STycho Nightingale " [--set-desc-ds]\n" 102bf21cd93STycho Nightingale " [--get-desc-ds]\n" 103bf21cd93STycho Nightingale " [--set-desc-es]\n" 104bf21cd93STycho Nightingale " [--get-desc-es]\n" 105bf21cd93STycho Nightingale " [--set-desc-gs]\n" 106bf21cd93STycho Nightingale " [--get-desc-gs]\n" 107bf21cd93STycho Nightingale " [--set-desc-fs]\n" 108bf21cd93STycho Nightingale " [--get-desc-fs]\n" 109bf21cd93STycho Nightingale " [--set-desc-cs]\n" 110bf21cd93STycho Nightingale " [--get-desc-cs]\n" 111bf21cd93STycho Nightingale " [--set-desc-ss]\n" 112bf21cd93STycho Nightingale " [--get-desc-ss]\n" 113bf21cd93STycho Nightingale " [--set-desc-tr]\n" 114bf21cd93STycho Nightingale " [--get-desc-tr]\n" 115bf21cd93STycho Nightingale " [--set-desc-ldtr]\n" 116bf21cd93STycho Nightingale " [--get-desc-ldtr]\n" 117bf21cd93STycho Nightingale " [--set-desc-gdtr]\n" 118bf21cd93STycho Nightingale " [--get-desc-gdtr]\n" 119bf21cd93STycho Nightingale " [--set-desc-idtr]\n" 120bf21cd93STycho Nightingale " [--get-desc-idtr]\n" 121bf21cd93STycho Nightingale " [--run]\n" 122bf21cd93STycho Nightingale " [--capname=<capname>]\n" 123bf21cd93STycho Nightingale " [--getcap]\n" 124bf21cd93STycho Nightingale " [--setcap=<0|1>]\n" 125bf21cd93STycho Nightingale " [--desc-base=<BASE>]\n" 126bf21cd93STycho Nightingale " [--desc-limit=<LIMIT>]\n" 127bf21cd93STycho Nightingale " [--desc-access=<ACCESS>]\n" 128bf21cd93STycho Nightingale " [--set-cr0=<CR0>]\n" 129bf21cd93STycho Nightingale " [--get-cr0]\n" 1304c87aefeSPatrick Mooney " [--set-cr2=<CR2>]\n" 1314c87aefeSPatrick Mooney " [--get-cr2]\n" 132bf21cd93STycho Nightingale " [--set-cr3=<CR3>]\n" 133bf21cd93STycho Nightingale " [--get-cr3]\n" 134bf21cd93STycho Nightingale " [--set-cr4=<CR4>]\n" 135bf21cd93STycho Nightingale " [--get-cr4]\n" 1364c87aefeSPatrick Mooney " [--set-dr0=<DR0>]\n" 1374c87aefeSPatrick Mooney " [--get-dr0]\n" 1384c87aefeSPatrick Mooney " [--set-dr1=<DR1>]\n" 1394c87aefeSPatrick Mooney " [--get-dr1]\n" 1404c87aefeSPatrick Mooney " [--set-dr2=<DR2>]\n" 1414c87aefeSPatrick Mooney " [--get-dr2]\n" 1424c87aefeSPatrick Mooney " [--set-dr3=<DR3>]\n" 1434c87aefeSPatrick Mooney " [--get-dr3]\n" 1444c87aefeSPatrick Mooney " [--set-dr6=<DR6>]\n" 1454c87aefeSPatrick Mooney " [--get-dr6]\n" 146bf21cd93STycho Nightingale " [--set-dr7=<DR7>]\n" 147bf21cd93STycho Nightingale " [--get-dr7]\n" 148bf21cd93STycho Nightingale " [--set-rsp=<RSP>]\n" 149bf21cd93STycho Nightingale " [--get-rsp]\n" 150bf21cd93STycho Nightingale " [--set-rip=<RIP>]\n" 151bf21cd93STycho Nightingale " [--get-rip]\n" 152bf21cd93STycho Nightingale " [--get-rax]\n" 153bf21cd93STycho Nightingale " [--set-rax=<RAX>]\n" 154bf21cd93STycho Nightingale " [--get-rbx]\n" 155bf21cd93STycho Nightingale " [--get-rcx]\n" 156bf21cd93STycho Nightingale " [--get-rdx]\n" 157bf21cd93STycho Nightingale " [--get-rsi]\n" 158bf21cd93STycho Nightingale " [--get-rdi]\n" 159bf21cd93STycho Nightingale " [--get-rbp]\n" 160bf21cd93STycho Nightingale " [--get-r8]\n" 161bf21cd93STycho Nightingale " [--get-r9]\n" 162bf21cd93STycho Nightingale " [--get-r10]\n" 163bf21cd93STycho Nightingale " [--get-r11]\n" 164bf21cd93STycho Nightingale " [--get-r12]\n" 165bf21cd93STycho Nightingale " [--get-r13]\n" 166bf21cd93STycho Nightingale " [--get-r14]\n" 167bf21cd93STycho Nightingale " [--get-r15]\n" 168bf21cd93STycho Nightingale " [--set-rflags=<RFLAGS>]\n" 169bf21cd93STycho Nightingale " [--get-rflags]\n" 170bf21cd93STycho Nightingale " [--set-cs]\n" 171bf21cd93STycho Nightingale " [--get-cs]\n" 172bf21cd93STycho Nightingale " [--set-ds]\n" 173bf21cd93STycho Nightingale " [--get-ds]\n" 174bf21cd93STycho Nightingale " [--set-es]\n" 175bf21cd93STycho Nightingale " [--get-es]\n" 176bf21cd93STycho Nightingale " [--set-fs]\n" 177bf21cd93STycho Nightingale " [--get-fs]\n" 178bf21cd93STycho Nightingale " [--set-gs]\n" 179bf21cd93STycho Nightingale " [--get-gs]\n" 180bf21cd93STycho Nightingale " [--set-ss]\n" 181bf21cd93STycho Nightingale " [--get-ss]\n" 182bf21cd93STycho Nightingale " [--get-tr]\n" 183bf21cd93STycho Nightingale " [--get-ldtr]\n" 184bf21cd93STycho Nightingale " [--set-x2apic-state=<state>]\n" 185bf21cd93STycho Nightingale " [--get-x2apic-state]\n" 186bf21cd93STycho Nightingale " [--set-mem=<memory in units of MB>]\n" 187bf21cd93STycho Nightingale " [--get-lowmem]\n" 1884c87aefeSPatrick Mooney " [--get-highmem]\n" 1894c87aefeSPatrick Mooney " [--get-gpa-pmap]\n" 1904c87aefeSPatrick Mooney " [--assert-lapic-lvt=<pin>]\n" 1914c87aefeSPatrick Mooney " [--inject-nmi]\n" 1924c87aefeSPatrick Mooney " [--force-reset]\n" 1934c87aefeSPatrick Mooney " [--force-poweroff]\n" 1944c87aefeSPatrick Mooney " [--get-rtc-time]\n" 1954c87aefeSPatrick Mooney " [--set-rtc-time=<secs>]\n" 1964c87aefeSPatrick Mooney " [--get-rtc-nvram]\n" 1974c87aefeSPatrick Mooney " [--set-rtc-nvram=<val>]\n" 1984c87aefeSPatrick Mooney " [--rtc-nvram-offset=<offset>]\n" 1994c87aefeSPatrick Mooney " [--get-active-cpus]\n" 2004c87aefeSPatrick Mooney " [--get-suspended-cpus]\n" 2014c87aefeSPatrick Mooney " [--get-intinfo]\n" 2024c87aefeSPatrick Mooney " [--get-eptp]\n" 2034c87aefeSPatrick Mooney " [--set-exception-bitmap]\n" 2044c87aefeSPatrick Mooney " [--get-exception-bitmap]\n" 2054c87aefeSPatrick Mooney " [--get-tsc-offset]\n" 2064c87aefeSPatrick Mooney " [--get-guest-pat]\n" 2074c87aefeSPatrick Mooney " [--get-io-bitmap-address]\n" 2084c87aefeSPatrick Mooney " [--get-msr-bitmap]\n" 2094c87aefeSPatrick Mooney " [--get-msr-bitmap-address]\n" 2104c87aefeSPatrick Mooney " [--get-guest-sysenter]\n" 2114c87aefeSPatrick Mooney " [--get-exit-reason]\n" 2124c87aefeSPatrick Mooney " [--get-cpu-topology]\n", 213bf21cd93STycho Nightingale progname); 2144c87aefeSPatrick Mooney 2154c87aefeSPatrick Mooney if (cpu_intel) { 2164c87aefeSPatrick Mooney (void)fprintf(stderr, 2174c87aefeSPatrick Mooney " [--get-vmcs-pinbased-ctls]\n" 2184c87aefeSPatrick Mooney " [--get-vmcs-procbased-ctls]\n" 2194c87aefeSPatrick Mooney " [--get-vmcs-procbased-ctls2]\n" 2204c87aefeSPatrick Mooney " [--get-vmcs-entry-interruption-info]\n" 2214c87aefeSPatrick Mooney " [--set-vmcs-entry-interruption-info=<info>]\n" 2224c87aefeSPatrick Mooney " [--get-vmcs-guest-physical-address\n" 2234c87aefeSPatrick Mooney " [--get-vmcs-guest-linear-address\n" 2244c87aefeSPatrick Mooney " [--get-vmcs-host-pat]\n" 2254c87aefeSPatrick Mooney " [--get-vmcs-host-cr0]\n" 2264c87aefeSPatrick Mooney " [--get-vmcs-host-cr3]\n" 2274c87aefeSPatrick Mooney " [--get-vmcs-host-cr4]\n" 2284c87aefeSPatrick Mooney " [--get-vmcs-host-rip]\n" 2294c87aefeSPatrick Mooney " [--get-vmcs-host-rsp]\n" 2304c87aefeSPatrick Mooney " [--get-vmcs-cr0-mask]\n" 2314c87aefeSPatrick Mooney " [--get-vmcs-cr0-shadow]\n" 2324c87aefeSPatrick Mooney " [--get-vmcs-cr4-mask]\n" 2334c87aefeSPatrick Mooney " [--get-vmcs-cr4-shadow]\n" 2344c87aefeSPatrick Mooney " [--get-vmcs-cr3-targets]\n" 2354c87aefeSPatrick Mooney " [--get-vmcs-apic-access-address]\n" 2364c87aefeSPatrick Mooney " [--get-vmcs-virtual-apic-address]\n" 2374c87aefeSPatrick Mooney " [--get-vmcs-tpr-threshold]\n" 2384c87aefeSPatrick Mooney " [--get-vmcs-vpid]\n" 2394c87aefeSPatrick Mooney " [--get-vmcs-instruction-error]\n" 2404c87aefeSPatrick Mooney " [--get-vmcs-exit-ctls]\n" 2414c87aefeSPatrick Mooney " [--get-vmcs-entry-ctls]\n" 2424c87aefeSPatrick Mooney " [--get-vmcs-link]\n" 2434c87aefeSPatrick Mooney " [--get-vmcs-exit-qualification]\n" 2444c87aefeSPatrick Mooney " [--get-vmcs-exit-interruption-info]\n" 2454c87aefeSPatrick Mooney " [--get-vmcs-exit-interruption-error]\n" 2464c87aefeSPatrick Mooney " [--get-vmcs-interruptibility]\n" 2474c87aefeSPatrick Mooney ); 2484c87aefeSPatrick Mooney } else { 2494c87aefeSPatrick Mooney (void)fprintf(stderr, 2504c87aefeSPatrick Mooney " [--get-vmcb-intercepts]\n" 2514c87aefeSPatrick Mooney " [--get-vmcb-asid]\n" 2524c87aefeSPatrick Mooney " [--get-vmcb-exit-details]\n" 2534c87aefeSPatrick Mooney " [--get-vmcb-tlb-ctrl]\n" 2544c87aefeSPatrick Mooney " [--get-vmcb-virq]\n" 2554c87aefeSPatrick Mooney " [--get-avic-apic-bar]\n" 2564c87aefeSPatrick Mooney " [--get-avic-backing-page]\n" 2574c87aefeSPatrick Mooney " [--get-avic-table]\n" 2584c87aefeSPatrick Mooney ); 2594c87aefeSPatrick Mooney } 260bf21cd93STycho Nightingale exit(1); 261bf21cd93STycho Nightingale } 262bf21cd93STycho Nightingale 2634c87aefeSPatrick Mooney static int get_rtc_time, set_rtc_time; 2644c87aefeSPatrick Mooney static int get_rtc_nvram, set_rtc_nvram; 2654c87aefeSPatrick Mooney static int rtc_nvram_offset; 2664c87aefeSPatrick Mooney static uint8_t rtc_nvram_value; 2674c87aefeSPatrick Mooney static time_t rtc_secs; 2684c87aefeSPatrick Mooney 2694c87aefeSPatrick Mooney static int get_stats, getcap, setcap, capval, get_gpa_pmap; 2704c87aefeSPatrick Mooney static int inject_nmi, assert_lapic_lvt; 2714c87aefeSPatrick Mooney static int force_reset, force_poweroff; 272bf21cd93STycho Nightingale static const char *capname; 2734c87aefeSPatrick Mooney static int create, destroy, get_memmap, get_memseg; 2744c87aefeSPatrick Mooney static int get_intinfo; 2754c87aefeSPatrick Mooney static int get_active_cpus, get_suspended_cpus; 276bf21cd93STycho Nightingale static uint64_t memsize; 2774c87aefeSPatrick Mooney static int set_cr0, get_cr0, set_cr2, get_cr2, set_cr3, get_cr3; 2784c87aefeSPatrick Mooney static int set_cr4, get_cr4; 279bf21cd93STycho Nightingale static int set_efer, get_efer; 2804c87aefeSPatrick Mooney static int set_dr0, get_dr0; 2814c87aefeSPatrick Mooney static int set_dr1, get_dr1; 2824c87aefeSPatrick Mooney static int set_dr2, get_dr2; 2834c87aefeSPatrick Mooney static int set_dr3, get_dr3; 2844c87aefeSPatrick Mooney static int set_dr6, get_dr6; 285bf21cd93STycho Nightingale static int set_dr7, get_dr7; 286bf21cd93STycho Nightingale static int set_rsp, get_rsp, set_rip, get_rip, set_rflags, get_rflags; 287bf21cd93STycho Nightingale static int set_rax, get_rax; 288bf21cd93STycho Nightingale static int get_rbx, get_rcx, get_rdx, get_rsi, get_rdi, get_rbp; 289bf21cd93STycho Nightingale static int get_r8, get_r9, get_r10, get_r11, get_r12, get_r13, get_r14, get_r15; 290bf21cd93STycho Nightingale static int set_desc_ds, get_desc_ds; 291bf21cd93STycho Nightingale static int set_desc_es, get_desc_es; 292bf21cd93STycho Nightingale static int set_desc_fs, get_desc_fs; 293bf21cd93STycho Nightingale static int set_desc_gs, get_desc_gs; 294bf21cd93STycho Nightingale static int set_desc_cs, get_desc_cs; 295bf21cd93STycho Nightingale static int set_desc_ss, get_desc_ss; 296bf21cd93STycho Nightingale static int set_desc_gdtr, get_desc_gdtr; 297bf21cd93STycho Nightingale static int set_desc_idtr, get_desc_idtr; 298bf21cd93STycho Nightingale static int set_desc_tr, get_desc_tr; 299bf21cd93STycho Nightingale static int set_desc_ldtr, get_desc_ldtr; 300bf21cd93STycho Nightingale static int set_cs, set_ds, set_es, set_fs, set_gs, set_ss, set_tr, set_ldtr; 301bf21cd93STycho Nightingale static int get_cs, get_ds, get_es, get_fs, get_gs, get_ss, get_tr, get_ldtr; 302bf21cd93STycho Nightingale static int set_x2apic_state, get_x2apic_state; 303bf21cd93STycho Nightingale enum x2apic_state x2apic_state; 304bf21cd93STycho Nightingale static int run; 3054c87aefeSPatrick Mooney static int get_cpu_topology; 3060e1453c3SPatrick Mooney static int pmtmr_port; 3074c87aefeSPatrick Mooney static int wrlock_cycle; 308957246c9SPatrick Mooney static int get_fpu; 3094c87aefeSPatrick Mooney 3104c87aefeSPatrick Mooney /* 3114c87aefeSPatrick Mooney * VMCB specific. 3124c87aefeSPatrick Mooney */ 3134c87aefeSPatrick Mooney static int get_vmcb_intercept, get_vmcb_exit_details, get_vmcb_tlb_ctrl; 3144c87aefeSPatrick Mooney static int get_vmcb_virq, get_avic_table; 315bf21cd93STycho Nightingale 316bf21cd93STycho Nightingale /* 317bf21cd93STycho Nightingale * VMCS-specific fields 318bf21cd93STycho Nightingale */ 319bf21cd93STycho Nightingale static int get_pinbased_ctls, get_procbased_ctls, get_procbased_ctls2; 320bf21cd93STycho Nightingale static int get_eptp, get_io_bitmap, get_tsc_offset; 321bf21cd93STycho Nightingale static int get_vmcs_entry_interruption_info, set_vmcs_entry_interruption_info; 322bf21cd93STycho Nightingale static int get_vmcs_interruptibility; 323bf21cd93STycho Nightingale uint32_t vmcs_entry_interruption_info; 324bf21cd93STycho Nightingale static int get_vmcs_gpa, get_vmcs_gla; 325bf21cd93STycho Nightingale static int get_exception_bitmap, set_exception_bitmap, exception_bitmap; 326bf21cd93STycho Nightingale static int get_cr0_mask, get_cr0_shadow; 327bf21cd93STycho Nightingale static int get_cr4_mask, get_cr4_shadow; 328bf21cd93STycho Nightingale static int get_cr3_targets; 329bf21cd93STycho Nightingale static int get_apic_access_addr, get_virtual_apic_addr, get_tpr_threshold; 330bf21cd93STycho Nightingale static int get_msr_bitmap, get_msr_bitmap_address; 331*54cf5b63SPatrick Mooney static int get_guest_msrs; 3324c87aefeSPatrick Mooney static int get_vpid_asid; 333bf21cd93STycho Nightingale static int get_inst_err, get_exit_ctls, get_entry_ctls; 334bf21cd93STycho Nightingale static int get_host_cr0, get_host_cr3, get_host_cr4; 335bf21cd93STycho Nightingale static int get_host_rip, get_host_rsp; 336*54cf5b63SPatrick Mooney static int get_host_pat; 337*54cf5b63SPatrick Mooney static int get_vmcs_link; 3384c87aefeSPatrick Mooney static int get_exit_reason, get_vmcs_exit_qualification; 339bf21cd93STycho Nightingale static int get_vmcs_exit_interruption_info, get_vmcs_exit_interruption_error; 3404c87aefeSPatrick Mooney static int get_vmcs_exit_inst_length; 341bf21cd93STycho Nightingale 342bf21cd93STycho Nightingale static uint64_t desc_base; 343bf21cd93STycho Nightingale static uint32_t desc_limit, desc_access; 344bf21cd93STycho Nightingale 345bf21cd93STycho Nightingale static int get_all; 346bf21cd93STycho Nightingale 347bf21cd93STycho Nightingale static void 348bf21cd93STycho Nightingale dump_vm_run_exitcode(struct vm_exit *vmexit, int vcpu) 349bf21cd93STycho Nightingale { 350bf21cd93STycho Nightingale printf("vm exit[%d]\n", vcpu); 351bf21cd93STycho Nightingale printf("\trip\t\t0x%016lx\n", vmexit->rip); 352bf21cd93STycho Nightingale printf("\tinst_length\t%d\n", vmexit->inst_length); 353bf21cd93STycho Nightingale switch (vmexit->exitcode) { 354bf21cd93STycho Nightingale case VM_EXITCODE_INOUT: 355bf21cd93STycho Nightingale printf("\treason\t\tINOUT\n"); 356e0c0d44eSPatrick Mooney printf("\tdirection\t%s\n", 357e0c0d44eSPatrick Mooney (vmexit->u.inout.flags & INOUT_IN) ? "IN" : "OUT"); 358bf21cd93STycho Nightingale printf("\tbytes\t\t%d\n", vmexit->u.inout.bytes); 359bf21cd93STycho Nightingale printf("\tport\t\t0x%04x\n", vmexit->u.inout.port); 360bf21cd93STycho Nightingale printf("\teax\t\t0x%08x\n", vmexit->u.inout.eax); 361bf21cd93STycho Nightingale break; 362e0c0d44eSPatrick Mooney case VM_EXITCODE_MMIO: 363e0c0d44eSPatrick Mooney printf("\treason\t\tMMIO\n"); 364e0c0d44eSPatrick Mooney printf("\toperation\t%s\n", 365e0c0d44eSPatrick Mooney vmexit->u.mmio.read ? "READ" : "WRITE"); 366e0c0d44eSPatrick Mooney printf("\tbytes\t\t%d\n", vmexit->u.mmio.bytes); 367e0c0d44eSPatrick Mooney printf("\tgpa\t\t0x%08x\n", vmexit->u.mmio.gpa); 368e0c0d44eSPatrick Mooney printf("\tdata\t\t0x%08x\n", vmexit->u.mmio.data); 369e0c0d44eSPatrick Mooney break; 370bf21cd93STycho Nightingale case VM_EXITCODE_VMX: 371bf21cd93STycho Nightingale printf("\treason\t\tVMX\n"); 372bf21cd93STycho Nightingale printf("\tstatus\t\t%d\n", vmexit->u.vmx.status); 373bf21cd93STycho Nightingale printf("\texit_reason\t0x%08x (%u)\n", 374bf21cd93STycho Nightingale vmexit->u.vmx.exit_reason, vmexit->u.vmx.exit_reason); 375bf21cd93STycho Nightingale printf("\tqualification\t0x%016lx\n", 376bf21cd93STycho Nightingale vmexit->u.vmx.exit_qualification); 377bf21cd93STycho Nightingale printf("\tinst_type\t\t%d\n", vmexit->u.vmx.inst_type); 378bf21cd93STycho Nightingale printf("\tinst_error\t\t%d\n", vmexit->u.vmx.inst_error); 379bf21cd93STycho Nightingale break; 3804c87aefeSPatrick Mooney case VM_EXITCODE_SVM: 3814c87aefeSPatrick Mooney printf("\treason\t\tSVM\n"); 3824c87aefeSPatrick Mooney printf("\texit_reason\t\t%#lx\n", vmexit->u.svm.exitcode); 3834c87aefeSPatrick Mooney printf("\texitinfo1\t\t%#lx\n", vmexit->u.svm.exitinfo1); 3844c87aefeSPatrick Mooney printf("\texitinfo2\t\t%#lx\n", vmexit->u.svm.exitinfo2); 3854c87aefeSPatrick Mooney break; 386bf21cd93STycho Nightingale default: 387bf21cd93STycho Nightingale printf("*** unknown vm run exitcode %d\n", vmexit->exitcode); 388bf21cd93STycho Nightingale break; 389bf21cd93STycho Nightingale } 390bf21cd93STycho Nightingale } 391bf21cd93STycho Nightingale 3924c87aefeSPatrick Mooney /* AMD 6th generation and Intel compatible MSRs */ 3934c87aefeSPatrick Mooney #define MSR_AMD6TH_START 0xC0000000 3944c87aefeSPatrick Mooney #define MSR_AMD6TH_END 0xC0001FFF 3954c87aefeSPatrick Mooney /* AMD 7th and 8th generation compatible MSRs */ 3964c87aefeSPatrick Mooney #define MSR_AMD7TH_START 0xC0010000 3974c87aefeSPatrick Mooney #define MSR_AMD7TH_END 0xC0011FFF 3984c87aefeSPatrick Mooney 399*54cf5b63SPatrick Mooney /* Until a safe method is created, arbitrary VMCS reads/writes are forbidden */ 400007ca332SPatrick Mooney static int 401007ca332SPatrick Mooney vm_get_vmcs_field(struct vmctx *ctx, int vcpu, int field, uint64_t *ret_val) 402007ca332SPatrick Mooney { 403007ca332SPatrick Mooney *ret_val = 0; 404007ca332SPatrick Mooney return (0); 405007ca332SPatrick Mooney } 406007ca332SPatrick Mooney 407007ca332SPatrick Mooney static int 408007ca332SPatrick Mooney vm_set_vmcs_field(struct vmctx *ctx, int vcpu, int field, uint64_t val) 409007ca332SPatrick Mooney { 410007ca332SPatrick Mooney return (EINVAL); 411007ca332SPatrick Mooney } 4124c87aefeSPatrick Mooney 413*54cf5b63SPatrick Mooney /* Until a safe method is created, arbitrary VMCB reads/writes are forbidden */ 414096bb5cbSPatrick Mooney static int 415096bb5cbSPatrick Mooney vm_get_vmcb_field(struct vmctx *ctx, int vcpu, int off, int bytes, 416*54cf5b63SPatrick Mooney uint64_t *ret_val) 417096bb5cbSPatrick Mooney { 418096bb5cbSPatrick Mooney *ret_val = 0; 419096bb5cbSPatrick Mooney return (0); 420096bb5cbSPatrick Mooney } 421096bb5cbSPatrick Mooney 422096bb5cbSPatrick Mooney static int 423096bb5cbSPatrick Mooney vm_set_vmcb_field(struct vmctx *ctx, int vcpu, int off, int bytes, 424*54cf5b63SPatrick Mooney uint64_t val) 425096bb5cbSPatrick Mooney { 426096bb5cbSPatrick Mooney return (EINVAL); 427096bb5cbSPatrick Mooney } 4284c87aefeSPatrick Mooney 429bf21cd93STycho Nightingale enum { 430bf21cd93STycho Nightingale VMNAME = 1000, /* avoid collision with return values from getopt */ 431bf21cd93STycho Nightingale VCPU, 432bf21cd93STycho Nightingale SET_MEM, 433bf21cd93STycho Nightingale SET_EFER, 434bf21cd93STycho Nightingale SET_CR0, 4354c87aefeSPatrick Mooney SET_CR2, 436bf21cd93STycho Nightingale SET_CR3, 437bf21cd93STycho Nightingale SET_CR4, 4384c87aefeSPatrick Mooney SET_DR0, 4394c87aefeSPatrick Mooney SET_DR1, 4404c87aefeSPatrick Mooney SET_DR2, 4414c87aefeSPatrick Mooney SET_DR3, 4424c87aefeSPatrick Mooney SET_DR6, 443bf21cd93STycho Nightingale SET_DR7, 444bf21cd93STycho Nightingale SET_RSP, 445bf21cd93STycho Nightingale SET_RIP, 446bf21cd93STycho Nightingale SET_RAX, 447bf21cd93STycho Nightingale SET_RFLAGS, 448bf21cd93STycho Nightingale DESC_BASE, 449bf21cd93STycho Nightingale DESC_LIMIT, 450bf21cd93STycho Nightingale DESC_ACCESS, 451bf21cd93STycho Nightingale SET_CS, 452bf21cd93STycho Nightingale SET_DS, 453bf21cd93STycho Nightingale SET_ES, 454bf21cd93STycho Nightingale SET_FS, 455bf21cd93STycho Nightingale SET_GS, 456bf21cd93STycho Nightingale SET_SS, 457bf21cd93STycho Nightingale SET_TR, 458bf21cd93STycho Nightingale SET_LDTR, 459bf21cd93STycho Nightingale SET_X2APIC_STATE, 4604c87aefeSPatrick Mooney SET_EXCEPTION_BITMAP, 461bf21cd93STycho Nightingale SET_VMCS_ENTRY_INTERRUPTION_INFO, 462bf21cd93STycho Nightingale SET_CAP, 463bf21cd93STycho Nightingale CAPNAME, 464bf21cd93STycho Nightingale UNASSIGN_PPTDEV, 4654c87aefeSPatrick Mooney GET_GPA_PMAP, 4664c87aefeSPatrick Mooney ASSERT_LAPIC_LVT, 4674c87aefeSPatrick Mooney SET_RTC_TIME, 4684c87aefeSPatrick Mooney SET_RTC_NVRAM, 4694c87aefeSPatrick Mooney RTC_NVRAM_OFFSET, 4700e1453c3SPatrick Mooney PMTMR_PORT, 471bf21cd93STycho Nightingale }; 472bf21cd93STycho Nightingale 4734c87aefeSPatrick Mooney static void 4744c87aefeSPatrick Mooney print_cpus(const char *banner, const cpuset_t *cpus) 475bf21cd93STycho Nightingale { 4764c87aefeSPatrick Mooney int i; 4774c87aefeSPatrick Mooney int first; 4784c87aefeSPatrick Mooney 4794c87aefeSPatrick Mooney first = 1; 4804c87aefeSPatrick Mooney printf("%s:\t", banner); 4814c87aefeSPatrick Mooney if (!CPU_EMPTY(cpus)) { 4824c87aefeSPatrick Mooney for (i = 0; i < CPU_SETSIZE; i++) { 4834c87aefeSPatrick Mooney if (CPU_ISSET(i, cpus)) { 4844c87aefeSPatrick Mooney printf("%s%d", first ? " " : ", ", i); 4854c87aefeSPatrick Mooney first = 0; 4864c87aefeSPatrick Mooney } 4874c87aefeSPatrick Mooney } 4884c87aefeSPatrick Mooney } else 4894c87aefeSPatrick Mooney printf(" (none)"); 4904c87aefeSPatrick Mooney printf("\n"); 4914c87aefeSPatrick Mooney } 4924c87aefeSPatrick Mooney 4933d097f7dSPatrick Mooney static void 4943d097f7dSPatrick Mooney print_intinfo(const char *banner, uint64_t info) 4953d097f7dSPatrick Mooney { 4963d097f7dSPatrick Mooney printf("%s:\t", banner); 4973d097f7dSPatrick Mooney if (VM_INTINFO_PENDING(info)) { 4983d097f7dSPatrick Mooney switch (VM_INTINFO_TYPE(info)) { 4993d097f7dSPatrick Mooney case VM_INTINFO_HWINTR: 5003d097f7dSPatrick Mooney printf("extint"); 5013d097f7dSPatrick Mooney break; 5023d097f7dSPatrick Mooney case VM_INTINFO_NMI: 5033d097f7dSPatrick Mooney printf("nmi"); 5043d097f7dSPatrick Mooney break; 5053d097f7dSPatrick Mooney case VM_INTINFO_SWINTR: 5063d097f7dSPatrick Mooney printf("swint"); 5073d097f7dSPatrick Mooney break; 5083d097f7dSPatrick Mooney default: 5093d097f7dSPatrick Mooney printf("exception"); 5103d097f7dSPatrick Mooney break; 5113d097f7dSPatrick Mooney } 5123d097f7dSPatrick Mooney printf(" vector %hhd", VM_INTINFO_VECTOR(info)); 5133d097f7dSPatrick Mooney if (VM_INTINFO_HAS_ERRCODE(info)) { 5143d097f7dSPatrick Mooney printf(" errcode %#x", VM_INTINFO_ERRCODE(info)); 5153d097f7dSPatrick Mooney } 5163d097f7dSPatrick Mooney } else { 5173d097f7dSPatrick Mooney printf("n/a"); 5183d097f7dSPatrick Mooney } 5193d097f7dSPatrick Mooney printf("\n"); 5203d097f7dSPatrick Mooney } 521bf21cd93STycho Nightingale 5224c87aefeSPatrick Mooney static bool 5234c87aefeSPatrick Mooney cpu_vendor_intel(void) 5244c87aefeSPatrick Mooney { 5254c87aefeSPatrick Mooney u_int regs[4]; 5264c87aefeSPatrick Mooney char cpu_vendor[13]; 5274c87aefeSPatrick Mooney 5284c87aefeSPatrick Mooney do_cpuid(0, regs); 5294c87aefeSPatrick Mooney ((u_int *)&cpu_vendor)[0] = regs[1]; 5304c87aefeSPatrick Mooney ((u_int *)&cpu_vendor)[1] = regs[3]; 5314c87aefeSPatrick Mooney ((u_int *)&cpu_vendor)[2] = regs[2]; 5324c87aefeSPatrick Mooney cpu_vendor[12] = '\0'; 5334c87aefeSPatrick Mooney 5344c87aefeSPatrick Mooney if (strcmp(cpu_vendor, "AuthenticAMD") == 0) { 5354c87aefeSPatrick Mooney return (false); 536154972afSPatrick Mooney } else if (strcmp(cpu_vendor, "HygonGenuine") == 0) { 537154972afSPatrick Mooney return (false); 5384c87aefeSPatrick Mooney } else if (strcmp(cpu_vendor, "GenuineIntel") == 0) { 5394c87aefeSPatrick Mooney return (true); 5404c87aefeSPatrick Mooney } else { 5414c87aefeSPatrick Mooney fprintf(stderr, "Unknown cpu vendor \"%s\"\n", cpu_vendor); 5424c87aefeSPatrick Mooney exit(1); 5434c87aefeSPatrick Mooney } 5444c87aefeSPatrick Mooney } 5454c87aefeSPatrick Mooney 5464c87aefeSPatrick Mooney static int 5474c87aefeSPatrick Mooney get_all_registers(struct vmctx *ctx, int vcpu) 5484c87aefeSPatrick Mooney { 5494c87aefeSPatrick Mooney uint64_t cr0, cr2, cr3, cr4, dr0, dr1, dr2, dr3, dr6, dr7; 5504c87aefeSPatrick Mooney uint64_t rsp, rip, rflags, efer; 551bf21cd93STycho Nightingale uint64_t rax, rbx, rcx, rdx, rsi, rdi, rbp; 552bf21cd93STycho Nightingale uint64_t r8, r9, r10, r11, r12, r13, r14, r15; 5534c87aefeSPatrick Mooney int error = 0; 554bf21cd93STycho Nightingale 5554c87aefeSPatrick Mooney if (!error && (get_efer || get_all)) { 5564c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_EFER, &efer); 5574c87aefeSPatrick Mooney if (error == 0) 5584c87aefeSPatrick Mooney printf("efer[%d]\t\t0x%016lx\n", vcpu, efer); 5594c87aefeSPatrick Mooney } 560bf21cd93STycho Nightingale 5614c87aefeSPatrick Mooney if (!error && (get_cr0 || get_all)) { 5624c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR0, &cr0); 5634c87aefeSPatrick Mooney if (error == 0) 5644c87aefeSPatrick Mooney printf("cr0[%d]\t\t0x%016lx\n", vcpu, cr0); 5654c87aefeSPatrick Mooney } 566bf21cd93STycho Nightingale 5674c87aefeSPatrick Mooney if (!error && (get_cr2 || get_all)) { 5684c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR2, &cr2); 5694c87aefeSPatrick Mooney if (error == 0) 5704c87aefeSPatrick Mooney printf("cr2[%d]\t\t0x%016lx\n", vcpu, cr2); 571bf21cd93STycho Nightingale } 572bf21cd93STycho Nightingale 5734c87aefeSPatrick Mooney if (!error && (get_cr3 || get_all)) { 5744c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR3, &cr3); 5754c87aefeSPatrick Mooney if (error == 0) 5764c87aefeSPatrick Mooney printf("cr3[%d]\t\t0x%016lx\n", vcpu, cr3); 577bf21cd93STycho Nightingale } 578bf21cd93STycho Nightingale 5794c87aefeSPatrick Mooney if (!error && (get_cr4 || get_all)) { 5804c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR4, &cr4); 581bf21cd93STycho Nightingale if (error == 0) 5824c87aefeSPatrick Mooney printf("cr4[%d]\t\t0x%016lx\n", vcpu, cr4); 583bf21cd93STycho Nightingale } 584bf21cd93STycho Nightingale 5854c87aefeSPatrick Mooney if (!error && (get_dr0 || get_all)) { 5864c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR0, &dr0); 587bf21cd93STycho Nightingale if (error == 0) 5884c87aefeSPatrick Mooney printf("dr0[%d]\t\t0x%016lx\n", vcpu, dr0); 589bf21cd93STycho Nightingale } 590bf21cd93STycho Nightingale 5914c87aefeSPatrick Mooney if (!error && (get_dr1 || get_all)) { 5924c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR1, &dr1); 593bf21cd93STycho Nightingale if (error == 0) 5944c87aefeSPatrick Mooney printf("dr1[%d]\t\t0x%016lx\n", vcpu, dr1); 595bf21cd93STycho Nightingale } 596bf21cd93STycho Nightingale 5974c87aefeSPatrick Mooney if (!error && (get_dr2 || get_all)) { 5984c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR2, &dr2); 599bf21cd93STycho Nightingale if (error == 0) 6004c87aefeSPatrick Mooney printf("dr2[%d]\t\t0x%016lx\n", vcpu, dr2); 601bf21cd93STycho Nightingale } 602bf21cd93STycho Nightingale 6034c87aefeSPatrick Mooney if (!error && (get_dr3 || get_all)) { 6044c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR3, &dr3); 605bf21cd93STycho Nightingale if (error == 0) 6064c87aefeSPatrick Mooney printf("dr3[%d]\t\t0x%016lx\n", vcpu, dr3); 607bf21cd93STycho Nightingale } 608bf21cd93STycho Nightingale 6094c87aefeSPatrick Mooney if (!error && (get_dr6 || get_all)) { 6104c87aefeSPatrick Mooney error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR6, &dr6); 611bf21cd93STycho Nightingale if (error == 0) 6124c87aefeSPatrick Mooney printf("dr6[%d]\t\t0x%016lx\n", vcpu, dr6); 613bf21cd93STycho Nightingale } 614bf21cd93STycho Nightingale 615bf21cd93STycho Nightingale if (!error && (get_dr7 || get_all)) { 616bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR7, &dr7); 617bf21cd93STycho Nightingale if (error == 0) 618bf21cd93STycho Nightingale printf("dr7[%d]\t\t0x%016lx\n", vcpu, dr7); 619bf21cd93STycho Nightingale } 620bf21cd93STycho Nightingale 621bf21cd93STycho Nightingale if (!error && (get_rsp || get_all)) { 622bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSP, &rsp); 623bf21cd93STycho Nightingale if (error == 0) 624bf21cd93STycho Nightingale printf("rsp[%d]\t\t0x%016lx\n", vcpu, rsp); 625bf21cd93STycho Nightingale } 626bf21cd93STycho Nightingale 627bf21cd93STycho Nightingale if (!error && (get_rip || get_all)) { 628bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RIP, &rip); 629bf21cd93STycho Nightingale if (error == 0) 630bf21cd93STycho Nightingale printf("rip[%d]\t\t0x%016lx\n", vcpu, rip); 631bf21cd93STycho Nightingale } 632bf21cd93STycho Nightingale 633bf21cd93STycho Nightingale if (!error && (get_rax || get_all)) { 634bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RAX, &rax); 635bf21cd93STycho Nightingale if (error == 0) 636bf21cd93STycho Nightingale printf("rax[%d]\t\t0x%016lx\n", vcpu, rax); 637bf21cd93STycho Nightingale } 638bf21cd93STycho Nightingale 639bf21cd93STycho Nightingale if (!error && (get_rbx || get_all)) { 640bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RBX, &rbx); 641bf21cd93STycho Nightingale if (error == 0) 642bf21cd93STycho Nightingale printf("rbx[%d]\t\t0x%016lx\n", vcpu, rbx); 643bf21cd93STycho Nightingale } 644bf21cd93STycho Nightingale 645bf21cd93STycho Nightingale if (!error && (get_rcx || get_all)) { 646bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RCX, &rcx); 647bf21cd93STycho Nightingale if (error == 0) 648bf21cd93STycho Nightingale printf("rcx[%d]\t\t0x%016lx\n", vcpu, rcx); 649bf21cd93STycho Nightingale } 650bf21cd93STycho Nightingale 651bf21cd93STycho Nightingale if (!error && (get_rdx || get_all)) { 652bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RDX, &rdx); 653bf21cd93STycho Nightingale if (error == 0) 654bf21cd93STycho Nightingale printf("rdx[%d]\t\t0x%016lx\n", vcpu, rdx); 655bf21cd93STycho Nightingale } 656bf21cd93STycho Nightingale 657bf21cd93STycho Nightingale if (!error && (get_rsi || get_all)) { 658bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSI, &rsi); 659bf21cd93STycho Nightingale if (error == 0) 660bf21cd93STycho Nightingale printf("rsi[%d]\t\t0x%016lx\n", vcpu, rsi); 661bf21cd93STycho Nightingale } 662bf21cd93STycho Nightingale 663bf21cd93STycho Nightingale if (!error && (get_rdi || get_all)) { 664bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RDI, &rdi); 665bf21cd93STycho Nightingale if (error == 0) 666bf21cd93STycho Nightingale printf("rdi[%d]\t\t0x%016lx\n", vcpu, rdi); 667bf21cd93STycho Nightingale } 668bf21cd93STycho Nightingale 669bf21cd93STycho Nightingale if (!error && (get_rbp || get_all)) { 670bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RBP, &rbp); 671bf21cd93STycho Nightingale if (error == 0) 672bf21cd93STycho Nightingale printf("rbp[%d]\t\t0x%016lx\n", vcpu, rbp); 673bf21cd93STycho Nightingale } 674bf21cd93STycho Nightingale 675bf21cd93STycho Nightingale if (!error && (get_r8 || get_all)) { 676bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R8, &r8); 677bf21cd93STycho Nightingale if (error == 0) 678bf21cd93STycho Nightingale printf("r8[%d]\t\t0x%016lx\n", vcpu, r8); 679bf21cd93STycho Nightingale } 680bf21cd93STycho Nightingale 681bf21cd93STycho Nightingale if (!error && (get_r9 || get_all)) { 682bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R9, &r9); 683bf21cd93STycho Nightingale if (error == 0) 684bf21cd93STycho Nightingale printf("r9[%d]\t\t0x%016lx\n", vcpu, r9); 685bf21cd93STycho Nightingale } 686bf21cd93STycho Nightingale 687bf21cd93STycho Nightingale if (!error && (get_r10 || get_all)) { 688bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R10, &r10); 689bf21cd93STycho Nightingale if (error == 0) 690bf21cd93STycho Nightingale printf("r10[%d]\t\t0x%016lx\n", vcpu, r10); 691bf21cd93STycho Nightingale } 692bf21cd93STycho Nightingale 693bf21cd93STycho Nightingale if (!error && (get_r11 || get_all)) { 694bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R11, &r11); 695bf21cd93STycho Nightingale if (error == 0) 696bf21cd93STycho Nightingale printf("r11[%d]\t\t0x%016lx\n", vcpu, r11); 697bf21cd93STycho Nightingale } 698bf21cd93STycho Nightingale 699bf21cd93STycho Nightingale if (!error && (get_r12 || get_all)) { 700bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R12, &r12); 701bf21cd93STycho Nightingale if (error == 0) 702bf21cd93STycho Nightingale printf("r12[%d]\t\t0x%016lx\n", vcpu, r12); 703bf21cd93STycho Nightingale } 704bf21cd93STycho Nightingale 705bf21cd93STycho Nightingale if (!error && (get_r13 || get_all)) { 706bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R13, &r13); 707bf21cd93STycho Nightingale if (error == 0) 708bf21cd93STycho Nightingale printf("r13[%d]\t\t0x%016lx\n", vcpu, r13); 709bf21cd93STycho Nightingale } 710bf21cd93STycho Nightingale 711bf21cd93STycho Nightingale if (!error && (get_r14 || get_all)) { 712bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R14, &r14); 713bf21cd93STycho Nightingale if (error == 0) 714bf21cd93STycho Nightingale printf("r14[%d]\t\t0x%016lx\n", vcpu, r14); 715bf21cd93STycho Nightingale } 716bf21cd93STycho Nightingale 717bf21cd93STycho Nightingale if (!error && (get_r15 || get_all)) { 718bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R15, &r15); 719bf21cd93STycho Nightingale if (error == 0) 720bf21cd93STycho Nightingale printf("r15[%d]\t\t0x%016lx\n", vcpu, r15); 721bf21cd93STycho Nightingale } 722bf21cd93STycho Nightingale 723bf21cd93STycho Nightingale if (!error && (get_rflags || get_all)) { 724bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, 725bf21cd93STycho Nightingale &rflags); 726bf21cd93STycho Nightingale if (error == 0) 727bf21cd93STycho Nightingale printf("rflags[%d]\t0x%016lx\n", vcpu, rflags); 728bf21cd93STycho Nightingale } 729bf21cd93STycho Nightingale 7304c87aefeSPatrick Mooney return (error); 7314c87aefeSPatrick Mooney } 732bf21cd93STycho Nightingale 7334c87aefeSPatrick Mooney static int 7344c87aefeSPatrick Mooney get_all_segments(struct vmctx *ctx, int vcpu) 7354c87aefeSPatrick Mooney { 7364c87aefeSPatrick Mooney uint64_t cs, ds, es, fs, gs, ss, tr, ldtr; 7374c87aefeSPatrick Mooney int error = 0; 738bf21cd93STycho Nightingale 739bf21cd93STycho Nightingale if (!error && (get_desc_ds || get_all)) { 740bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_DS, 7414c87aefeSPatrick Mooney &desc_base, &desc_limit, &desc_access); 742bf21cd93STycho Nightingale if (error == 0) { 743bf21cd93STycho Nightingale printf("ds desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 7444c87aefeSPatrick Mooney vcpu, desc_base, desc_limit, desc_access); 745bf21cd93STycho Nightingale } 746bf21cd93STycho Nightingale } 747bf21cd93STycho Nightingale 748bf21cd93STycho Nightingale if (!error && (get_desc_es || get_all)) { 749bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_ES, 750bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 751bf21cd93STycho Nightingale if (error == 0) { 752bf21cd93STycho Nightingale printf("es desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 7534c87aefeSPatrick Mooney vcpu, desc_base, desc_limit, desc_access); 754bf21cd93STycho Nightingale } 755bf21cd93STycho Nightingale } 756bf21cd93STycho Nightingale 757bf21cd93STycho Nightingale if (!error && (get_desc_fs || get_all)) { 758bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_FS, 759bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 760bf21cd93STycho Nightingale if (error == 0) { 761bf21cd93STycho Nightingale printf("fs desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 7624c87aefeSPatrick Mooney vcpu, desc_base, desc_limit, desc_access); 763bf21cd93STycho Nightingale } 764bf21cd93STycho Nightingale } 765bf21cd93STycho Nightingale 766bf21cd93STycho Nightingale if (!error && (get_desc_gs || get_all)) { 767bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_GS, 768bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 769bf21cd93STycho Nightingale if (error == 0) { 770bf21cd93STycho Nightingale printf("gs desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 7714c87aefeSPatrick Mooney vcpu, desc_base, desc_limit, desc_access); 772bf21cd93STycho Nightingale } 773bf21cd93STycho Nightingale } 774bf21cd93STycho Nightingale 775bf21cd93STycho Nightingale if (!error && (get_desc_ss || get_all)) { 776bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_SS, 777bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 778bf21cd93STycho Nightingale if (error == 0) { 779bf21cd93STycho Nightingale printf("ss desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 7804c87aefeSPatrick Mooney vcpu, desc_base, desc_limit, desc_access); 781bf21cd93STycho Nightingale } 782bf21cd93STycho Nightingale } 783bf21cd93STycho Nightingale 784bf21cd93STycho Nightingale if (!error && (get_desc_cs || get_all)) { 785bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_CS, 786bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 787bf21cd93STycho Nightingale if (error == 0) { 788bf21cd93STycho Nightingale printf("cs desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 7894c87aefeSPatrick Mooney vcpu, desc_base, desc_limit, desc_access); 790bf21cd93STycho Nightingale } 791bf21cd93STycho Nightingale } 792bf21cd93STycho Nightingale 793bf21cd93STycho Nightingale if (!error && (get_desc_tr || get_all)) { 794bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_TR, 795bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 796bf21cd93STycho Nightingale if (error == 0) { 797bf21cd93STycho Nightingale printf("tr desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 7984c87aefeSPatrick Mooney vcpu, desc_base, desc_limit, desc_access); 799bf21cd93STycho Nightingale } 800bf21cd93STycho Nightingale } 801bf21cd93STycho Nightingale 802bf21cd93STycho Nightingale if (!error && (get_desc_ldtr || get_all)) { 803bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_LDTR, 804bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 805bf21cd93STycho Nightingale if (error == 0) { 806bf21cd93STycho Nightingale printf("ldtr desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 8074c87aefeSPatrick Mooney vcpu, desc_base, desc_limit, desc_access); 808bf21cd93STycho Nightingale } 809bf21cd93STycho Nightingale } 810bf21cd93STycho Nightingale 811bf21cd93STycho Nightingale if (!error && (get_desc_gdtr || get_all)) { 812bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_GDTR, 813bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 814bf21cd93STycho Nightingale if (error == 0) { 815bf21cd93STycho Nightingale printf("gdtr[%d]\t\t0x%016lx/0x%08x\n", 8164c87aefeSPatrick Mooney vcpu, desc_base, desc_limit); 817bf21cd93STycho Nightingale } 818bf21cd93STycho Nightingale } 819bf21cd93STycho Nightingale 820bf21cd93STycho Nightingale if (!error && (get_desc_idtr || get_all)) { 821bf21cd93STycho Nightingale error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_IDTR, 822bf21cd93STycho Nightingale &desc_base, &desc_limit, &desc_access); 823bf21cd93STycho Nightingale if (error == 0) { 824bf21cd93STycho Nightingale printf("idtr[%d]\t\t0x%016lx/0x%08x\n", 8254c87aefeSPatrick Mooney vcpu, desc_base, desc_limit); 826bf21cd93STycho Nightingale } 827bf21cd93STycho Nightingale } 828bf21cd93STycho Nightingale 829bf21cd93STycho Nightingale if (!error && (get_cs || get_all)) { 830bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CS, &cs); 831bf21cd93STycho Nightingale if (error == 0) 832bf21cd93STycho Nightingale printf("cs[%d]\t\t0x%04lx\n", vcpu, cs); 833bf21cd93STycho Nightingale } 834bf21cd93STycho Nightingale 835bf21cd93STycho Nightingale if (!error && (get_ds || get_all)) { 836bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DS, &ds); 837bf21cd93STycho Nightingale if (error == 0) 838bf21cd93STycho Nightingale printf("ds[%d]\t\t0x%04lx\n", vcpu, ds); 839bf21cd93STycho Nightingale } 840bf21cd93STycho Nightingale 841bf21cd93STycho Nightingale if (!error && (get_es || get_all)) { 842bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_ES, &es); 843bf21cd93STycho Nightingale if (error == 0) 844bf21cd93STycho Nightingale printf("es[%d]\t\t0x%04lx\n", vcpu, es); 845bf21cd93STycho Nightingale } 846bf21cd93STycho Nightingale 847bf21cd93STycho Nightingale if (!error && (get_fs || get_all)) { 848bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_FS, &fs); 849bf21cd93STycho Nightingale if (error == 0) 850bf21cd93STycho Nightingale printf("fs[%d]\t\t0x%04lx\n", vcpu, fs); 851bf21cd93STycho Nightingale } 852bf21cd93STycho Nightingale 853bf21cd93STycho Nightingale if (!error && (get_gs || get_all)) { 854bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_GS, &gs); 855bf21cd93STycho Nightingale if (error == 0) 856bf21cd93STycho Nightingale printf("gs[%d]\t\t0x%04lx\n", vcpu, gs); 857bf21cd93STycho Nightingale } 858bf21cd93STycho Nightingale 859bf21cd93STycho Nightingale if (!error && (get_ss || get_all)) { 860bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_SS, &ss); 861bf21cd93STycho Nightingale if (error == 0) 862bf21cd93STycho Nightingale printf("ss[%d]\t\t0x%04lx\n", vcpu, ss); 863bf21cd93STycho Nightingale } 864bf21cd93STycho Nightingale 865bf21cd93STycho Nightingale if (!error && (get_tr || get_all)) { 866bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_TR, &tr); 867bf21cd93STycho Nightingale if (error == 0) 868bf21cd93STycho Nightingale printf("tr[%d]\t\t0x%04lx\n", vcpu, tr); 869bf21cd93STycho Nightingale } 870bf21cd93STycho Nightingale 871bf21cd93STycho Nightingale if (!error && (get_ldtr || get_all)) { 872bf21cd93STycho Nightingale error = vm_get_register(ctx, vcpu, VM_REG_GUEST_LDTR, &ldtr); 873bf21cd93STycho Nightingale if (error == 0) 874bf21cd93STycho Nightingale printf("ldtr[%d]\t\t0x%04lx\n", vcpu, ldtr); 875bf21cd93STycho Nightingale } 876bf21cd93STycho Nightingale 8774c87aefeSPatrick Mooney return (error); 8784c87aefeSPatrick Mooney } 879bf21cd93STycho Nightingale 8804c87aefeSPatrick Mooney static int 8814c87aefeSPatrick Mooney get_misc_vmcs(struct vmctx *ctx, int vcpu) 8824c87aefeSPatrick Mooney { 8834c87aefeSPatrick Mooney uint64_t ctl, cr0, cr3, cr4, rsp, rip, pat, addr, u64; 8844c87aefeSPatrick Mooney int error = 0; 885bf21cd93STycho Nightingale 886bf21cd93STycho Nightingale if (!error && (get_cr0_mask || get_all)) { 887bf21cd93STycho Nightingale uint64_t cr0mask; 888bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR0_MASK, &cr0mask); 889bf21cd93STycho Nightingale if (error == 0) 890bf21cd93STycho Nightingale printf("cr0_mask[%d]\t\t0x%016lx\n", vcpu, cr0mask); 891bf21cd93STycho Nightingale } 892bf21cd93STycho Nightingale 893bf21cd93STycho Nightingale if (!error && (get_cr0_shadow || get_all)) { 894bf21cd93STycho Nightingale uint64_t cr0shadow; 895bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR0_SHADOW, 896bf21cd93STycho Nightingale &cr0shadow); 897bf21cd93STycho Nightingale if (error == 0) 898bf21cd93STycho Nightingale printf("cr0_shadow[%d]\t\t0x%016lx\n", vcpu, cr0shadow); 899bf21cd93STycho Nightingale } 900bf21cd93STycho Nightingale 901bf21cd93STycho Nightingale if (!error && (get_cr4_mask || get_all)) { 902bf21cd93STycho Nightingale uint64_t cr4mask; 903bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR4_MASK, &cr4mask); 904bf21cd93STycho Nightingale if (error == 0) 905bf21cd93STycho Nightingale printf("cr4_mask[%d]\t\t0x%016lx\n", vcpu, cr4mask); 906bf21cd93STycho Nightingale } 907bf21cd93STycho Nightingale 908bf21cd93STycho Nightingale if (!error && (get_cr4_shadow || get_all)) { 909bf21cd93STycho Nightingale uint64_t cr4shadow; 910bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR4_SHADOW, 911bf21cd93STycho Nightingale &cr4shadow); 912bf21cd93STycho Nightingale if (error == 0) 913bf21cd93STycho Nightingale printf("cr4_shadow[%d]\t\t0x%016lx\n", vcpu, cr4shadow); 914bf21cd93STycho Nightingale } 915*54cf5b63SPatrick Mooney 916bf21cd93STycho Nightingale if (!error && (get_cr3_targets || get_all)) { 917bf21cd93STycho Nightingale uint64_t target_count, target_addr; 918bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET_COUNT, 919bf21cd93STycho Nightingale &target_count); 920bf21cd93STycho Nightingale if (error == 0) { 9214c87aefeSPatrick Mooney printf("cr3_target_count[%d]\t0x%016lx\n", 922bf21cd93STycho Nightingale vcpu, target_count); 923bf21cd93STycho Nightingale } 924bf21cd93STycho Nightingale 925bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET0, 926bf21cd93STycho Nightingale &target_addr); 927bf21cd93STycho Nightingale if (error == 0) { 928bf21cd93STycho Nightingale printf("cr3_target0[%d]\t\t0x%016lx\n", 929bf21cd93STycho Nightingale vcpu, target_addr); 930bf21cd93STycho Nightingale } 931bf21cd93STycho Nightingale 932bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET1, 933bf21cd93STycho Nightingale &target_addr); 934bf21cd93STycho Nightingale if (error == 0) { 935bf21cd93STycho Nightingale printf("cr3_target1[%d]\t\t0x%016lx\n", 936bf21cd93STycho Nightingale vcpu, target_addr); 937bf21cd93STycho Nightingale } 938bf21cd93STycho Nightingale 939bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET2, 940bf21cd93STycho Nightingale &target_addr); 941bf21cd93STycho Nightingale if (error == 0) { 942bf21cd93STycho Nightingale printf("cr3_target2[%d]\t\t0x%016lx\n", 943bf21cd93STycho Nightingale vcpu, target_addr); 944bf21cd93STycho Nightingale } 945bf21cd93STycho Nightingale 946bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET3, 947bf21cd93STycho Nightingale &target_addr); 948bf21cd93STycho Nightingale if (error == 0) { 949bf21cd93STycho Nightingale printf("cr3_target3[%d]\t\t0x%016lx\n", 950bf21cd93STycho Nightingale vcpu, target_addr); 951bf21cd93STycho Nightingale } 952bf21cd93STycho Nightingale } 953bf21cd93STycho Nightingale 9544c87aefeSPatrick Mooney if (!error && (get_pinbased_ctls || get_all)) { 9554c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_PIN_BASED_CTLS, &ctl); 956bf21cd93STycho Nightingale if (error == 0) 9574c87aefeSPatrick Mooney printf("pinbased_ctls[%d]\t0x%016lx\n", vcpu, ctl); 958bf21cd93STycho Nightingale } 959bf21cd93STycho Nightingale 9604c87aefeSPatrick Mooney if (!error && (get_procbased_ctls || get_all)) { 9614c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, 9624c87aefeSPatrick Mooney VMCS_PRI_PROC_BASED_CTLS, &ctl); 963bf21cd93STycho Nightingale if (error == 0) 9644c87aefeSPatrick Mooney printf("procbased_ctls[%d]\t0x%016lx\n", vcpu, ctl); 965bf21cd93STycho Nightingale } 966bf21cd93STycho Nightingale 9674c87aefeSPatrick Mooney if (!error && (get_procbased_ctls2 || get_all)) { 9684c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, 9694c87aefeSPatrick Mooney VMCS_SEC_PROC_BASED_CTLS, &ctl); 970bf21cd93STycho Nightingale if (error == 0) 9714c87aefeSPatrick Mooney printf("procbased_ctls2[%d]\t0x%016lx\n", vcpu, ctl); 972bf21cd93STycho Nightingale } 973bf21cd93STycho Nightingale 9744c87aefeSPatrick Mooney if (!error && (get_vmcs_gla || get_all)) { 9754c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, 9764c87aefeSPatrick Mooney VMCS_GUEST_LINEAR_ADDRESS, &u64); 977bf21cd93STycho Nightingale if (error == 0) 9784c87aefeSPatrick Mooney printf("gla[%d]\t\t0x%016lx\n", vcpu, u64); 979bf21cd93STycho Nightingale } 980bf21cd93STycho Nightingale 9814c87aefeSPatrick Mooney if (!error && (get_vmcs_gpa || get_all)) { 9824c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, 9834c87aefeSPatrick Mooney VMCS_GUEST_PHYSICAL_ADDRESS, &u64); 984bf21cd93STycho Nightingale if (error == 0) 9854c87aefeSPatrick Mooney printf("gpa[%d]\t\t0x%016lx\n", vcpu, u64); 986bf21cd93STycho Nightingale } 987bf21cd93STycho Nightingale 988*54cf5b63SPatrick Mooney if (!error && (get_vmcs_entry_interruption_info || 9894c87aefeSPatrick Mooney get_all)) { 9904c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_ENTRY_INTR_INFO,&u64); 9914c87aefeSPatrick Mooney if (error == 0) { 9924c87aefeSPatrick Mooney printf("entry_interruption_info[%d]\t0x%016lx\n", 9934c87aefeSPatrick Mooney vcpu, u64); 9944c87aefeSPatrick Mooney } 995bf21cd93STycho Nightingale } 996bf21cd93STycho Nightingale 9974c87aefeSPatrick Mooney if (!error && (get_tpr_threshold || get_all)) { 9984c87aefeSPatrick Mooney uint64_t threshold; 9994c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_TPR_THRESHOLD, 10004c87aefeSPatrick Mooney &threshold); 1001bf21cd93STycho Nightingale if (error == 0) 10024c87aefeSPatrick Mooney printf("tpr_threshold[%d]\t0x%016lx\n", vcpu, threshold); 1003bf21cd93STycho Nightingale } 1004bf21cd93STycho Nightingale 1005bf21cd93STycho Nightingale if (!error && (get_inst_err || get_all)) { 1006bf21cd93STycho Nightingale uint64_t insterr; 1007bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_INSTRUCTION_ERROR, 1008bf21cd93STycho Nightingale &insterr); 1009bf21cd93STycho Nightingale if (error == 0) { 10104c87aefeSPatrick Mooney printf("instruction_error[%d]\t0x%016lx\n", 1011bf21cd93STycho Nightingale vcpu, insterr); 1012bf21cd93STycho Nightingale } 1013bf21cd93STycho Nightingale } 1014bf21cd93STycho Nightingale 1015bf21cd93STycho Nightingale if (!error && (get_exit_ctls || get_all)) { 1016bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_CTLS, &ctl); 1017bf21cd93STycho Nightingale if (error == 0) 10184c87aefeSPatrick Mooney printf("exit_ctls[%d]\t\t0x%016lx\n", vcpu, ctl); 1019bf21cd93STycho Nightingale } 1020bf21cd93STycho Nightingale 1021bf21cd93STycho Nightingale if (!error && (get_entry_ctls || get_all)) { 1022bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_ENTRY_CTLS, &ctl); 1023bf21cd93STycho Nightingale if (error == 0) 10244c87aefeSPatrick Mooney printf("entry_ctls[%d]\t\t0x%016lx\n", vcpu, ctl); 1025bf21cd93STycho Nightingale } 1026bf21cd93STycho Nightingale 1027bf21cd93STycho Nightingale if (!error && (get_host_pat || get_all)) { 1028bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_IA32_PAT, &pat); 1029bf21cd93STycho Nightingale if (error == 0) 1030bf21cd93STycho Nightingale printf("host_pat[%d]\t\t0x%016lx\n", vcpu, pat); 1031bf21cd93STycho Nightingale } 1032bf21cd93STycho Nightingale 1033bf21cd93STycho Nightingale if (!error && (get_host_cr0 || get_all)) { 1034bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_CR0, &cr0); 1035bf21cd93STycho Nightingale if (error == 0) 1036bf21cd93STycho Nightingale printf("host_cr0[%d]\t\t0x%016lx\n", vcpu, cr0); 1037bf21cd93STycho Nightingale } 1038bf21cd93STycho Nightingale 1039bf21cd93STycho Nightingale if (!error && (get_host_cr3 || get_all)) { 1040bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_CR3, &cr3); 1041bf21cd93STycho Nightingale if (error == 0) 1042bf21cd93STycho Nightingale printf("host_cr3[%d]\t\t0x%016lx\n", vcpu, cr3); 1043bf21cd93STycho Nightingale } 1044bf21cd93STycho Nightingale 1045bf21cd93STycho Nightingale if (!error && (get_host_cr4 || get_all)) { 1046bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_CR4, &cr4); 1047bf21cd93STycho Nightingale if (error == 0) 1048bf21cd93STycho Nightingale printf("host_cr4[%d]\t\t0x%016lx\n", vcpu, cr4); 1049bf21cd93STycho Nightingale } 1050bf21cd93STycho Nightingale 1051bf21cd93STycho Nightingale if (!error && (get_host_rip || get_all)) { 1052bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_RIP, &rip); 1053bf21cd93STycho Nightingale if (error == 0) 1054bf21cd93STycho Nightingale printf("host_rip[%d]\t\t0x%016lx\n", vcpu, rip); 1055bf21cd93STycho Nightingale } 1056bf21cd93STycho Nightingale 1057bf21cd93STycho Nightingale if (!error && (get_host_rsp || get_all)) { 1058bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_RSP, &rsp); 1059bf21cd93STycho Nightingale if (error == 0) 1060bf21cd93STycho Nightingale printf("host_rsp[%d]\t\t0x%016lx\n", vcpu, rsp); 1061bf21cd93STycho Nightingale } 1062bf21cd93STycho Nightingale 1063bf21cd93STycho Nightingale if (!error && (get_vmcs_link || get_all)) { 1064bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_LINK_POINTER, &addr); 1065bf21cd93STycho Nightingale if (error == 0) 1066bf21cd93STycho Nightingale printf("vmcs_pointer[%d]\t0x%016lx\n", vcpu, addr); 1067bf21cd93STycho Nightingale } 1068bf21cd93STycho Nightingale 1069bf21cd93STycho Nightingale if (!error && (get_vmcs_exit_interruption_info || get_all)) { 1070bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_INTR_INFO, &u64); 1071bf21cd93STycho Nightingale if (error == 0) { 10724c87aefeSPatrick Mooney printf("vmcs_exit_interruption_info[%d]\t0x%016lx\n", 1073bf21cd93STycho Nightingale vcpu, u64); 1074bf21cd93STycho Nightingale } 1075bf21cd93STycho Nightingale } 1076bf21cd93STycho Nightingale 1077bf21cd93STycho Nightingale if (!error && (get_vmcs_exit_interruption_error || get_all)) { 1078bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_INTR_ERRCODE, 10794c87aefeSPatrick Mooney &u64); 1080bf21cd93STycho Nightingale if (error == 0) { 10814c87aefeSPatrick Mooney printf("vmcs_exit_interruption_error[%d]\t0x%016lx\n", 1082bf21cd93STycho Nightingale vcpu, u64); 1083bf21cd93STycho Nightingale } 1084bf21cd93STycho Nightingale } 1085bf21cd93STycho Nightingale 1086bf21cd93STycho Nightingale if (!error && (get_vmcs_interruptibility || get_all)) { 1087bf21cd93STycho Nightingale error = vm_get_vmcs_field(ctx, vcpu, 1088bf21cd93STycho Nightingale VMCS_GUEST_INTERRUPTIBILITY, &u64); 1089bf21cd93STycho Nightingale if (error == 0) { 10904c87aefeSPatrick Mooney printf("vmcs_guest_interruptibility[%d]\t0x%016lx\n", 1091bf21cd93STycho Nightingale vcpu, u64); 1092bf21cd93STycho Nightingale } 1093bf21cd93STycho Nightingale } 1094bf21cd93STycho Nightingale 10954c87aefeSPatrick Mooney if (!error && (get_vmcs_exit_inst_length || get_all)) { 10964c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, 10974c87aefeSPatrick Mooney VMCS_EXIT_INSTRUCTION_LENGTH, &u64); 10984c87aefeSPatrick Mooney if (error == 0) 10994c87aefeSPatrick Mooney printf("vmcs_exit_inst_length[%d]\t0x%08x\n", vcpu, 11004c87aefeSPatrick Mooney (uint32_t)u64); 1101bf21cd93STycho Nightingale } 1102bf21cd93STycho Nightingale 11034c87aefeSPatrick Mooney if (!error && (get_vmcs_exit_qualification || get_all)) { 11044c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_QUALIFICATION, 11054c87aefeSPatrick Mooney &u64); 11064c87aefeSPatrick Mooney if (error == 0) 11074c87aefeSPatrick Mooney printf("vmcs_exit_qualification[%d]\t0x%016lx\n", 11084c87aefeSPatrick Mooney vcpu, u64); 11094c87aefeSPatrick Mooney } 1110*54cf5b63SPatrick Mooney 11114c87aefeSPatrick Mooney return (error); 11124c87aefeSPatrick Mooney } 1113bf21cd93STycho Nightingale 11144c87aefeSPatrick Mooney static int 11154c87aefeSPatrick Mooney get_misc_vmcb(struct vmctx *ctx, int vcpu) 11164c87aefeSPatrick Mooney { 11174c87aefeSPatrick Mooney uint64_t ctl, addr; 11184c87aefeSPatrick Mooney int error = 0; 1119bf21cd93STycho Nightingale 11204c87aefeSPatrick Mooney if (!error && (get_vmcb_intercept || get_all)) { 11214c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_CR_INTERCEPT, 4, 11224c87aefeSPatrick Mooney &ctl); 11234c87aefeSPatrick Mooney if (error == 0) 11244c87aefeSPatrick Mooney printf("cr_intercept[%d]\t0x%08x\n", vcpu, (int)ctl); 11254c87aefeSPatrick Mooney 11264c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_DR_INTERCEPT, 4, 11274c87aefeSPatrick Mooney &ctl); 11284c87aefeSPatrick Mooney if (error == 0) 11294c87aefeSPatrick Mooney printf("dr_intercept[%d]\t0x%08x\n", vcpu, (int)ctl); 11304c87aefeSPatrick Mooney 11314c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_EXC_INTERCEPT, 4, 11324c87aefeSPatrick Mooney &ctl); 11334c87aefeSPatrick Mooney if (error == 0) 11344c87aefeSPatrick Mooney printf("exc_intercept[%d]\t0x%08x\n", vcpu, (int)ctl); 11354c87aefeSPatrick Mooney 11364c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_INST1_INTERCEPT, 11374c87aefeSPatrick Mooney 4, &ctl); 11384c87aefeSPatrick Mooney if (error == 0) 11394c87aefeSPatrick Mooney printf("inst1_intercept[%d]\t0x%08x\n", vcpu, (int)ctl); 11404c87aefeSPatrick Mooney 11414c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_INST2_INTERCEPT, 11424c87aefeSPatrick Mooney 4, &ctl); 11434c87aefeSPatrick Mooney if (error == 0) 11444c87aefeSPatrick Mooney printf("inst2_intercept[%d]\t0x%08x\n", vcpu, (int)ctl); 1145bf21cd93STycho Nightingale } 1146bf21cd93STycho Nightingale 11474c87aefeSPatrick Mooney if (!error && (get_vmcb_tlb_ctrl || get_all)) { 11484c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_TLB_CTRL, 11494c87aefeSPatrick Mooney 4, &ctl); 1150bf21cd93STycho Nightingale if (error == 0) 11514c87aefeSPatrick Mooney printf("TLB ctrl[%d]\t0x%016lx\n", vcpu, ctl); 11524c87aefeSPatrick Mooney } 11534c87aefeSPatrick Mooney 11544c87aefeSPatrick Mooney if (!error && (get_vmcb_exit_details || get_all)) { 11554c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_EXITINFO1, 11564c87aefeSPatrick Mooney 8, &ctl); 11574c87aefeSPatrick Mooney if (error == 0) 11584c87aefeSPatrick Mooney printf("exitinfo1[%d]\t0x%016lx\n", vcpu, ctl); 11594c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_EXITINFO2, 11604c87aefeSPatrick Mooney 8, &ctl); 11614c87aefeSPatrick Mooney if (error == 0) 11624c87aefeSPatrick Mooney printf("exitinfo2[%d]\t0x%016lx\n", vcpu, ctl); 11634c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_EXITINTINFO, 11644c87aefeSPatrick Mooney 8, &ctl); 11654c87aefeSPatrick Mooney if (error == 0) 11664c87aefeSPatrick Mooney printf("exitintinfo[%d]\t0x%016lx\n", vcpu, ctl); 1167bf21cd93STycho Nightingale } 1168bf21cd93STycho Nightingale 11694c87aefeSPatrick Mooney if (!error && (get_vmcb_virq || get_all)) { 11704c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_VIRQ, 11714c87aefeSPatrick Mooney 8, &ctl); 11724c87aefeSPatrick Mooney if (error == 0) 11734c87aefeSPatrick Mooney printf("v_irq/tpr[%d]\t0x%016lx\n", vcpu, ctl); 11744c87aefeSPatrick Mooney } 11754c87aefeSPatrick Mooney 11764c87aefeSPatrick Mooney if (!error && (get_apic_access_addr || get_all)) { 11774c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_AVIC_BAR, 8, 11784c87aefeSPatrick Mooney &addr); 11794c87aefeSPatrick Mooney if (error == 0) 11804c87aefeSPatrick Mooney printf("AVIC apic_bar[%d]\t0x%016lx\n", vcpu, addr); 11814c87aefeSPatrick Mooney } 11824c87aefeSPatrick Mooney 11834c87aefeSPatrick Mooney if (!error && (get_virtual_apic_addr || get_all)) { 11844c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_AVIC_PAGE, 8, 11854c87aefeSPatrick Mooney &addr); 11864c87aefeSPatrick Mooney if (error == 0) 11874c87aefeSPatrick Mooney printf("AVIC backing page[%d]\t0x%016lx\n", vcpu, addr); 11884c87aefeSPatrick Mooney } 11894c87aefeSPatrick Mooney 11904c87aefeSPatrick Mooney if (!error && (get_avic_table || get_all)) { 11914c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_AVIC_LT, 8, 11924c87aefeSPatrick Mooney &addr); 11934c87aefeSPatrick Mooney if (error == 0) 11944c87aefeSPatrick Mooney printf("AVIC logical table[%d]\t0x%016lx\n", 11954c87aefeSPatrick Mooney vcpu, addr); 11964c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_AVIC_PT, 8, 11974c87aefeSPatrick Mooney &addr); 11984c87aefeSPatrick Mooney if (error == 0) 11994c87aefeSPatrick Mooney printf("AVIC physical table[%d]\t0x%016lx\n", 12004c87aefeSPatrick Mooney vcpu, addr); 12014c87aefeSPatrick Mooney } 12024c87aefeSPatrick Mooney 12034c87aefeSPatrick Mooney return (error); 12044c87aefeSPatrick Mooney } 12054c87aefeSPatrick Mooney 12064c87aefeSPatrick Mooney static struct option * 12074c87aefeSPatrick Mooney setup_options(bool cpu_intel) 12084c87aefeSPatrick Mooney { 12094c87aefeSPatrick Mooney const struct option common_opts[] = { 12104c87aefeSPatrick Mooney { "vm", REQ_ARG, 0, VMNAME }, 12114c87aefeSPatrick Mooney { "cpu", REQ_ARG, 0, VCPU }, 12124c87aefeSPatrick Mooney { "set-mem", REQ_ARG, 0, SET_MEM }, 12134c87aefeSPatrick Mooney { "set-efer", REQ_ARG, 0, SET_EFER }, 12144c87aefeSPatrick Mooney { "set-cr0", REQ_ARG, 0, SET_CR0 }, 12154c87aefeSPatrick Mooney { "set-cr2", REQ_ARG, 0, SET_CR2 }, 12164c87aefeSPatrick Mooney { "set-cr3", REQ_ARG, 0, SET_CR3 }, 12174c87aefeSPatrick Mooney { "set-cr4", REQ_ARG, 0, SET_CR4 }, 12184c87aefeSPatrick Mooney { "set-dr0", REQ_ARG, 0, SET_DR0 }, 12194c87aefeSPatrick Mooney { "set-dr1", REQ_ARG, 0, SET_DR1 }, 12204c87aefeSPatrick Mooney { "set-dr2", REQ_ARG, 0, SET_DR2 }, 12214c87aefeSPatrick Mooney { "set-dr3", REQ_ARG, 0, SET_DR3 }, 12224c87aefeSPatrick Mooney { "set-dr6", REQ_ARG, 0, SET_DR6 }, 12234c87aefeSPatrick Mooney { "set-dr7", REQ_ARG, 0, SET_DR7 }, 12244c87aefeSPatrick Mooney { "set-rsp", REQ_ARG, 0, SET_RSP }, 12254c87aefeSPatrick Mooney { "set-rip", REQ_ARG, 0, SET_RIP }, 12264c87aefeSPatrick Mooney { "set-rax", REQ_ARG, 0, SET_RAX }, 12274c87aefeSPatrick Mooney { "set-rflags", REQ_ARG, 0, SET_RFLAGS }, 12284c87aefeSPatrick Mooney { "desc-base", REQ_ARG, 0, DESC_BASE }, 12294c87aefeSPatrick Mooney { "desc-limit", REQ_ARG, 0, DESC_LIMIT }, 12304c87aefeSPatrick Mooney { "desc-access",REQ_ARG, 0, DESC_ACCESS }, 12314c87aefeSPatrick Mooney { "set-cs", REQ_ARG, 0, SET_CS }, 12324c87aefeSPatrick Mooney { "set-ds", REQ_ARG, 0, SET_DS }, 12334c87aefeSPatrick Mooney { "set-es", REQ_ARG, 0, SET_ES }, 12344c87aefeSPatrick Mooney { "set-fs", REQ_ARG, 0, SET_FS }, 12354c87aefeSPatrick Mooney { "set-gs", REQ_ARG, 0, SET_GS }, 12364c87aefeSPatrick Mooney { "set-ss", REQ_ARG, 0, SET_SS }, 12374c87aefeSPatrick Mooney { "set-tr", REQ_ARG, 0, SET_TR }, 12384c87aefeSPatrick Mooney { "set-ldtr", REQ_ARG, 0, SET_LDTR }, 12394c87aefeSPatrick Mooney { "set-x2apic-state",REQ_ARG, 0, SET_X2APIC_STATE }, 12404c87aefeSPatrick Mooney { "set-exception-bitmap", 12414c87aefeSPatrick Mooney REQ_ARG, 0, SET_EXCEPTION_BITMAP }, 12424c87aefeSPatrick Mooney { "capname", REQ_ARG, 0, CAPNAME }, 12434c87aefeSPatrick Mooney { "unassign-pptdev", REQ_ARG, 0, UNASSIGN_PPTDEV }, 12444c87aefeSPatrick Mooney { "setcap", REQ_ARG, 0, SET_CAP }, 12454c87aefeSPatrick Mooney { "get-gpa-pmap", REQ_ARG, 0, GET_GPA_PMAP }, 12464c87aefeSPatrick Mooney { "assert-lapic-lvt", REQ_ARG, 0, ASSERT_LAPIC_LVT }, 12474c87aefeSPatrick Mooney { "get-rtc-time", NO_ARG, &get_rtc_time, 1 }, 12484c87aefeSPatrick Mooney { "set-rtc-time", REQ_ARG, 0, SET_RTC_TIME }, 12494c87aefeSPatrick Mooney { "rtc-nvram-offset", REQ_ARG, 0, RTC_NVRAM_OFFSET }, 12504c87aefeSPatrick Mooney { "get-rtc-nvram", NO_ARG, &get_rtc_nvram, 1 }, 12514c87aefeSPatrick Mooney { "set-rtc-nvram", REQ_ARG, 0, SET_RTC_NVRAM }, 12524c87aefeSPatrick Mooney { "getcap", NO_ARG, &getcap, 1 }, 12534c87aefeSPatrick Mooney { "get-stats", NO_ARG, &get_stats, 1 }, 12544c87aefeSPatrick Mooney { "get-desc-ds",NO_ARG, &get_desc_ds, 1 }, 12554c87aefeSPatrick Mooney { "set-desc-ds",NO_ARG, &set_desc_ds, 1 }, 12564c87aefeSPatrick Mooney { "get-desc-es",NO_ARG, &get_desc_es, 1 }, 12574c87aefeSPatrick Mooney { "set-desc-es",NO_ARG, &set_desc_es, 1 }, 12584c87aefeSPatrick Mooney { "get-desc-ss",NO_ARG, &get_desc_ss, 1 }, 12594c87aefeSPatrick Mooney { "set-desc-ss",NO_ARG, &set_desc_ss, 1 }, 12604c87aefeSPatrick Mooney { "get-desc-cs",NO_ARG, &get_desc_cs, 1 }, 12614c87aefeSPatrick Mooney { "set-desc-cs",NO_ARG, &set_desc_cs, 1 }, 12624c87aefeSPatrick Mooney { "get-desc-fs",NO_ARG, &get_desc_fs, 1 }, 12634c87aefeSPatrick Mooney { "set-desc-fs",NO_ARG, &set_desc_fs, 1 }, 12644c87aefeSPatrick Mooney { "get-desc-gs",NO_ARG, &get_desc_gs, 1 }, 12654c87aefeSPatrick Mooney { "set-desc-gs",NO_ARG, &set_desc_gs, 1 }, 12664c87aefeSPatrick Mooney { "get-desc-tr",NO_ARG, &get_desc_tr, 1 }, 12674c87aefeSPatrick Mooney { "set-desc-tr",NO_ARG, &set_desc_tr, 1 }, 12684c87aefeSPatrick Mooney { "set-desc-ldtr", NO_ARG, &set_desc_ldtr, 1 }, 12694c87aefeSPatrick Mooney { "get-desc-ldtr", NO_ARG, &get_desc_ldtr, 1 }, 12704c87aefeSPatrick Mooney { "set-desc-gdtr", NO_ARG, &set_desc_gdtr, 1 }, 12714c87aefeSPatrick Mooney { "get-desc-gdtr", NO_ARG, &get_desc_gdtr, 1 }, 12724c87aefeSPatrick Mooney { "set-desc-idtr", NO_ARG, &set_desc_idtr, 1 }, 12734c87aefeSPatrick Mooney { "get-desc-idtr", NO_ARG, &get_desc_idtr, 1 }, 12744c87aefeSPatrick Mooney { "get-memmap", NO_ARG, &get_memmap, 1 }, 12754c87aefeSPatrick Mooney { "get-memseg", NO_ARG, &get_memseg, 1 }, 12764c87aefeSPatrick Mooney { "get-efer", NO_ARG, &get_efer, 1 }, 12774c87aefeSPatrick Mooney { "get-cr0", NO_ARG, &get_cr0, 1 }, 12784c87aefeSPatrick Mooney { "get-cr2", NO_ARG, &get_cr2, 1 }, 12794c87aefeSPatrick Mooney { "get-cr3", NO_ARG, &get_cr3, 1 }, 12804c87aefeSPatrick Mooney { "get-cr4", NO_ARG, &get_cr4, 1 }, 12814c87aefeSPatrick Mooney { "get-dr0", NO_ARG, &get_dr0, 1 }, 12824c87aefeSPatrick Mooney { "get-dr1", NO_ARG, &get_dr1, 1 }, 12834c87aefeSPatrick Mooney { "get-dr2", NO_ARG, &get_dr2, 1 }, 12844c87aefeSPatrick Mooney { "get-dr3", NO_ARG, &get_dr3, 1 }, 12854c87aefeSPatrick Mooney { "get-dr6", NO_ARG, &get_dr6, 1 }, 12864c87aefeSPatrick Mooney { "get-dr7", NO_ARG, &get_dr7, 1 }, 12874c87aefeSPatrick Mooney { "get-rsp", NO_ARG, &get_rsp, 1 }, 12884c87aefeSPatrick Mooney { "get-rip", NO_ARG, &get_rip, 1 }, 12894c87aefeSPatrick Mooney { "get-rax", NO_ARG, &get_rax, 1 }, 12904c87aefeSPatrick Mooney { "get-rbx", NO_ARG, &get_rbx, 1 }, 12914c87aefeSPatrick Mooney { "get-rcx", NO_ARG, &get_rcx, 1 }, 12924c87aefeSPatrick Mooney { "get-rdx", NO_ARG, &get_rdx, 1 }, 12934c87aefeSPatrick Mooney { "get-rsi", NO_ARG, &get_rsi, 1 }, 12944c87aefeSPatrick Mooney { "get-rdi", NO_ARG, &get_rdi, 1 }, 12954c87aefeSPatrick Mooney { "get-rbp", NO_ARG, &get_rbp, 1 }, 12964c87aefeSPatrick Mooney { "get-r8", NO_ARG, &get_r8, 1 }, 12974c87aefeSPatrick Mooney { "get-r9", NO_ARG, &get_r9, 1 }, 12984c87aefeSPatrick Mooney { "get-r10", NO_ARG, &get_r10, 1 }, 12994c87aefeSPatrick Mooney { "get-r11", NO_ARG, &get_r11, 1 }, 13004c87aefeSPatrick Mooney { "get-r12", NO_ARG, &get_r12, 1 }, 13014c87aefeSPatrick Mooney { "get-r13", NO_ARG, &get_r13, 1 }, 13024c87aefeSPatrick Mooney { "get-r14", NO_ARG, &get_r14, 1 }, 13034c87aefeSPatrick Mooney { "get-r15", NO_ARG, &get_r15, 1 }, 13044c87aefeSPatrick Mooney { "get-rflags", NO_ARG, &get_rflags, 1 }, 13054c87aefeSPatrick Mooney { "get-cs", NO_ARG, &get_cs, 1 }, 13064c87aefeSPatrick Mooney { "get-ds", NO_ARG, &get_ds, 1 }, 13074c87aefeSPatrick Mooney { "get-es", NO_ARG, &get_es, 1 }, 13084c87aefeSPatrick Mooney { "get-fs", NO_ARG, &get_fs, 1 }, 13094c87aefeSPatrick Mooney { "get-gs", NO_ARG, &get_gs, 1 }, 13104c87aefeSPatrick Mooney { "get-ss", NO_ARG, &get_ss, 1 }, 13114c87aefeSPatrick Mooney { "get-tr", NO_ARG, &get_tr, 1 }, 13124c87aefeSPatrick Mooney { "get-ldtr", NO_ARG, &get_ldtr, 1 }, 13134c87aefeSPatrick Mooney { "get-eptp", NO_ARG, &get_eptp, 1 }, 13144c87aefeSPatrick Mooney { "get-exception-bitmap", 13154c87aefeSPatrick Mooney NO_ARG, &get_exception_bitmap, 1 }, 13164c87aefeSPatrick Mooney { "get-io-bitmap-address", 13174c87aefeSPatrick Mooney NO_ARG, &get_io_bitmap, 1 }, 13184c87aefeSPatrick Mooney { "get-tsc-offset", NO_ARG, &get_tsc_offset, 1 }, 13194c87aefeSPatrick Mooney { "get-msr-bitmap", 13204c87aefeSPatrick Mooney NO_ARG, &get_msr_bitmap, 1 }, 13214c87aefeSPatrick Mooney { "get-msr-bitmap-address", 13224c87aefeSPatrick Mooney NO_ARG, &get_msr_bitmap_address, 1 }, 1323*54cf5b63SPatrick Mooney { "get-guest-msrs", NO_ARG, &get_guest_msrs, 1 }, 13244c87aefeSPatrick Mooney { "get-exit-reason", 13254c87aefeSPatrick Mooney NO_ARG, &get_exit_reason, 1 }, 13264c87aefeSPatrick Mooney { "get-x2apic-state", NO_ARG, &get_x2apic_state, 1 }, 13274c87aefeSPatrick Mooney { "get-all", NO_ARG, &get_all, 1 }, 13284c87aefeSPatrick Mooney { "run", NO_ARG, &run, 1 }, 13294c87aefeSPatrick Mooney { "create", NO_ARG, &create, 1 }, 13304c87aefeSPatrick Mooney { "destroy", NO_ARG, &destroy, 1 }, 13314c87aefeSPatrick Mooney { "inject-nmi", NO_ARG, &inject_nmi, 1 }, 13324c87aefeSPatrick Mooney { "force-reset", NO_ARG, &force_reset, 1 }, 13334c87aefeSPatrick Mooney { "force-poweroff", NO_ARG, &force_poweroff, 1 }, 13344c87aefeSPatrick Mooney { "get-active-cpus", NO_ARG, &get_active_cpus, 1 }, 13354c87aefeSPatrick Mooney { "get-suspended-cpus", NO_ARG, &get_suspended_cpus, 1 }, 13364c87aefeSPatrick Mooney { "get-intinfo", NO_ARG, &get_intinfo, 1 }, 13374c87aefeSPatrick Mooney { "get-cpu-topology", NO_ARG, &get_cpu_topology, 1 }, 13380e1453c3SPatrick Mooney { "pmtmr-port", REQ_ARG, 0, PMTMR_PORT }, 13394c87aefeSPatrick Mooney { "wrlock-cycle", NO_ARG, &wrlock_cycle, 1 }, 1340957246c9SPatrick Mooney { "get-fpu", NO_ARG, &get_fpu, 1 }, 13414c87aefeSPatrick Mooney }; 13424c87aefeSPatrick Mooney 13434c87aefeSPatrick Mooney const struct option intel_opts[] = { 13444c87aefeSPatrick Mooney { "get-vmcs-pinbased-ctls", 13454c87aefeSPatrick Mooney NO_ARG, &get_pinbased_ctls, 1 }, 13464c87aefeSPatrick Mooney { "get-vmcs-procbased-ctls", 13474c87aefeSPatrick Mooney NO_ARG, &get_procbased_ctls, 1 }, 13484c87aefeSPatrick Mooney { "get-vmcs-procbased-ctls2", 13494c87aefeSPatrick Mooney NO_ARG, &get_procbased_ctls2, 1 }, 13504c87aefeSPatrick Mooney { "get-vmcs-guest-linear-address", 13514c87aefeSPatrick Mooney NO_ARG, &get_vmcs_gla, 1 }, 13524c87aefeSPatrick Mooney { "get-vmcs-guest-physical-address", 13534c87aefeSPatrick Mooney NO_ARG, &get_vmcs_gpa, 1 }, 13544c87aefeSPatrick Mooney { "get-vmcs-entry-interruption-info", 13554c87aefeSPatrick Mooney NO_ARG, &get_vmcs_entry_interruption_info, 1}, 13564c87aefeSPatrick Mooney { "get-vmcs-cr0-mask", NO_ARG, &get_cr0_mask, 1 }, 13574c87aefeSPatrick Mooney { "get-vmcs-cr0-shadow", NO_ARG,&get_cr0_shadow, 1 }, 13584c87aefeSPatrick Mooney { "get-vmcs-cr4-mask", NO_ARG, &get_cr4_mask, 1 }, 13594c87aefeSPatrick Mooney { "get-vmcs-cr4-shadow", NO_ARG, &get_cr4_shadow, 1 }, 13604c87aefeSPatrick Mooney { "get-vmcs-cr3-targets", NO_ARG, &get_cr3_targets, 1 }, 13614c87aefeSPatrick Mooney { "get-vmcs-tpr-threshold", 13624c87aefeSPatrick Mooney NO_ARG, &get_tpr_threshold, 1 }, 13634c87aefeSPatrick Mooney { "get-vmcs-vpid", NO_ARG, &get_vpid_asid, 1 }, 13644c87aefeSPatrick Mooney { "get-vmcs-exit-ctls", NO_ARG, &get_exit_ctls, 1 }, 13654c87aefeSPatrick Mooney { "get-vmcs-entry-ctls", 13664c87aefeSPatrick Mooney NO_ARG, &get_entry_ctls, 1 }, 13674c87aefeSPatrick Mooney { "get-vmcs-instruction-error", 13684c87aefeSPatrick Mooney NO_ARG, &get_inst_err, 1 }, 13694c87aefeSPatrick Mooney { "get-vmcs-host-pat", NO_ARG, &get_host_pat, 1 }, 13704c87aefeSPatrick Mooney { "get-vmcs-host-cr0", 13714c87aefeSPatrick Mooney NO_ARG, &get_host_cr0, 1 }, 13724c87aefeSPatrick Mooney { "set-vmcs-entry-interruption-info", 13734c87aefeSPatrick Mooney REQ_ARG, 0, SET_VMCS_ENTRY_INTERRUPTION_INFO }, 13744c87aefeSPatrick Mooney { "get-vmcs-exit-qualification", 13754c87aefeSPatrick Mooney NO_ARG, &get_vmcs_exit_qualification, 1 }, 13764c87aefeSPatrick Mooney { "get-vmcs-exit-inst-length", 13774c87aefeSPatrick Mooney NO_ARG, &get_vmcs_exit_inst_length, 1 }, 13784c87aefeSPatrick Mooney { "get-vmcs-interruptibility", 13794c87aefeSPatrick Mooney NO_ARG, &get_vmcs_interruptibility, 1 }, 13804c87aefeSPatrick Mooney { "get-vmcs-exit-interruption-error", 13814c87aefeSPatrick Mooney NO_ARG, &get_vmcs_exit_interruption_error, 1 }, 13824c87aefeSPatrick Mooney { "get-vmcs-exit-interruption-info", 13834c87aefeSPatrick Mooney NO_ARG, &get_vmcs_exit_interruption_info, 1 }, 13844c87aefeSPatrick Mooney { "get-vmcs-link", NO_ARG, &get_vmcs_link, 1 }, 13854c87aefeSPatrick Mooney { "get-vmcs-host-cr3", 13864c87aefeSPatrick Mooney NO_ARG, &get_host_cr3, 1 }, 13874c87aefeSPatrick Mooney { "get-vmcs-host-cr4", 13884c87aefeSPatrick Mooney NO_ARG, &get_host_cr4, 1 }, 13894c87aefeSPatrick Mooney { "get-vmcs-host-rip", 13904c87aefeSPatrick Mooney NO_ARG, &get_host_rip, 1 }, 13914c87aefeSPatrick Mooney { "get-vmcs-host-rsp", 13924c87aefeSPatrick Mooney NO_ARG, &get_host_rsp, 1 }, 13934c87aefeSPatrick Mooney { "get-apic-access-address", 13944c87aefeSPatrick Mooney NO_ARG, &get_apic_access_addr, 1}, 13954c87aefeSPatrick Mooney { "get-virtual-apic-address", 13964c87aefeSPatrick Mooney NO_ARG, &get_virtual_apic_addr, 1} 13974c87aefeSPatrick Mooney }; 13984c87aefeSPatrick Mooney 13994c87aefeSPatrick Mooney const struct option amd_opts[] = { 14004c87aefeSPatrick Mooney { "get-vmcb-intercepts", 14014c87aefeSPatrick Mooney NO_ARG, &get_vmcb_intercept, 1 }, 1402*54cf5b63SPatrick Mooney { "get-vmcb-asid", 14034c87aefeSPatrick Mooney NO_ARG, &get_vpid_asid, 1 }, 14044c87aefeSPatrick Mooney { "get-vmcb-exit-details", 14054c87aefeSPatrick Mooney NO_ARG, &get_vmcb_exit_details, 1 }, 14064c87aefeSPatrick Mooney { "get-vmcb-tlb-ctrl", 14074c87aefeSPatrick Mooney NO_ARG, &get_vmcb_tlb_ctrl, 1 }, 14084c87aefeSPatrick Mooney { "get-vmcb-virq", 14094c87aefeSPatrick Mooney NO_ARG, &get_vmcb_virq, 1 }, 14104c87aefeSPatrick Mooney { "get-avic-apic-bar", 14114c87aefeSPatrick Mooney NO_ARG, &get_apic_access_addr, 1 }, 14124c87aefeSPatrick Mooney { "get-avic-backing-page", 14134c87aefeSPatrick Mooney NO_ARG, &get_virtual_apic_addr, 1 }, 14144c87aefeSPatrick Mooney { "get-avic-table", 14154c87aefeSPatrick Mooney NO_ARG, &get_avic_table, 1 } 14164c87aefeSPatrick Mooney }; 14174c87aefeSPatrick Mooney 14184c87aefeSPatrick Mooney const struct option null_opt = { 14194c87aefeSPatrick Mooney NULL, 0, NULL, 0 14204c87aefeSPatrick Mooney }; 14214c87aefeSPatrick Mooney 14224c87aefeSPatrick Mooney struct option *all_opts; 14234c87aefeSPatrick Mooney char *cp; 14244c87aefeSPatrick Mooney int optlen; 14254c87aefeSPatrick Mooney 14264c87aefeSPatrick Mooney optlen = sizeof(common_opts); 14274c87aefeSPatrick Mooney 14284c87aefeSPatrick Mooney if (cpu_intel) 14294c87aefeSPatrick Mooney optlen += sizeof(intel_opts); 14304c87aefeSPatrick Mooney else 14314c87aefeSPatrick Mooney optlen += sizeof(amd_opts); 14324c87aefeSPatrick Mooney 14334c87aefeSPatrick Mooney optlen += sizeof(null_opt); 14344c87aefeSPatrick Mooney 14354c87aefeSPatrick Mooney all_opts = malloc(optlen); 14364c87aefeSPatrick Mooney 14374c87aefeSPatrick Mooney cp = (char *)all_opts; 14384c87aefeSPatrick Mooney memcpy(cp, common_opts, sizeof(common_opts)); 14394c87aefeSPatrick Mooney cp += sizeof(common_opts); 14404c87aefeSPatrick Mooney 14414c87aefeSPatrick Mooney if (cpu_intel) { 14424c87aefeSPatrick Mooney memcpy(cp, intel_opts, sizeof(intel_opts)); 14434c87aefeSPatrick Mooney cp += sizeof(intel_opts); 14444c87aefeSPatrick Mooney } else { 14454c87aefeSPatrick Mooney memcpy(cp, amd_opts, sizeof(amd_opts)); 14464c87aefeSPatrick Mooney cp += sizeof(amd_opts); 14474c87aefeSPatrick Mooney } 14484c87aefeSPatrick Mooney 14494c87aefeSPatrick Mooney memcpy(cp, &null_opt, sizeof(null_opt)); 14504c87aefeSPatrick Mooney cp += sizeof(null_opt); 14514c87aefeSPatrick Mooney 14524c87aefeSPatrick Mooney return (all_opts); 14534c87aefeSPatrick Mooney } 14544c87aefeSPatrick Mooney 14554c87aefeSPatrick Mooney static const char * 14564c87aefeSPatrick Mooney wday_str(int idx) 14574c87aefeSPatrick Mooney { 14584c87aefeSPatrick Mooney static const char *weekdays[] = { 14594c87aefeSPatrick Mooney "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 14604c87aefeSPatrick Mooney }; 14614c87aefeSPatrick Mooney 14624c87aefeSPatrick Mooney if (idx >= 0 && idx < 7) 14634c87aefeSPatrick Mooney return (weekdays[idx]); 14644c87aefeSPatrick Mooney else 14654c87aefeSPatrick Mooney return ("UNK"); 14664c87aefeSPatrick Mooney } 14674c87aefeSPatrick Mooney 14684c87aefeSPatrick Mooney static const char * 14694c87aefeSPatrick Mooney mon_str(int idx) 14704c87aefeSPatrick Mooney { 14714c87aefeSPatrick Mooney static const char *months[] = { 14724c87aefeSPatrick Mooney "Jan", "Feb", "Mar", "Apr", "May", "Jun", 14734c87aefeSPatrick Mooney "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 14744c87aefeSPatrick Mooney }; 14754c87aefeSPatrick Mooney 14764c87aefeSPatrick Mooney if (idx >= 0 && idx < 12) 14774c87aefeSPatrick Mooney return (months[idx]); 14784c87aefeSPatrick Mooney else 14794c87aefeSPatrick Mooney return ("UNK"); 14804c87aefeSPatrick Mooney } 14814c87aefeSPatrick Mooney 14824c87aefeSPatrick Mooney static int 14834c87aefeSPatrick Mooney show_memmap(struct vmctx *ctx) 14844c87aefeSPatrick Mooney { 14854c87aefeSPatrick Mooney char name[SPECNAMELEN + 1], numbuf[8]; 14864c87aefeSPatrick Mooney vm_ooffset_t segoff; 14874c87aefeSPatrick Mooney vm_paddr_t gpa; 14884c87aefeSPatrick Mooney size_t maplen, seglen; 14894c87aefeSPatrick Mooney int error, flags, prot, segid, delim; 14904c87aefeSPatrick Mooney 14914c87aefeSPatrick Mooney printf("Address Length Segment Offset "); 14924c87aefeSPatrick Mooney printf("Prot Flags\n"); 14934c87aefeSPatrick Mooney 14944c87aefeSPatrick Mooney gpa = 0; 14954c87aefeSPatrick Mooney while (1) { 14964c87aefeSPatrick Mooney error = vm_mmap_getnext(ctx, &gpa, &segid, &segoff, &maplen, 14974c87aefeSPatrick Mooney &prot, &flags); 14984c87aefeSPatrick Mooney if (error) 14994c87aefeSPatrick Mooney return (errno == ENOENT ? 0 : error); 15004c87aefeSPatrick Mooney 15014c87aefeSPatrick Mooney error = vm_get_memseg(ctx, segid, &seglen, name, sizeof(name)); 15024c87aefeSPatrick Mooney if (error) 15034c87aefeSPatrick Mooney return (error); 15044c87aefeSPatrick Mooney 15054c87aefeSPatrick Mooney printf("%-12lX", gpa); 15064c87aefeSPatrick Mooney humanize_number(numbuf, sizeof(numbuf), maplen, "B", 15074c87aefeSPatrick Mooney HN_AUTOSCALE, HN_NOSPACE); 15084c87aefeSPatrick Mooney printf("%-12s", numbuf); 15094c87aefeSPatrick Mooney 15104c87aefeSPatrick Mooney printf("%-12s", name[0] ? name : "sysmem"); 15114c87aefeSPatrick Mooney printf("%-12lX", segoff); 15124c87aefeSPatrick Mooney printf("%c%c%c ", prot & PROT_READ ? 'R' : '-', 15134c87aefeSPatrick Mooney prot & PROT_WRITE ? 'W' : '-', 15144c87aefeSPatrick Mooney prot & PROT_EXEC ? 'X' : '-'); 15154c87aefeSPatrick Mooney 15164c87aefeSPatrick Mooney delim = '\0'; 15174c87aefeSPatrick Mooney if (flags & VM_MEMMAP_F_WIRED) { 15184c87aefeSPatrick Mooney printf("%cwired", delim); 15194c87aefeSPatrick Mooney delim = '/'; 15204c87aefeSPatrick Mooney } 15214c87aefeSPatrick Mooney if (flags & VM_MEMMAP_F_IOMMU) { 15224c87aefeSPatrick Mooney printf("%ciommu", delim); 15234c87aefeSPatrick Mooney delim = '/'; 15244c87aefeSPatrick Mooney } 15254c87aefeSPatrick Mooney printf("\n"); 15264c87aefeSPatrick Mooney 15274c87aefeSPatrick Mooney gpa += maplen; 15284c87aefeSPatrick Mooney } 15294c87aefeSPatrick Mooney } 15304c87aefeSPatrick Mooney 15314c87aefeSPatrick Mooney static int 15324c87aefeSPatrick Mooney show_memseg(struct vmctx *ctx) 15334c87aefeSPatrick Mooney { 15344c87aefeSPatrick Mooney char name[SPECNAMELEN + 1], numbuf[8]; 15354c87aefeSPatrick Mooney size_t seglen; 15364c87aefeSPatrick Mooney int error, segid; 15374c87aefeSPatrick Mooney 15384c87aefeSPatrick Mooney printf("ID Length Name\n"); 15394c87aefeSPatrick Mooney 15404c87aefeSPatrick Mooney segid = 0; 15414c87aefeSPatrick Mooney while (1) { 15424c87aefeSPatrick Mooney error = vm_get_memseg(ctx, segid, &seglen, name, sizeof(name)); 15434c87aefeSPatrick Mooney if (error) 15444c87aefeSPatrick Mooney return (errno == EINVAL ? 0 : error); 15454c87aefeSPatrick Mooney 15464c87aefeSPatrick Mooney if (seglen) { 15474c87aefeSPatrick Mooney printf("%-4d", segid); 15484c87aefeSPatrick Mooney humanize_number(numbuf, sizeof(numbuf), seglen, "B", 15494c87aefeSPatrick Mooney HN_AUTOSCALE, HN_NOSPACE); 15504c87aefeSPatrick Mooney printf("%-12s", numbuf); 15514c87aefeSPatrick Mooney printf("%s", name[0] ? name : "sysmem"); 15524c87aefeSPatrick Mooney printf("\n"); 15534c87aefeSPatrick Mooney } 15544c87aefeSPatrick Mooney segid++; 15554c87aefeSPatrick Mooney } 15564c87aefeSPatrick Mooney } 15574c87aefeSPatrick Mooney 1558957246c9SPatrick Mooney static int 1559957246c9SPatrick Mooney show_fpu(struct vmctx *ctx, int vcpu) 1560957246c9SPatrick Mooney { 1561957246c9SPatrick Mooney int res, fd; 1562957246c9SPatrick Mooney 1563957246c9SPatrick Mooney struct vm_fpu_desc_entry entries[64]; 1564957246c9SPatrick Mooney struct vm_fpu_desc desc = { 1565957246c9SPatrick Mooney .vfd_entry_data = entries, 1566957246c9SPatrick Mooney .vfd_num_entries = 64, 1567957246c9SPatrick Mooney }; 1568957246c9SPatrick Mooney fd = vm_get_device_fd(ctx); 1569957246c9SPatrick Mooney res = ioctl(fd, VM_DESC_FPU_AREA, &desc); 1570957246c9SPatrick Mooney if (res != 0) { 1571957246c9SPatrick Mooney return (errno); 1572957246c9SPatrick Mooney } 1573957246c9SPatrick Mooney for (uint_t i = 0; i < desc.vfd_num_entries; i++) { 1574957246c9SPatrick Mooney const struct vm_fpu_desc_entry *entry = &entries[i]; 1575957246c9SPatrick Mooney 1576957246c9SPatrick Mooney /* confirm that AVX fields are where we expect */ 1577957246c9SPatrick Mooney if (entry->vfde_feature == XFEATURE_AVX) { 1578957246c9SPatrick Mooney if (entry->vfde_size != 0x100 || 1579957246c9SPatrick Mooney entry->vfde_off != 0x240) { 1580957246c9SPatrick Mooney (void) fprintf(stderr, 1581957246c9SPatrick Mooney "show_fpu: unexpected AVX size/placement " 1582957246c9SPatrick Mooney "- size:%x off:%x\n", 1583957246c9SPatrick Mooney entry->vfde_size, entry->vfde_off); 1584957246c9SPatrick Mooney return (EINVAL); 1585957246c9SPatrick Mooney } 1586957246c9SPatrick Mooney } 1587957246c9SPatrick Mooney } 1588957246c9SPatrick Mooney void *buf = malloc(desc.vfd_req_size); 1589957246c9SPatrick Mooney if (buf == NULL) { 1590957246c9SPatrick Mooney return (ENOMEM); 1591957246c9SPatrick Mooney } 1592957246c9SPatrick Mooney struct vm_fpu_state req = { 1593957246c9SPatrick Mooney .vcpuid = vcpu, 1594957246c9SPatrick Mooney .buf = buf, 1595957246c9SPatrick Mooney .len = desc.vfd_req_size, 1596957246c9SPatrick Mooney }; 1597957246c9SPatrick Mooney res = ioctl(fd, VM_GET_FPU, &req); 1598957246c9SPatrick Mooney if (res != 0) { 1599957246c9SPatrick Mooney res = errno; 1600957246c9SPatrick Mooney free(buf); 1601957246c9SPatrick Mooney return (res); 1602957246c9SPatrick Mooney } 1603957246c9SPatrick Mooney 1604957246c9SPatrick Mooney const struct xsave_state *state = buf; 1605957246c9SPatrick Mooney const struct fxsave_state *fx = &state->xs_fxsave; 1606957246c9SPatrick Mooney (void) printf("fpu_fcw[%d]\t\t0x%04x\n", vcpu, fx->fx_fcw); 1607957246c9SPatrick Mooney (void) printf("fpu_fsw[%d]\t\t0x%04x\n", vcpu, fx->fx_fsw); 1608957246c9SPatrick Mooney (void) printf("fpu_ftw[%d]\t\t0x%04x\n", vcpu, fx->fx_fctw); 1609957246c9SPatrick Mooney (void) printf("fpu_fop[%d]\t\t0x%04x\n", vcpu, fx->fx_fop); 1610957246c9SPatrick Mooney (void) printf("fpu_rip[%d]\t\t0x%016lx\n", vcpu, fx->fx_rip); 1611957246c9SPatrick Mooney (void) printf("fpu_rdp[%d]\t\t0x%016lx\n", vcpu, fx->fx_rdp); 1612957246c9SPatrick Mooney (void) printf("fpu_mxcsr[%d]\t\t0x%08x\n", vcpu, fx->fx_mxcsr); 1613957246c9SPatrick Mooney (void) printf("fpu_mxcsr_mask[%d]\t0x%08x\n", vcpu, 1614957246c9SPatrick Mooney fx->fx_mxcsr_mask); 1615957246c9SPatrick Mooney /* ST/MMX regs */ 1616957246c9SPatrick Mooney for (uint_t i = 0; i < 8; i++) { 1617957246c9SPatrick Mooney (void) printf("fpu_st%u[%d]\t\t0x%08x%08x%08x%08x\n", vcpu, i, 1618957246c9SPatrick Mooney fx->fx_st[i].__fpr_pad[0], fx->fx_st[i].__fpr_pad[1], 1619957246c9SPatrick Mooney fx->fx_st[i].__fpr_pad[2], fx->fx_st[i].__fpr_pad[3]); 1620957246c9SPatrick Mooney } 1621957246c9SPatrick Mooney /* SSE regs */ 1622957246c9SPatrick Mooney for (uint_t i = 0; i < 16; i++) { 1623957246c9SPatrick Mooney (void) printf("fpu_xmm%u[%d]\t\t0x%08x%08x%08x%08x\n", 1624957246c9SPatrick Mooney i, vcpu, 1625957246c9SPatrick Mooney fx->fx_xmm[i]._l[0], fx->fx_xmm[i]._l[1], 1626957246c9SPatrick Mooney fx->fx_xmm[i]._l[2], fx->fx_xmm[i]._l[3]); 1627957246c9SPatrick Mooney } 1628957246c9SPatrick Mooney 1629957246c9SPatrick Mooney if (state->xs_header.xsh_xstate_bv & XFEATURE_AVX) { 1630957246c9SPatrick Mooney /* AVX regs */ 1631957246c9SPatrick Mooney for (uint_t i = 0; i < 16; i++) { 1632957246c9SPatrick Mooney (void) printf("fpu_ymm%u[%d]\t\t0x%08x%08x%08x%08x\n", 1633957246c9SPatrick Mooney i, vcpu, 1634957246c9SPatrick Mooney state->xs_ymm[i]._l[0], state->xs_ymm[i]._l[1], 1635957246c9SPatrick Mooney state->xs_ymm[i]._l[2], state->xs_ymm[i]._l[3]); 1636957246c9SPatrick Mooney } 1637957246c9SPatrick Mooney } 1638957246c9SPatrick Mooney 1639957246c9SPatrick Mooney free(buf); 1640957246c9SPatrick Mooney return (0); 1641957246c9SPatrick Mooney } 1642*54cf5b63SPatrick Mooney 1643*54cf5b63SPatrick Mooney static const char * 1644*54cf5b63SPatrick Mooney msr_name(uint32_t msr) 1645*54cf5b63SPatrick Mooney { 1646*54cf5b63SPatrick Mooney #define MSR_IDENT_MAP(x) case x: return (#x); 1647*54cf5b63SPatrick Mooney switch (msr) { 1648*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_PAT) 1649*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_SYSENTER_CS_MSR) 1650*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_SYSENTER_ESP_MSR) 1651*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_SYSENTER_EIP_MSR) 1652*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_STAR) 1653*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_LSTAR) 1654*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_CSTAR) 1655*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_SF_MASK) 1656*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_FSBASE) 1657*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_GSBASE) 1658*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_KGSBASE) 1659*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_EFER) 1660*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_MTRRcap) 1661*54cf5b63SPatrick Mooney MSR_IDENT_MAP(MSR_MTRRdefType) 1662*54cf5b63SPatrick Mooney case MSR_TSC: 1663*54cf5b63SPatrick Mooney return ("MSR_TSC (offset from system boot)"); 1664*54cf5b63SPatrick Mooney default: 1665*54cf5b63SPatrick Mooney return (NULL); 1666*54cf5b63SPatrick Mooney } 1667*54cf5b63SPatrick Mooney } 1668*54cf5b63SPatrick Mooney 1669*54cf5b63SPatrick Mooney static int 1670*54cf5b63SPatrick Mooney show_msrs(struct vmctx *ctx, int vcpu) 1671*54cf5b63SPatrick Mooney { 1672*54cf5b63SPatrick Mooney struct vdi_field_entry_v1 *msrs; 1673*54cf5b63SPatrick Mooney struct vm_data_xfer xfer = { 1674*54cf5b63SPatrick Mooney .vdx_vcpuid = vcpu, 1675*54cf5b63SPatrick Mooney .vdx_class = VDC_MSR, 1676*54cf5b63SPatrick Mooney .vdx_version = 1, 1677*54cf5b63SPatrick Mooney .vdx_len = 0, 1678*54cf5b63SPatrick Mooney .vdx_data = &msrs, 1679*54cf5b63SPatrick Mooney }; 1680*54cf5b63SPatrick Mooney int fd = vm_get_device_fd(ctx); 1681*54cf5b63SPatrick Mooney int res; 1682*54cf5b63SPatrick Mooney 1683*54cf5b63SPatrick Mooney /* Figure out how many entries we need to alloc for */ 1684*54cf5b63SPatrick Mooney res = ioctl(fd, VM_DATA_READ, &xfer); 1685*54cf5b63SPatrick Mooney if (res == 0) { 1686*54cf5b63SPatrick Mooney return (EINVAL); 1687*54cf5b63SPatrick Mooney } else if (errno != ENOSPC) { 1688*54cf5b63SPatrick Mooney return (errno); 1689*54cf5b63SPatrick Mooney } 1690*54cf5b63SPatrick Mooney const uint32_t len = xfer.vdx_result_len; 1691*54cf5b63SPatrick Mooney msrs = malloc(len); 1692*54cf5b63SPatrick Mooney if (msrs == NULL) { 1693*54cf5b63SPatrick Mooney return (ENOMEM); 1694*54cf5b63SPatrick Mooney } 1695*54cf5b63SPatrick Mooney bzero(msrs, len); 1696*54cf5b63SPatrick Mooney xfer.vdx_data = msrs; 1697*54cf5b63SPatrick Mooney xfer.vdx_len = len; 1698*54cf5b63SPatrick Mooney 1699*54cf5b63SPatrick Mooney /* Query the actual data, now that we should have an adequate buffer */ 1700*54cf5b63SPatrick Mooney res = ioctl(fd, VM_DATA_READ, &xfer); 1701*54cf5b63SPatrick Mooney if (res != 0) { 1702*54cf5b63SPatrick Mooney free(msrs); 1703*54cf5b63SPatrick Mooney return (errno); 1704*54cf5b63SPatrick Mooney } 1705*54cf5b63SPatrick Mooney 1706*54cf5b63SPatrick Mooney const uint_t count = 1707*54cf5b63SPatrick Mooney xfer.vdx_result_len / sizeof (struct vdi_field_entry_v1); 1708*54cf5b63SPatrick Mooney for (uint_t i = 0; i < count; i++) { 1709*54cf5b63SPatrick Mooney const uint32_t ident = msrs[i].vfe_ident; 1710*54cf5b63SPatrick Mooney const uint64_t value = msrs[i].vfe_value; 1711*54cf5b63SPatrick Mooney 1712*54cf5b63SPatrick Mooney const char *name = msr_name(ident); 1713*54cf5b63SPatrick Mooney 1714*54cf5b63SPatrick Mooney if (name != NULL) { 1715*54cf5b63SPatrick Mooney printf("msr[%s]\t = %x\n", name, value); 1716*54cf5b63SPatrick Mooney } else { 1717*54cf5b63SPatrick Mooney printf("msr[%08x]\t = %x\n", ident, value); 1718*54cf5b63SPatrick Mooney } 1719*54cf5b63SPatrick Mooney } 1720*54cf5b63SPatrick Mooney free(msrs); 1721*54cf5b63SPatrick Mooney return (0); 1722*54cf5b63SPatrick Mooney } 1723957246c9SPatrick Mooney 17244c87aefeSPatrick Mooney int 17254c87aefeSPatrick Mooney main(int argc, char *argv[]) 17264c87aefeSPatrick Mooney { 17274c87aefeSPatrick Mooney char *vmname; 17284c87aefeSPatrick Mooney int error, ch, vcpu, ptenum; 17294c87aefeSPatrick Mooney vm_paddr_t gpa_pmap; 17304c87aefeSPatrick Mooney struct vm_exit vmexit; 17314c87aefeSPatrick Mooney uint64_t rax, cr0, cr2, cr3, cr4, dr0, dr1, dr2, dr3, dr6, dr7; 1732*54cf5b63SPatrick Mooney uint64_t rsp, rip, rflags, efer; 17334c87aefeSPatrick Mooney uint64_t eptp, bm, addr, u64, pteval[4], *pte, info[2]; 17344c87aefeSPatrick Mooney struct vmctx *ctx; 17354c87aefeSPatrick Mooney cpuset_t cpus; 17364c87aefeSPatrick Mooney bool cpu_intel; 17374c87aefeSPatrick Mooney uint64_t cs, ds, es, fs, gs, ss, tr, ldtr; 17384c87aefeSPatrick Mooney struct tm tm; 17394c87aefeSPatrick Mooney struct option *opts; 17404c87aefeSPatrick Mooney 17414c87aefeSPatrick Mooney cpu_intel = cpu_vendor_intel(); 17424c87aefeSPatrick Mooney opts = setup_options(cpu_intel); 17434c87aefeSPatrick Mooney 17444c87aefeSPatrick Mooney vcpu = 0; 17454c87aefeSPatrick Mooney vmname = NULL; 17464c87aefeSPatrick Mooney assert_lapic_lvt = -1; 17474c87aefeSPatrick Mooney progname = basename(argv[0]); 17484c87aefeSPatrick Mooney 17494c87aefeSPatrick Mooney while ((ch = getopt_long(argc, argv, "", opts, NULL)) != -1) { 17504c87aefeSPatrick Mooney switch (ch) { 17514c87aefeSPatrick Mooney case 0: 17524c87aefeSPatrick Mooney break; 17534c87aefeSPatrick Mooney case VMNAME: 17544c87aefeSPatrick Mooney vmname = optarg; 17554c87aefeSPatrick Mooney break; 17564c87aefeSPatrick Mooney case VCPU: 17574c87aefeSPatrick Mooney vcpu = atoi(optarg); 17584c87aefeSPatrick Mooney break; 17594c87aefeSPatrick Mooney case SET_MEM: 17604c87aefeSPatrick Mooney memsize = atoi(optarg) * MB; 17614c87aefeSPatrick Mooney memsize = roundup(memsize, 2 * MB); 17624c87aefeSPatrick Mooney break; 17634c87aefeSPatrick Mooney case SET_EFER: 17644c87aefeSPatrick Mooney efer = strtoul(optarg, NULL, 0); 17654c87aefeSPatrick Mooney set_efer = 1; 17664c87aefeSPatrick Mooney break; 17674c87aefeSPatrick Mooney case SET_CR0: 17684c87aefeSPatrick Mooney cr0 = strtoul(optarg, NULL, 0); 17694c87aefeSPatrick Mooney set_cr0 = 1; 17704c87aefeSPatrick Mooney break; 17714c87aefeSPatrick Mooney case SET_CR2: 17724c87aefeSPatrick Mooney cr2 = strtoul(optarg, NULL, 0); 17734c87aefeSPatrick Mooney set_cr2 = 1; 17744c87aefeSPatrick Mooney break; 17754c87aefeSPatrick Mooney case SET_CR3: 17764c87aefeSPatrick Mooney cr3 = strtoul(optarg, NULL, 0); 17774c87aefeSPatrick Mooney set_cr3 = 1; 17784c87aefeSPatrick Mooney break; 17794c87aefeSPatrick Mooney case SET_CR4: 17804c87aefeSPatrick Mooney cr4 = strtoul(optarg, NULL, 0); 17814c87aefeSPatrick Mooney set_cr4 = 1; 17824c87aefeSPatrick Mooney break; 17834c87aefeSPatrick Mooney case SET_DR0: 17844c87aefeSPatrick Mooney dr0 = strtoul(optarg, NULL, 0); 17854c87aefeSPatrick Mooney set_dr0 = 1; 17864c87aefeSPatrick Mooney break; 17874c87aefeSPatrick Mooney case SET_DR1: 17884c87aefeSPatrick Mooney dr1 = strtoul(optarg, NULL, 0); 17894c87aefeSPatrick Mooney set_dr1 = 1; 17904c87aefeSPatrick Mooney break; 17914c87aefeSPatrick Mooney case SET_DR2: 17924c87aefeSPatrick Mooney dr2 = strtoul(optarg, NULL, 0); 17934c87aefeSPatrick Mooney set_dr2 = 1; 17944c87aefeSPatrick Mooney break; 17954c87aefeSPatrick Mooney case SET_DR3: 17964c87aefeSPatrick Mooney dr3 = strtoul(optarg, NULL, 0); 17974c87aefeSPatrick Mooney set_dr3 = 1; 17984c87aefeSPatrick Mooney break; 17994c87aefeSPatrick Mooney case SET_DR6: 18004c87aefeSPatrick Mooney dr6 = strtoul(optarg, NULL, 0); 18014c87aefeSPatrick Mooney set_dr6 = 1; 18024c87aefeSPatrick Mooney break; 18034c87aefeSPatrick Mooney case SET_DR7: 18044c87aefeSPatrick Mooney dr7 = strtoul(optarg, NULL, 0); 18054c87aefeSPatrick Mooney set_dr7 = 1; 18064c87aefeSPatrick Mooney break; 18074c87aefeSPatrick Mooney case SET_RSP: 18084c87aefeSPatrick Mooney rsp = strtoul(optarg, NULL, 0); 18094c87aefeSPatrick Mooney set_rsp = 1; 18104c87aefeSPatrick Mooney break; 18114c87aefeSPatrick Mooney case SET_RIP: 18124c87aefeSPatrick Mooney rip = strtoul(optarg, NULL, 0); 18134c87aefeSPatrick Mooney set_rip = 1; 18144c87aefeSPatrick Mooney break; 18154c87aefeSPatrick Mooney case SET_RAX: 18164c87aefeSPatrick Mooney rax = strtoul(optarg, NULL, 0); 18174c87aefeSPatrick Mooney set_rax = 1; 18184c87aefeSPatrick Mooney break; 18194c87aefeSPatrick Mooney case SET_RFLAGS: 18204c87aefeSPatrick Mooney rflags = strtoul(optarg, NULL, 0); 18214c87aefeSPatrick Mooney set_rflags = 1; 18224c87aefeSPatrick Mooney break; 18234c87aefeSPatrick Mooney case DESC_BASE: 18244c87aefeSPatrick Mooney desc_base = strtoul(optarg, NULL, 0); 18254c87aefeSPatrick Mooney break; 18264c87aefeSPatrick Mooney case DESC_LIMIT: 18274c87aefeSPatrick Mooney desc_limit = strtoul(optarg, NULL, 0); 18284c87aefeSPatrick Mooney break; 18294c87aefeSPatrick Mooney case DESC_ACCESS: 18304c87aefeSPatrick Mooney desc_access = strtoul(optarg, NULL, 0); 18314c87aefeSPatrick Mooney break; 18324c87aefeSPatrick Mooney case SET_CS: 18334c87aefeSPatrick Mooney cs = strtoul(optarg, NULL, 0); 18344c87aefeSPatrick Mooney set_cs = 1; 18354c87aefeSPatrick Mooney break; 18364c87aefeSPatrick Mooney case SET_DS: 18374c87aefeSPatrick Mooney ds = strtoul(optarg, NULL, 0); 18384c87aefeSPatrick Mooney set_ds = 1; 18394c87aefeSPatrick Mooney break; 18404c87aefeSPatrick Mooney case SET_ES: 18414c87aefeSPatrick Mooney es = strtoul(optarg, NULL, 0); 18424c87aefeSPatrick Mooney set_es = 1; 18434c87aefeSPatrick Mooney break; 18444c87aefeSPatrick Mooney case SET_FS: 18454c87aefeSPatrick Mooney fs = strtoul(optarg, NULL, 0); 18464c87aefeSPatrick Mooney set_fs = 1; 18474c87aefeSPatrick Mooney break; 18484c87aefeSPatrick Mooney case SET_GS: 18494c87aefeSPatrick Mooney gs = strtoul(optarg, NULL, 0); 18504c87aefeSPatrick Mooney set_gs = 1; 18514c87aefeSPatrick Mooney break; 18524c87aefeSPatrick Mooney case SET_SS: 18534c87aefeSPatrick Mooney ss = strtoul(optarg, NULL, 0); 18544c87aefeSPatrick Mooney set_ss = 1; 18554c87aefeSPatrick Mooney break; 18564c87aefeSPatrick Mooney case SET_TR: 18574c87aefeSPatrick Mooney tr = strtoul(optarg, NULL, 0); 18584c87aefeSPatrick Mooney set_tr = 1; 18594c87aefeSPatrick Mooney break; 18604c87aefeSPatrick Mooney case SET_LDTR: 18614c87aefeSPatrick Mooney ldtr = strtoul(optarg, NULL, 0); 18624c87aefeSPatrick Mooney set_ldtr = 1; 18634c87aefeSPatrick Mooney break; 18644c87aefeSPatrick Mooney case SET_X2APIC_STATE: 18654c87aefeSPatrick Mooney x2apic_state = strtol(optarg, NULL, 0); 18664c87aefeSPatrick Mooney set_x2apic_state = 1; 18674c87aefeSPatrick Mooney break; 18684c87aefeSPatrick Mooney case SET_EXCEPTION_BITMAP: 18694c87aefeSPatrick Mooney exception_bitmap = strtoul(optarg, NULL, 0); 18704c87aefeSPatrick Mooney set_exception_bitmap = 1; 18714c87aefeSPatrick Mooney break; 18724c87aefeSPatrick Mooney case SET_VMCS_ENTRY_INTERRUPTION_INFO: 18734c87aefeSPatrick Mooney vmcs_entry_interruption_info = strtoul(optarg, NULL, 0); 18744c87aefeSPatrick Mooney set_vmcs_entry_interruption_info = 1; 18754c87aefeSPatrick Mooney break; 18764c87aefeSPatrick Mooney case SET_CAP: 18774c87aefeSPatrick Mooney capval = strtoul(optarg, NULL, 0); 18784c87aefeSPatrick Mooney setcap = 1; 18794c87aefeSPatrick Mooney break; 18804c87aefeSPatrick Mooney case SET_RTC_TIME: 18814c87aefeSPatrick Mooney rtc_secs = strtoul(optarg, NULL, 0); 18824c87aefeSPatrick Mooney set_rtc_time = 1; 18834c87aefeSPatrick Mooney break; 18844c87aefeSPatrick Mooney case SET_RTC_NVRAM: 18854c87aefeSPatrick Mooney rtc_nvram_value = (uint8_t)strtoul(optarg, NULL, 0); 18864c87aefeSPatrick Mooney set_rtc_nvram = 1; 18874c87aefeSPatrick Mooney break; 18884c87aefeSPatrick Mooney case RTC_NVRAM_OFFSET: 18894c87aefeSPatrick Mooney rtc_nvram_offset = strtoul(optarg, NULL, 0); 18904c87aefeSPatrick Mooney break; 18914c87aefeSPatrick Mooney case GET_GPA_PMAP: 18924c87aefeSPatrick Mooney gpa_pmap = strtoul(optarg, NULL, 0); 18934c87aefeSPatrick Mooney get_gpa_pmap = 1; 18944c87aefeSPatrick Mooney break; 18954c87aefeSPatrick Mooney case CAPNAME: 18964c87aefeSPatrick Mooney capname = optarg; 18974c87aefeSPatrick Mooney break; 18984c87aefeSPatrick Mooney case ASSERT_LAPIC_LVT: 18994c87aefeSPatrick Mooney assert_lapic_lvt = atoi(optarg); 19004c87aefeSPatrick Mooney break; 19010e1453c3SPatrick Mooney case PMTMR_PORT: 19020e1453c3SPatrick Mooney pmtmr_port = strtoul(optarg, NULL, 16); 19030e1453c3SPatrick Mooney break; 19044c87aefeSPatrick Mooney default: 19054c87aefeSPatrick Mooney usage(cpu_intel); 19064c87aefeSPatrick Mooney } 19074c87aefeSPatrick Mooney } 19084c87aefeSPatrick Mooney argc -= optind; 19094c87aefeSPatrick Mooney argv += optind; 19104c87aefeSPatrick Mooney 19114c87aefeSPatrick Mooney if (vmname == NULL) 19124c87aefeSPatrick Mooney usage(cpu_intel); 19134c87aefeSPatrick Mooney 19144c87aefeSPatrick Mooney error = 0; 19154c87aefeSPatrick Mooney 1916b57f5d3eSPatrick Mooney if (!error && create) 1917b57f5d3eSPatrick Mooney error = vm_create(vmname, 0); 19184c87aefeSPatrick Mooney 19194c87aefeSPatrick Mooney if (!error) { 19204c87aefeSPatrick Mooney ctx = vm_open(vmname); 19214c87aefeSPatrick Mooney if (ctx == NULL) { 19222b948146SAndy Fiddaman fprintf(stderr, 19232b948146SAndy Fiddaman "vm_open: %s could not be opened: %s\n", 19242b948146SAndy Fiddaman vmname, strerror(errno)); 19254c87aefeSPatrick Mooney exit (1); 19264c87aefeSPatrick Mooney } 19274c87aefeSPatrick Mooney } 19284c87aefeSPatrick Mooney 19290e1453c3SPatrick Mooney if (!error && pmtmr_port) { 19300e1453c3SPatrick Mooney error = vm_pmtmr_set_location(ctx, pmtmr_port); 19310e1453c3SPatrick Mooney exit(error); 19320e1453c3SPatrick Mooney } 1933*54cf5b63SPatrick Mooney 19344c87aefeSPatrick Mooney if (!error && wrlock_cycle) { 19354c87aefeSPatrick Mooney error = vm_wrlock_cycle(ctx); 19364c87aefeSPatrick Mooney exit(error); 19374c87aefeSPatrick Mooney } 19384c87aefeSPatrick Mooney 19394c87aefeSPatrick Mooney if (!error && memsize) 19404c87aefeSPatrick Mooney error = vm_setup_memory(ctx, memsize, VM_MMAP_ALL); 19414c87aefeSPatrick Mooney 19424c87aefeSPatrick Mooney if (!error && set_efer) 19434c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_EFER, efer); 19444c87aefeSPatrick Mooney 19454c87aefeSPatrick Mooney if (!error && set_cr0) 19464c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR0, cr0); 19474c87aefeSPatrick Mooney 19484c87aefeSPatrick Mooney if (!error && set_cr2) 19494c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR2, cr2); 19504c87aefeSPatrick Mooney 19514c87aefeSPatrick Mooney if (!error && set_cr3) 19524c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR3, cr3); 19534c87aefeSPatrick Mooney 19544c87aefeSPatrick Mooney if (!error && set_cr4) 19554c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR4, cr4); 19564c87aefeSPatrick Mooney 19574c87aefeSPatrick Mooney if (!error && set_dr0) 19584c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR0, dr0); 19594c87aefeSPatrick Mooney 19604c87aefeSPatrick Mooney if (!error && set_dr1) 19614c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR1, dr1); 19624c87aefeSPatrick Mooney 19634c87aefeSPatrick Mooney if (!error && set_dr2) 19644c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR2, dr2); 19654c87aefeSPatrick Mooney 19664c87aefeSPatrick Mooney if (!error && set_dr3) 19674c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR3, dr3); 19684c87aefeSPatrick Mooney 19694c87aefeSPatrick Mooney if (!error && set_dr6) 19704c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR6, dr6); 19714c87aefeSPatrick Mooney 19724c87aefeSPatrick Mooney if (!error && set_dr7) 19734c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR7, dr7); 19744c87aefeSPatrick Mooney 19754c87aefeSPatrick Mooney if (!error && set_rsp) 19764c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSP, rsp); 19774c87aefeSPatrick Mooney 19784c87aefeSPatrick Mooney if (!error && set_rip) 19794c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RIP, rip); 19804c87aefeSPatrick Mooney 19814c87aefeSPatrick Mooney if (!error && set_rax) 19824c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RAX, rax); 19834c87aefeSPatrick Mooney 19844c87aefeSPatrick Mooney if (!error && set_rflags) { 19854c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, 19864c87aefeSPatrick Mooney rflags); 19874c87aefeSPatrick Mooney } 19884c87aefeSPatrick Mooney 19894c87aefeSPatrick Mooney if (!error && set_desc_ds) { 19904c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_DS, 19914c87aefeSPatrick Mooney desc_base, desc_limit, desc_access); 19924c87aefeSPatrick Mooney } 19934c87aefeSPatrick Mooney 19944c87aefeSPatrick Mooney if (!error && set_desc_es) { 19954c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_ES, 19964c87aefeSPatrick Mooney desc_base, desc_limit, desc_access); 19974c87aefeSPatrick Mooney } 19984c87aefeSPatrick Mooney 19994c87aefeSPatrick Mooney if (!error && set_desc_ss) { 20004c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_SS, 20014c87aefeSPatrick Mooney desc_base, desc_limit, desc_access); 20024c87aefeSPatrick Mooney } 20034c87aefeSPatrick Mooney 20044c87aefeSPatrick Mooney if (!error && set_desc_cs) { 20054c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_CS, 20064c87aefeSPatrick Mooney desc_base, desc_limit, desc_access); 20074c87aefeSPatrick Mooney } 20084c87aefeSPatrick Mooney 20094c87aefeSPatrick Mooney if (!error && set_desc_fs) { 20104c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_FS, 20114c87aefeSPatrick Mooney desc_base, desc_limit, desc_access); 20124c87aefeSPatrick Mooney } 20134c87aefeSPatrick Mooney 20144c87aefeSPatrick Mooney if (!error && set_desc_gs) { 20154c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_GS, 20164c87aefeSPatrick Mooney desc_base, desc_limit, desc_access); 20174c87aefeSPatrick Mooney } 20184c87aefeSPatrick Mooney 20194c87aefeSPatrick Mooney if (!error && set_desc_tr) { 20204c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_TR, 20214c87aefeSPatrick Mooney desc_base, desc_limit, desc_access); 20224c87aefeSPatrick Mooney } 20234c87aefeSPatrick Mooney 20244c87aefeSPatrick Mooney if (!error && set_desc_ldtr) { 20254c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_LDTR, 20264c87aefeSPatrick Mooney desc_base, desc_limit, desc_access); 20274c87aefeSPatrick Mooney } 20284c87aefeSPatrick Mooney 20294c87aefeSPatrick Mooney if (!error && set_desc_gdtr) { 20304c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_GDTR, 20314c87aefeSPatrick Mooney desc_base, desc_limit, 0); 20324c87aefeSPatrick Mooney } 20334c87aefeSPatrick Mooney 20344c87aefeSPatrick Mooney if (!error && set_desc_idtr) { 20354c87aefeSPatrick Mooney error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_IDTR, 20364c87aefeSPatrick Mooney desc_base, desc_limit, 0); 20374c87aefeSPatrick Mooney } 20384c87aefeSPatrick Mooney 20394c87aefeSPatrick Mooney if (!error && set_cs) 20404c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CS, cs); 20414c87aefeSPatrick Mooney 20424c87aefeSPatrick Mooney if (!error && set_ds) 20434c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DS, ds); 20444c87aefeSPatrick Mooney 20454c87aefeSPatrick Mooney if (!error && set_es) 20464c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_ES, es); 20474c87aefeSPatrick Mooney 20484c87aefeSPatrick Mooney if (!error && set_fs) 20494c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_FS, fs); 20504c87aefeSPatrick Mooney 20514c87aefeSPatrick Mooney if (!error && set_gs) 20524c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_GS, gs); 20534c87aefeSPatrick Mooney 20544c87aefeSPatrick Mooney if (!error && set_ss) 20554c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_SS, ss); 20564c87aefeSPatrick Mooney 20574c87aefeSPatrick Mooney if (!error && set_tr) 20584c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_TR, tr); 20594c87aefeSPatrick Mooney 20604c87aefeSPatrick Mooney if (!error && set_ldtr) 20614c87aefeSPatrick Mooney error = vm_set_register(ctx, vcpu, VM_REG_GUEST_LDTR, ldtr); 20624c87aefeSPatrick Mooney 20634c87aefeSPatrick Mooney if (!error && set_x2apic_state) 20644c87aefeSPatrick Mooney error = vm_set_x2apic_state(ctx, vcpu, x2apic_state); 20654c87aefeSPatrick Mooney 20664c87aefeSPatrick Mooney if (!error && set_exception_bitmap) { 20674c87aefeSPatrick Mooney if (cpu_intel) 20684c87aefeSPatrick Mooney error = vm_set_vmcs_field(ctx, vcpu, 20694c87aefeSPatrick Mooney VMCS_EXCEPTION_BITMAP, 20704c87aefeSPatrick Mooney exception_bitmap); 20714c87aefeSPatrick Mooney else 20724c87aefeSPatrick Mooney error = vm_set_vmcb_field(ctx, vcpu, 20734c87aefeSPatrick Mooney VMCB_OFF_EXC_INTERCEPT, 20744c87aefeSPatrick Mooney 4, exception_bitmap); 20754c87aefeSPatrick Mooney } 20764c87aefeSPatrick Mooney 20774c87aefeSPatrick Mooney if (!error && cpu_intel && set_vmcs_entry_interruption_info) { 20784c87aefeSPatrick Mooney error = vm_set_vmcs_field(ctx, vcpu, VMCS_ENTRY_INTR_INFO, 20794c87aefeSPatrick Mooney vmcs_entry_interruption_info); 20804c87aefeSPatrick Mooney } 20814c87aefeSPatrick Mooney 20824c87aefeSPatrick Mooney if (!error && inject_nmi) { 20834c87aefeSPatrick Mooney error = vm_inject_nmi(ctx, vcpu); 20844c87aefeSPatrick Mooney } 20854c87aefeSPatrick Mooney 20864c87aefeSPatrick Mooney if (!error && assert_lapic_lvt != -1) { 20874c87aefeSPatrick Mooney error = vm_lapic_local_irq(ctx, vcpu, assert_lapic_lvt); 20884c87aefeSPatrick Mooney } 20894c87aefeSPatrick Mooney 20904c87aefeSPatrick Mooney if (!error && (get_memseg || get_all)) 20914c87aefeSPatrick Mooney error = show_memseg(ctx); 20924c87aefeSPatrick Mooney 20934c87aefeSPatrick Mooney if (!error && (get_memmap || get_all)) 20944c87aefeSPatrick Mooney error = show_memmap(ctx); 20954c87aefeSPatrick Mooney 20964c87aefeSPatrick Mooney if (!error) 20974c87aefeSPatrick Mooney error = get_all_registers(ctx, vcpu); 20984c87aefeSPatrick Mooney 20994c87aefeSPatrick Mooney if (!error) 21004c87aefeSPatrick Mooney error = get_all_segments(ctx, vcpu); 21014c87aefeSPatrick Mooney 2102957246c9SPatrick Mooney if (!error && (get_fpu || get_all)) { 2103957246c9SPatrick Mooney error = show_fpu(ctx, vcpu); 2104957246c9SPatrick Mooney } 2105957246c9SPatrick Mooney 21064c87aefeSPatrick Mooney if (!error) { 21074c87aefeSPatrick Mooney if (cpu_intel) 21084c87aefeSPatrick Mooney error = get_misc_vmcs(ctx, vcpu); 21094c87aefeSPatrick Mooney else 21104c87aefeSPatrick Mooney error = get_misc_vmcb(ctx, vcpu); 21114c87aefeSPatrick Mooney } 2112*54cf5b63SPatrick Mooney 21134c87aefeSPatrick Mooney if (!error && (get_x2apic_state || get_all)) { 21144c87aefeSPatrick Mooney error = vm_get_x2apic_state(ctx, vcpu, &x2apic_state); 21154c87aefeSPatrick Mooney if (error == 0) 21164c87aefeSPatrick Mooney printf("x2apic_state[%d]\t%d\n", vcpu, x2apic_state); 21174c87aefeSPatrick Mooney } 21184c87aefeSPatrick Mooney 21194c87aefeSPatrick Mooney if (!error && (get_eptp || get_all)) { 21204c87aefeSPatrick Mooney if (cpu_intel) 21214c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_EPTP, &eptp); 21224c87aefeSPatrick Mooney else 21234c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_NPT_BASE, 21244c87aefeSPatrick Mooney 8, &eptp); 21254c87aefeSPatrick Mooney if (error == 0) 21264c87aefeSPatrick Mooney printf("%s[%d]\t\t0x%016lx\n", 21274c87aefeSPatrick Mooney cpu_intel ? "eptp" : "rvi/npt", vcpu, eptp); 21284c87aefeSPatrick Mooney } 21294c87aefeSPatrick Mooney 21304c87aefeSPatrick Mooney if (!error && (get_exception_bitmap || get_all)) { 21314c87aefeSPatrick Mooney if(cpu_intel) 21324c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, 21334c87aefeSPatrick Mooney VMCS_EXCEPTION_BITMAP, &bm); 21344c87aefeSPatrick Mooney else 21354c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, 21364c87aefeSPatrick Mooney VMCB_OFF_EXC_INTERCEPT, 21374c87aefeSPatrick Mooney 4, &bm); 21384c87aefeSPatrick Mooney if (error == 0) 21394c87aefeSPatrick Mooney printf("exception_bitmap[%d]\t%#lx\n", vcpu, bm); 21404c87aefeSPatrick Mooney } 21414c87aefeSPatrick Mooney 21424c87aefeSPatrick Mooney if (!error && (get_io_bitmap || get_all)) { 21434c87aefeSPatrick Mooney if (cpu_intel) { 21444c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_IO_BITMAP_A, 21454c87aefeSPatrick Mooney &bm); 21464c87aefeSPatrick Mooney if (error == 0) 21474c87aefeSPatrick Mooney printf("io_bitmap_a[%d]\t%#lx\n", vcpu, bm); 21484c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_IO_BITMAP_B, 21494c87aefeSPatrick Mooney &bm); 21504c87aefeSPatrick Mooney if (error == 0) 21514c87aefeSPatrick Mooney printf("io_bitmap_b[%d]\t%#lx\n", vcpu, bm); 21524c87aefeSPatrick Mooney } else { 21534c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, 21544c87aefeSPatrick Mooney VMCB_OFF_IO_PERM, 8, &bm); 21554c87aefeSPatrick Mooney if (error == 0) 21564c87aefeSPatrick Mooney printf("io_bitmap[%d]\t%#lx\n", vcpu, bm); 21574c87aefeSPatrick Mooney } 21584c87aefeSPatrick Mooney } 21594c87aefeSPatrick Mooney 21604c87aefeSPatrick Mooney if (!error && (get_tsc_offset || get_all)) { 21614c87aefeSPatrick Mooney uint64_t tscoff; 21624c87aefeSPatrick Mooney if (cpu_intel) 21634c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_TSC_OFFSET, 21644c87aefeSPatrick Mooney &tscoff); 21654c87aefeSPatrick Mooney else 21664c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, 2167*54cf5b63SPatrick Mooney VMCB_OFF_TSC_OFFSET, 21684c87aefeSPatrick Mooney 8, &tscoff); 21694c87aefeSPatrick Mooney if (error == 0) 21704c87aefeSPatrick Mooney printf("tsc_offset[%d]\t0x%016lx\n", vcpu, tscoff); 21714c87aefeSPatrick Mooney } 21724c87aefeSPatrick Mooney 21734c87aefeSPatrick Mooney if (!error && (get_msr_bitmap_address || get_all)) { 21744c87aefeSPatrick Mooney if (cpu_intel) 2175*54cf5b63SPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_MSR_BITMAP, 21764c87aefeSPatrick Mooney &addr); 21774c87aefeSPatrick Mooney else 21784c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, 21794c87aefeSPatrick Mooney VMCB_OFF_MSR_PERM, 8, &addr); 21804c87aefeSPatrick Mooney if (error == 0) 21814c87aefeSPatrick Mooney printf("msr_bitmap[%d]\t\t%#lx\n", vcpu, addr); 21824c87aefeSPatrick Mooney } 21834c87aefeSPatrick Mooney 21844c87aefeSPatrick Mooney if (!error && (get_vpid_asid || get_all)) { 21854c87aefeSPatrick Mooney uint64_t vpid; 21864c87aefeSPatrick Mooney if (cpu_intel) 21874c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_VPID, &vpid); 21884c87aefeSPatrick Mooney else 2189*54cf5b63SPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, VMCB_OFF_ASID, 21904c87aefeSPatrick Mooney 4, &vpid); 21914c87aefeSPatrick Mooney if (error == 0) 2192*54cf5b63SPatrick Mooney printf("%s[%d]\t\t0x%04lx\n", 21934c87aefeSPatrick Mooney cpu_intel ? "vpid" : "asid", vcpu, vpid); 21944c87aefeSPatrick Mooney } 21954c87aefeSPatrick Mooney 2196*54cf5b63SPatrick Mooney if (!error && (get_guest_msrs || get_all)) { 2197*54cf5b63SPatrick Mooney error = show_msrs(ctx, vcpu); 21984c87aefeSPatrick Mooney } 21994c87aefeSPatrick Mooney 22004c87aefeSPatrick Mooney if (!error && (get_exit_reason || get_all)) { 22014c87aefeSPatrick Mooney if (cpu_intel) 22024c87aefeSPatrick Mooney error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_REASON, 22034c87aefeSPatrick Mooney &u64); 2204*54cf5b63SPatrick Mooney else 22054c87aefeSPatrick Mooney error = vm_get_vmcb_field(ctx, vcpu, 22064c87aefeSPatrick Mooney VMCB_OFF_EXIT_REASON, 8, 22074c87aefeSPatrick Mooney &u64); 22084c87aefeSPatrick Mooney if (error == 0) 22094c87aefeSPatrick Mooney printf("exit_reason[%d]\t%#lx\n", vcpu, u64); 22104c87aefeSPatrick Mooney } 22114c87aefeSPatrick Mooney 22124c87aefeSPatrick Mooney if (!error && setcap) { 22134c87aefeSPatrick Mooney int captype; 22144c87aefeSPatrick Mooney captype = vm_capability_name2type(capname); 22154c87aefeSPatrick Mooney error = vm_set_capability(ctx, vcpu, captype, capval); 22164c87aefeSPatrick Mooney if (error != 0 && errno == ENOENT) 22174c87aefeSPatrick Mooney printf("Capability \"%s\" is not available\n", capname); 22184c87aefeSPatrick Mooney } 22194c87aefeSPatrick Mooney 22204c87aefeSPatrick Mooney if (!error && get_gpa_pmap) { 22214c87aefeSPatrick Mooney error = vm_get_gpa_pmap(ctx, gpa_pmap, pteval, &ptenum); 22224c87aefeSPatrick Mooney if (error == 0) { 22234c87aefeSPatrick Mooney printf("gpa %#lx:", gpa_pmap); 22244c87aefeSPatrick Mooney pte = &pteval[0]; 22254c87aefeSPatrick Mooney while (ptenum-- > 0) 22264c87aefeSPatrick Mooney printf(" %#lx", *pte++); 22274c87aefeSPatrick Mooney printf("\n"); 22284c87aefeSPatrick Mooney } 22294c87aefeSPatrick Mooney } 22304c87aefeSPatrick Mooney 22314c87aefeSPatrick Mooney if (!error && set_rtc_nvram) 22324c87aefeSPatrick Mooney error = vm_rtc_write(ctx, rtc_nvram_offset, rtc_nvram_value); 22334c87aefeSPatrick Mooney 22344c87aefeSPatrick Mooney if (!error && (get_rtc_nvram || get_all)) { 22354c87aefeSPatrick Mooney error = vm_rtc_read(ctx, rtc_nvram_offset, &rtc_nvram_value); 22364c87aefeSPatrick Mooney if (error == 0) { 22374c87aefeSPatrick Mooney printf("rtc nvram[%03d]: 0x%02x\n", rtc_nvram_offset, 22384c87aefeSPatrick Mooney rtc_nvram_value); 22394c87aefeSPatrick Mooney } 22404c87aefeSPatrick Mooney } 22414c87aefeSPatrick Mooney 22424c87aefeSPatrick Mooney if (!error && set_rtc_time) 22434c87aefeSPatrick Mooney error = vm_rtc_settime(ctx, rtc_secs); 22444c87aefeSPatrick Mooney 22454c87aefeSPatrick Mooney if (!error && (get_rtc_time || get_all)) { 22464c87aefeSPatrick Mooney error = vm_rtc_gettime(ctx, &rtc_secs); 22474c87aefeSPatrick Mooney if (error == 0) { 22484c87aefeSPatrick Mooney gmtime_r(&rtc_secs, &tm); 22494c87aefeSPatrick Mooney printf("rtc time %#lx: %s %s %02d %02d:%02d:%02d %d\n", 22504c87aefeSPatrick Mooney rtc_secs, wday_str(tm.tm_wday), mon_str(tm.tm_mon), 22514c87aefeSPatrick Mooney tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 22524c87aefeSPatrick Mooney 1900 + tm.tm_year); 22534c87aefeSPatrick Mooney } 22544c87aefeSPatrick Mooney } 22554c87aefeSPatrick Mooney 22564c87aefeSPatrick Mooney if (!error && (getcap || get_all)) { 22574c87aefeSPatrick Mooney int captype, val, getcaptype; 22584c87aefeSPatrick Mooney 22594c87aefeSPatrick Mooney if (getcap && capname) 22604c87aefeSPatrick Mooney getcaptype = vm_capability_name2type(capname); 22614c87aefeSPatrick Mooney else 22624c87aefeSPatrick Mooney getcaptype = -1; 22634c87aefeSPatrick Mooney 22644c87aefeSPatrick Mooney for (captype = 0; captype < VM_CAP_MAX; captype++) { 22654c87aefeSPatrick Mooney if (getcaptype >= 0 && captype != getcaptype) 22664c87aefeSPatrick Mooney continue; 22674c87aefeSPatrick Mooney error = vm_get_capability(ctx, vcpu, captype, &val); 22684c87aefeSPatrick Mooney if (error == 0) { 22694c87aefeSPatrick Mooney printf("Capability \"%s\" is %s on vcpu %d\n", 22704c87aefeSPatrick Mooney vm_capability_type2name(captype), 22714c87aefeSPatrick Mooney val ? "set" : "not set", vcpu); 22724c87aefeSPatrick Mooney } else if (errno == ENOENT) { 22734c87aefeSPatrick Mooney error = 0; 22744c87aefeSPatrick Mooney printf("Capability \"%s\" is not available\n", 22754c87aefeSPatrick Mooney vm_capability_type2name(captype)); 22764c87aefeSPatrick Mooney } else { 22774c87aefeSPatrick Mooney break; 22784c87aefeSPatrick Mooney } 22794c87aefeSPatrick Mooney } 22804c87aefeSPatrick Mooney } 22814c87aefeSPatrick Mooney 22824c87aefeSPatrick Mooney if (!error && (get_active_cpus || get_all)) { 22834c87aefeSPatrick Mooney error = vm_active_cpus(ctx, &cpus); 22844c87aefeSPatrick Mooney if (!error) 22854c87aefeSPatrick Mooney print_cpus("active cpus", &cpus); 22864c87aefeSPatrick Mooney } 22874c87aefeSPatrick Mooney 22884c87aefeSPatrick Mooney if (!error && (get_suspended_cpus || get_all)) { 22894c87aefeSPatrick Mooney error = vm_suspended_cpus(ctx, &cpus); 22904c87aefeSPatrick Mooney if (!error) 22914c87aefeSPatrick Mooney print_cpus("suspended cpus", &cpus); 22924c87aefeSPatrick Mooney } 22934c87aefeSPatrick Mooney 22944c87aefeSPatrick Mooney if (!error && (get_intinfo || get_all)) { 22954c87aefeSPatrick Mooney error = vm_get_intinfo(ctx, vcpu, &info[0], &info[1]); 22964c87aefeSPatrick Mooney if (!error) { 22974c87aefeSPatrick Mooney print_intinfo("pending", info[0]); 22984c87aefeSPatrick Mooney print_intinfo("current", info[1]); 22994c87aefeSPatrick Mooney } 23004c87aefeSPatrick Mooney } 23014c87aefeSPatrick Mooney 23024c87aefeSPatrick Mooney if (!error && (get_stats || get_all)) { 23034c87aefeSPatrick Mooney int i, num_stats; 23044c87aefeSPatrick Mooney uint64_t *stats; 23054c87aefeSPatrick Mooney struct timeval tv; 23064c87aefeSPatrick Mooney const char *desc; 23074c87aefeSPatrick Mooney 23084c87aefeSPatrick Mooney stats = vm_get_stats(ctx, vcpu, &tv, &num_stats); 23094c87aefeSPatrick Mooney if (stats != NULL) { 23104c87aefeSPatrick Mooney printf("vcpu%d stats:\n", vcpu); 23114c87aefeSPatrick Mooney for (i = 0; i < num_stats; i++) { 23124c87aefeSPatrick Mooney desc = vm_get_stat_desc(ctx, i); 23134c87aefeSPatrick Mooney printf("%-40s\t%ld\n", desc, stats[i]); 23144c87aefeSPatrick Mooney } 23154c87aefeSPatrick Mooney } 23164c87aefeSPatrick Mooney } 23174c87aefeSPatrick Mooney 23184c87aefeSPatrick Mooney if (!error && (get_cpu_topology || get_all)) { 23194c87aefeSPatrick Mooney uint16_t sockets, cores, threads, maxcpus; 23204c87aefeSPatrick Mooney 23214c87aefeSPatrick Mooney vm_get_topology(ctx, &sockets, &cores, &threads, &maxcpus); 23224c87aefeSPatrick Mooney printf("cpu_topology:\tsockets=%hu, cores=%hu, threads=%hu, " 23234c87aefeSPatrick Mooney "maxcpus=%hu\n", sockets, cores, threads, maxcpus); 23244c87aefeSPatrick Mooney } 23254c87aefeSPatrick Mooney 23264c87aefeSPatrick Mooney if (!error && run) { 2327e0c0d44eSPatrick Mooney struct vm_entry entry; 2328e0c0d44eSPatrick Mooney 2329e0c0d44eSPatrick Mooney bzero(&entry, sizeof (entry)); 2330e0c0d44eSPatrick Mooney 2331e0c0d44eSPatrick Mooney error = vm_run(ctx, vcpu, &entry, &vmexit); 23324c87aefeSPatrick Mooney if (error == 0) 23334c87aefeSPatrick Mooney dump_vm_run_exitcode(&vmexit, vcpu); 23344c87aefeSPatrick Mooney else 23354c87aefeSPatrick Mooney printf("vm_run error %d\n", error); 23364c87aefeSPatrick Mooney } 23374c87aefeSPatrick Mooney 23384c87aefeSPatrick Mooney if (!error && force_reset) 23394c87aefeSPatrick Mooney error = vm_suspend(ctx, VM_SUSPEND_RESET); 23404c87aefeSPatrick Mooney 23414c87aefeSPatrick Mooney if (!error && force_poweroff) 23424c87aefeSPatrick Mooney error = vm_suspend(ctx, VM_SUSPEND_POWEROFF); 23434c87aefeSPatrick Mooney 2344bf21cd93STycho Nightingale if (error) 2345bf21cd93STycho Nightingale printf("errno = %d\n", errno); 2346bf21cd93STycho Nightingale 2347bf21cd93STycho Nightingale if (!error && destroy) 23484c87aefeSPatrick Mooney vm_destroy(ctx); 2349bf21cd93STycho Nightingale 23504c87aefeSPatrick Mooney free (opts); 2351bf21cd93STycho Nightingale exit(error); 2352bf21cd93STycho Nightingale } 2353