Changeset View
Changeset View
Standalone View
Standalone View
head/usr.sbin/bhyvectl/bhyvectl.c
Show First 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | usage(bool cpu_intel) | ||||
" [--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-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" | |||||
" [--get-dr0]\n" | |||||
" [--set-dr1=<DR1>]\n" | |||||
" [--get-dr1]\n" | |||||
" [--set-dr2=<DR2>]\n" | |||||
" [--get-dr2]\n" | |||||
" [--set-dr3=<DR3>]\n" | |||||
" [--get-dr3]\n" | |||||
" [--set-dr6=<DR6>]\n" | |||||
" [--get-dr6]\n" | |||||
" [--set-dr7=<DR7>]\n" | " [--set-dr7=<DR7>]\n" | ||||
" [--get-dr7]\n" | " [--get-dr7]\n" | ||||
" [--set-rsp=<RSP>]\n" | " [--set-rsp=<RSP>]\n" | ||||
" [--get-rsp]\n" | " [--get-rsp]\n" | ||||
" [--set-rip=<RIP>]\n" | " [--set-rip=<RIP>]\n" | ||||
" [--get-rip]\n" | " [--get-rip]\n" | ||||
" [--get-rax]\n" | " [--get-rax]\n" | ||||
" [--set-rax=<RAX>]\n" | " [--set-rax=<RAX>]\n" | ||||
▲ Show 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | |||||
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_cr3, get_cr3, 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_dr1, get_dr1; | |||||
static int set_dr2, get_dr2; | |||||
static int set_dr3, get_dr3; | |||||
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; | ||||
static int set_rax, get_rax; | static int set_rax, get_rax; | ||||
static int get_rbx, get_rcx, get_rdx, get_rsi, get_rdi, get_rbp; | static int get_rbx, get_rcx, get_rdx, get_rsi, get_rdi, get_rbp; | ||||
static int get_r8, get_r9, get_r10, get_r11, get_r12, get_r13, get_r14, get_r15; | static int get_r8, get_r9, get_r10, get_r11, get_r12, get_r13, get_r14, get_r15; | ||||
static int set_desc_ds, get_desc_ds; | static int set_desc_ds, get_desc_ds; | ||||
static int set_desc_es, get_desc_es; | static int set_desc_es, get_desc_es; | ||||
static int set_desc_fs, get_desc_fs; | static int set_desc_fs, get_desc_fs; | ||||
▲ Show 20 Lines • Show All 276 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_CR3, | SET_CR3, | ||||
SET_CR4, | SET_CR4, | ||||
SET_DR0, | |||||
SET_DR1, | |||||
SET_DR2, | |||||
SET_DR3, | |||||
SET_DR6, | |||||
SET_DR7, | SET_DR7, | ||||
SET_RSP, | SET_RSP, | ||||
SET_RIP, | SET_RIP, | ||||
SET_RAX, | SET_RAX, | ||||
SET_RFLAGS, | SET_RFLAGS, | ||||
DESC_BASE, | DESC_BASE, | ||||
DESC_LIMIT, | DESC_LIMIT, | ||||
DESC_ACCESS, | DESC_ACCESS, | ||||
▲ Show 20 Lines • Show All 88 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, dr7, rsp, rip, rflags, efer; | uint64_t cr0, cr3, cr4, dr0, dr1, dr2, dr3, dr6, dr7; | ||||
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); | ||||
Show All 12 Lines | get_all_registers(struct vmctx *ctx, int vcpu) | ||||
} | } | ||||
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); | ||||
if (error == 0) | if (error == 0) | ||||
printf("cr4[%d]\t\t0x%016lx\n", vcpu, cr4); | printf("cr4[%d]\t\t0x%016lx\n", vcpu, cr4); | ||||
} | } | ||||
if (!error && (get_dr0 || get_all)) { | |||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR0, &dr0); | |||||
if (error == 0) | |||||
printf("dr0[%d]\t\t0x%016lx\n", vcpu, dr0); | |||||
} | |||||
if (!error && (get_dr1 || get_all)) { | |||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR1, &dr1); | |||||
if (error == 0) | |||||
printf("dr1[%d]\t\t0x%016lx\n", vcpu, dr1); | |||||
} | |||||
if (!error && (get_dr2 || get_all)) { | |||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR2, &dr2); | |||||
if (error == 0) | |||||
printf("dr2[%d]\t\t0x%016lx\n", vcpu, dr2); | |||||
} | |||||
if (!error && (get_dr3 || get_all)) { | |||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR3, &dr3); | |||||
if (error == 0) | |||||
printf("dr3[%d]\t\t0x%016lx\n", vcpu, dr3); | |||||
} | |||||
if (!error && (get_dr6 || get_all)) { | |||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR6, &dr6); | |||||
if (error == 0) | |||||
printf("dr6[%d]\t\t0x%016lx\n", vcpu, dr6); | |||||
} | |||||
if (!error && (get_dr7 || get_all)) { | if (!error && (get_dr7 || get_all)) { | ||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR7, &dr7); | error = vm_get_register(ctx, vcpu, VM_REG_GUEST_DR7, &dr7); | ||||
if (error == 0) | if (error == 0) | ||||
printf("dr7[%d]\t\t0x%016lx\n", vcpu, dr7); | printf("dr7[%d]\t\t0x%016lx\n", vcpu, dr7); | ||||
} | } | ||||
if (!error && (get_rsp || get_all)) { | if (!error && (get_rsp || get_all)) { | ||||
error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSP, &rsp); | error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RSP, &rsp); | ||||
▲ Show 20 Lines • Show All 586 Lines • ▼ Show 20 Lines | 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-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-dr1", REQ_ARG, 0, SET_DR1 }, | |||||
{ "set-dr2", REQ_ARG, 0, SET_DR2 }, | |||||
{ "set-dr3", REQ_ARG, 0, SET_DR3 }, | |||||
{ "set-dr6", REQ_ARG, 0, SET_DR6 }, | |||||
{ "set-dr7", REQ_ARG, 0, SET_DR7 }, | { "set-dr7", REQ_ARG, 0, SET_DR7 }, | ||||
{ "set-rsp", REQ_ARG, 0, SET_RSP }, | { "set-rsp", REQ_ARG, 0, SET_RSP }, | ||||
{ "set-rip", REQ_ARG, 0, SET_RIP }, | { "set-rip", REQ_ARG, 0, SET_RIP }, | ||||
{ "set-rax", REQ_ARG, 0, SET_RAX }, | { "set-rax", REQ_ARG, 0, SET_RAX }, | ||||
{ "set-rflags", REQ_ARG, 0, SET_RFLAGS }, | { "set-rflags", REQ_ARG, 0, SET_RFLAGS }, | ||||
{ "desc-base", REQ_ARG, 0, DESC_BASE }, | { "desc-base", REQ_ARG, 0, DESC_BASE }, | ||||
{ "desc-limit", REQ_ARG, 0, DESC_LIMIT }, | { "desc-limit", REQ_ARG, 0, DESC_LIMIT }, | ||||
{ "desc-access",REQ_ARG, 0, DESC_ACCESS }, | { "desc-access",REQ_ARG, 0, DESC_ACCESS }, | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | const struct option common_opts[] = { | ||||
{ "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-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-dr1", NO_ARG, &get_dr1, 1 }, | |||||
{ "get-dr2", NO_ARG, &get_dr2, 1 }, | |||||
{ "get-dr3", NO_ARG, &get_dr3, 1 }, | |||||
{ "get-dr6", NO_ARG, &get_dr6, 1 }, | |||||
{ "get-dr7", NO_ARG, &get_dr7, 1 }, | { "get-dr7", NO_ARG, &get_dr7, 1 }, | ||||
{ "get-rsp", NO_ARG, &get_rsp, 1 }, | { "get-rsp", NO_ARG, &get_rsp, 1 }, | ||||
{ "get-rip", NO_ARG, &get_rip, 1 }, | { "get-rip", NO_ARG, &get_rip, 1 }, | ||||
{ "get-rax", NO_ARG, &get_rax, 1 }, | { "get-rax", NO_ARG, &get_rax, 1 }, | ||||
{ "get-rbx", NO_ARG, &get_rbx, 1 }, | { "get-rbx", NO_ARG, &get_rbx, 1 }, | ||||
{ "get-rcx", NO_ARG, &get_rcx, 1 }, | { "get-rcx", NO_ARG, &get_rcx, 1 }, | ||||
{ "get-rdx", NO_ARG, &get_rdx, 1 }, | { "get-rdx", NO_ARG, &get_rdx, 1 }, | ||||
{ "get-rsi", NO_ARG, &get_rsi, 1 }, | { "get-rsi", NO_ARG, &get_rsi, 1 }, | ||||
▲ Show 20 Lines • Show All 261 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, dr7, rsp, rip, rflags, efer, pat; | uint64_t rax, cr0, cr3, cr4, dr0, dr1, dr2, dr3, dr6, dr7; | ||||
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 30 Lines | while ((ch = getopt_long(argc, argv, "", opts, NULL)) != -1) { | ||||
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; | ||||
case SET_DR0: | |||||
dr0 = strtoul(optarg, NULL, 0); | |||||
set_dr0 = 1; | |||||
break; | |||||
case SET_DR1: | |||||
dr1 = strtoul(optarg, NULL, 0); | |||||
set_dr1 = 1; | |||||
break; | |||||
case SET_DR2: | |||||
dr2 = strtoul(optarg, NULL, 0); | |||||
set_dr2 = 1; | |||||
break; | |||||
case SET_DR3: | |||||
dr3 = strtoul(optarg, NULL, 0); | |||||
set_dr3 = 1; | |||||
break; | |||||
case SET_DR6: | |||||
dr6 = strtoul(optarg, NULL, 0); | |||||
set_dr6 = 1; | |||||
break; | |||||
case SET_DR7: | case SET_DR7: | ||||
dr7 = strtoul(optarg, NULL, 0); | dr7 = strtoul(optarg, NULL, 0); | ||||
set_dr7 = 1; | set_dr7 = 1; | ||||
break; | break; | ||||
case SET_RSP: | case SET_RSP: | ||||
rsp = strtoul(optarg, NULL, 0); | rsp = strtoul(optarg, NULL, 0); | ||||
set_rsp = 1; | set_rsp = 1; | ||||
break; | break; | ||||
▲ Show 20 Lines • Show All 124 Lines • ▼ Show 20 Lines | main(int argc, char *argv[]) | ||||
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_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) | |||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR0, dr0); | |||||
if (!error && set_dr1) | |||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR1, dr1); | |||||
if (!error && set_dr2) | |||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR2, dr2); | |||||
if (!error && set_dr3) | |||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR3, dr3); | |||||
if (!error && set_dr6) | |||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR6, dr6); | |||||
if (!error && set_dr7) | if (!error && set_dr7) | ||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR7, dr7); | error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DR7, dr7); | ||||
if (!error && set_rsp) | if (!error && set_rsp) | ||||
error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSP, rsp); | error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSP, rsp); | ||||
if (!error && set_rip) | if (!error && set_rip) | ||||
▲ Show 20 Lines • Show All 417 Lines • Show Last 20 Lines |