Changeset View
Changeset View
Standalone View
Standalone View
head/usr.sbin/bhyvectl/bhyvectl.c
Show First 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | usage(bool cpu_intel) | ||||
" [--capname=<capname>]\n" | " [--capname=<capname>]\n" | ||||
" [--getcap]\n" | " [--getcap]\n" | ||||
" [--setcap=<0|1>]\n" | " [--setcap=<0|1>]\n" | ||||
" [--desc-base=<BASE>]\n" | " [--desc-base=<BASE>]\n" | ||||
" [--desc-limit=<LIMIT>]\n" | " [--desc-limit=<LIMIT>]\n" | ||||
" [--desc-access=<ACCESS>]\n" | " [--desc-access=<ACCESS>]\n" | ||||
" [--set-cr0=<CR0>]\n" | " [--set-cr0=<CR0>]\n" | ||||
" [--get-cr0]\n" | " [--get-cr0]\n" | ||||
" [--set-cr2=<CR2>]\n" | |||||
" [--get-cr2]\n" | |||||
" [--set-cr3=<CR3>]\n" | " [--set-cr3=<CR3>]\n" | ||||
" [--get-cr3]\n" | " [--get-cr3]\n" | ||||
" [--set-cr4=<CR4>]\n" | " [--set-cr4=<CR4>]\n" | ||||
" [--get-cr4]\n" | " [--get-cr4]\n" | ||||
" [--set-dr0=<DR0>]\n" | " [--set-dr0=<DR0>]\n" | ||||
" [--get-dr0]\n" | " [--get-dr0]\n" | ||||
" [--set-dr1=<DR1>]\n" | " [--set-dr1=<DR1>]\n" | ||||
" [--get-dr1]\n" | " [--get-dr1]\n" | ||||
▲ Show 20 Lines • Show All 129 Lines • ▼ Show 20 Lines | |||||
static int get_stats, getcap, setcap, capval, get_gpa_pmap; | static int get_stats, getcap, setcap, capval, get_gpa_pmap; | ||||
static int inject_nmi, assert_lapic_lvt; | static int inject_nmi, assert_lapic_lvt; | ||||
static int force_reset, force_poweroff; | static int force_reset, force_poweroff; | ||||
static const char *capname; | static const char *capname; | ||||
static int create, destroy, get_memmap, get_memseg; | static int create, destroy, get_memmap, get_memseg; | ||||
static int get_intinfo; | static int get_intinfo; | ||||
static int get_active_cpus, get_suspended_cpus; | static int get_active_cpus, get_suspended_cpus; | ||||
static uint64_t memsize; | static uint64_t memsize; | ||||
static int set_cr0, get_cr0, set_cr3, get_cr3, set_cr4, get_cr4; | static int set_cr0, get_cr0, set_cr2, get_cr2, set_cr3, get_cr3; | ||||
static int set_cr4, get_cr4; | |||||
static int set_efer, get_efer; | static int set_efer, get_efer; | ||||
static int set_dr0, get_dr0; | static int set_dr0, get_dr0; | ||||
static int set_dr1, get_dr1; | static int set_dr1, get_dr1; | ||||
static int set_dr2, get_dr2; | static int set_dr2, get_dr2; | ||||
static int set_dr3, get_dr3; | static int set_dr3, get_dr3; | ||||
static int set_dr6, get_dr6; | static int set_dr6, get_dr6; | ||||
static int set_dr7, get_dr7; | static int set_dr7, get_dr7; | ||||
static int set_rsp, get_rsp, set_rip, get_rip, set_rflags, get_rflags; | static int set_rsp, get_rsp, set_rip, get_rip, set_rflags, get_rflags; | ||||
▲ Show 20 Lines • Show All 280 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
enum { | enum { | ||||
VMNAME = 1000, /* avoid collision with return values from getopt */ | VMNAME = 1000, /* avoid collision with return values from getopt */ | ||||
VCPU, | VCPU, | ||||
SET_MEM, | SET_MEM, | ||||
SET_EFER, | SET_EFER, | ||||
SET_CR0, | SET_CR0, | ||||
SET_CR2, | |||||
SET_CR3, | SET_CR3, | ||||
SET_CR4, | SET_CR4, | ||||
SET_DR0, | SET_DR0, | ||||
SET_DR1, | SET_DR1, | ||||
SET_DR2, | SET_DR2, | ||||
SET_DR3, | SET_DR3, | ||||
SET_DR6, | SET_DR6, | ||||
SET_DR7, | SET_DR7, | ||||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | if (strcmp(cpu_vendor, "AuthenticAMD") == 0) { | ||||
fprintf(stderr, "Unknown cpu vendor \"%s\"\n", cpu_vendor); | fprintf(stderr, "Unknown cpu vendor \"%s\"\n", cpu_vendor); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
} | } | ||||
static int | static int | ||||
get_all_registers(struct vmctx *ctx, int vcpu) | get_all_registers(struct vmctx *ctx, int vcpu) | ||||
{ | { | ||||
uint64_t cr0, cr3, cr4, dr0, dr1, dr2, dr3, dr6, dr7; | uint64_t cr0, cr2, cr3, cr4, dr0, dr1, dr2, dr3, dr6, dr7; | ||||
uint64_t rsp, rip, rflags, efer; | uint64_t rsp, rip, rflags, efer; | ||||
uint64_t rax, rbx, rcx, rdx, rsi, rdi, rbp; | uint64_t rax, rbx, rcx, rdx, rsi, rdi, rbp; | ||||
uint64_t r8, r9, r10, r11, r12, r13, r14, r15; | uint64_t r8, r9, r10, r11, r12, r13, r14, r15; | ||||
int error = 0; | int error = 0; | ||||
if (!error && (get_efer || get_all)) { | if (!error && (get_efer || get_all)) { | ||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_EFER, &efer); | error = vm_get_register(ctx, vcpu, VM_REG_GUEST_EFER, &efer); | ||||
if (error == 0) | if (error == 0) | ||||
printf("efer[%d]\t\t0x%016lx\n", vcpu, efer); | printf("efer[%d]\t\t0x%016lx\n", vcpu, efer); | ||||
} | } | ||||
if (!error && (get_cr0 || get_all)) { | if (!error && (get_cr0 || get_all)) { | ||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR0, &cr0); | error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR0, &cr0); | ||||
if (error == 0) | if (error == 0) | ||||
printf("cr0[%d]\t\t0x%016lx\n", vcpu, cr0); | printf("cr0[%d]\t\t0x%016lx\n", vcpu, cr0); | ||||
} | } | ||||
if (!error && (get_cr2 || get_all)) { | |||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR2, &cr2); | |||||
if (error == 0) | |||||
printf("cr2[%d]\t\t0x%016lx\n", vcpu, cr2); | |||||
} | |||||
if (!error && (get_cr3 || get_all)) { | if (!error && (get_cr3 || get_all)) { | ||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR3, &cr3); | error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR3, &cr3); | ||||
if (error == 0) | if (error == 0) | ||||
printf("cr3[%d]\t\t0x%016lx\n", vcpu, cr3); | printf("cr3[%d]\t\t0x%016lx\n", vcpu, cr3); | ||||
} | } | ||||
if (!error && (get_cr4 || get_all)) { | if (!error && (get_cr4 || get_all)) { | ||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR4, &cr4); | error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR4, &cr4); | ||||
▲ Show 20 Lines • Show All 626 Lines • ▼ Show 20 Lines | |||||
setup_options(bool cpu_intel) | setup_options(bool cpu_intel) | ||||
{ | { | ||||
const struct option common_opts[] = { | const struct option common_opts[] = { | ||||
{ "vm", REQ_ARG, 0, VMNAME }, | { "vm", REQ_ARG, 0, VMNAME }, | ||||
{ "cpu", REQ_ARG, 0, VCPU }, | { "cpu", REQ_ARG, 0, VCPU }, | ||||
{ "set-mem", REQ_ARG, 0, SET_MEM }, | { "set-mem", REQ_ARG, 0, SET_MEM }, | ||||
{ "set-efer", REQ_ARG, 0, SET_EFER }, | { "set-efer", REQ_ARG, 0, SET_EFER }, | ||||
{ "set-cr0", REQ_ARG, 0, SET_CR0 }, | { "set-cr0", REQ_ARG, 0, SET_CR0 }, | ||||
{ "set-cr2", REQ_ARG, 0, SET_CR2 }, | |||||
{ "set-cr3", REQ_ARG, 0, SET_CR3 }, | { "set-cr3", REQ_ARG, 0, SET_CR3 }, | ||||
{ "set-cr4", REQ_ARG, 0, SET_CR4 }, | { "set-cr4", REQ_ARG, 0, SET_CR4 }, | ||||
{ "set-dr0", REQ_ARG, 0, SET_DR0 }, | { "set-dr0", REQ_ARG, 0, SET_DR0 }, | ||||
{ "set-dr1", REQ_ARG, 0, SET_DR1 }, | { "set-dr1", REQ_ARG, 0, SET_DR1 }, | ||||
{ "set-dr2", REQ_ARG, 0, SET_DR2 }, | { "set-dr2", REQ_ARG, 0, SET_DR2 }, | ||||
{ "set-dr3", REQ_ARG, 0, SET_DR3 }, | { "set-dr3", REQ_ARG, 0, SET_DR3 }, | ||||
{ "set-dr6", REQ_ARG, 0, SET_DR6 }, | { "set-dr6", REQ_ARG, 0, SET_DR6 }, | ||||
{ "set-dr7", REQ_ARG, 0, SET_DR7 }, | { "set-dr7", REQ_ARG, 0, SET_DR7 }, | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | const struct option common_opts[] = { | ||||
{ "set-desc-gdtr", NO_ARG, &set_desc_gdtr, 1 }, | { "set-desc-gdtr", NO_ARG, &set_desc_gdtr, 1 }, | ||||
{ "get-desc-gdtr", NO_ARG, &get_desc_gdtr, 1 }, | { "get-desc-gdtr", NO_ARG, &get_desc_gdtr, 1 }, | ||||
{ "set-desc-idtr", NO_ARG, &set_desc_idtr, 1 }, | { "set-desc-idtr", NO_ARG, &set_desc_idtr, 1 }, | ||||
{ "get-desc-idtr", NO_ARG, &get_desc_idtr, 1 }, | { "get-desc-idtr", NO_ARG, &get_desc_idtr, 1 }, | ||||
{ "get-memmap", NO_ARG, &get_memmap, 1 }, | { "get-memmap", NO_ARG, &get_memmap, 1 }, | ||||
{ "get-memseg", NO_ARG, &get_memseg, 1 }, | { "get-memseg", NO_ARG, &get_memseg, 1 }, | ||||
{ "get-efer", NO_ARG, &get_efer, 1 }, | { "get-efer", NO_ARG, &get_efer, 1 }, | ||||
{ "get-cr0", NO_ARG, &get_cr0, 1 }, | { "get-cr0", NO_ARG, &get_cr0, 1 }, | ||||
{ "get-cr2", NO_ARG, &get_cr2, 1 }, | |||||
{ "get-cr3", NO_ARG, &get_cr3, 1 }, | { "get-cr3", NO_ARG, &get_cr3, 1 }, | ||||
{ "get-cr4", NO_ARG, &get_cr4, 1 }, | { "get-cr4", NO_ARG, &get_cr4, 1 }, | ||||
{ "get-dr0", NO_ARG, &get_dr0, 1 }, | { "get-dr0", NO_ARG, &get_dr0, 1 }, | ||||
{ "get-dr1", NO_ARG, &get_dr1, 1 }, | { "get-dr1", NO_ARG, &get_dr1, 1 }, | ||||
{ "get-dr2", NO_ARG, &get_dr2, 1 }, | { "get-dr2", NO_ARG, &get_dr2, 1 }, | ||||
{ "get-dr3", NO_ARG, &get_dr3, 1 }, | { "get-dr3", NO_ARG, &get_dr3, 1 }, | ||||
{ "get-dr6", NO_ARG, &get_dr6, 1 }, | { "get-dr6", NO_ARG, &get_dr6, 1 }, | ||||
{ "get-dr7", NO_ARG, &get_dr7, 1 }, | { "get-dr7", NO_ARG, &get_dr7, 1 }, | ||||
▲ Show 20 Lines • Show All 268 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
main(int argc, char *argv[]) | main(int argc, char *argv[]) | ||||
{ | { | ||||
char *vmname; | char *vmname; | ||||
int error, ch, vcpu, ptenum; | int error, ch, vcpu, ptenum; | ||||
vm_paddr_t gpa_pmap; | vm_paddr_t gpa_pmap; | ||||
struct vm_exit vmexit; | struct vm_exit vmexit; | ||||
uint64_t rax, cr0, cr3, cr4, dr0, dr1, dr2, dr3, dr6, dr7; | uint64_t rax, cr0, cr2, cr3, cr4, dr0, dr1, dr2, dr3, dr6, dr7; | ||||
uint64_t rsp, rip, rflags, efer, pat; | uint64_t rsp, rip, rflags, efer, pat; | ||||
uint64_t eptp, bm, addr, u64, pteval[4], *pte, info[2]; | uint64_t eptp, bm, addr, u64, pteval[4], *pte, info[2]; | ||||
struct vmctx *ctx; | struct vmctx *ctx; | ||||
cpuset_t cpus; | cpuset_t cpus; | ||||
bool cpu_intel; | bool cpu_intel; | ||||
uint64_t cs, ds, es, fs, gs, ss, tr, ldtr; | uint64_t cs, ds, es, fs, gs, ss, tr, ldtr; | ||||
struct tm tm; | struct tm tm; | ||||
struct option *opts; | struct option *opts; | ||||
Show All 23 Lines | while ((ch = getopt_long(argc, argv, "", opts, NULL)) != -1) { | ||||
case SET_EFER: | case SET_EFER: | ||||
efer = strtoul(optarg, NULL, 0); | efer = strtoul(optarg, NULL, 0); | ||||
set_efer = 1; | set_efer = 1; | ||||
break; | break; | ||||
case SET_CR0: | case SET_CR0: | ||||
cr0 = strtoul(optarg, NULL, 0); | cr0 = strtoul(optarg, NULL, 0); | ||||
set_cr0 = 1; | set_cr0 = 1; | ||||
break; | break; | ||||
case SET_CR2: | |||||
cr2 = strtoul(optarg, NULL, 0); | |||||
set_cr2 = 1; | |||||
break; | |||||
case SET_CR3: | case SET_CR3: | ||||
cr3 = strtoul(optarg, NULL, 0); | cr3 = strtoul(optarg, NULL, 0); | ||||
set_cr3 = 1; | set_cr3 = 1; | ||||
break; | break; | ||||
case SET_CR4: | case SET_CR4: | ||||
cr4 = strtoul(optarg, NULL, 0); | cr4 = strtoul(optarg, NULL, 0); | ||||
set_cr4 = 1; | set_cr4 = 1; | ||||
break; | break; | ||||
▲ Show 20 Lines • Show All 146 Lines • ▼ Show 20 Lines | main(int argc, char *argv[]) | ||||
if (!error && memsize) | if (!error && memsize) | ||||
error = vm_setup_memory(ctx, memsize, VM_MMAP_ALL); | error = vm_setup_memory(ctx, memsize, VM_MMAP_ALL); | ||||
if (!error && set_efer) | if (!error && set_efer) | ||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_EFER, efer); | error = vm_set_register(ctx, vcpu, VM_REG_GUEST_EFER, efer); | ||||
if (!error && set_cr0) | if (!error && set_cr0) | ||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR0, cr0); | error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR0, cr0); | ||||
if (!error && set_cr2) | |||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR2, cr2); | |||||
if (!error && set_cr3) | if (!error && set_cr3) | ||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR3, cr3); | error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR3, cr3); | ||||
if (!error && set_cr4) | if (!error && set_cr4) | ||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR4, cr4); | error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CR4, cr4); | ||||
if (!error && set_dr0) | if (!error && set_dr0) | ||||
▲ Show 20 Lines • Show All 438 Lines • Show Last 20 Lines |