|
@@ -32,6 +32,12 @@
|
|
#include <asm/opal.h>
|
|
#include <asm/opal.h>
|
|
#include <asm/xive-regs.h>
|
|
#include <asm/xive-regs.h>
|
|
|
|
|
|
|
|
+/* Sign-extend HDEC if not on POWER9 */
|
|
|
|
+#define EXTEND_HDEC(reg) \
|
|
|
|
+BEGIN_FTR_SECTION; \
|
|
|
|
+ extsw reg, reg; \
|
|
|
|
+END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
|
|
|
|
+
|
|
#define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM)
|
|
#define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM)
|
|
|
|
|
|
/* Values in HSTATE_NAPPING(r13) */
|
|
/* Values in HSTATE_NAPPING(r13) */
|
|
@@ -214,6 +220,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
|
kvmppc_primary_no_guest:
|
|
kvmppc_primary_no_guest:
|
|
/* We handle this much like a ceded vcpu */
|
|
/* We handle this much like a ceded vcpu */
|
|
/* put the HDEC into the DEC, since HDEC interrupts don't wake us */
|
|
/* put the HDEC into the DEC, since HDEC interrupts don't wake us */
|
|
|
|
+ /* HDEC may be larger than DEC for arch >= v3.00, but since the */
|
|
|
|
+ /* HDEC value came from DEC in the first place, it will fit */
|
|
mfspr r3, SPRN_HDEC
|
|
mfspr r3, SPRN_HDEC
|
|
mtspr SPRN_DEC, r3
|
|
mtspr SPRN_DEC, r3
|
|
/*
|
|
/*
|
|
@@ -295,8 +303,9 @@ kvm_novcpu_wakeup:
|
|
|
|
|
|
/* See if our timeslice has expired (HDEC is negative) */
|
|
/* See if our timeslice has expired (HDEC is negative) */
|
|
mfspr r0, SPRN_HDEC
|
|
mfspr r0, SPRN_HDEC
|
|
|
|
+ EXTEND_HDEC(r0)
|
|
li r12, BOOK3S_INTERRUPT_HV_DECREMENTER
|
|
li r12, BOOK3S_INTERRUPT_HV_DECREMENTER
|
|
- cmpwi r0, 0
|
|
|
|
|
|
+ cmpdi r0, 0
|
|
blt kvm_novcpu_exit
|
|
blt kvm_novcpu_exit
|
|
|
|
|
|
/* Got an IPI but other vcpus aren't yet exiting, must be a latecomer */
|
|
/* Got an IPI but other vcpus aren't yet exiting, must be a latecomer */
|
|
@@ -390,8 +399,8 @@ kvm_secondary_got_guest:
|
|
lbz r4, HSTATE_PTID(r13)
|
|
lbz r4, HSTATE_PTID(r13)
|
|
cmpwi r4, 0
|
|
cmpwi r4, 0
|
|
bne 63f
|
|
bne 63f
|
|
- lis r6, 0x7fff
|
|
|
|
- ori r6, r6, 0xffff
|
|
|
|
|
|
+ LOAD_REG_ADDR(r6, decrementer_max)
|
|
|
|
+ ld r6, 0(r6)
|
|
mtspr SPRN_HDEC, r6
|
|
mtspr SPRN_HDEC, r6
|
|
/* and set per-LPAR registers, if doing dynamic micro-threading */
|
|
/* and set per-LPAR registers, if doing dynamic micro-threading */
|
|
ld r6, HSTATE_SPLIT_MODE(r13)
|
|
ld r6, HSTATE_SPLIT_MODE(r13)
|
|
@@ -968,7 +977,8 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
|
|
|
|
|
|
/* Check if HDEC expires soon */
|
|
/* Check if HDEC expires soon */
|
|
mfspr r3, SPRN_HDEC
|
|
mfspr r3, SPRN_HDEC
|
|
- cmpwi r3, 512 /* 1 microsecond */
|
|
|
|
|
|
+ EXTEND_HDEC(r3)
|
|
|
|
+ cmpdi r3, 512 /* 1 microsecond */
|
|
blt hdec_soon
|
|
blt hdec_soon
|
|
|
|
|
|
#ifdef CONFIG_KVM_XICS
|
|
#ifdef CONFIG_KVM_XICS
|
|
@@ -2366,12 +2376,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_TM)
|
|
mfspr r3, SPRN_DEC
|
|
mfspr r3, SPRN_DEC
|
|
mfspr r4, SPRN_HDEC
|
|
mfspr r4, SPRN_HDEC
|
|
mftb r5
|
|
mftb r5
|
|
- cmpw r3, r4
|
|
|
|
|
|
+ extsw r3, r3
|
|
|
|
+ EXTEND_HDEC(r4)
|
|
|
|
+ cmpd r3, r4
|
|
ble 67f
|
|
ble 67f
|
|
mtspr SPRN_DEC, r4
|
|
mtspr SPRN_DEC, r4
|
|
67:
|
|
67:
|
|
/* save expiry time of guest decrementer */
|
|
/* save expiry time of guest decrementer */
|
|
- extsw r3, r3
|
|
|
|
add r3, r3, r5
|
|
add r3, r3, r5
|
|
ld r4, HSTATE_KVM_VCPU(r13)
|
|
ld r4, HSTATE_KVM_VCPU(r13)
|
|
ld r5, HSTATE_KVM_VCORE(r13)
|
|
ld r5, HSTATE_KVM_VCORE(r13)
|