On Nov 21, 2007, at 7:09 AM, Geert Uytterhoeven wrote:

> On Tue, 20 Nov 2007, Kumar Gala wrote:
>> On Nov 20, 2007, at 11:54 AM, Scott Wood wrote:
>>> On Mon, Nov 19, 2007 at 09:36:57PM -0600, Kumar Gala wrote:
>>>> isel (Integer Select) is a new user space instruction in the
>>>> PowerISA 2.04 spec.  Not all processors implement it so lets  
>>>> emulate
>>>> to ensure code built with isel will run everywhere.
>>>
>>> Given that the instruction is meant to be a performance enhancement,
>>> we should probably warn the first few times it's emulated, so the  
>>> user
>>> knows they should change their toolchain setup if possible.
>>
>> The same is true of mcrxr, popcntb, and possibly string ld/st.
>>
>> Feel free to submit a patch that warns about their usage.
>
> Something like this?
>
> Probably we also want it for:
>
>  - arch/powerpc/kernel/align.c
>      o emulate_dcbz()
>      o emulate_multiple()
>      o emulate_fp_pair()
>      o emulate_spe()
>
>  - arch/powerpc/kernel/softemu8xx.c
>      o Soft_emulate_8xx()
>
>  - arch/powerpc/kernel/traps.c
>      o SoftwareEmulation()

You missed math_emu.

>   - arch/powerpc/kernel/vecemu.c
>      o emulate_altivec()

I'm not sure I would concern this one emulation, there isn't much you  
can do about the denorm fixup.

How about some per processor counters in sysfs under the processor.

> Question: do we want it for emulate_single_step(), too?

What do you mean, we should could the emulation, the emulate single  
step just is for handling if you are doing debug while hitting an  
emulated insn.

> So far my Debian userland didn't trigger any of them on the PS3, I  
> had to
> write an explicit test ;-)
> ---
> arch/powerpc/kernel/traps.c |   19 +++++++++++++++++--
> 1 files changed, 17 insertions(+), 2 deletions(-)
>
> --- a/arch/powerpc/kernel/traps.c
> +++ b/arch/powerpc/kernel/traps.c
> @@ -707,6 +707,14 @@ static int emulate_popcntb_inst(struct p
>       return 0;
> }
>
> +#define WARN_EMULATE(type)                                           \
> +     do {                                                            \
> +         static unsigned int count;                                  \
> +         if (count++ < 10)                                           \
> +                 pr_warning("%s used emulated %s instruction\n",     \
> +                            current->comm, type);                    \
> +     } while (0)
> +
> static int emulate_instruction(struct pt_regs *regs)
> {
>       u32 instword;
> @@ -721,31 +729,38 @@ static int emulate_instruction(struct pt
>
>       /* Emulate the mfspr rD, PVR. */
>       if ((instword & INST_MFSPR_PVR_MASK) == INST_MFSPR_PVR) {
> +             WARN_EMULATE("mfpvr");
>               rd = (instword >> 21) & 0x1f;
>               regs->gpr[rd] = mfspr(SPRN_PVR);
>               return 0;
>       }
>
>       /* Emulating the dcba insn is just a no-op.  */
> -     if ((instword & INST_DCBA_MASK) == INST_DCBA)
> +     if ((instword & INST_DCBA_MASK) == INST_DCBA) {
> +             WARN_EMULATE("dcba");
>               return 0;
> +     }
>
>       /* Emulate the mcrxr insn.  */
>       if ((instword & INST_MCRXR_MASK) == INST_MCRXR) {
>               int shift = (instword >> 21) & 0x1c;
>               unsigned long msk = 0xf0000000UL >> shift;
>
> +             WARN_EMULATE("mcrxr");
>               regs->ccr = (regs->ccr & ~msk) | ((regs->xer >> shift) & msk);
>               regs->xer &= ~0xf0000000UL;
>               return 0;
>       }
>
>       /* Emulate load/store string insn. */
> -     if ((instword & INST_STRING_GEN_MASK) == INST_STRING)
> +     if ((instword & INST_STRING_GEN_MASK) == INST_STRING) {
> +             WARN_EMULATE("string");
>               return emulate_string_inst(regs, instword);
> +     }
>
>       /* Emulate the popcntb (Population Count Bytes) instruction. */
>       if ((instword & INST_POPCNTB_MASK) == INST_POPCNTB) {
> +             WARN_EMULATE("popcntb");
>               return emulate_popcntb_inst(regs, instword);
>       }
>

This looks good as a start.

- k

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to