1221828Sgrehan/*- 2221828Sgrehan * Copyright (c) 2011 NetApp, Inc. 3221828Sgrehan * All rights reserved. 4221828Sgrehan * 5221828Sgrehan * Redistribution and use in source and binary forms, with or without 6221828Sgrehan * modification, are permitted provided that the following conditions 7221828Sgrehan * are met: 8221828Sgrehan * 1. Redistributions of source code must retain the above copyright 9221828Sgrehan * notice, this list of conditions and the following disclaimer. 10221828Sgrehan * 2. Redistributions in binary form must reproduce the above copyright 11221828Sgrehan * notice, this list of conditions and the following disclaimer in the 12221828Sgrehan * documentation and/or other materials provided with the distribution. 13221828Sgrehan * 14221828Sgrehan * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND 15221828Sgrehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16221828Sgrehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17221828Sgrehan * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE 18221828Sgrehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19221828Sgrehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20221828Sgrehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21221828Sgrehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22221828Sgrehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23221828Sgrehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24221828Sgrehan * SUCH DAMAGE. 25221828Sgrehan * 26221828Sgrehan * $FreeBSD$ 27221828Sgrehan */ 28221828Sgrehan 29221828Sgrehan#include <sys/cdefs.h> 30221828Sgrehan__FBSDID("$FreeBSD$"); 31221828Sgrehan 32221828Sgrehan#include <sys/param.h> 33221828Sgrehan#include <sys/types.h> 34221828Sgrehan#include <sys/sysctl.h> 35221828Sgrehan#include <sys/errno.h> 36221828Sgrehan#include <sys/mman.h> 37221828Sgrehan 38221828Sgrehan#include <stdio.h> 39221828Sgrehan#include <stdlib.h> 40221828Sgrehan#include <unistd.h> 41221828Sgrehan#include <libgen.h> 42221828Sgrehan#include <libutil.h> 43221828Sgrehan#include <fcntl.h> 44221828Sgrehan#include <string.h> 45221828Sgrehan#include <getopt.h> 46221828Sgrehan#include <assert.h> 47221828Sgrehan 48221828Sgrehan#include <machine/vmm.h> 49221828Sgrehan#include <vmmapi.h> 50221828Sgrehan 51221828Sgrehan#include "intel/vmcs.h" 52221828Sgrehan 53221828Sgrehan#define MB (1UL << 20) 54221828Sgrehan#define GB (1UL << 30) 55221828Sgrehan 56221828Sgrehan#define REQ_ARG required_argument 57221828Sgrehan#define NO_ARG no_argument 58221828Sgrehan#define OPT_ARG optional_argument 59221828Sgrehan 60221828Sgrehanstatic const char *progname; 61221828Sgrehan 62221828Sgrehanstatic void 63221828Sgrehanusage(void) 64221828Sgrehan{ 65221828Sgrehan 66221828Sgrehan (void)fprintf(stderr, 67245679Sneel "Usage: %s --vm=<vmname>\n" 68221828Sgrehan " [--cpu=<vcpu_number>]\n" 69221828Sgrehan " [--create]\n" 70221828Sgrehan " [--destroy]\n" 71245685Sjoel " [--get-all]\n" 72221828Sgrehan " [--get-stats]\n" 73221828Sgrehan " [--set-desc-ds]\n" 74221828Sgrehan " [--get-desc-ds]\n" 75221828Sgrehan " [--set-desc-es]\n" 76221828Sgrehan " [--get-desc-es]\n" 77221828Sgrehan " [--set-desc-gs]\n" 78221828Sgrehan " [--get-desc-gs]\n" 79221828Sgrehan " [--set-desc-fs]\n" 80221828Sgrehan " [--get-desc-fs]\n" 81221828Sgrehan " [--set-desc-cs]\n" 82221828Sgrehan " [--get-desc-cs]\n" 83221828Sgrehan " [--set-desc-ss]\n" 84221828Sgrehan " [--get-desc-ss]\n" 85221828Sgrehan " [--set-desc-tr]\n" 86221828Sgrehan " [--get-desc-tr]\n" 87221828Sgrehan " [--set-desc-ldtr]\n" 88221828Sgrehan " [--get-desc-ldtr]\n" 89221828Sgrehan " [--set-desc-gdtr]\n" 90221828Sgrehan " [--get-desc-gdtr]\n" 91221828Sgrehan " [--set-desc-idtr]\n" 92221828Sgrehan " [--get-desc-idtr]\n" 93221828Sgrehan " [--run]\n" 94221828Sgrehan " [--capname=<capname>]\n" 95221828Sgrehan " [--getcap]\n" 96221828Sgrehan " [--setcap=<0|1>]\n" 97221828Sgrehan " [--desc-base=<BASE>]\n" 98221828Sgrehan " [--desc-limit=<LIMIT>]\n" 99221828Sgrehan " [--desc-access=<ACCESS>]\n" 100221828Sgrehan " [--set-cr0=<CR0>]\n" 101221828Sgrehan " [--get-cr0]\n" 102221828Sgrehan " [--set-cr3=<CR3>]\n" 103221828Sgrehan " [--get-cr3]\n" 104221828Sgrehan " [--set-cr4=<CR4>]\n" 105221828Sgrehan " [--get-cr4]\n" 106221828Sgrehan " [--set-dr7=<DR7>]\n" 107221828Sgrehan " [--get-dr7]\n" 108221828Sgrehan " [--set-rsp=<RSP>]\n" 109221828Sgrehan " [--get-rsp]\n" 110221828Sgrehan " [--set-rip=<RIP>]\n" 111221828Sgrehan " [--get-rip]\n" 112221828Sgrehan " [--get-rax]\n" 113221828Sgrehan " [--set-rax=<RAX>]\n" 114221828Sgrehan " [--get-rbx]\n" 115221828Sgrehan " [--get-rcx]\n" 116221828Sgrehan " [--get-rdx]\n" 117221828Sgrehan " [--get-rsi]\n" 118221828Sgrehan " [--get-rdi]\n" 119221828Sgrehan " [--get-rbp]\n" 120221828Sgrehan " [--get-r8]\n" 121221828Sgrehan " [--get-r9]\n" 122221828Sgrehan " [--get-r10]\n" 123221828Sgrehan " [--get-r11]\n" 124221828Sgrehan " [--get-r12]\n" 125221828Sgrehan " [--get-r13]\n" 126221828Sgrehan " [--get-r14]\n" 127221828Sgrehan " [--get-r15]\n" 128221828Sgrehan " [--set-rflags=<RFLAGS>]\n" 129221828Sgrehan " [--get-rflags]\n" 130221828Sgrehan " [--set-cs]\n" 131221828Sgrehan " [--get-cs]\n" 132221828Sgrehan " [--set-ds]\n" 133221828Sgrehan " [--get-ds]\n" 134221828Sgrehan " [--set-es]\n" 135221828Sgrehan " [--get-es]\n" 136221828Sgrehan " [--set-fs]\n" 137221828Sgrehan " [--get-fs]\n" 138221828Sgrehan " [--set-gs]\n" 139221828Sgrehan " [--get-gs]\n" 140221828Sgrehan " [--set-ss]\n" 141221828Sgrehan " [--get-ss]\n" 142221828Sgrehan " [--get-tr]\n" 143221828Sgrehan " [--get-ldtr]\n" 144221828Sgrehan " [--get-vmcs-pinbased-ctls]\n" 145221828Sgrehan " [--get-vmcs-procbased-ctls]\n" 146221828Sgrehan " [--get-vmcs-procbased-ctls2]\n" 147221828Sgrehan " [--get-vmcs-entry-interruption-info]\n" 148221828Sgrehan " [--set-vmcs-entry-interruption-info=<info>]\n" 149221828Sgrehan " [--get-vmcs-eptp]\n" 150221828Sgrehan " [--get-vmcs-guest-physical-address\n" 151221828Sgrehan " [--get-vmcs-guest-linear-address\n" 152221828Sgrehan " [--set-vmcs-exception-bitmap]\n" 153221828Sgrehan " [--get-vmcs-exception-bitmap]\n" 154221828Sgrehan " [--get-vmcs-io-bitmap-address]\n" 155221828Sgrehan " [--get-vmcs-tsc-offset]\n" 156221828Sgrehan " [--get-vmcs-guest-pat]\n" 157221828Sgrehan " [--get-vmcs-host-pat]\n" 158221828Sgrehan " [--get-vmcs-host-cr0]\n" 159221828Sgrehan " [--get-vmcs-host-cr3]\n" 160221828Sgrehan " [--get-vmcs-host-cr4]\n" 161221828Sgrehan " [--get-vmcs-host-rip]\n" 162221828Sgrehan " [--get-vmcs-host-rsp]\n" 163221828Sgrehan " [--get-vmcs-cr0-mask]\n" 164221828Sgrehan " [--get-vmcs-cr0-shadow]\n" 165221828Sgrehan " [--get-vmcs-cr4-mask]\n" 166221828Sgrehan " [--get-vmcs-cr4-shadow]\n" 167221828Sgrehan " [--get-vmcs-cr3-targets]\n" 168221828Sgrehan " [--get-vmcs-apic-access-address]\n" 169221828Sgrehan " [--get-vmcs-virtual-apic-address]\n" 170221828Sgrehan " [--get-vmcs-tpr-threshold]\n" 171221828Sgrehan " [--get-vmcs-msr-bitmap]\n" 172221828Sgrehan " [--get-vmcs-msr-bitmap-address]\n" 173221828Sgrehan " [--get-vmcs-vpid]\n" 174221828Sgrehan " [--get-vmcs-ple-gap]\n" 175221828Sgrehan " [--get-vmcs-ple-window]\n" 176221828Sgrehan " [--get-vmcs-instruction-error]\n" 177221828Sgrehan " [--get-vmcs-exit-ctls]\n" 178221828Sgrehan " [--get-vmcs-entry-ctls]\n" 179221828Sgrehan " [--get-vmcs-guest-sysenter]\n" 180221828Sgrehan " [--get-vmcs-link]\n" 181221828Sgrehan " [--get-vmcs-exit-reason]\n" 182221828Sgrehan " [--get-vmcs-exit-qualification]\n" 183221828Sgrehan " [--get-vmcs-exit-interruption-info]\n" 184221828Sgrehan " [--get-vmcs-exit-interruption-error]\n" 185221828Sgrehan " [--get-vmcs-interruptibility]\n" 186240922Sneel " [--set-x2apic-state=<state>]\n" 187240922Sneel " [--get-x2apic-state]\n" 188246800Sneel " [--unassign-pptdev=<bus/slot/func>]\n" 189248477Sneel " [--set-mem=<memory in units of MB>]\n" 190221828Sgrehan " [--get-lowmem]\n" 191256072Sneel " [--get-highmem]\n" 192262350Sjhb " [--get-gpa-pmap]\n" 193262350Sjhb " [--assert-lapic-lvt=<pin>]\n" 194268935Sjhb " [--inject-nmi]\n" 195268935Sjhb " [--force-reset]\n" 196270070Sgrehan " [--force-poweroff]\n" 197270070Sgrehan " [--get-active-cpus]\n" 198270159Sgrehan " [--get-suspended-cpus]\n" 199270159Sgrehan " [--get-intinfo]\n", 200221828Sgrehan progname); 201221828Sgrehan exit(1); 202221828Sgrehan} 203221828Sgrehan 204256072Sneelstatic int get_stats, getcap, setcap, capval, get_gpa_pmap; 205262350Sjhbstatic int inject_nmi, assert_lapic_lvt; 206268935Sjhbstatic int force_reset, force_poweroff; 207221828Sgrehanstatic const char *capname; 208221828Sgrehanstatic int create, destroy, get_lowmem, get_highmem; 209270159Sgrehanstatic int get_intinfo; 210270070Sgrehanstatic int get_active_cpus, get_suspended_cpus; 211248477Sneelstatic uint64_t memsize; 212221828Sgrehanstatic int set_cr0, get_cr0, set_cr3, get_cr3, set_cr4, get_cr4; 213221828Sgrehanstatic int set_efer, get_efer; 214221828Sgrehanstatic int set_dr7, get_dr7; 215221828Sgrehanstatic int set_rsp, get_rsp, set_rip, get_rip, set_rflags, get_rflags; 216221828Sgrehanstatic int set_rax, get_rax; 217221828Sgrehanstatic int get_rbx, get_rcx, get_rdx, get_rsi, get_rdi, get_rbp; 218221828Sgrehanstatic int get_r8, get_r9, get_r10, get_r11, get_r12, get_r13, get_r14, get_r15; 219221828Sgrehanstatic int set_desc_ds, get_desc_ds; 220221828Sgrehanstatic int set_desc_es, get_desc_es; 221221828Sgrehanstatic int set_desc_fs, get_desc_fs; 222221828Sgrehanstatic int set_desc_gs, get_desc_gs; 223221828Sgrehanstatic int set_desc_cs, get_desc_cs; 224221828Sgrehanstatic int set_desc_ss, get_desc_ss; 225221828Sgrehanstatic int set_desc_gdtr, get_desc_gdtr; 226221828Sgrehanstatic int set_desc_idtr, get_desc_idtr; 227221828Sgrehanstatic int set_desc_tr, get_desc_tr; 228221828Sgrehanstatic int set_desc_ldtr, get_desc_ldtr; 229221828Sgrehanstatic int set_cs, set_ds, set_es, set_fs, set_gs, set_ss, set_tr, set_ldtr; 230221828Sgrehanstatic int get_cs, get_ds, get_es, get_fs, get_gs, get_ss, get_tr, get_ldtr; 231240922Sneelstatic int set_x2apic_state, get_x2apic_state; 232240922Sneelenum x2apic_state x2apic_state; 233246800Sneelstatic int unassign_pptdev, bus, slot, func; 234221828Sgrehanstatic int run; 235221828Sgrehan 236221828Sgrehan/* 237221828Sgrehan * VMCS-specific fields 238221828Sgrehan */ 239221828Sgrehanstatic int get_pinbased_ctls, get_procbased_ctls, get_procbased_ctls2; 240221828Sgrehanstatic int get_eptp, get_io_bitmap, get_tsc_offset; 241221828Sgrehanstatic int get_vmcs_entry_interruption_info, set_vmcs_entry_interruption_info; 242221828Sgrehanstatic int get_vmcs_interruptibility; 243221828Sgrehanuint32_t vmcs_entry_interruption_info; 244221828Sgrehanstatic int get_vmcs_gpa, get_vmcs_gla; 245221828Sgrehanstatic int get_exception_bitmap, set_exception_bitmap, exception_bitmap; 246221828Sgrehanstatic int get_cr0_mask, get_cr0_shadow; 247221828Sgrehanstatic int get_cr4_mask, get_cr4_shadow; 248221828Sgrehanstatic int get_cr3_targets; 249221828Sgrehanstatic int get_apic_access_addr, get_virtual_apic_addr, get_tpr_threshold; 250221828Sgrehanstatic int get_msr_bitmap, get_msr_bitmap_address; 251221828Sgrehanstatic int get_vpid, get_ple_gap, get_ple_window; 252221828Sgrehanstatic int get_inst_err, get_exit_ctls, get_entry_ctls; 253221828Sgrehanstatic int get_host_cr0, get_host_cr3, get_host_cr4; 254221828Sgrehanstatic int get_host_rip, get_host_rsp; 255221828Sgrehanstatic int get_guest_pat, get_host_pat; 256221828Sgrehanstatic int get_guest_sysenter, get_vmcs_link; 257221828Sgrehanstatic int get_vmcs_exit_reason, get_vmcs_exit_qualification; 258221828Sgrehanstatic int get_vmcs_exit_interruption_info, get_vmcs_exit_interruption_error; 259221828Sgrehan 260221828Sgrehanstatic uint64_t desc_base; 261221828Sgrehanstatic uint32_t desc_limit, desc_access; 262221828Sgrehan 263238386Sgrehanstatic int get_all; 264238386Sgrehan 265221828Sgrehanstatic void 266221828Sgrehandump_vm_run_exitcode(struct vm_exit *vmexit, int vcpu) 267221828Sgrehan{ 268221828Sgrehan printf("vm exit[%d]\n", vcpu); 269221828Sgrehan printf("\trip\t\t0x%016lx\n", vmexit->rip); 270221828Sgrehan printf("\tinst_length\t%d\n", vmexit->inst_length); 271221828Sgrehan switch (vmexit->exitcode) { 272221828Sgrehan case VM_EXITCODE_INOUT: 273221828Sgrehan printf("\treason\t\tINOUT\n"); 274221828Sgrehan printf("\tdirection\t%s\n", vmexit->u.inout.in ? "IN" : "OUT"); 275221828Sgrehan printf("\tbytes\t\t%d\n", vmexit->u.inout.bytes); 276221828Sgrehan printf("\tflags\t\t%s%s\n", 277221828Sgrehan vmexit->u.inout.string ? "STRING " : "", 278221828Sgrehan vmexit->u.inout.rep ? "REP " : ""); 279221828Sgrehan printf("\tport\t\t0x%04x\n", vmexit->u.inout.port); 280221828Sgrehan printf("\teax\t\t0x%08x\n", vmexit->u.inout.eax); 281221828Sgrehan break; 282221828Sgrehan case VM_EXITCODE_VMX: 283221828Sgrehan printf("\treason\t\tVMX\n"); 284264619Sjhb printf("\tstatus\t\t%d\n", vmexit->u.vmx.status); 285221828Sgrehan printf("\texit_reason\t0x%08x (%u)\n", 286221828Sgrehan vmexit->u.vmx.exit_reason, vmexit->u.vmx.exit_reason); 287221828Sgrehan printf("\tqualification\t0x%016lx\n", 288221828Sgrehan vmexit->u.vmx.exit_qualification); 289264619Sjhb printf("\tinst_type\t\t%d\n", vmexit->u.vmx.inst_type); 290264619Sjhb printf("\tinst_error\t\t%d\n", vmexit->u.vmx.inst_error); 291221828Sgrehan break; 292221828Sgrehan default: 293221828Sgrehan printf("*** unknown vm run exitcode %d\n", vmexit->exitcode); 294221828Sgrehan break; 295221828Sgrehan } 296221828Sgrehan} 297221828Sgrehan 298221828Sgrehanstatic int 299221828Sgrehandump_vmcs_msr_bitmap(int vcpu, u_long addr) 300221828Sgrehan{ 301221828Sgrehan int error, fd, byte, bit, readable, writeable; 302221828Sgrehan u_int msr; 303221828Sgrehan const char *bitmap; 304221828Sgrehan 305221828Sgrehan error = -1; 306221828Sgrehan bitmap = MAP_FAILED; 307221828Sgrehan 308221828Sgrehan fd = open("/dev/mem", O_RDONLY, 0); 309221828Sgrehan if (fd < 0) 310221828Sgrehan goto done; 311221828Sgrehan 312221828Sgrehan bitmap = mmap(NULL, PAGE_SIZE, PROT_READ, 0, fd, addr); 313221828Sgrehan if (bitmap == MAP_FAILED) 314221828Sgrehan goto done; 315221828Sgrehan 316221828Sgrehan for (msr = 0; msr < 0x2000; msr++) { 317221828Sgrehan byte = msr / 8; 318221828Sgrehan bit = msr & 0x7; 319221828Sgrehan 320221828Sgrehan /* Look at MSRs in the range 0x00000000 to 0x00001FFF */ 321221828Sgrehan readable = (bitmap[byte] & (1 << bit)) ? 0 : 1; 322221828Sgrehan writeable = (bitmap[2048 + byte] & (1 << bit)) ? 0 : 1; 323221828Sgrehan if (readable || writeable) { 324221828Sgrehan printf("msr 0x%08x[%d]\t\t%c%c\n", msr, vcpu, 325221828Sgrehan readable ? 'R' : '-', 326221828Sgrehan writeable ? 'W' : '-'); 327221828Sgrehan } 328221828Sgrehan 329221828Sgrehan /* Look at MSRs in the range 0xC0000000 to 0xC0001FFF */ 330221828Sgrehan byte += 1024; 331221828Sgrehan readable = (bitmap[byte] & (1 << bit)) ? 0 : 1; 332221828Sgrehan writeable = (bitmap[2048 + byte] & (1 << bit)) ? 0 : 1; 333221828Sgrehan if (readable || writeable) { 334221828Sgrehan printf("msr 0x%08x[%d]\t\t%c%c\n", 335221828Sgrehan 0xc0000000 + msr, vcpu, 336221828Sgrehan readable ? 'R' : '-', 337221828Sgrehan writeable ? 'W' : '-'); 338221828Sgrehan } 339221828Sgrehan } 340221828Sgrehan 341221828Sgrehan error = 0; 342221828Sgrehandone: 343221828Sgrehan if (bitmap != MAP_FAILED) 344221828Sgrehan munmap((void *)bitmap, PAGE_SIZE); 345221828Sgrehan if (fd >= 0) 346221828Sgrehan close(fd); 347221828Sgrehan return (error); 348221828Sgrehan} 349221828Sgrehan 350221828Sgrehanstatic int 351221828Sgrehanvm_get_vmcs_field(struct vmctx *ctx, int vcpu, int field, uint64_t *ret_val) 352221828Sgrehan{ 353221828Sgrehan 354221828Sgrehan return (vm_get_register(ctx, vcpu, VMCS_IDENT(field), ret_val)); 355221828Sgrehan} 356221828Sgrehan 357221828Sgrehanstatic int 358221828Sgrehanvm_set_vmcs_field(struct vmctx *ctx, int vcpu, int field, uint64_t val) 359221828Sgrehan{ 360221828Sgrehan 361221828Sgrehan return (vm_set_register(ctx, vcpu, VMCS_IDENT(field), val)); 362221828Sgrehan} 363221828Sgrehan 364221828Sgrehanenum { 365221828Sgrehan VMNAME = 1000, /* avoid collision with return values from getopt */ 366221828Sgrehan VCPU, 367248477Sneel SET_MEM, 368221828Sgrehan SET_EFER, 369221828Sgrehan SET_CR0, 370221828Sgrehan SET_CR3, 371221828Sgrehan SET_CR4, 372221828Sgrehan SET_DR7, 373221828Sgrehan SET_RSP, 374221828Sgrehan SET_RIP, 375221828Sgrehan SET_RAX, 376221828Sgrehan SET_RFLAGS, 377221828Sgrehan DESC_BASE, 378221828Sgrehan DESC_LIMIT, 379221828Sgrehan DESC_ACCESS, 380221828Sgrehan SET_CS, 381221828Sgrehan SET_DS, 382221828Sgrehan SET_ES, 383221828Sgrehan SET_FS, 384221828Sgrehan SET_GS, 385221828Sgrehan SET_SS, 386221828Sgrehan SET_TR, 387221828Sgrehan SET_LDTR, 388240922Sneel SET_X2APIC_STATE, 389221828Sgrehan SET_VMCS_EXCEPTION_BITMAP, 390221828Sgrehan SET_VMCS_ENTRY_INTERRUPTION_INFO, 391221828Sgrehan SET_CAP, 392221828Sgrehan CAPNAME, 393246800Sneel UNASSIGN_PPTDEV, 394256072Sneel GET_GPA_PMAP, 395262350Sjhb ASSERT_LAPIC_LVT, 396221828Sgrehan}; 397221828Sgrehan 398270070Sgrehanstatic void 399270070Sgrehanprint_cpus(const char *banner, const cpuset_t *cpus) 400270070Sgrehan{ 401270070Sgrehan int i, first; 402270070Sgrehan 403270070Sgrehan first = 1; 404270070Sgrehan printf("%s:\t", banner); 405270070Sgrehan if (!CPU_EMPTY(cpus)) { 406270070Sgrehan for (i = 0; i < CPU_SETSIZE; i++) { 407270070Sgrehan if (CPU_ISSET(i, cpus)) { 408270070Sgrehan printf("%s%d", first ? " " : ", ", i); 409270070Sgrehan first = 0; 410270070Sgrehan } 411270070Sgrehan } 412270070Sgrehan } else 413270070Sgrehan printf(" (none)"); 414270070Sgrehan printf("\n"); 415270070Sgrehan} 416270070Sgrehan 417270159Sgrehanstatic void 418270159Sgrehanprint_intinfo(const char *banner, uint64_t info) 419270159Sgrehan{ 420270159Sgrehan int type; 421270159Sgrehan 422270159Sgrehan printf("%s:\t", banner); 423270159Sgrehan if (info & VM_INTINFO_VALID) { 424270159Sgrehan type = info & VM_INTINFO_TYPE; 425270159Sgrehan switch (type) { 426270159Sgrehan case VM_INTINFO_HWINTR: 427270159Sgrehan printf("extint"); 428270159Sgrehan break; 429270159Sgrehan case VM_INTINFO_NMI: 430270159Sgrehan printf("nmi"); 431270159Sgrehan break; 432270159Sgrehan case VM_INTINFO_SWINTR: 433270159Sgrehan printf("swint"); 434270159Sgrehan break; 435270159Sgrehan default: 436270159Sgrehan printf("exception"); 437270159Sgrehan break; 438270159Sgrehan } 439270159Sgrehan printf(" vector %d", (int)VM_INTINFO_VECTOR(info)); 440270159Sgrehan if (info & VM_INTINFO_DEL_ERRCODE) 441270159Sgrehan printf(" errcode %#x", (u_int)(info >> 32)); 442270159Sgrehan } else { 443270159Sgrehan printf("n/a"); 444270159Sgrehan } 445270159Sgrehan printf("\n"); 446270159Sgrehan} 447270159Sgrehan 448221828Sgrehanint 449221828Sgrehanmain(int argc, char *argv[]) 450221828Sgrehan{ 451221828Sgrehan char *vmname; 452256072Sneel int error, ch, vcpu, ptenum; 453256072Sneel vm_paddr_t gpa, gpa_pmap; 454221828Sgrehan size_t len; 455221828Sgrehan struct vm_exit vmexit; 456270159Sgrehan uint64_t ctl, eptp, bm, addr, u64, pteval[4], *pte, info[2]; 457221828Sgrehan struct vmctx *ctx; 458256072Sneel int wired; 459270070Sgrehan cpuset_t cpus; 460221828Sgrehan 461221828Sgrehan uint64_t cr0, cr3, cr4, dr7, rsp, rip, rflags, efer, pat; 462221828Sgrehan uint64_t rax, rbx, rcx, rdx, rsi, rdi, rbp; 463221828Sgrehan uint64_t r8, r9, r10, r11, r12, r13, r14, r15; 464221828Sgrehan uint64_t cs, ds, es, fs, gs, ss, tr, ldtr; 465221828Sgrehan 466221828Sgrehan struct option opts[] = { 467221828Sgrehan { "vm", REQ_ARG, 0, VMNAME }, 468221828Sgrehan { "cpu", REQ_ARG, 0, VCPU }, 469248477Sneel { "set-mem", REQ_ARG, 0, SET_MEM }, 470221828Sgrehan { "set-efer", REQ_ARG, 0, SET_EFER }, 471221828Sgrehan { "set-cr0", REQ_ARG, 0, SET_CR0 }, 472221828Sgrehan { "set-cr3", REQ_ARG, 0, SET_CR3 }, 473221828Sgrehan { "set-cr4", REQ_ARG, 0, SET_CR4 }, 474221828Sgrehan { "set-dr7", REQ_ARG, 0, SET_DR7 }, 475221828Sgrehan { "set-rsp", REQ_ARG, 0, SET_RSP }, 476221828Sgrehan { "set-rip", REQ_ARG, 0, SET_RIP }, 477221828Sgrehan { "set-rax", REQ_ARG, 0, SET_RAX }, 478221828Sgrehan { "set-rflags", REQ_ARG, 0, SET_RFLAGS }, 479221828Sgrehan { "desc-base", REQ_ARG, 0, DESC_BASE }, 480221828Sgrehan { "desc-limit", REQ_ARG, 0, DESC_LIMIT }, 481221828Sgrehan { "desc-access",REQ_ARG, 0, DESC_ACCESS }, 482221828Sgrehan { "set-cs", REQ_ARG, 0, SET_CS }, 483221828Sgrehan { "set-ds", REQ_ARG, 0, SET_DS }, 484221828Sgrehan { "set-es", REQ_ARG, 0, SET_ES }, 485221828Sgrehan { "set-fs", REQ_ARG, 0, SET_FS }, 486221828Sgrehan { "set-gs", REQ_ARG, 0, SET_GS }, 487221828Sgrehan { "set-ss", REQ_ARG, 0, SET_SS }, 488221828Sgrehan { "set-tr", REQ_ARG, 0, SET_TR }, 489221828Sgrehan { "set-ldtr", REQ_ARG, 0, SET_LDTR }, 490240922Sneel { "set-x2apic-state",REQ_ARG, 0, SET_X2APIC_STATE }, 491221828Sgrehan { "set-vmcs-exception-bitmap", 492221828Sgrehan REQ_ARG, 0, SET_VMCS_EXCEPTION_BITMAP }, 493221828Sgrehan { "set-vmcs-entry-interruption-info", 494221828Sgrehan REQ_ARG, 0, SET_VMCS_ENTRY_INTERRUPTION_INFO }, 495221828Sgrehan { "capname", REQ_ARG, 0, CAPNAME }, 496246800Sneel { "unassign-pptdev", REQ_ARG, 0, UNASSIGN_PPTDEV }, 497221828Sgrehan { "setcap", REQ_ARG, 0, SET_CAP }, 498256072Sneel { "get-gpa-pmap", REQ_ARG, 0, GET_GPA_PMAP }, 499262350Sjhb { "assert-lapic-lvt", REQ_ARG, 0, ASSERT_LAPIC_LVT }, 500221828Sgrehan { "getcap", NO_ARG, &getcap, 1 }, 501221828Sgrehan { "get-stats", NO_ARG, &get_stats, 1 }, 502221828Sgrehan { "get-desc-ds",NO_ARG, &get_desc_ds, 1 }, 503221828Sgrehan { "set-desc-ds",NO_ARG, &set_desc_ds, 1 }, 504221828Sgrehan { "get-desc-es",NO_ARG, &get_desc_es, 1 }, 505221828Sgrehan { "set-desc-es",NO_ARG, &set_desc_es, 1 }, 506221828Sgrehan { "get-desc-ss",NO_ARG, &get_desc_ss, 1 }, 507221828Sgrehan { "set-desc-ss",NO_ARG, &set_desc_ss, 1 }, 508221828Sgrehan { "get-desc-cs",NO_ARG, &get_desc_cs, 1 }, 509221828Sgrehan { "set-desc-cs",NO_ARG, &set_desc_cs, 1 }, 510221828Sgrehan { "get-desc-fs",NO_ARG, &get_desc_fs, 1 }, 511221828Sgrehan { "set-desc-fs",NO_ARG, &set_desc_fs, 1 }, 512221828Sgrehan { "get-desc-gs",NO_ARG, &get_desc_gs, 1 }, 513221828Sgrehan { "set-desc-gs",NO_ARG, &set_desc_gs, 1 }, 514221828Sgrehan { "get-desc-tr",NO_ARG, &get_desc_tr, 1 }, 515221828Sgrehan { "set-desc-tr",NO_ARG, &set_desc_tr, 1 }, 516221828Sgrehan { "set-desc-ldtr", NO_ARG, &set_desc_ldtr, 1 }, 517221828Sgrehan { "get-desc-ldtr", NO_ARG, &get_desc_ldtr, 1 }, 518221828Sgrehan { "set-desc-gdtr", NO_ARG, &set_desc_gdtr, 1 }, 519221828Sgrehan { "get-desc-gdtr", NO_ARG, &get_desc_gdtr, 1 }, 520221828Sgrehan { "set-desc-idtr", NO_ARG, &set_desc_idtr, 1 }, 521221828Sgrehan { "get-desc-idtr", NO_ARG, &get_desc_idtr, 1 }, 522221828Sgrehan { "get-lowmem", NO_ARG, &get_lowmem, 1 }, 523221828Sgrehan { "get-highmem",NO_ARG, &get_highmem, 1 }, 524221828Sgrehan { "get-efer", NO_ARG, &get_efer, 1 }, 525221828Sgrehan { "get-cr0", NO_ARG, &get_cr0, 1 }, 526221828Sgrehan { "get-cr3", NO_ARG, &get_cr3, 1 }, 527221828Sgrehan { "get-cr4", NO_ARG, &get_cr4, 1 }, 528221828Sgrehan { "get-dr7", NO_ARG, &get_dr7, 1 }, 529221828Sgrehan { "get-rsp", NO_ARG, &get_rsp, 1 }, 530221828Sgrehan { "get-rip", NO_ARG, &get_rip, 1 }, 531221828Sgrehan { "get-rax", NO_ARG, &get_rax, 1 }, 532221828Sgrehan { "get-rbx", NO_ARG, &get_rbx, 1 }, 533221828Sgrehan { "get-rcx", NO_ARG, &get_rcx, 1 }, 534221828Sgrehan { "get-rdx", NO_ARG, &get_rdx, 1 }, 535221828Sgrehan { "get-rsi", NO_ARG, &get_rsi, 1 }, 536221828Sgrehan { "get-rdi", NO_ARG, &get_rdi, 1 }, 537221828Sgrehan { "get-rbp", NO_ARG, &get_rbp, 1 }, 538221828Sgrehan { "get-r8", NO_ARG, &get_r8, 1 }, 539221828Sgrehan { "get-r9", NO_ARG, &get_r9, 1 }, 540221828Sgrehan { "get-r10", NO_ARG, &get_r10, 1 }, 541221828Sgrehan { "get-r11", NO_ARG, &get_r11, 1 }, 542221828Sgrehan { "get-r12", NO_ARG, &get_r12, 1 }, 543221828Sgrehan { "get-r13", NO_ARG, &get_r13, 1 }, 544221828Sgrehan { "get-r14", NO_ARG, &get_r14, 1 }, 545221828Sgrehan { "get-r15", NO_ARG, &get_r15, 1 }, 546221828Sgrehan { "get-rflags", NO_ARG, &get_rflags, 1 }, 547221828Sgrehan { "get-cs", NO_ARG, &get_cs, 1 }, 548221828Sgrehan { "get-ds", NO_ARG, &get_ds, 1 }, 549221828Sgrehan { "get-es", NO_ARG, &get_es, 1 }, 550221828Sgrehan { "get-fs", NO_ARG, &get_fs, 1 }, 551221828Sgrehan { "get-gs", NO_ARG, &get_gs, 1 }, 552221828Sgrehan { "get-ss", NO_ARG, &get_ss, 1 }, 553221828Sgrehan { "get-tr", NO_ARG, &get_tr, 1 }, 554221828Sgrehan { "get-ldtr", NO_ARG, &get_ldtr, 1 }, 555221828Sgrehan { "get-vmcs-pinbased-ctls", 556221828Sgrehan NO_ARG, &get_pinbased_ctls, 1 }, 557221828Sgrehan { "get-vmcs-procbased-ctls", 558221828Sgrehan NO_ARG, &get_procbased_ctls, 1 }, 559221828Sgrehan { "get-vmcs-procbased-ctls2", 560221828Sgrehan NO_ARG, &get_procbased_ctls2, 1 }, 561221828Sgrehan { "get-vmcs-guest-linear-address", 562221828Sgrehan NO_ARG, &get_vmcs_gla, 1 }, 563221828Sgrehan { "get-vmcs-guest-physical-address", 564221828Sgrehan NO_ARG, &get_vmcs_gpa, 1 }, 565221828Sgrehan { "get-vmcs-entry-interruption-info", 566221828Sgrehan NO_ARG, &get_vmcs_entry_interruption_info, 1}, 567221828Sgrehan { "get-vmcs-eptp", NO_ARG, &get_eptp, 1 }, 568221828Sgrehan { "get-vmcs-exception-bitmap", 569221828Sgrehan NO_ARG, &get_exception_bitmap, 1 }, 570221828Sgrehan { "get-vmcs-io-bitmap-address", 571221828Sgrehan NO_ARG, &get_io_bitmap, 1 }, 572221828Sgrehan { "get-vmcs-tsc-offset", NO_ARG,&get_tsc_offset, 1 }, 573221828Sgrehan { "get-vmcs-cr0-mask", NO_ARG, &get_cr0_mask, 1 }, 574221828Sgrehan { "get-vmcs-cr0-shadow", NO_ARG,&get_cr0_shadow, 1 }, 575221828Sgrehan { "get-vmcs-cr4-mask", NO_ARG, &get_cr4_mask, 1 }, 576221828Sgrehan { "get-vmcs-cr4-shadow", NO_ARG,&get_cr4_shadow, 1 }, 577221828Sgrehan { "get-vmcs-cr3-targets", NO_ARG, &get_cr3_targets, 1}, 578221828Sgrehan { "get-vmcs-apic-access-address", 579221828Sgrehan NO_ARG, &get_apic_access_addr, 1}, 580221828Sgrehan { "get-vmcs-virtual-apic-address", 581221828Sgrehan NO_ARG, &get_virtual_apic_addr, 1}, 582221828Sgrehan { "get-vmcs-tpr-threshold", 583221828Sgrehan NO_ARG, &get_tpr_threshold, 1 }, 584221828Sgrehan { "get-vmcs-msr-bitmap", 585221828Sgrehan NO_ARG, &get_msr_bitmap, 1 }, 586221828Sgrehan { "get-vmcs-msr-bitmap-address", 587221828Sgrehan NO_ARG, &get_msr_bitmap_address, 1 }, 588221828Sgrehan { "get-vmcs-vpid", NO_ARG, &get_vpid, 1 }, 589221828Sgrehan { "get-vmcs-ple-gap", NO_ARG, &get_ple_gap, 1 }, 590221828Sgrehan { "get-vmcs-ple-window", NO_ARG,&get_ple_window,1 }, 591221828Sgrehan { "get-vmcs-instruction-error", 592221828Sgrehan NO_ARG, &get_inst_err, 1 }, 593221828Sgrehan { "get-vmcs-exit-ctls", NO_ARG, &get_exit_ctls, 1 }, 594221828Sgrehan { "get-vmcs-entry-ctls", 595221828Sgrehan NO_ARG, &get_entry_ctls, 1 }, 596221828Sgrehan { "get-vmcs-guest-pat", NO_ARG, &get_guest_pat, 1 }, 597221828Sgrehan { "get-vmcs-host-pat", NO_ARG, &get_host_pat, 1 }, 598221828Sgrehan { "get-vmcs-host-cr0", 599221828Sgrehan NO_ARG, &get_host_cr0, 1 }, 600221828Sgrehan { "get-vmcs-host-cr3", 601221828Sgrehan NO_ARG, &get_host_cr3, 1 }, 602221828Sgrehan { "get-vmcs-host-cr4", 603221828Sgrehan NO_ARG, &get_host_cr4, 1 }, 604221828Sgrehan { "get-vmcs-host-rip", 605221828Sgrehan NO_ARG, &get_host_rip, 1 }, 606221828Sgrehan { "get-vmcs-host-rsp", 607221828Sgrehan NO_ARG, &get_host_rsp, 1 }, 608221828Sgrehan { "get-vmcs-guest-sysenter", 609221828Sgrehan NO_ARG, &get_guest_sysenter, 1 }, 610221828Sgrehan { "get-vmcs-link", NO_ARG, &get_vmcs_link, 1 }, 611221828Sgrehan { "get-vmcs-exit-reason", 612221828Sgrehan NO_ARG, &get_vmcs_exit_reason, 1 }, 613221828Sgrehan { "get-vmcs-exit-qualification", 614221828Sgrehan NO_ARG, &get_vmcs_exit_qualification, 1 }, 615221828Sgrehan { "get-vmcs-exit-interruption-info", 616221828Sgrehan NO_ARG, &get_vmcs_exit_interruption_info, 1}, 617221828Sgrehan { "get-vmcs-exit-interruption-error", 618221828Sgrehan NO_ARG, &get_vmcs_exit_interruption_error, 1}, 619221828Sgrehan { "get-vmcs-interruptibility", 620221828Sgrehan NO_ARG, &get_vmcs_interruptibility, 1 }, 621240922Sneel { "get-x2apic-state",NO_ARG, &get_x2apic_state, 1 }, 622238386Sgrehan { "get-all", NO_ARG, &get_all, 1 }, 623221828Sgrehan { "run", NO_ARG, &run, 1 }, 624221828Sgrehan { "create", NO_ARG, &create, 1 }, 625221828Sgrehan { "destroy", NO_ARG, &destroy, 1 }, 626262350Sjhb { "inject-nmi", NO_ARG, &inject_nmi, 1 }, 627268935Sjhb { "force-reset", NO_ARG, &force_reset, 1 }, 628268935Sjhb { "force-poweroff", NO_ARG, &force_poweroff, 1 }, 629270070Sgrehan { "get-active-cpus", NO_ARG, &get_active_cpus, 1 }, 630270070Sgrehan { "get-suspended-cpus", NO_ARG, &get_suspended_cpus, 1 }, 631270159Sgrehan { "get-intinfo", NO_ARG, &get_intinfo, 1 }, 632221828Sgrehan { NULL, 0, NULL, 0 } 633221828Sgrehan }; 634221828Sgrehan 635221828Sgrehan vcpu = 0; 636268951Sjhb vmname = NULL; 637262350Sjhb assert_lapic_lvt = -1; 638221828Sgrehan progname = basename(argv[0]); 639221828Sgrehan 640221828Sgrehan while ((ch = getopt_long(argc, argv, "", opts, NULL)) != -1) { 641221828Sgrehan switch (ch) { 642221828Sgrehan case 0: 643221828Sgrehan break; 644221828Sgrehan case VMNAME: 645221828Sgrehan vmname = optarg; 646221828Sgrehan break; 647221828Sgrehan case VCPU: 648221828Sgrehan vcpu = atoi(optarg); 649221828Sgrehan break; 650248477Sneel case SET_MEM: 651248477Sneel memsize = atoi(optarg) * MB; 652248477Sneel memsize = roundup(memsize, 2 * MB); 653221828Sgrehan break; 654221828Sgrehan case SET_EFER: 655221828Sgrehan efer = strtoul(optarg, NULL, 0); 656221828Sgrehan set_efer = 1; 657221828Sgrehan break; 658221828Sgrehan case SET_CR0: 659221828Sgrehan cr0 = strtoul(optarg, NULL, 0); 660221828Sgrehan set_cr0 = 1; 661221828Sgrehan break; 662221828Sgrehan case SET_CR3: 663221828Sgrehan cr3 = strtoul(optarg, NULL, 0); 664221828Sgrehan set_cr3 = 1; 665221828Sgrehan break; 666221828Sgrehan case SET_CR4: 667221828Sgrehan cr4 = strtoul(optarg, NULL, 0); 668221828Sgrehan set_cr4 = 1; 669221828Sgrehan break; 670221828Sgrehan case SET_DR7: 671221828Sgrehan dr7 = strtoul(optarg, NULL, 0); 672221828Sgrehan set_dr7 = 1; 673221828Sgrehan break; 674221828Sgrehan case SET_RSP: 675221828Sgrehan rsp = strtoul(optarg, NULL, 0); 676221828Sgrehan set_rsp = 1; 677221828Sgrehan break; 678221828Sgrehan case SET_RIP: 679221828Sgrehan rip = strtoul(optarg, NULL, 0); 680221828Sgrehan set_rip = 1; 681221828Sgrehan break; 682221828Sgrehan case SET_RAX: 683221828Sgrehan rax = strtoul(optarg, NULL, 0); 684221828Sgrehan set_rax = 1; 685221828Sgrehan break; 686221828Sgrehan case SET_RFLAGS: 687221828Sgrehan rflags = strtoul(optarg, NULL, 0); 688221828Sgrehan set_rflags = 1; 689221828Sgrehan break; 690221828Sgrehan case DESC_BASE: 691221828Sgrehan desc_base = strtoul(optarg, NULL, 0); 692221828Sgrehan break; 693221828Sgrehan case DESC_LIMIT: 694221828Sgrehan desc_limit = strtoul(optarg, NULL, 0); 695221828Sgrehan break; 696221828Sgrehan case DESC_ACCESS: 697221828Sgrehan desc_access = strtoul(optarg, NULL, 0); 698221828Sgrehan break; 699221828Sgrehan case SET_CS: 700221828Sgrehan cs = strtoul(optarg, NULL, 0); 701221828Sgrehan set_cs = 1; 702221828Sgrehan break; 703221828Sgrehan case SET_DS: 704221828Sgrehan ds = strtoul(optarg, NULL, 0); 705221828Sgrehan set_ds = 1; 706221828Sgrehan break; 707221828Sgrehan case SET_ES: 708221828Sgrehan es = strtoul(optarg, NULL, 0); 709221828Sgrehan set_es = 1; 710221828Sgrehan break; 711221828Sgrehan case SET_FS: 712221828Sgrehan fs = strtoul(optarg, NULL, 0); 713221828Sgrehan set_fs = 1; 714221828Sgrehan break; 715221828Sgrehan case SET_GS: 716221828Sgrehan gs = strtoul(optarg, NULL, 0); 717221828Sgrehan set_gs = 1; 718221828Sgrehan break; 719221828Sgrehan case SET_SS: 720221828Sgrehan ss = strtoul(optarg, NULL, 0); 721221828Sgrehan set_ss = 1; 722221828Sgrehan break; 723221828Sgrehan case SET_TR: 724221828Sgrehan tr = strtoul(optarg, NULL, 0); 725221828Sgrehan set_tr = 1; 726221828Sgrehan break; 727221828Sgrehan case SET_LDTR: 728221828Sgrehan ldtr = strtoul(optarg, NULL, 0); 729221828Sgrehan set_ldtr = 1; 730221828Sgrehan break; 731240922Sneel case SET_X2APIC_STATE: 732240922Sneel x2apic_state = strtol(optarg, NULL, 0); 733240922Sneel set_x2apic_state = 1; 734240922Sneel break; 735221828Sgrehan case SET_VMCS_EXCEPTION_BITMAP: 736221828Sgrehan exception_bitmap = strtoul(optarg, NULL, 0); 737221828Sgrehan set_exception_bitmap = 1; 738221828Sgrehan break; 739221828Sgrehan case SET_VMCS_ENTRY_INTERRUPTION_INFO: 740221828Sgrehan vmcs_entry_interruption_info = strtoul(optarg, NULL, 0); 741221828Sgrehan set_vmcs_entry_interruption_info = 1; 742221828Sgrehan break; 743221828Sgrehan case SET_CAP: 744221828Sgrehan capval = strtoul(optarg, NULL, 0); 745221828Sgrehan setcap = 1; 746221828Sgrehan break; 747256072Sneel case GET_GPA_PMAP: 748256072Sneel gpa_pmap = strtoul(optarg, NULL, 0); 749256072Sneel get_gpa_pmap = 1; 750256072Sneel break; 751221828Sgrehan case CAPNAME: 752221828Sgrehan capname = optarg; 753221828Sgrehan break; 754246800Sneel case UNASSIGN_PPTDEV: 755246800Sneel unassign_pptdev = 1; 756246800Sneel if (sscanf(optarg, "%d/%d/%d", &bus, &slot, &func) != 3) 757246800Sneel usage(); 758246800Sneel break; 759262350Sjhb case ASSERT_LAPIC_LVT: 760262350Sjhb assert_lapic_lvt = atoi(optarg); 761262350Sjhb break; 762221828Sgrehan default: 763221828Sgrehan usage(); 764221828Sgrehan } 765221828Sgrehan } 766221828Sgrehan argc -= optind; 767221828Sgrehan argv += optind; 768221828Sgrehan 769221828Sgrehan if (vmname == NULL) 770221828Sgrehan usage(); 771221828Sgrehan 772221828Sgrehan error = 0; 773221828Sgrehan 774221828Sgrehan if (!error && create) 775221828Sgrehan error = vm_create(vmname); 776221828Sgrehan 777221828Sgrehan if (!error) { 778221828Sgrehan ctx = vm_open(vmname); 779221828Sgrehan if (ctx == NULL) 780221828Sgrehan error = -1; 781221828Sgrehan } 782221828Sgrehan 783248477Sneel if (!error && memsize) 784248477Sneel error = vm_setup_memory(ctx, memsize, VM_MMAP_NONE); 785221828Sgrehan 786221828Sgrehan if (!error && set_efer) 787221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_EFER, efer); 788221828Sgrehan 789221828Sgrehan if (!error && set_cr0) 790221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR0, cr0); 791221828Sgrehan 792221828Sgrehan if (!error && set_cr3) 793221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR3, cr3); 794221828Sgrehan 795221828Sgrehan if (!error && set_cr4) 796221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR4, cr4); 797221828Sgrehan 798221828Sgrehan if (!error && set_dr7) 799221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR7, dr7); 800221828Sgrehan 801221828Sgrehan if (!error && set_rsp) 802221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSP, rsp); 803221828Sgrehan 804221828Sgrehan if (!error && set_rip) 805221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RIP, rip); 806221828Sgrehan 807221828Sgrehan if (!error && set_rax) 808221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RAX, rax); 809221828Sgrehan 810221828Sgrehan if (!error && set_rflags) { 811221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, 812221828Sgrehan rflags); 813221828Sgrehan } 814221828Sgrehan 815221828Sgrehan if (!error && set_desc_ds) { 816221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_DS, 817221828Sgrehan desc_base, desc_limit, desc_access); 818221828Sgrehan } 819221828Sgrehan 820221828Sgrehan if (!error && set_desc_es) { 821221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_ES, 822221828Sgrehan desc_base, desc_limit, desc_access); 823221828Sgrehan } 824221828Sgrehan 825221828Sgrehan if (!error && set_desc_ss) { 826221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_SS, 827221828Sgrehan desc_base, desc_limit, desc_access); 828221828Sgrehan } 829221828Sgrehan 830221828Sgrehan if (!error && set_desc_cs) { 831221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_CS, 832221828Sgrehan desc_base, desc_limit, desc_access); 833221828Sgrehan } 834221828Sgrehan 835221828Sgrehan if (!error && set_desc_fs) { 836221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_FS, 837221828Sgrehan desc_base, desc_limit, desc_access); 838221828Sgrehan } 839221828Sgrehan 840221828Sgrehan if (!error && set_desc_gs) { 841221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_GS, 842221828Sgrehan desc_base, desc_limit, desc_access); 843221828Sgrehan } 844221828Sgrehan 845221828Sgrehan if (!error && set_desc_tr) { 846221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_TR, 847221828Sgrehan desc_base, desc_limit, desc_access); 848221828Sgrehan } 849221828Sgrehan 850221828Sgrehan if (!error && set_desc_ldtr) { 851221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_LDTR, 852221828Sgrehan desc_base, desc_limit, desc_access); 853221828Sgrehan } 854221828Sgrehan 855221828Sgrehan if (!error && set_desc_gdtr) { 856221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_GDTR, 857221828Sgrehan desc_base, desc_limit, 0); 858221828Sgrehan } 859221828Sgrehan 860221828Sgrehan if (!error && set_desc_idtr) { 861221828Sgrehan error = vm_set_desc(ctx, vcpu, VM_REG_GUEST_IDTR, 862221828Sgrehan desc_base, desc_limit, 0); 863221828Sgrehan } 864221828Sgrehan 865221828Sgrehan if (!error && set_cs) 866221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CS, cs); 867221828Sgrehan 868221828Sgrehan if (!error && set_ds) 869221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DS, ds); 870221828Sgrehan 871221828Sgrehan if (!error && set_es) 872221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_ES, es); 873221828Sgrehan 874221828Sgrehan if (!error && set_fs) 875221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_FS, fs); 876221828Sgrehan 877221828Sgrehan if (!error && set_gs) 878221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_GS, gs); 879221828Sgrehan 880221828Sgrehan if (!error && set_ss) 881221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_SS, ss); 882221828Sgrehan 883221828Sgrehan if (!error && set_tr) 884221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_TR, tr); 885221828Sgrehan 886221828Sgrehan if (!error && set_ldtr) 887221828Sgrehan error = vm_set_register(ctx, vcpu, VM_REG_GUEST_LDTR, ldtr); 888221828Sgrehan 889240922Sneel if (!error && set_x2apic_state) 890240922Sneel error = vm_set_x2apic_state(ctx, vcpu, x2apic_state); 891240922Sneel 892246800Sneel if (!error && unassign_pptdev) 893246800Sneel error = vm_unassign_pptdev(ctx, bus, slot, func); 894246800Sneel 895221828Sgrehan if (!error && set_exception_bitmap) { 896221828Sgrehan error = vm_set_vmcs_field(ctx, vcpu, VMCS_EXCEPTION_BITMAP, 897221828Sgrehan exception_bitmap); 898221828Sgrehan } 899221828Sgrehan 900221828Sgrehan if (!error && set_vmcs_entry_interruption_info) { 901221828Sgrehan error = vm_set_vmcs_field(ctx, vcpu, VMCS_ENTRY_INTR_INFO, 902221828Sgrehan vmcs_entry_interruption_info); 903221828Sgrehan } 904221828Sgrehan 905262350Sjhb if (!error && inject_nmi) { 906262350Sjhb error = vm_inject_nmi(ctx, vcpu); 907262350Sjhb } 908262350Sjhb 909262350Sjhb if (!error && assert_lapic_lvt != -1) { 910262350Sjhb error = vm_lapic_local_irq(ctx, vcpu, assert_lapic_lvt); 911262350Sjhb } 912262350Sjhb 913238386Sgrehan if (!error && (get_lowmem || get_all)) { 914241179Sneel gpa = 0; 915256072Sneel error = vm_get_memory_seg(ctx, gpa, &len, &wired); 916221828Sgrehan if (error == 0) 917256072Sneel printf("lowmem\t\t0x%016lx/%ld%s\n", gpa, len, 918256072Sneel wired ? " wired" : ""); 919221828Sgrehan } 920221828Sgrehan 921238386Sgrehan if (!error && (get_highmem || get_all)) { 922241179Sneel gpa = 4 * GB; 923256072Sneel error = vm_get_memory_seg(ctx, gpa, &len, &wired); 924221828Sgrehan if (error == 0) 925256072Sneel printf("highmem\t\t0x%016lx/%ld%s\n", gpa, len, 926256072Sneel wired ? " wired" : ""); 927221828Sgrehan } 928221828Sgrehan 929238386Sgrehan if (!error && (get_efer || get_all)) { 930221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_EFER, &efer); 931221828Sgrehan if (error == 0) 932221828Sgrehan printf("efer[%d]\t\t0x%016lx\n", vcpu, efer); 933221828Sgrehan } 934221828Sgrehan 935238386Sgrehan if (!error && (get_cr0 || get_all)) { 936221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR0, &cr0); 937221828Sgrehan if (error == 0) 938221828Sgrehan printf("cr0[%d]\t\t0x%016lx\n", vcpu, cr0); 939221828Sgrehan } 940221828Sgrehan 941238386Sgrehan if (!error && (get_cr3 || get_all)) { 942221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR3, &cr3); 943221828Sgrehan if (error == 0) 944221828Sgrehan printf("cr3[%d]\t\t0x%016lx\n", vcpu, cr3); 945221828Sgrehan } 946221828Sgrehan 947238386Sgrehan if (!error && (get_cr4 || get_all)) { 948221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR4, &cr4); 949221828Sgrehan if (error == 0) 950221828Sgrehan printf("cr4[%d]\t\t0x%016lx\n", vcpu, cr4); 951221828Sgrehan } 952221828Sgrehan 953238386Sgrehan if (!error && (get_dr7 || get_all)) { 954221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR7, &dr7); 955221828Sgrehan if (error == 0) 956221828Sgrehan printf("dr7[%d]\t\t0x%016lx\n", vcpu, dr7); 957221828Sgrehan } 958221828Sgrehan 959238386Sgrehan if (!error && (get_rsp || get_all)) { 960221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSP, &rsp); 961221828Sgrehan if (error == 0) 962221828Sgrehan printf("rsp[%d]\t\t0x%016lx\n", vcpu, rsp); 963221828Sgrehan } 964221828Sgrehan 965238386Sgrehan if (!error && (get_rip || get_all)) { 966221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RIP, &rip); 967221828Sgrehan if (error == 0) 968221828Sgrehan printf("rip[%d]\t\t0x%016lx\n", vcpu, rip); 969221828Sgrehan } 970221828Sgrehan 971238386Sgrehan if (!error && (get_rax || get_all)) { 972221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RAX, &rax); 973221828Sgrehan if (error == 0) 974221828Sgrehan printf("rax[%d]\t\t0x%016lx\n", vcpu, rax); 975221828Sgrehan } 976221828Sgrehan 977238386Sgrehan if (!error && (get_rbx || get_all)) { 978221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RBX, &rbx); 979221828Sgrehan if (error == 0) 980221828Sgrehan printf("rbx[%d]\t\t0x%016lx\n", vcpu, rbx); 981221828Sgrehan } 982221828Sgrehan 983238386Sgrehan if (!error && (get_rcx || get_all)) { 984221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RCX, &rcx); 985221828Sgrehan if (error == 0) 986221828Sgrehan printf("rcx[%d]\t\t0x%016lx\n", vcpu, rcx); 987221828Sgrehan } 988221828Sgrehan 989238386Sgrehan if (!error && (get_rdx || get_all)) { 990221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RDX, &rdx); 991221828Sgrehan if (error == 0) 992221828Sgrehan printf("rdx[%d]\t\t0x%016lx\n", vcpu, rdx); 993221828Sgrehan } 994221828Sgrehan 995238386Sgrehan if (!error && (get_rsi || get_all)) { 996221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSI, &rsi); 997221828Sgrehan if (error == 0) 998221828Sgrehan printf("rsi[%d]\t\t0x%016lx\n", vcpu, rsi); 999221828Sgrehan } 1000221828Sgrehan 1001238386Sgrehan if (!error && (get_rdi || get_all)) { 1002221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RDI, &rdi); 1003221828Sgrehan if (error == 0) 1004221828Sgrehan printf("rdi[%d]\t\t0x%016lx\n", vcpu, rdi); 1005221828Sgrehan } 1006221828Sgrehan 1007238386Sgrehan if (!error && (get_rbp || get_all)) { 1008221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RBP, &rbp); 1009221828Sgrehan if (error == 0) 1010221828Sgrehan printf("rbp[%d]\t\t0x%016lx\n", vcpu, rbp); 1011221828Sgrehan } 1012221828Sgrehan 1013238386Sgrehan if (!error && (get_r8 || get_all)) { 1014221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R8, &r8); 1015221828Sgrehan if (error == 0) 1016221828Sgrehan printf("r8[%d]\t\t0x%016lx\n", vcpu, r8); 1017221828Sgrehan } 1018221828Sgrehan 1019238386Sgrehan if (!error && (get_r9 || get_all)) { 1020221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R9, &r9); 1021221828Sgrehan if (error == 0) 1022221828Sgrehan printf("r9[%d]\t\t0x%016lx\n", vcpu, r9); 1023221828Sgrehan } 1024221828Sgrehan 1025238386Sgrehan if (!error && (get_r10 || get_all)) { 1026221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R10, &r10); 1027221828Sgrehan if (error == 0) 1028221828Sgrehan printf("r10[%d]\t\t0x%016lx\n", vcpu, r10); 1029221828Sgrehan } 1030221828Sgrehan 1031238386Sgrehan if (!error && (get_r11 || get_all)) { 1032221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R11, &r11); 1033221828Sgrehan if (error == 0) 1034221828Sgrehan printf("r11[%d]\t\t0x%016lx\n", vcpu, r11); 1035221828Sgrehan } 1036221828Sgrehan 1037238386Sgrehan if (!error && (get_r12 || get_all)) { 1038221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R12, &r12); 1039221828Sgrehan if (error == 0) 1040221828Sgrehan printf("r12[%d]\t\t0x%016lx\n", vcpu, r12); 1041221828Sgrehan } 1042221828Sgrehan 1043238386Sgrehan if (!error && (get_r13 || get_all)) { 1044221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R13, &r13); 1045221828Sgrehan if (error == 0) 1046221828Sgrehan printf("r13[%d]\t\t0x%016lx\n", vcpu, r13); 1047221828Sgrehan } 1048221828Sgrehan 1049238386Sgrehan if (!error && (get_r14 || get_all)) { 1050221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R14, &r14); 1051221828Sgrehan if (error == 0) 1052221828Sgrehan printf("r14[%d]\t\t0x%016lx\n", vcpu, r14); 1053221828Sgrehan } 1054221828Sgrehan 1055238386Sgrehan if (!error && (get_r15 || get_all)) { 1056221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_R15, &r15); 1057221828Sgrehan if (error == 0) 1058221828Sgrehan printf("r15[%d]\t\t0x%016lx\n", vcpu, r15); 1059221828Sgrehan } 1060221828Sgrehan 1061238386Sgrehan if (!error && (get_rflags || get_all)) { 1062221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, 1063221828Sgrehan &rflags); 1064221828Sgrehan if (error == 0) 1065221828Sgrehan printf("rflags[%d]\t0x%016lx\n", vcpu, rflags); 1066221828Sgrehan } 1067221828Sgrehan 1068238386Sgrehan if (!error && (get_stats || get_all)) { 1069221828Sgrehan int i, num_stats; 1070221828Sgrehan uint64_t *stats; 1071221828Sgrehan struct timeval tv; 1072221828Sgrehan const char *desc; 1073221828Sgrehan 1074221828Sgrehan stats = vm_get_stats(ctx, vcpu, &tv, &num_stats); 1075221828Sgrehan if (stats != NULL) { 1076221828Sgrehan printf("vcpu%d\n", vcpu); 1077221828Sgrehan for (i = 0; i < num_stats; i++) { 1078221828Sgrehan desc = vm_get_stat_desc(ctx, i); 1079248935Sneel printf("%-40s\t%ld\n", desc, stats[i]); 1080221828Sgrehan } 1081221828Sgrehan } 1082221828Sgrehan } 1083221828Sgrehan 1084238386Sgrehan if (!error && (get_desc_ds || get_all)) { 1085221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_DS, 1086221828Sgrehan &desc_base, &desc_limit, &desc_access); 1087221828Sgrehan if (error == 0) { 1088221828Sgrehan printf("ds desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 1089221828Sgrehan vcpu, desc_base, desc_limit, desc_access); 1090221828Sgrehan } 1091221828Sgrehan } 1092221828Sgrehan 1093238386Sgrehan if (!error && (get_desc_es || get_all)) { 1094221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_ES, 1095221828Sgrehan &desc_base, &desc_limit, &desc_access); 1096221828Sgrehan if (error == 0) { 1097221828Sgrehan printf("es desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 1098221828Sgrehan vcpu, desc_base, desc_limit, desc_access); 1099221828Sgrehan } 1100221828Sgrehan } 1101221828Sgrehan 1102238386Sgrehan if (!error && (get_desc_fs || get_all)) { 1103221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_FS, 1104221828Sgrehan &desc_base, &desc_limit, &desc_access); 1105221828Sgrehan if (error == 0) { 1106221828Sgrehan printf("fs desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 1107221828Sgrehan vcpu, desc_base, desc_limit, desc_access); 1108221828Sgrehan } 1109221828Sgrehan } 1110221828Sgrehan 1111238386Sgrehan if (!error && (get_desc_gs || get_all)) { 1112221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_GS, 1113221828Sgrehan &desc_base, &desc_limit, &desc_access); 1114221828Sgrehan if (error == 0) { 1115221828Sgrehan printf("gs desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 1116221828Sgrehan vcpu, desc_base, desc_limit, desc_access); 1117221828Sgrehan } 1118221828Sgrehan } 1119221828Sgrehan 1120238386Sgrehan if (!error && (get_desc_ss || get_all)) { 1121221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_SS, 1122221828Sgrehan &desc_base, &desc_limit, &desc_access); 1123221828Sgrehan if (error == 0) { 1124221828Sgrehan printf("ss desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 1125221828Sgrehan vcpu, desc_base, desc_limit, desc_access); 1126221828Sgrehan } 1127221828Sgrehan } 1128221828Sgrehan 1129238386Sgrehan if (!error && (get_desc_cs || get_all)) { 1130221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_CS, 1131221828Sgrehan &desc_base, &desc_limit, &desc_access); 1132221828Sgrehan if (error == 0) { 1133221828Sgrehan printf("cs desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 1134221828Sgrehan vcpu, desc_base, desc_limit, desc_access); 1135221828Sgrehan } 1136221828Sgrehan } 1137221828Sgrehan 1138238386Sgrehan if (!error && (get_desc_tr || get_all)) { 1139221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_TR, 1140221828Sgrehan &desc_base, &desc_limit, &desc_access); 1141221828Sgrehan if (error == 0) { 1142221828Sgrehan printf("tr desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 1143221828Sgrehan vcpu, desc_base, desc_limit, desc_access); 1144221828Sgrehan } 1145221828Sgrehan } 1146221828Sgrehan 1147238386Sgrehan if (!error && (get_desc_ldtr || get_all)) { 1148221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_LDTR, 1149221828Sgrehan &desc_base, &desc_limit, &desc_access); 1150221828Sgrehan if (error == 0) { 1151221828Sgrehan printf("ldtr desc[%d]\t0x%016lx/0x%08x/0x%08x\n", 1152221828Sgrehan vcpu, desc_base, desc_limit, desc_access); 1153221828Sgrehan } 1154221828Sgrehan } 1155221828Sgrehan 1156238386Sgrehan if (!error && (get_desc_gdtr || get_all)) { 1157221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_GDTR, 1158221828Sgrehan &desc_base, &desc_limit, &desc_access); 1159221828Sgrehan if (error == 0) { 1160221828Sgrehan printf("gdtr[%d]\t\t0x%016lx/0x%08x\n", 1161221828Sgrehan vcpu, desc_base, desc_limit); 1162221828Sgrehan } 1163221828Sgrehan } 1164221828Sgrehan 1165238386Sgrehan if (!error && (get_desc_idtr || get_all)) { 1166221828Sgrehan error = vm_get_desc(ctx, vcpu, VM_REG_GUEST_IDTR, 1167221828Sgrehan &desc_base, &desc_limit, &desc_access); 1168221828Sgrehan if (error == 0) { 1169221828Sgrehan printf("idtr[%d]\t\t0x%016lx/0x%08x\n", 1170221828Sgrehan vcpu, desc_base, desc_limit); 1171221828Sgrehan } 1172221828Sgrehan } 1173221828Sgrehan 1174238386Sgrehan if (!error && (get_cs || get_all)) { 1175221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CS, &cs); 1176221828Sgrehan if (error == 0) 1177221828Sgrehan printf("cs[%d]\t\t0x%04lx\n", vcpu, cs); 1178221828Sgrehan } 1179221828Sgrehan 1180238386Sgrehan if (!error && (get_ds || get_all)) { 1181221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DS, &ds); 1182221828Sgrehan if (error == 0) 1183221828Sgrehan printf("ds[%d]\t\t0x%04lx\n", vcpu, ds); 1184221828Sgrehan } 1185221828Sgrehan 1186238386Sgrehan if (!error && (get_es || get_all)) { 1187221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_ES, &es); 1188221828Sgrehan if (error == 0) 1189221828Sgrehan printf("es[%d]\t\t0x%04lx\n", vcpu, es); 1190221828Sgrehan } 1191221828Sgrehan 1192238386Sgrehan if (!error && (get_fs || get_all)) { 1193221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_FS, &fs); 1194221828Sgrehan if (error == 0) 1195221828Sgrehan printf("fs[%d]\t\t0x%04lx\n", vcpu, fs); 1196221828Sgrehan } 1197221828Sgrehan 1198238386Sgrehan if (!error && (get_gs || get_all)) { 1199221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_GS, &gs); 1200221828Sgrehan if (error == 0) 1201221828Sgrehan printf("gs[%d]\t\t0x%04lx\n", vcpu, gs); 1202221828Sgrehan } 1203221828Sgrehan 1204238386Sgrehan if (!error && (get_ss || get_all)) { 1205221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_SS, &ss); 1206221828Sgrehan if (error == 0) 1207221828Sgrehan printf("ss[%d]\t\t0x%04lx\n", vcpu, ss); 1208221828Sgrehan } 1209221828Sgrehan 1210238386Sgrehan if (!error && (get_tr || get_all)) { 1211221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_TR, &tr); 1212221828Sgrehan if (error == 0) 1213221828Sgrehan printf("tr[%d]\t\t0x%04lx\n", vcpu, tr); 1214221828Sgrehan } 1215221828Sgrehan 1216238386Sgrehan if (!error && (get_ldtr || get_all)) { 1217221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_LDTR, &ldtr); 1218221828Sgrehan if (error == 0) 1219221828Sgrehan printf("ldtr[%d]\t\t0x%04lx\n", vcpu, ldtr); 1220221828Sgrehan } 1221221828Sgrehan 1222240922Sneel if (!error && (get_x2apic_state || get_all)) { 1223240922Sneel error = vm_get_x2apic_state(ctx, vcpu, &x2apic_state); 1224240922Sneel if (error == 0) 1225240922Sneel printf("x2apic_state[%d]\t%d\n", vcpu, x2apic_state); 1226240922Sneel } 1227240922Sneel 1228238386Sgrehan if (!error && (get_pinbased_ctls || get_all)) { 1229221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_PIN_BASED_CTLS, &ctl); 1230221828Sgrehan if (error == 0) 1231221942Sjhb printf("pinbased_ctls[%d]\t0x%08lx\n", vcpu, ctl); 1232221828Sgrehan } 1233221828Sgrehan 1234238386Sgrehan if (!error && (get_procbased_ctls || get_all)) { 1235221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, 1236221828Sgrehan VMCS_PRI_PROC_BASED_CTLS, &ctl); 1237221828Sgrehan if (error == 0) 1238221942Sjhb printf("procbased_ctls[%d]\t0x%08lx\n", vcpu, ctl); 1239221828Sgrehan } 1240221828Sgrehan 1241238386Sgrehan if (!error && (get_procbased_ctls2 || get_all)) { 1242221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, 1243221828Sgrehan VMCS_SEC_PROC_BASED_CTLS, &ctl); 1244221828Sgrehan if (error == 0) 1245221942Sjhb printf("procbased_ctls2[%d]\t0x%08lx\n", vcpu, ctl); 1246221828Sgrehan } 1247221828Sgrehan 1248238386Sgrehan if (!error && (get_vmcs_gla || get_all)) { 1249221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, 1250221828Sgrehan VMCS_GUEST_LINEAR_ADDRESS, &u64); 1251221828Sgrehan if (error == 0) 1252221828Sgrehan printf("gla[%d]\t\t0x%016lx\n", vcpu, u64); 1253221828Sgrehan } 1254221828Sgrehan 1255238386Sgrehan if (!error && (get_vmcs_gpa || get_all)) { 1256221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, 1257221828Sgrehan VMCS_GUEST_PHYSICAL_ADDRESS, &u64); 1258221828Sgrehan if (error == 0) 1259221828Sgrehan printf("gpa[%d]\t\t0x%016lx\n", vcpu, u64); 1260221828Sgrehan } 1261221828Sgrehan 1262238386Sgrehan if (!error && (get_vmcs_entry_interruption_info || get_all)) { 1263221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_ENTRY_INTR_INFO,&u64); 1264221828Sgrehan if (error == 0) { 1265221942Sjhb printf("entry_interruption_info[%d]\t0x%08lx\n", 1266221828Sgrehan vcpu, u64); 1267221828Sgrehan } 1268221828Sgrehan } 1269221828Sgrehan 1270238386Sgrehan if (!error && (get_eptp || get_all)) { 1271221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_EPTP, &eptp); 1272221828Sgrehan if (error == 0) 1273221828Sgrehan printf("eptp[%d]\t\t0x%016lx\n", vcpu, eptp); 1274221828Sgrehan } 1275221828Sgrehan 1276238386Sgrehan if (!error && (get_exception_bitmap || get_all)) { 1277221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXCEPTION_BITMAP, 1278221828Sgrehan &bm); 1279221828Sgrehan if (error == 0) 1280221942Sjhb printf("exception_bitmap[%d]\t0x%08lx\n", vcpu, bm); 1281221828Sgrehan } 1282221828Sgrehan 1283238386Sgrehan if (!error && (get_io_bitmap || get_all)) { 1284221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_IO_BITMAP_A, &bm); 1285221828Sgrehan if (error == 0) 1286221942Sjhb printf("io_bitmap_a[%d]\t0x%08lx\n", vcpu, bm); 1287221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_IO_BITMAP_B, &bm); 1288221828Sgrehan if (error == 0) 1289221942Sjhb printf("io_bitmap_b[%d]\t0x%08lx\n", vcpu, bm); 1290221828Sgrehan } 1291221828Sgrehan 1292238386Sgrehan if (!error && (get_tsc_offset || get_all)) { 1293221828Sgrehan uint64_t tscoff; 1294221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_TSC_OFFSET, &tscoff); 1295221828Sgrehan if (error == 0) 1296221942Sjhb printf("tsc_offset[%d]\t0x%016lx\n", vcpu, tscoff); 1297221828Sgrehan } 1298221828Sgrehan 1299238386Sgrehan if (!error && (get_cr0_mask || get_all)) { 1300221828Sgrehan uint64_t cr0mask; 1301221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR0_MASK, &cr0mask); 1302221828Sgrehan if (error == 0) 1303221942Sjhb printf("cr0_mask[%d]\t\t0x%016lx\n", vcpu, cr0mask); 1304221828Sgrehan } 1305221828Sgrehan 1306238386Sgrehan if (!error && (get_cr0_shadow || get_all)) { 1307221828Sgrehan uint64_t cr0shadow; 1308221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR0_SHADOW, 1309221828Sgrehan &cr0shadow); 1310221828Sgrehan if (error == 0) 1311221942Sjhb printf("cr0_shadow[%d]\t\t0x%016lx\n", vcpu, cr0shadow); 1312221828Sgrehan } 1313221828Sgrehan 1314238386Sgrehan if (!error && (get_cr4_mask || get_all)) { 1315221828Sgrehan uint64_t cr4mask; 1316221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR4_MASK, &cr4mask); 1317221828Sgrehan if (error == 0) 1318221942Sjhb printf("cr4_mask[%d]\t\t0x%016lx\n", vcpu, cr4mask); 1319221828Sgrehan } 1320221828Sgrehan 1321238386Sgrehan if (!error && (get_cr4_shadow || get_all)) { 1322221828Sgrehan uint64_t cr4shadow; 1323221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR4_SHADOW, 1324221828Sgrehan &cr4shadow); 1325221828Sgrehan if (error == 0) 1326221942Sjhb printf("cr4_shadow[%d]\t\t0x%016lx\n", vcpu, cr4shadow); 1327221828Sgrehan } 1328221828Sgrehan 1329238386Sgrehan if (!error && (get_cr3_targets || get_all)) { 1330221828Sgrehan uint64_t target_count, target_addr; 1331221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET_COUNT, 1332221828Sgrehan &target_count); 1333221828Sgrehan if (error == 0) { 1334221942Sjhb printf("cr3_target_count[%d]\t0x%08lx\n", 1335221828Sgrehan vcpu, target_count); 1336221828Sgrehan } 1337221828Sgrehan 1338221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET0, 1339221828Sgrehan &target_addr); 1340221828Sgrehan if (error == 0) { 1341221828Sgrehan printf("cr3_target0[%d]\t\t0x%016lx\n", 1342221828Sgrehan vcpu, target_addr); 1343221828Sgrehan } 1344221828Sgrehan 1345221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET1, 1346221828Sgrehan &target_addr); 1347221828Sgrehan if (error == 0) { 1348221828Sgrehan printf("cr3_target1[%d]\t\t0x%016lx\n", 1349221828Sgrehan vcpu, target_addr); 1350221828Sgrehan } 1351221828Sgrehan 1352221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET2, 1353221828Sgrehan &target_addr); 1354221828Sgrehan if (error == 0) { 1355221828Sgrehan printf("cr3_target2[%d]\t\t0x%016lx\n", 1356221828Sgrehan vcpu, target_addr); 1357221828Sgrehan } 1358221828Sgrehan 1359221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_CR3_TARGET3, 1360221828Sgrehan &target_addr); 1361221828Sgrehan if (error == 0) { 1362221828Sgrehan printf("cr3_target3[%d]\t\t0x%016lx\n", 1363221828Sgrehan vcpu, target_addr); 1364221828Sgrehan } 1365221828Sgrehan } 1366221828Sgrehan 1367238386Sgrehan if (!error && (get_apic_access_addr || get_all)) { 1368221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_APIC_ACCESS, &addr); 1369221828Sgrehan if (error == 0) 1370221828Sgrehan printf("apic_access_addr[%d]\t0x%016lx\n", vcpu, addr); 1371221828Sgrehan } 1372221828Sgrehan 1373238386Sgrehan if (!error && (get_virtual_apic_addr || get_all)) { 1374221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_VIRTUAL_APIC, &addr); 1375221828Sgrehan if (error == 0) 1376221828Sgrehan printf("virtual_apic_addr[%d]\t0x%016lx\n", vcpu, addr); 1377221828Sgrehan } 1378221828Sgrehan 1379238386Sgrehan if (!error && (get_tpr_threshold || get_all)) { 1380221828Sgrehan uint64_t threshold; 1381221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_TPR_THRESHOLD, 1382221828Sgrehan &threshold); 1383221828Sgrehan if (error == 0) 1384221942Sjhb printf("tpr_threshold[%d]\t0x%08lx\n", vcpu, threshold); 1385221828Sgrehan } 1386221828Sgrehan 1387238386Sgrehan if (!error && (get_msr_bitmap_address || get_all)) { 1388221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_MSR_BITMAP, &addr); 1389221828Sgrehan if (error == 0) 1390221828Sgrehan printf("msr_bitmap[%d]\t\t0x%016lx\n", vcpu, addr); 1391221828Sgrehan } 1392221828Sgrehan 1393238386Sgrehan if (!error && (get_msr_bitmap || get_all)) { 1394221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_MSR_BITMAP, &addr); 1395221828Sgrehan if (error == 0) 1396221828Sgrehan error = dump_vmcs_msr_bitmap(vcpu, addr); 1397221828Sgrehan } 1398221828Sgrehan 1399238386Sgrehan if (!error && (get_vpid || get_all)) { 1400221828Sgrehan uint64_t vpid; 1401221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_VPID, &vpid); 1402221828Sgrehan if (error == 0) 1403221942Sjhb printf("vpid[%d]\t\t0x%04lx\n", vcpu, vpid); 1404221828Sgrehan } 1405221828Sgrehan 1406238386Sgrehan if (!error && (get_ple_window || get_all)) { 1407221828Sgrehan uint64_t window; 1408221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_PLE_WINDOW, &window); 1409221828Sgrehan if (error == 0) 1410221942Sjhb printf("ple_window[%d]\t\t0x%08lx\n", vcpu, window); 1411221828Sgrehan } 1412221828Sgrehan 1413238386Sgrehan if (!error && (get_ple_gap || get_all)) { 1414221828Sgrehan uint64_t gap; 1415221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_PLE_GAP, &gap); 1416221828Sgrehan if (error == 0) 1417221942Sjhb printf("ple_gap[%d]\t\t0x%08lx\n", vcpu, gap); 1418221828Sgrehan } 1419221828Sgrehan 1420238386Sgrehan if (!error && (get_inst_err || get_all)) { 1421221828Sgrehan uint64_t insterr; 1422221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_INSTRUCTION_ERROR, 1423221828Sgrehan &insterr); 1424221828Sgrehan if (error == 0) { 1425221942Sjhb printf("instruction_error[%d]\t0x%08lx\n", 1426221828Sgrehan vcpu, insterr); 1427221828Sgrehan } 1428221828Sgrehan } 1429221828Sgrehan 1430238386Sgrehan if (!error && (get_exit_ctls || get_all)) { 1431221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_CTLS, &ctl); 1432221828Sgrehan if (error == 0) 1433221942Sjhb printf("exit_ctls[%d]\t\t0x%08lx\n", vcpu, ctl); 1434221828Sgrehan } 1435221828Sgrehan 1436238386Sgrehan if (!error && (get_entry_ctls || get_all)) { 1437221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_ENTRY_CTLS, &ctl); 1438221828Sgrehan if (error == 0) 1439221942Sjhb printf("entry_ctls[%d]\t\t0x%08lx\n", vcpu, ctl); 1440221828Sgrehan } 1441221828Sgrehan 1442238386Sgrehan if (!error && (get_host_pat || get_all)) { 1443221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_IA32_PAT, &pat); 1444221828Sgrehan if (error == 0) 1445221828Sgrehan printf("host_pat[%d]\t\t0x%016lx\n", vcpu, pat); 1446221828Sgrehan } 1447221828Sgrehan 1448238386Sgrehan if (!error && (get_guest_pat || get_all)) { 1449221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_GUEST_IA32_PAT, &pat); 1450221828Sgrehan if (error == 0) 1451221828Sgrehan printf("guest_pat[%d]\t\t0x%016lx\n", vcpu, pat); 1452221828Sgrehan } 1453221828Sgrehan 1454238386Sgrehan if (!error && (get_host_cr0 || get_all)) { 1455221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_CR0, &cr0); 1456221828Sgrehan if (error == 0) 1457221828Sgrehan printf("host_cr0[%d]\t\t0x%016lx\n", vcpu, cr0); 1458221828Sgrehan } 1459221828Sgrehan 1460238386Sgrehan if (!error && (get_host_cr3 || get_all)) { 1461221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_CR3, &cr3); 1462221828Sgrehan if (error == 0) 1463221828Sgrehan printf("host_cr3[%d]\t\t0x%016lx\n", vcpu, cr3); 1464221828Sgrehan } 1465221828Sgrehan 1466238386Sgrehan if (!error && (get_host_cr4 || get_all)) { 1467221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_CR4, &cr4); 1468221828Sgrehan if (error == 0) 1469221828Sgrehan printf("host_cr4[%d]\t\t0x%016lx\n", vcpu, cr4); 1470221828Sgrehan } 1471221828Sgrehan 1472238386Sgrehan if (!error && (get_host_rip || get_all)) { 1473221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_RIP, &rip); 1474221828Sgrehan if (error == 0) 1475221828Sgrehan printf("host_rip[%d]\t\t0x%016lx\n", vcpu, rip); 1476221828Sgrehan } 1477221828Sgrehan 1478238386Sgrehan if (!error && (get_host_rsp || get_all)) { 1479221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_HOST_RSP, &rsp); 1480221828Sgrehan if (error == 0) 1481242059Sneel printf("host_rsp[%d]\t\t0x%016lx\n", vcpu, rsp); 1482221828Sgrehan } 1483221828Sgrehan 1484238386Sgrehan if (!error && (get_guest_sysenter || get_all)) { 1485221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, 1486221828Sgrehan VMCS_GUEST_IA32_SYSENTER_CS, &cs); 1487221828Sgrehan if (error == 0) 1488221942Sjhb printf("guest_sysenter_cs[%d]\t0x%08lx\n", vcpu, cs); 1489221828Sgrehan 1490221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, 1491221828Sgrehan VMCS_GUEST_IA32_SYSENTER_ESP, &rsp); 1492221828Sgrehan if (error == 0) 1493221828Sgrehan printf("guest_sysenter_sp[%d]\t0x%016lx\n", vcpu, rsp); 1494221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, 1495221828Sgrehan VMCS_GUEST_IA32_SYSENTER_EIP, &rip); 1496221828Sgrehan if (error == 0) 1497221828Sgrehan printf("guest_sysenter_ip[%d]\t0x%016lx\n", vcpu, rip); 1498221828Sgrehan } 1499221828Sgrehan 1500238386Sgrehan if (!error && (get_vmcs_link || get_all)) { 1501221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_LINK_POINTER, &addr); 1502221828Sgrehan if (error == 0) 1503221828Sgrehan printf("vmcs_pointer[%d]\t0x%016lx\n", vcpu, addr); 1504221828Sgrehan } 1505221828Sgrehan 1506238386Sgrehan if (!error && (get_vmcs_exit_reason || get_all)) { 1507221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_REASON, &u64); 1508221828Sgrehan if (error == 0) 1509221828Sgrehan printf("vmcs_exit_reason[%d]\t0x%016lx\n", vcpu, u64); 1510221828Sgrehan } 1511221828Sgrehan 1512238386Sgrehan if (!error && (get_vmcs_exit_qualification || get_all)) { 1513221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_QUALIFICATION, 1514221828Sgrehan &u64); 1515221828Sgrehan if (error == 0) 1516221828Sgrehan printf("vmcs_exit_qualification[%d]\t0x%016lx\n", 1517221828Sgrehan vcpu, u64); 1518221828Sgrehan } 1519221828Sgrehan 1520238386Sgrehan if (!error && (get_vmcs_exit_interruption_info || get_all)) { 1521266339Sjhb error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_INTR_INFO, &u64); 1522221828Sgrehan if (error == 0) { 1523221942Sjhb printf("vmcs_exit_interruption_info[%d]\t0x%08lx\n", 1524221828Sgrehan vcpu, u64); 1525221828Sgrehan } 1526221828Sgrehan } 1527221828Sgrehan 1528238386Sgrehan if (!error && (get_vmcs_exit_interruption_error || get_all)) { 1529266339Sjhb error = vm_get_vmcs_field(ctx, vcpu, VMCS_EXIT_INTR_ERRCODE, 1530266339Sjhb &u64); 1531221828Sgrehan if (error == 0) { 1532221942Sjhb printf("vmcs_exit_interruption_error[%d]\t0x%08lx\n", 1533221828Sgrehan vcpu, u64); 1534221828Sgrehan } 1535221828Sgrehan } 1536221828Sgrehan 1537238386Sgrehan if (!error && (get_vmcs_interruptibility || get_all)) { 1538221828Sgrehan error = vm_get_vmcs_field(ctx, vcpu, 1539221828Sgrehan VMCS_GUEST_INTERRUPTIBILITY, &u64); 1540221828Sgrehan if (error == 0) { 1541221942Sjhb printf("vmcs_guest_interruptibility[%d]\t0x%08lx\n", 1542221828Sgrehan vcpu, u64); 1543221828Sgrehan } 1544221828Sgrehan } 1545221828Sgrehan 1546221828Sgrehan if (!error && setcap) { 1547221828Sgrehan int captype; 1548221828Sgrehan captype = vm_capability_name2type(capname); 1549221828Sgrehan error = vm_set_capability(ctx, vcpu, captype, capval); 1550221828Sgrehan if (error != 0 && errno == ENOENT) 1551221828Sgrehan printf("Capability \"%s\" is not available\n", capname); 1552221828Sgrehan } 1553221828Sgrehan 1554256072Sneel if (!error && get_gpa_pmap) { 1555256072Sneel error = vm_get_gpa_pmap(ctx, gpa_pmap, pteval, &ptenum); 1556256072Sneel if (error == 0) { 1557256072Sneel printf("gpa %#lx:", gpa_pmap); 1558256072Sneel pte = &pteval[0]; 1559256072Sneel while (ptenum-- > 0) 1560256072Sneel printf(" %#lx", *pte++); 1561256072Sneel printf("\n"); 1562256072Sneel } 1563256072Sneel } 1564256072Sneel 1565238386Sgrehan if (!error && (getcap || get_all)) { 1566241487Sneel int captype, val, getcaptype; 1567241487Sneel 1568241487Sneel if (getcap && capname) 1569241487Sneel getcaptype = vm_capability_name2type(capname); 1570241487Sneel else 1571241487Sneel getcaptype = -1; 1572241487Sneel 1573241487Sneel for (captype = 0; captype < VM_CAP_MAX; captype++) { 1574241487Sneel if (getcaptype >= 0 && captype != getcaptype) 1575241487Sneel continue; 1576241487Sneel error = vm_get_capability(ctx, vcpu, captype, &val); 1577241487Sneel if (error == 0) { 1578241487Sneel printf("Capability \"%s\" is %s on vcpu %d\n", 1579241487Sneel vm_capability_type2name(captype), 1580241487Sneel val ? "set" : "not set", vcpu); 1581241487Sneel } else if (errno == ENOENT) { 1582256869Sneel error = 0; 1583241487Sneel printf("Capability \"%s\" is not available\n", 1584241487Sneel vm_capability_type2name(captype)); 1585241487Sneel } else { 1586241487Sneel break; 1587241487Sneel } 1588221828Sgrehan } 1589221828Sgrehan } 1590221828Sgrehan 1591270070Sgrehan if (!error && (get_active_cpus || get_all)) { 1592270070Sgrehan error = vm_active_cpus(ctx, &cpus); 1593270070Sgrehan if (!error) 1594270070Sgrehan print_cpus("active cpus", &cpus); 1595270070Sgrehan } 1596270070Sgrehan 1597270070Sgrehan if (!error && (get_suspended_cpus || get_all)) { 1598270070Sgrehan error = vm_suspended_cpus(ctx, &cpus); 1599270070Sgrehan if (!error) 1600270070Sgrehan print_cpus("suspended cpus", &cpus); 1601270070Sgrehan } 1602270070Sgrehan 1603270159Sgrehan if (!error && (get_intinfo || get_all)) { 1604270159Sgrehan error = vm_get_intinfo(ctx, vcpu, &info[0], &info[1]); 1605270159Sgrehan if (!error) { 1606270159Sgrehan print_intinfo("pending", info[0]); 1607270159Sgrehan print_intinfo("current", info[1]); 1608270159Sgrehan } 1609270159Sgrehan } 1610270159Sgrehan 1611221828Sgrehan if (!error && run) { 1612221828Sgrehan error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RIP, &rip); 1613221828Sgrehan assert(error == 0); 1614221828Sgrehan 1615221828Sgrehan error = vm_run(ctx, vcpu, rip, &vmexit); 1616221828Sgrehan if (error == 0) 1617221828Sgrehan dump_vm_run_exitcode(&vmexit, vcpu); 1618221828Sgrehan else 1619221828Sgrehan printf("vm_run error %d\n", error); 1620221828Sgrehan } 1621221828Sgrehan 1622268935Sjhb if (!error && force_reset) 1623268935Sjhb error = vm_suspend(ctx, VM_SUSPEND_RESET); 1624268935Sjhb 1625268935Sjhb if (!error && force_poweroff) 1626268935Sjhb error = vm_suspend(ctx, VM_SUSPEND_POWEROFF); 1627268935Sjhb 1628221828Sgrehan if (error) 1629221828Sgrehan printf("errno = %d\n", errno); 1630221828Sgrehan 1631221828Sgrehan if (!error && destroy) 1632221828Sgrehan vm_destroy(ctx); 1633221828Sgrehan 1634221828Sgrehan exit(error); 1635221828Sgrehan} 1636