Merge branch 'nohv_v2_wstimer_direct' into 'master'
x86: hyperv-v: Various unmerged patches
See merge request kvm-unit-tests/kvm-unit-tests!52
diff --git a/lib/powerpc/asm/ppc_asm.h b/lib/powerpc/asm/ppc_asm.h
index 46b4be0..52a42df 100644
--- a/lib/powerpc/asm/ppc_asm.h
+++ b/lib/powerpc/asm/ppc_asm.h
@@ -2,6 +2,7 @@
#define _ASMPOWERPC_PPC_ASM_H
#include <asm/asm-offsets.h>
+#include <asm/reg.h>
#define SAVE_GPR(n, base) std n,GPR0+8*(n)(base)
#define REST_GPR(n, base) ld n,GPR0+8*(n)(base)
@@ -35,11 +36,4 @@
#endif /* __BYTE_ORDER__ */
-#define SPR_HSRR0 0x13A
-#define SPR_HSRR1 0x13B
-
-/* Machine State Register definitions: */
-#define MSR_EE_BIT 15 /* External Interrupts Enable */
-#define MSR_SF_BIT 63 /* 64-bit mode */
-
#endif /* _ASMPOWERPC_PPC_ASM_H */
diff --git a/lib/powerpc/asm/processor.h b/lib/powerpc/asm/processor.h
index 4ad6612..e415f92 100644
--- a/lib/powerpc/asm/processor.h
+++ b/lib/powerpc/asm/processor.h
@@ -3,18 +3,13 @@
#include <libcflat.h>
#include <asm/ptrace.h>
+#include <asm/reg.h>
#ifndef __ASSEMBLY__
void handle_exception(int trap, void (*func)(struct pt_regs *, void *), void *);
void do_handle_exception(struct pt_regs *regs);
#endif /* __ASSEMBLY__ */
-#define SPR_TB 0x10c
-#define SPR_SPRG0 0x110
-#define SPR_SPRG1 0x111
-#define SPR_SPRG2 0x112
-#define SPR_SPRG3 0x113
-
static inline uint64_t mfspr(int nr)
{
uint64_t ret;
@@ -43,25 +38,4 @@
asm volatile ("mtmsrd %[msr]" :: [msr] "r" (msr) : "memory");
}
-static inline uint64_t get_tb(void)
-{
- return mfspr(SPR_TB);
-}
-
-extern void delay(uint64_t cycles);
-extern void udelay(uint64_t us);
-extern void sleep_tb(uint64_t cycles);
-extern void usleep(uint64_t us);
-
-static inline void mdelay(uint64_t ms)
-{
- while (ms--)
- udelay(1000);
-}
-
-static inline void msleep(uint64_t ms)
-{
- usleep(ms * 1000);
-}
-
#endif /* _ASMPOWERPC_PROCESSOR_H_ */
diff --git a/lib/powerpc/asm/reg.h b/lib/powerpc/asm/reg.h
new file mode 100644
index 0000000..6810c1d
--- /dev/null
+++ b/lib/powerpc/asm/reg.h
@@ -0,0 +1,30 @@
+#ifndef _ASMPOWERPC_REG_H
+#define _ASMPOWERPC_REG_H
+
+#include <linux/const.h>
+
+#define UL(x) _AC(x, UL)
+
+#define SPR_TB 0x10c
+#define SPR_SPRG0 0x110
+#define SPR_SPRG1 0x111
+#define SPR_SPRG2 0x112
+#define SPR_SPRG3 0x113
+#define SPR_PVR 0x11f
+#define PVR_VERSION_MASK UL(0xffff0000)
+#define PVR_VER_970 UL(0x00390000)
+#define PVR_VER_970FX UL(0x003c0000)
+#define PVR_VER_970MP UL(0x00440000)
+#define PVR_VER_POWER8E UL(0x004b0000)
+#define PVR_VER_POWER8NVL UL(0x004c0000)
+#define PVR_VER_POWER8 UL(0x004d0000)
+#define PVR_VER_POWER9 UL(0x004e0000)
+#define PVR_VER_POWER10 UL(0x00800000)
+#define SPR_HSRR0 0x13a
+#define SPR_HSRR1 0x13b
+
+/* Machine State Register definitions: */
+#define MSR_EE_BIT 15 /* External Interrupts Enable */
+#define MSR_SF_BIT 63 /* 64-bit mode */
+
+#endif
diff --git a/lib/powerpc/asm/time.h b/lib/powerpc/asm/time.h
new file mode 100644
index 0000000..a1f0729
--- /dev/null
+++ b/lib/powerpc/asm/time.h
@@ -0,0 +1,31 @@
+#ifndef _ASMPOWERPC_TIME_H_
+#define _ASMPOWERPC_TIME_H_
+
+#include <libcflat.h>
+#include <asm/processor.h>
+#include <asm/reg.h>
+
+static inline uint64_t get_tb(void)
+{
+ return mfspr(SPR_TB);
+}
+
+extern uint64_t get_clock_us(void);
+extern uint64_t get_clock_ms(void);
+extern void delay(uint64_t cycles);
+extern void udelay(uint64_t us);
+extern void sleep_tb(uint64_t cycles);
+extern void usleep(uint64_t us);
+
+static inline void mdelay(uint64_t ms)
+{
+ while (ms--)
+ udelay(1000);
+}
+
+static inline void msleep(uint64_t ms)
+{
+ usleep(ms * 1000);
+}
+
+#endif /* _ASMPOWERPC_TIME_H_ */
diff --git a/lib/powerpc/processor.c b/lib/powerpc/processor.c
index b224fc8..ad0d956 100644
--- a/lib/powerpc/processor.c
+++ b/lib/powerpc/processor.c
@@ -7,6 +7,7 @@
#include <libcflat.h>
#include <asm/processor.h>
+#include <asm/time.h>
#include <asm/ptrace.h>
#include <asm/setup.h>
#include <asm/barrier.h>
@@ -54,6 +55,16 @@
abort();
}
+uint64_t get_clock_us(void)
+{
+ return get_tb() * 1000000 / tb_hz;
+}
+
+uint64_t get_clock_ms(void)
+{
+ return get_tb() * 1000 / tb_hz;
+}
+
void delay(uint64_t cycles)
{
uint64_t start = get_tb();
diff --git a/lib/powerpc/smp.c b/lib/powerpc/smp.c
index afe4361..3e211eb 100644
--- a/lib/powerpc/smp.c
+++ b/lib/powerpc/smp.c
@@ -7,6 +7,7 @@
*/
#include <devicetree.h>
+#include <asm/time.h>
#include <asm/setup.h>
#include <asm/rtas.h>
#include <asm/smp.h>
diff --git a/lib/ppc64/asm/reg.h b/lib/ppc64/asm/reg.h
new file mode 100644
index 0000000..bc407b5
--- /dev/null
+++ b/lib/ppc64/asm/reg.h
@@ -0,0 +1 @@
+#include "../../powerpc/asm/reg.h"
diff --git a/lib/ppc64/asm/time.h b/lib/ppc64/asm/time.h
new file mode 100644
index 0000000..326d288
--- /dev/null
+++ b/lib/ppc64/asm/time.h
@@ -0,0 +1 @@
+#include "../../powerpc/asm/time.h"
diff --git a/powerpc/spapr_vpa.c b/powerpc/spapr_vpa.c
index 6a3fe5e..c2075e1 100644
--- a/powerpc/spapr_vpa.c
+++ b/powerpc/spapr_vpa.c
@@ -10,6 +10,7 @@
#include <util.h>
#include <alloc.h>
#include <asm/processor.h>
+#include <asm/time.h>
#include <asm/setup.h>
#include <asm/hcall.h>
#include <asm/vpa.h>
diff --git a/powerpc/sprs.c b/powerpc/sprs.c
index 57e487c..a19d80a 100644
--- a/powerpc/sprs.c
+++ b/powerpc/sprs.c
@@ -23,9 +23,11 @@
#include <util.h>
#include <migrate.h>
#include <alloc.h>
+#include <asm/ppc_asm.h>
#include <asm/handlers.h>
#include <asm/hcall.h>
#include <asm/processor.h>
+#include <asm/time.h>
#include <asm/barrier.h>
uint64_t before[1024], after[1024];
@@ -119,25 +121,23 @@
static void set_sprs(uint64_t val)
{
- uint32_t pvr = mfspr(287); /* Processor Version Register */
-
set_sprs_common(val);
- switch (pvr >> 16) {
- case 0x39: /* PPC970 */
- case 0x3C: /* PPC970FX */
- case 0x44: /* PPC970MP */
+ switch (mfspr(SPR_PVR) & PVR_VERSION_MASK) {
+ case PVR_VER_970:
+ case PVR_VER_970FX:
+ case PVR_VER_970MP:
set_sprs_book3s_201(val);
break;
- case 0x4b: /* POWER8E */
- case 0x4c: /* POWER8NVL */
- case 0x4d: /* POWER8 */
+ case PVR_VER_POWER8E:
+ case PVR_VER_POWER8NVL:
+ case PVR_VER_POWER8:
set_sprs_book3s_207(val);
break;
- case 0x4e: /* POWER9 */
+ case PVR_VER_POWER9:
set_sprs_book3s_300(val);
break;
- case 0x80: /* POWER10 */
+ case PVR_VER_POWER10:
set_sprs_book3s_31(val);
break;
default:
diff --git a/powerpc/tm.c b/powerpc/tm.c
index 7fa9163..6b1ceeb 100644
--- a/powerpc/tm.c
+++ b/powerpc/tm.c
@@ -8,6 +8,7 @@
#include <libcflat.h>
#include <asm/hcall.h>
#include <asm/processor.h>
+#include <asm/time.h>
#include <asm/handlers.h>
#include <asm/smp.h>
#include <asm/setup.h>
diff --git a/s390x/snippets/c/sie-dat.c b/s390x/snippets/c/sie-dat.c
index ecfcb60..9d89801 100644
--- a/s390x/snippets/c/sie-dat.c
+++ b/s390x/snippets/c/sie-dat.c
@@ -9,6 +9,7 @@
*/
#include <libcflat.h>
#include <asm-generic/page.h>
+#include <asm/mem.h>
#include "sie-dat.h"
static uint8_t test_pages[GUEST_TEST_PAGE_COUNT * PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
@@ -47,7 +48,7 @@
force_exit();
/* the first unmapped address */
- invalid_ptr = (uint8_t *)(GUEST_TOTAL_PAGE_COUNT * PAGE_SIZE);
+ invalid_ptr = OPAQUE_PTR(GUEST_TOTAL_PAGE_COUNT * PAGE_SIZE);
*invalid_ptr = 42;
/* indicate we've written the non-allowed page (should never get here) */
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 2214d94..413f3ed 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -237,12 +237,8 @@
echo > ${dst_infifo}
rm ${dst_infifo}
- # Ensure the incoming socket is removed, ready for next destination
- if [ -S ${dst_incoming} ] ; then
- echo "ERROR: Incoming migration socket not removed after migration." >& 2
- qmp ${dst_qmp} '"quit"'> ${dst_qmpout} 2>/dev/null
- return 2
- fi
+ # Wait for the incoming socket being removed, ready for next destination
+ while [ -S ${dst_incoming} ] ; do sleep 0.1 ; done
wait ${live_pid}
ret=$?