Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 424c32f1 authored by Glauber Costa's avatar Glauber Costa Committed by Avi Kivity
Browse files

x86, paravirt: Enable pvclock flags in vcpu_time_info structure



This patch removes one padding byte and transform it into a flags
field. New versions of guests using pvclock will query these flags
upon each read.

Flags, however, will only be interpreted when the guest decides to.
It uses the pvclock_valid_flags function to signal that a specific
set of flags should be taken into consideration. Which flags are valid
are usually devised via HV negotiation.

Signed-off-by: default avatarGlauber Costa <glommer@redhat.com>
CC: Jeremy Fitzhardinge <jeremy@goop.org>
Acked-by: default avatarZachary Amsden <zamsden@redhat.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent b69e8cae
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -29,7 +29,8 @@ struct pvclock_vcpu_time_info {
	u64   system_time;
	u32   tsc_to_system_mul;
	s8    tsc_shift;
	u8    pad[3];
	u8    flags;
	u8    pad[2];
} __attribute__((__packed__)); /* 32 bytes */

struct pvclock_wall_clock {
+1 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@

/* some helper functions for xen and kvm pv clock sources */
cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src);
void pvclock_set_flags(u8 flags);
unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
			    struct pvclock_vcpu_time_info *vcpu,
+9 −0
Original line number Diff line number Diff line
@@ -31,8 +31,16 @@ struct pvclock_shadow_time {
	u32 tsc_to_nsec_mul;
	int tsc_shift;
	u32 version;
	u8  flags;
};

static u8 valid_flags __read_mostly = 0;

void pvclock_set_flags(u8 flags)
{
	valid_flags = flags;
}

/*
 * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
 * yielding a 64-bit result.
@@ -91,6 +99,7 @@ static unsigned pvclock_get_time_values(struct pvclock_shadow_time *dst,
		dst->system_timestamp  = src->system_time;
		dst->tsc_to_nsec_mul   = src->tsc_to_system_mul;
		dst->tsc_shift         = src->tsc_shift;
		dst->flags             = src->flags;
		rmb();		/* test version after fetching data */
	} while ((src->version & 1) || (dst->version != src->version));