Mike Belopuhov wrote: > To be able to use TSC as a timecounter source on OpenBSD or Solo5 > you'd have to improve the in-kernel measurement of the TSC frequency > first. I've tried to perform 10 measurements and take an average and > it does improve accuracy, however I believe we need to poach another > bit from Linux and re-calibrate TSC via HPET: > > > http://elixir.free-electrons.com/linux/v4.12.4/source/arch/x86/kernel/tsc.c#L409 > > I think this is the most sane thing we can do. Here's a complete > procedure that Linux kernel undertakes: > > > http://elixir.free-electrons.com/linux/v4.12.4/source/arch/x86/kernel/tsc.c#L751 > > Regards, > Mike
Looks like i have more sort out! Mike Larkin wrote: > If you point me to a bootable image that causes this failure, I might be > able to figure out what vmm(4) doesn't like. > > Nothing in lines 122-134 of the file indicated above should cause this. This is where things get a little more interesting, Solo5 (https://github.com/adamsteen/solo5) is actually two parts Solo5 the Unikernel and ukvm the userland side of a hypervisor (currently running with kvm and bhyve), I have been porting to run ukvm directly with vmm. I expect the cause of "vmx_handle_exit: unhandled exit 2147483681 (unknown)" is the register setup in https://github.com/adamsteen/solo5/blob/master/ukvm/ukvm_hv_openbsd_x86_64.c, lines 118-147 the constants are ukvm constants. struct vm_resetcpu_params vrp = { .vrp_vm_id = hvb->vcp_id, .vrp_vcpu_id = hvb->vcpu_id, .vrp_init_state = { .vrs_gprs[VCPU_REGS_RFLAGS] = X86_RFLAGS_INIT, .vrs_gprs[VCPU_REGS_RIP] = gpa_ep, .vrs_gprs[VCPU_REGS_RSP] = hv->mem_size - 8, .vrs_gprs[VCPU_REGS_RDI] = X86_BOOT_INFO_BASE, .vrs_crs[VCPU_REGS_CR0] = X86_CR0_INIT, .vrs_crs[VCPU_REGS_CR3] = X86_CR3_INIT, .vrs_crs[VCPU_REGS_CR4] = X86_CR4_INIT, .vrs_sregs[VCPU_REGS_CS] = sreg_to_vsi(&ukvm_x86_sreg_code), .vrs_sregs[VCPU_REGS_DS] = sreg_to_vsi(&ukvm_x86_sreg_data), .vrs_sregs[VCPU_REGS_ES] = sreg_to_vsi(&ukvm_x86_sreg_data), .vrs_sregs[VCPU_REGS_FS] = sreg_to_vsi(&ukvm_x86_sreg_data), .vrs_sregs[VCPU_REGS_GS] = sreg_to_vsi(&ukvm_x86_sreg_data), .vrs_sregs[VCPU_REGS_SS] = sreg_to_vsi(&ukvm_x86_sreg_data), .vrs_gdtr = { 0x0, X86_GDTR_LIMIT, 0x0, X86_GDT_BASE}, .vrs_idtr = { 0x0, 0xFFFF, 0x0, 0x0}, .vrs_sregs[VCPU_REGS_LDTR] = sreg_to_vsi(&ukvm_x86_sreg_unusable), .vrs_sregs[VCPU_REGS_TR] = sreg_to_vsi(&ukvm_x86_sreg_tr), .vrs_msrs[VCPU_REGS_EFER] = X86_EFER_INIT, .vrs_msrs[VCPU_REGS_STAR] = 0ULL, .vrs_msrs[VCPU_REGS_LSTAR] = 0ULL, .vrs_msrs[VCPU_REGS_CSTAR] = 0ULL, .vrs_msrs[VCPU_REGS_SFMASK] = 0ULL, .vrs_msrs[VCPU_REGS_KGSBASE] = 0ULL, .vrs_crs[VCPU_REGS_XCR0] = XCR0_X87 } }; the three specific OpenBSD files are https://github.com/adamsteen/solo5/blob/master/ukvm/ukvm_hv_openbsd.h https://github.com/adamsteen/solo5/blob/master/ukvm/ukvm_hv_openbsd.c https://github.com/adamsteen/solo5/blob/master/ukvm/ukvm_hv_openbsd_x86_64.c with small changes in ukvm/ukvm_elf.c and ukvm/ukvm_module_net.c I could upload a binary image for you but It won't run with vmd its has ukvm specific hypercalls designed to simplify things. Cheers Adam ps i am currently trying to document the differences in what vmm is expecting and ukvm is expecting.

