On 2013年04月26日 11:51, Paul Mackerras wrote: > Building a 64-bit powerpc kernel with PR KVM enabled currently gives > this error: > > AS arch/powerpc/kernel/head_64.o > arch/powerpc/kernel/exceptions-64s.S: Assembler messages: > arch/powerpc/kernel/exceptions-64s.S:258: Error: attempt to move .org > backwards > make[2]: *** [arch/powerpc/kernel/head_64.o] Error 1 > > This happens because the MASKABLE_EXCEPTION_PSERIES macro turns into > 33 instructions, but we only have space for 32 at the decrementer > interrupt vector (from 0x900 to 0x980). > > In the code generated by the MASKABLE_EXCEPTION_PSERIES macro, we > currently have two instances of the HMT_MEDIUM macro, which has the > effect of setting the SMT thread priority to medium. One is the > first instruction, and is overwritten by a no-op on processors where > we save the PPR (processor priority register), that is, POWER7 or > later. The other is after we have saved the PPR. > > In order to reduce the code at 0x900 by one instruction, we omit the > first HMT_MEDIUM. On processors without SMT this will have no effect > since HMT_MEDIUM is a no-op there. On POWER5 and RS64 machines this > will mean that the first few instructions take a little longer in the > case where a decrementer interrupt occurs when the hardware thread is > running at low SMT priority. On POWER6 and later machines, the > hardware automatically boosts the thread priority when a decrementer > interrupt is taken if the thread priority was below medium, so this > change won't make any difference. > > The alternative would be to branch out of line after saving the CFAR. > However, that would incur an extra overhead on all processors, whereas > the approach adopted here only adds overhead on older threaded processors. > > Signed-off-by: Paul Mackerras <pau...@samba.org> > ---
Hello Mike: Please try Paul's patch, firstly. :-) Thanks. > arch/powerpc/include/asm/exception-64s.h | 2 +- > arch/powerpc/kernel/exceptions-64s.S | 7 ++++++- > 2 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/include/asm/exception-64s.h > b/arch/powerpc/include/asm/exception-64s.h > index 05e6d2e..8e5fae8 100644 > --- a/arch/powerpc/include/asm/exception-64s.h > +++ b/arch/powerpc/include/asm/exception-64s.h > @@ -414,7 +414,6 @@ label##_relon_hv: > \ > #define SOFTEN_NOTEST_HV(vec) _SOFTEN_TEST(EXC_HV, vec) > > #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ > - HMT_MEDIUM_PPR_DISCARD; \ > SET_SCRATCH0(r13); /* save r13 */ \ > EXCEPTION_PROLOG_0(PACA_EXGEN); \ > __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ > @@ -427,6 +426,7 @@ label##_relon_hv: > \ > . = loc; \ > .globl label##_pSeries; \ > label##_pSeries: \ > + HMT_MEDIUM_PPR_DISCARD; \ > _MASKABLE_EXCEPTION_PSERIES(vec, label, \ > EXC_STD, SOFTEN_TEST_PR) > > diff --git a/arch/powerpc/kernel/exceptions-64s.S > b/arch/powerpc/kernel/exceptions-64s.S > index 56bd923..574db3f 100644 > --- a/arch/powerpc/kernel/exceptions-64s.S > +++ b/arch/powerpc/kernel/exceptions-64s.S > @@ -235,6 +235,7 @@ instruction_access_slb_pSeries: > .globl hardware_interrupt_hv; > hardware_interrupt_pSeries: > hardware_interrupt_hv: > + HMT_MEDIUM_PPR_DISCARD > BEGIN_FTR_SECTION > _MASKABLE_EXCEPTION_PSERIES(0x502, hardware_interrupt, > EXC_HV, SOFTEN_TEST_HV) > @@ -254,7 +255,11 @@ hardware_interrupt_hv: > STD_EXCEPTION_PSERIES(0x800, 0x800, fp_unavailable) > KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800) > > - MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer) > + . = 0x900 > + .globl decrementer_pSeries > +decrementer_pSeries: > + _MASKABLE_EXCEPTION_PSERIES(0x900, decrementer, EXC_STD, SOFTEN_TEST_PR) > + > STD_EXCEPTION_HV(0x980, 0x982, hdecrementer) > > MASKABLE_EXCEPTION_PSERIES(0xa00, 0xa00, doorbell_super) > -- Chen Gang Asianux Corporation _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev