diff options
author | Paul Mackerras <paulus@samba.org> | 2013-09-20 00:52:39 -0400 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-10-17 08:45:02 -0400 |
commit | 4b8473c9c19dff1b0c672f182cc50b9952cf42e7 (patch) | |
tree | c4e91c0612665859589f0cf12d32eff6c8af4990 /arch/powerpc/include/asm/exception-64s.h | |
parent | a0144e2a6b0b4a137a32f0102354782547bf0935 (diff) |
KVM: PPC: Book3S HV: Add support for guest Program Priority Register
POWER7 and later IBM server processors have a register called the
Program Priority Register (PPR), which controls the priority of
each hardware CPU SMT thread, and affects how fast it runs compared
to other SMT threads. This priority can be controlled by writing to
the PPR or by use of a set of instructions of the form or rN,rN,rN
which are otherwise no-ops but have been defined to set the priority
to particular levels.
This adds code to context switch the PPR when entering and exiting
guests and to make the PPR value accessible through the SET/GET_ONE_REG
interface. When entering the guest, we set the PPR as late as
possible, because if we are setting a low thread priority it will
make the code run slowly from that point on. Similarly, the
first-level interrupt handlers save the PPR value in the PACA very
early on, and set the thread priority to the medium level, so that
the interrupt handling code runs at a reasonable speed.
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/include/asm/exception-64s.h')
-rw-r--r-- | arch/powerpc/include/asm/exception-64s.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index cca12f084842..402c1c466509 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -204,6 +204,10 @@ do_kvm_##n: \ | |||
204 | ld r10,area+EX_CFAR(r13); \ | 204 | ld r10,area+EX_CFAR(r13); \ |
205 | std r10,HSTATE_CFAR(r13); \ | 205 | std r10,HSTATE_CFAR(r13); \ |
206 | END_FTR_SECTION_NESTED(CPU_FTR_CFAR,CPU_FTR_CFAR,947); \ | 206 | END_FTR_SECTION_NESTED(CPU_FTR_CFAR,CPU_FTR_CFAR,947); \ |
207 | BEGIN_FTR_SECTION_NESTED(948) \ | ||
208 | ld r10,area+EX_PPR(r13); \ | ||
209 | std r10,HSTATE_PPR(r13); \ | ||
210 | END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948); \ | ||
207 | ld r10,area+EX_R10(r13); \ | 211 | ld r10,area+EX_R10(r13); \ |
208 | stw r9,HSTATE_SCRATCH1(r13); \ | 212 | stw r9,HSTATE_SCRATCH1(r13); \ |
209 | ld r9,area+EX_R9(r13); \ | 213 | ld r9,area+EX_R9(r13); \ |
@@ -217,6 +221,10 @@ do_kvm_##n: \ | |||
217 | ld r10,area+EX_R10(r13); \ | 221 | ld r10,area+EX_R10(r13); \ |
218 | beq 89f; \ | 222 | beq 89f; \ |
219 | stw r9,HSTATE_SCRATCH1(r13); \ | 223 | stw r9,HSTATE_SCRATCH1(r13); \ |
224 | BEGIN_FTR_SECTION_NESTED(948) \ | ||
225 | ld r9,area+EX_PPR(r13); \ | ||
226 | std r9,HSTATE_PPR(r13); \ | ||
227 | END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948); \ | ||
220 | ld r9,area+EX_R9(r13); \ | 228 | ld r9,area+EX_R9(r13); \ |
221 | std r12,HSTATE_SCRATCH0(r13); \ | 229 | std r12,HSTATE_SCRATCH0(r13); \ |
222 | li r12,n; \ | 230 | li r12,n; \ |