Monday, July 31, 2017

Re: Calculate the frequency of the tsc timecounter

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.

No comments:

Post a Comment