linux_dsm_epyc7002/arch/mips
James Hogan f82393426a MIPS: KVM: Add master disable count interface
Expose two new virtual registers to userland via the
KVM_{GET,SET}_ONE_REG ioctls.

KVM_REG_MIPS_COUNT_CTL is for timer configuration fields and just
contains a master disable count bit. This can be used by userland to
freeze the timer in order to read a consistent state from the timer
count value and timer interrupt pending bit. This cannot be done with
the CP0_Cause.DC bit because the timer interrupt pending bit (TI) is
also in CP0_Cause so it would be impossible to stop the timer without
also risking a race with an hrtimer interrupt and having to explicitly
check whether an interrupt should have occurred.

When the timer is re-enabled it resumes without losing time, i.e. the
CP0_Count value jumps to what it would have been had the timer not been
disabled, which would also be impossible to do from userland with
CP0_Cause.DC. The timer interrupt also cannot be lost, i.e. if a timer
interrupt would have occurred had the timer not been disabled it is
queued when the timer is re-enabled.

This works by storing the nanosecond monotonic time when the master
disable is set, and using it for various operations instead of the
current monotonic time (e.g. when recalculating the bias when the
CP0_Count is set), until the master disable is cleared again, i.e. the
timer state is read/written as it would have been at that time. This
state is exposed to userland via the read-only KVM_REG_MIPS_COUNT_RESUME
virtual register so that userland can determine the exact time the
master disable took effect.

This should allow userland to atomically save the state of the timer,
and later restore it.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Gleb Natapov <gleb@kernel.org>
Cc: kvm@vger.kernel.org
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: David Daney <david.daney@cavium.com>
Cc: Sanjay Lal <sanjayl@kymasys.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2014-05-30 13:02:45 +02:00
..
alchemy Merge branch '3.14-fixes' into mips-for-linux-next 2014-03-31 18:17:33 +02:00
ar7 MIPS: Restore init.h usage to arch/mips/ar7/time.c 2014-03-26 23:09:23 +01:00
ath79 usb: host: remove selects of USB_ARCH_HAS_?HCI 2014-02-18 12:36:38 -08:00
bcm47xx Merge branch '3.14-fixes' into mips-for-linux-next 2014-03-31 18:17:33 +02:00
bcm63xx MIPS: Use current_cpu_type() instead of c->cputype 2014-03-31 18:17:12 +02:00
boot mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
cavium-octeon MIPS: Octeon: Fix warning in of_device_alloc on cn3xxx 2014-03-19 23:50:30 +01:00
cobalt MIPS: Cobalt: Move to 8250/16550 serial early printk driver 2013-10-29 21:24:38 +01:00
configs MIPS: Loongson: Add a Loongson-3 default config file 2014-03-31 18:17:12 +02:00
dec DEC: Whitespace cleanup 2013-10-29 21:24:44 +01:00
emma MIPS: Remove panic_timeout settings 2013-11-26 12:12:27 +01:00
fw mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
include MIPS: KVM: Add master disable count interface 2014-05-30 13:02:45 +02:00
jazz Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2013-03-02 07:44:16 -08:00
jz4740 mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
kernel Merge git://git.infradead.org/users/eparis/audit 2014-04-12 12:38:53 -07:00
kvm MIPS: KVM: Add master disable count interface 2014-05-30 13:02:45 +02:00
lantiq mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
lasat MIPS: Lasat: Replace del_timer by del_timer_sync 2014-03-31 18:17:12 +02:00
lib MIPS: lib: csum_partial: Add EVA support 2014-03-26 23:09:17 +01:00
loongson cpufreq: create another field .flags in cpufreq_frequency_table 2014-04-07 14:43:50 +02:00
loongson1 MIPS: Idle: Consolidate all declarations in <asm/idle.h>. 2013-05-22 01:34:27 +02:00
math-emu Merge branch '3.14-fixes' into mips-for-linux-next 2014-03-31 18:17:33 +02:00
mm MIPS: Export local_flush_icache_range for KVM 2014-05-30 12:59:28 +02:00
mti-malta MIPS: KVM: Override guest kernel timer frequency directly 2014-05-30 13:02:23 +02:00
mti-sead3 MIPS: SEAD3: Don't use module_init in non-modular sead3-mtd.c code 2014-03-31 18:17:12 +02:00
netlogic Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2014-01-30 17:20:32 -08:00
oprofile MIPS: Add support for the M5150 processor 2014-03-26 23:09:22 +01:00
pci Merge branch '3.14-fixes' into mips-for-linux-next 2014-03-31 18:17:33 +02:00
pmcs-msp71xx MIPS: Fix gigaton of warning building with microMIPS. 2014-03-31 18:17:12 +02:00
pnx833x MIPS: PNX833x: PNX8335_PCI_ETHERNET_INT depends on CONFIG_SOC_PNX8335 2013-08-05 13:34:22 +02:00
power MIPS: Hibernate: Flush TLB entries in swsusp_arch_resume() 2014-03-31 10:16:53 +02:00
ralink usb: host: remove selects of USB_ARCH_HAS_?HCI 2014-02-18 12:36:38 -08:00
rb532 MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
sgi-ip22 mips: Use the core irq stats function 2014-03-04 17:37:53 +01:00
sgi-ip27 mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
sgi-ip32 MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
sibyte mips: Validate online cpus in irq_set_affinity() callbacks 2014-03-12 13:07:40 +01:00
sni MIPS: Cleanup CP0 PRId and CP1 FPIR register access masks 2013-09-18 20:25:19 +02:00
txx9 MIPS: TXx9: Fix build error if CONFIG_TOSHIBA_JMR3927 is not selected 2013-09-03 15:30:50 +02:00
vr41xx MIPS: Idle: Consolidate all declarations in <asm/idle.h>. 2013-05-22 01:34:27 +02:00
Kbuild KVM/MIPS32: Infrastructure/build files. 2013-05-08 03:55:34 +02:00
Kbuild.platforms MIPS: PowerTV: Remove support code. 2013-10-29 21:25:17 +01:00
Kconfig MIPS: KVM: Override guest kernel timer frequency directly 2014-05-30 13:02:23 +02:00
Kconfig.debug MIPS: Fix build error due to multiple prom_putchar() definitions. 2014-03-31 10:16:52 +02:00
Makefile MIPS: Add MSA register definitions & access 2014-03-26 23:09:10 +01:00