Monday, July 31, 2017

Re: Calculate the frequency of the tsc timecounter

On Tue, Aug 1, 2017 at 7:26 AM, Adam Steen <adam@adamsteen.com.au> wrote:
> 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.

One more thing

Please note currently i have to build the bootable binary image of
solo5 with a cross compiler as i have not figured out the
discrepancies between OpenBSD's ld and solo5's linker script.

Cheers
Adam

No comments:

Post a Comment