[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 3/3] plat/kvm: Add KVM (x86_64) timer support
Hi Costin, > -----Original Message----- > From: Minios-devel <minios-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of > Costin Lupu > Sent: 2018年5月1日 7:55 > To: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>; minios-devel@xxxxxxxxxxxxx > Subject: Re: [Minios-devel] [UNIKRAFT PATCH 3/3] plat/kvm: Add KVM (x86_64) > timer support > > On 04/30/2018 03:44 PM, Simon Kuenzer wrote: > > See my comments inline. > > > > On 05.04.2018 17:21, Costin Lupu wrote: > >> We are using TSC clock as main timer on KVM. > >> > >> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> > >> --- > >> plat/kvm/Makefile.uk | 3 + > >> plat/kvm/clock_subr.c | 226 ++++++++++++++++++++++++ > >> plat/kvm/include/kvm/clock_subr.h | 83 +++++++++ > >> plat/kvm/include/kvm/tscclock.h | 42 +++++ > >> plat/kvm/irq.c | 10 ++ > >> plat/kvm/time.c | 62 +++++++ > >> plat/kvm/tscclock.c | 356 [...] trimming for easy reading > >> +/* > >> + * Calibrate TSC and initialise TSC clock. > >> + */ > >> +int tscclock_init(void) > >> +{ > >> + __u64 tsc_freq, rtc_boot; > >> + > >> + /* Initialise i8254 timer channel 0 to mode 2 at 100 Hz */ > >> + outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT); > >> + outb(TIMER_CNTR, (TIMER_HZ / 100) & 0xff); > >> + outb(TIMER_CNTR, (TIMER_HZ / 100) >> 8); > >> + > >> + /* > >> + * Read RTC "time at boot". This must be done just before > >> tsc_base is > >> + * initialised in order to get a correct offset below. > >> + */ > >> + rtc_boot = rtc_gettimeofday(); > >> + > >> + /* > >> + * Calculate TSC frequency by calibrating against an 0.1s delay > >> + * using the i8254 timer. > >> + */ > > > > Wow, this is adds a 100ms boot delay to the Unikernels on KVM. Can you > > put an TODO comment for revisiting this later? Maybe we can find a > > different method to get the correct value for the TSC frequency. > > Right. > It seems that QEMU-KVM publish TSC frequency to the guest OS in CPUID page 0x40000010. Can we read the tsc_freq from CPUID just like VMWare does? > >> + tsc_base = rdtsc(); > >> + i8254_delay(100000); > >> + tsc_freq = (rdtsc() - tsc_base) * 10; > >> + uk_printd(DLVL_INFO, > >> + "Clock source: TSC, frequency estimate is %llu Hz\n", > >> + (unsigned long long) tsc_freq); //TODO > >> + > >> + /* > >> + * Calculate TSC scaling multiplier. > >> + * > >> + * (0.32) tsc_mult = NSEC_PER_SEC (32.32) / tsc_freq (32.0) > >> + */ > >> + tsc_mult = (NSEC_PER_SEC << 32) / tsc_freq; > >> + > >> + /* > >> + * Monotonic time begins at tsc_base (first read of TSC before > >> + * calibration). > >> + */ > >> + time_base = mul64_32(tsc_base, tsc_mult); > >> + > >> + /* > >> + * Compute RTC epoch offset by subtracting monotonic time_base > >> from RTC > >> + * time at boot. > >> + */ > >> + rtc_epochoffset = rtc_boot - time_base; > >> + > >> + /* > >> + * Initialise i8254 timer channel 0 to mode 4 (one shot). > >> + */ > >> + outb(TIMER_MODE, TIMER_SEL0 | TIMER_ONESHOT | TIMER_16BIT); > >> + > >> + return 0; > >> +} _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |