linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
@ 2007-11-20  3:36 Kumar Gala
  2007-11-20 17:54 ` Scott Wood
  0 siblings, 1 reply; 24+ messages in thread
From: Kumar Gala @ 2007-11-20  3:36 UTC (permalink / raw)
  To: linuxppc-dev

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.

---
 arch/powerpc/kernel/traps.c |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+), 0 deletions(-)

In my git tree for 2.6.25.

diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 59c464e..cad6484 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -622,6 +622,9 @@ static void parse_fpe(struct pt_regs *regs)
 #define INST_POPCNTB		0x7c0000f4
 #define INST_POPCNTB_MASK	0xfc0007fe

+#define INST_ISEL		0x7c00001e
+#define INST_ISEL_MASK		0xfc00003e
+
 static int emulate_string_inst(struct pt_regs *regs, u32 instword)
 {
 	u8 rT = (instword >> 21) & 0x1f;
@@ -707,6 +710,23 @@ static int emulate_popcntb_inst(struct pt_regs *regs, u32 instword)
 	return 0;
 }

+static int emulate_isel(struct pt_regs *regs, u32 instword)
+{
+	u8 rT = (instword >> 21) & 0x1f;
+	u8 rA = (instword >> 16) & 0x1f;
+	u8 rB = (instword >> 11) & 0x1f;
+	u8 BC = (instword >> 6) & 0x1f;
+	u8 bit;
+	unsigned long tmp;
+
+	tmp = (rA == 0) ? 0 : regs->gpr[rA];
+	bit = (regs->ccr >> (31 - BC)) & 0x1;
+
+	regs->gpr[rT] = bit ? tmp : regs->gpr[rB];
+
+	return 0;
+}
+
 static int emulate_instruction(struct pt_regs *regs)
 {
 	u32 instword;
@@ -749,6 +769,11 @@ static int emulate_instruction(struct pt_regs *regs)
 		return emulate_popcntb_inst(regs, instword);
 	}

+	/* Emulate isel (Integer Select) instruction */
+	if ((instword & INST_ISEL_MASK) == INST_ISEL) {
+		return emulate_isel(regs, instword);
+	}
+
 	return -EINVAL;
 }

-- 
1.5.3.4

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-20  3:36 [PATCH] [POWERPC] Emulate isel (Integer Select) instruction Kumar Gala
@ 2007-11-20 17:54 ` Scott Wood
  2007-11-20 21:01   ` Kumar Gala
  0 siblings, 1 reply; 24+ messages in thread
From: Scott Wood @ 2007-11-20 17:54 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev

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.

-Scott

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-20 17:54 ` Scott Wood
@ 2007-11-20 21:01   ` Kumar Gala
  2007-11-21  9:12     ` Benjamin Herrenschmidt
  2007-11-21 13:09     ` Geert Uytterhoeven
  0 siblings, 2 replies; 24+ messages in thread
From: Kumar Gala @ 2007-11-20 21:01 UTC (permalink / raw)
  To: Scott Wood; +Cc: linuxppc-dev


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.

- k

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-20 21:01   ` Kumar Gala
@ 2007-11-21  9:12     ` Benjamin Herrenschmidt
  2007-11-21 14:19       ` Kumar Gala
  2007-11-21 13:09     ` Geert Uytterhoeven
  1 sibling, 1 reply; 24+ messages in thread
From: Benjamin Herrenschmidt @ 2007-11-21  9:12 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev


On Tue, 2007-11-20 at 15:01 -0600, Kumar Gala wrote:
> > 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.

At least we should keep counters... best would be per-task counters
in /proc but that sounds harder :-)

I remember in the early days of powerpc, it wasn't uncommon to have apps
with issues because they used 601 only bits on 603/4 that had to be
emulated (such as old POWER opcodes). On MacOS, we used to have a
system-wide counter of the number of emulated instructions we could use
to detect these things.

Ben.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-20 21:01   ` Kumar Gala
  2007-11-21  9:12     ` Benjamin Herrenschmidt
@ 2007-11-21 13:09     ` Geert Uytterhoeven
  2007-11-21 14:22       ` Kumar Gala
                         ` (4 more replies)
  1 sibling, 5 replies; 24+ messages in thread
From: Geert Uytterhoeven @ 2007-11-21 13:09 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev

[-- Attachment #1: Type: TEXT/PLAIN, Size: 3610 bytes --]

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()

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

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

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);
 	}
 

With kind regards,
 
Geert Uytterhoeven
Software Architect

Sony Network and Software Technology Center Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
 
Phone:    +32 (0)2 700 8453	
Fax:      +32 (0)2 700 8622	
E-mail:   Geert.Uytterhoeven@sonycom.com	
Internet: http://www.sony-europe.com/
 	
Sony Network and Software Technology Center Europe	
A division of Sony Service Centre (Europe) N.V.	
Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium	
VAT BE 0413.825.160 · RPR Brussels	
Fortis Bank Zaventem · Swift GEBABEBB08A · IBAN BE39001382358619

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21  9:12     ` Benjamin Herrenschmidt
@ 2007-11-21 14:19       ` Kumar Gala
  0 siblings, 0 replies; 24+ messages in thread
From: Kumar Gala @ 2007-11-21 14:19 UTC (permalink / raw)
  To: benh; +Cc: linuxppc-dev


On Nov 21, 2007, at 3:12 AM, Benjamin Herrenschmidt wrote:

>
> On Tue, 2007-11-20 at 15:01 -0600, Kumar Gala wrote:
>>> 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.
>
> At least we should keep counters... best would be per-task counters
> in /proc but that sounds harder :-)
>
> I remember in the early days of powerpc, it wasn't uncommon to have  
> apps
> with issues because they used 601 only bits on 603/4 that had to be
> emulated (such as old POWER opcodes). On MacOS, we used to have a
> system-wide counter of the number of emulated instructions we could  
> use
> to detect these things.

I think having some form of per insn group counters would be useful as  
well.  I know it would be helpful to debug user problems if they are  
doing a lot of FP emu or the like and don't know it.

- k

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 13:09     ` Geert Uytterhoeven
@ 2007-11-21 14:22       ` Kumar Gala
  2007-11-21 14:33         ` Geert Uytterhoeven
  2007-11-21 16:50         ` Geert Uytterhoeven
  2007-11-21 21:31       ` Paul Mackerras
                         ` (3 subsequent siblings)
  4 siblings, 2 replies; 24+ messages in thread
From: Kumar Gala @ 2007-11-21 14:22 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev


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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 14:22       ` Kumar Gala
@ 2007-11-21 14:33         ` Geert Uytterhoeven
  2007-11-21 15:34           ` Kumar Gala
  2007-11-21 16:50         ` Geert Uytterhoeven
  1 sibling, 1 reply; 24+ messages in thread
From: Geert Uytterhoeven @ 2007-11-21 14:33 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev

[-- Attachment #1: Type: TEXT/PLAIN, Size: 2359 bytes --]

On Wed, 21 Nov 2007, Kumar Gala wrote:
> 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.

Good idea!

> > 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.

I mean: should these be counted?

With kind regards,
 
Geert Uytterhoeven
Software Architect

Sony Network and Software Technology Center Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
 
Phone:    +32 (0)2 700 8453	
Fax:      +32 (0)2 700 8622	
E-mail:   Geert.Uytterhoeven@sonycom.com	
Internet: http://www.sony-europe.com/
 	
Sony Network and Software Technology Center Europe	
A division of Sony Service Centre (Europe) N.V.	
Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium	
VAT BE 0413.825.160 · RPR Brussels	
Fortis Bank Zaventem · Swift GEBABEBB08A · IBAN BE39001382358619

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 14:33         ` Geert Uytterhoeven
@ 2007-11-21 15:34           ` Kumar Gala
  0 siblings, 0 replies; 24+ messages in thread
From: Kumar Gala @ 2007-11-21 15:34 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev


On Nov 21, 2007, at 8:33 AM, Geert Uytterhoeven wrote:

> On Wed, 21 Nov 2007, Kumar Gala wrote:
>> 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.
>
> Good idea!
>
>>> 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.
>
> I mean: should these be counted?

the number of emulated single steps insn?  not sure I follow.  I think  
we should count regardless if we go through emulate_single_step().

- k

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 14:22       ` Kumar Gala
  2007-11-21 14:33         ` Geert Uytterhoeven
@ 2007-11-21 16:50         ` Geert Uytterhoeven
  2007-11-21 19:22           ` Kumar Gala
  1 sibling, 1 reply; 24+ messages in thread
From: Geert Uytterhoeven @ 2007-11-21 16:50 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1328 bytes --]

On Wed, 21 Nov 2007, Kumar Gala wrote:
> 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:
> > > > 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.
> 
> How about some per processor counters in sysfs under the processor.

Per processor? That means it has to be per_cpu, which sounds a bit like
overkill to me.

With kind regards,
 
Geert Uytterhoeven
Software Architect

Sony Network and Software Technology Center Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
 
Phone:    +32 (0)2 700 8453	
Fax:      +32 (0)2 700 8622	
E-mail:   Geert.Uytterhoeven@sonycom.com	
Internet: http://www.sony-europe.com/
 	
Sony Network and Software Technology Center Europe	
A division of Sony Service Centre (Europe) N.V.	
Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium	
VAT BE 0413.825.160 · RPR Brussels	
Fortis Bank Zaventem · Swift GEBABEBB08A · IBAN BE39001382358619

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 16:50         ` Geert Uytterhoeven
@ 2007-11-21 19:22           ` Kumar Gala
  0 siblings, 0 replies; 24+ messages in thread
From: Kumar Gala @ 2007-11-21 19:22 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev


On Nov 21, 2007, at 10:50 AM, Geert Uytterhoeven wrote:

> On Wed, 21 Nov 2007, Kumar Gala wrote:
>> 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:
>>>>> 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.
>>
>> How about some per processor counters in sysfs under the processor.
>
> Per processor? That means it has to be per_cpu, which sounds a bit  
> like
> overkill to me.

I can probably live with global, not sure that would work with sysfs.

- k

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 13:09     ` Geert Uytterhoeven
  2007-11-21 14:22       ` Kumar Gala
@ 2007-11-21 21:31       ` Paul Mackerras
  2007-11-21 21:36       ` Paul Mackerras
                         ` (2 subsequent siblings)
  4 siblings, 0 replies; 24+ messages in thread
From: Paul Mackerras @ 2007-11-21 21:31 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev

Geert Uytterhoeven writes:

> @@ -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");

mfpvr is a bit different from the others in that it is actually a
privileged instruction, so I don't think it helps to warn about it.

Also, I think the warnings should be optional.

Paul.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 13:09     ` Geert Uytterhoeven
  2007-11-21 14:22       ` Kumar Gala
  2007-11-21 21:31       ` Paul Mackerras
@ 2007-11-21 21:36       ` Paul Mackerras
  2007-11-21 21:41         ` Scott Wood
  2007-11-21 21:38       ` Paul Mackerras
  2007-11-27 14:56       ` Geert Uytterhoeven
  4 siblings, 1 reply; 24+ messages in thread
From: Paul Mackerras @ 2007-11-21 21:36 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev

Geert Uytterhoeven writes:

> +#define WARN_EMULATE(type)						\
> +	do {								\
> +	    static unsigned int count;					\
> +	    if (count++ < 10)						\
> +		    pr_warning("%s used emulated %s instruction\n",	\
> +			       current->comm, type);			\

Thinking about this a bit more, if an instruction gets emulated 10
times then I don't care, since it's probably only cost me 10
microseconds or so.  If it gets emulated a million times then I might
want to look at it.  So in fact this approach doesn't give me the
information I need to know whether there is a real problem or not.

Paul.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 13:09     ` Geert Uytterhoeven
                         ` (2 preceding siblings ...)
  2007-11-21 21:36       ` Paul Mackerras
@ 2007-11-21 21:38       ` Paul Mackerras
  2007-11-27 14:56       ` Geert Uytterhoeven
  4 siblings, 0 replies; 24+ messages in thread
From: Paul Mackerras @ 2007-11-21 21:38 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev

Geert Uytterhoeven writes:

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

No, because that's not emulating an instruction.

Paul.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 21:36       ` Paul Mackerras
@ 2007-11-21 21:41         ` Scott Wood
  2007-11-21 21:48           ` Kim Phillips
  0 siblings, 1 reply; 24+ messages in thread
From: Scott Wood @ 2007-11-21 21:41 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: Geert Uytterhoeven, linuxppc-dev

Paul Mackerras wrote:
> Geert Uytterhoeven writes:
> 
>> +#define WARN_EMULATE(type)						\
>> +	do {								\
>> +	    static unsigned int count;					\
>> +	    if (count++ < 10)						\
>> +		    pr_warning("%s used emulated %s instruction\n",	\
>> +			       current->comm, type);			\
> 
> Thinking about this a bit more, if an instruction gets emulated 10
> times then I don't care, since it's probably only cost me 10
> microseconds or so.  If it gets emulated a million times then I might
> want to look at it.  So in fact this approach doesn't give me the
> information I need to know whether there is a real problem or not.

Maybe print the first time, then when it's happened 10 times, then 100, 
then 1000, etc.

-Scott

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 21:41         ` Scott Wood
@ 2007-11-21 21:48           ` Kim Phillips
  0 siblings, 0 replies; 24+ messages in thread
From: Kim Phillips @ 2007-11-21 21:48 UTC (permalink / raw)
  To: Scott Wood; +Cc: Geert Uytterhoeven, linuxppc-dev, Paul Mackerras

On Wed, 21 Nov 2007 15:41:00 -0600
Scott Wood <scottwood@freescale.com> wrote:

> Paul Mackerras wrote:
> > Geert Uytterhoeven writes:
> > 
> >> +#define WARN_EMULATE(type)						\
> >> +	do {								\
> >> +	    static unsigned int count;					\
> >> +	    if (count++ < 10)						\
> >> +		    pr_warning("%s used emulated %s instruction\n",	\
> >> +			       current->comm, type);			\
> > 
> > Thinking about this a bit more, if an instruction gets emulated 10
> > times then I don't care, since it's probably only cost me 10
> > microseconds or so.  If it gets emulated a million times then I might
> > want to look at it.  So in fact this approach doesn't give me the
> > information I need to know whether there is a real problem or not.
> 
> Maybe print the first time, then when it's happened 10 times, then 100, 
> then 1000, etc.
> 
or just use printk_ratelimit().

Kim

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-21 13:09     ` Geert Uytterhoeven
                         ` (3 preceding siblings ...)
  2007-11-21 21:38       ` Paul Mackerras
@ 2007-11-27 14:56       ` Geert Uytterhoeven
  2007-11-27 15:23         ` Olof Johansson
  4 siblings, 1 reply; 24+ messages in thread
From: Geert Uytterhoeven @ 2007-11-27 14:56 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev

[-- Attachment #1: Type: TEXT/PLAIN, Size: 10848 bytes --]

On Wed, 21 Nov 2007, 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?

New version below.

Do we want it in sysfs? Or should we use debugfs instead?

Subject: powerpc: Keep track of emulated instructions

From: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>

powerpc: Keep track of emulated instructions

Counters for the various classes of emulated instructions are available under
/sys/devices/system/cpu/cpu*/emulated/.
Optionally, rate-limited warnings can be printed to the console when
instructions are emulated.

Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
---
 arch/powerpc/Kconfig.debug     |   10 ++++++
 arch/powerpc/kernel/align.c    |   17 ++++++++--
 arch/powerpc/kernel/sysfs.c    |   64 ++++++++++++++++++++++++++++++++++++++++-
 arch/powerpc/kernel/traps.c    |   17 +++++++++-
 include/asm-powerpc/emulator.h |   60 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 161 insertions(+), 7 deletions(-)

--- a/arch/powerpc/Kconfig.debug
+++ b/arch/powerpc/Kconfig.debug
@@ -284,4 +284,14 @@ config PPC_EARLY_DEBUG_CPM_ADDR
 	  platform probing is done, all platforms selected must
 	  share the same address.
 
+config DEBUG_WARN_EMULATED
+	bool "Warn if emulated instructions are used"
+	depends on DEBUG_KERNEL && SYSFS
+	help
+	  This option will cause messages to be printed if an instruction is
+	  emulated.
+	  Counters for emulated instruction usages are always available under
+	  /sys/devices/system/cpu/cpu*/emulated/, irrespective of the state
+	  of this option.
+
 endmenu
--- a/arch/powerpc/kernel/align.c
+++ b/arch/powerpc/kernel/align.c
@@ -24,6 +24,7 @@
 #include <asm/system.h>
 #include <asm/cache.h>
 #include <asm/cputable.h>
+#include <asm/emulator.h>
 
 struct aligninfo {
 	unsigned char len;
@@ -696,8 +697,10 @@ int fix_alignment(struct pt_regs *regs)
 	areg = dsisr & 0x1f;		/* register to update */
 
 #ifdef CONFIG_SPE
-	if ((instr >> 26) == 0x4)
+	if ((instr >> 26) == 0x4) {
+		WARN_EMULATE(spe);
 		return emulate_spe(regs, reg, instr);
+	}
 #endif
 
 	instr = (dsisr >> 10) & 0x7f;
@@ -731,17 +734,21 @@ int fix_alignment(struct pt_regs *regs)
 	/* A size of 0 indicates an instruction we don't support, with
 	 * the exception of DCBZ which is handled as a special case here
 	 */
-	if (instr == DCBZ)
+	if (instr == DCBZ) {
+		WARN_EMULATE(dcbz);
 		return emulate_dcbz(regs, addr);
+	}
 	if (unlikely(nb == 0))
 		return 0;
 
 	/* Load/Store Multiple instructions are handled in their own
 	 * function
 	 */
-	if (flags & M)
+	if (flags & M) {
+		WARN_EMULATE(multiple);
 		return emulate_multiple(regs, addr, reg, nb,
 					flags, instr, swiz);
+	}
 
 	/* Verify the address of the operand */
 	if (unlikely(user_mode(regs) &&
@@ -758,8 +765,10 @@ int fix_alignment(struct pt_regs *regs)
 	}
 
 	/* Special case for 16-byte FP loads and stores */
-	if (nb == 16)
+	if (nb == 16) {
+		WARN_EMULATE(fp_pair);
 		return emulate_fp_pair(regs, addr, reg, flags);
+	}
 
 	/* If we are loading, get the data from user space, else
 	 * get it from register values
--- a/arch/powerpc/kernel/sysfs.c
+++ b/arch/powerpc/kernel/sysfs.c
@@ -19,6 +19,7 @@
 #include <asm/lppaca.h>
 #include <asm/machdep.h>
 #include <asm/smp.h>
+#include <asm/emulator.h>
 
 static DEFINE_PER_CPU(struct cpu, cpu_devices);
 
@@ -291,12 +292,68 @@ static struct sysdev_attribute pa6t_attr
 };
 
 
+#define SYSFS_EMULATED_SETUP(type)					\
+DEFINE_PER_CPU(atomic_long_t, emulated_ ## type);			\
+static ssize_t show_emulated_ ## type (struct sys_device *dev,		\
+				       char *buf)			\
+{									\
+	struct cpu *cpu = container_of(dev, struct cpu, sysdev);	\
+									\
+	return sprintf(buf, "%lu\n",					\
+		       atomic_long_read(&per_cpu(emulated_ ## type,	\
+					cpu->sysdev.id)));		\
+}									\
+									\
+static struct sysdev_attribute emulated_ ## type ## _attr = {		\
+	.attr = { .name = #type, .mode = 0400 },			\
+	.show = show_emulated_ ## type,					\
+};
+
+SYSFS_EMULATED_SETUP(dcba);
+SYSFS_EMULATED_SETUP(dcbz);
+SYSFS_EMULATED_SETUP(fp_pair);
+SYSFS_EMULATED_SETUP(mcrxr);
+SYSFS_EMULATED_SETUP(mfpvr);
+SYSFS_EMULATED_SETUP(multiple);
+SYSFS_EMULATED_SETUP(popcntb);
+SYSFS_EMULATED_SETUP(spe);
+SYSFS_EMULATED_SETUP(string);
+#ifdef CONFIG_MATH_EMULATION
+SYSFS_EMULATED_SETUP(math);
+#elif defined(CONFIG_8XX_MINIMAL_FPEMU)
+SYSFS_EMULATED_SETUP(8xx);
+#endif
+
+static struct attribute *emulated_attrs[] = {
+	&emulated_dcba_attr.attr,
+	&emulated_dcbz_attr.attr,
+	&emulated_fp_pair_attr.attr,
+	&emulated_mcrxr_attr.attr,
+	&emulated_mfpvr_attr.attr,
+	&emulated_multiple_attr.attr,
+	&emulated_popcntb_attr.attr,
+	&emulated_spe_attr.attr,
+	&emulated_string_attr.attr,
+#ifdef CONFIG_MATH_EMULATION
+	&emulated_math_attr.attr,
+#elif defined(CONFIG_8XX_MINIMAL_FPEMU)
+	&emulated_8xx_attr.attr,
+#endif
+	NULL
+};
+
+static struct attribute_group emulated_attr_group = {
+	.attrs = emulated_attrs,
+	.name = "emulated"
+};
+
+
 static void register_cpu_online(unsigned int cpu)
 {
 	struct cpu *c = &per_cpu(cpu_devices, cpu);
 	struct sys_device *s = &c->sysdev;
 	struct sysdev_attribute *attrs, *pmc_attrs;
-	int i, nattrs;
+	int i, nattrs, res;
 
 	if (!firmware_has_feature(FW_FEATURE_ISERIES) &&
 			cpu_has_feature(CPU_FTR_SMT))
@@ -339,6 +396,11 @@ static void register_cpu_online(unsigned
 
 	if (cpu_has_feature(CPU_FTR_DSCR))
 		sysdev_create_file(s, &attr_dscr);
+
+	res = sysfs_create_group(&s->kobj, &emulated_attr_group);
+	if (res)
+		pr_warning("Cannot create emulated sysfs group for cpu %u\n",
+			   cpu);
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -53,6 +53,7 @@
 #include <asm/processor.h>
 #endif
 #include <asm/kexec.h>
+#include <asm/emulator.h>
 
 #ifdef CONFIG_DEBUGGER
 int (*__debugger)(struct pt_regs *regs);
@@ -721,31 +722,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);
 	}
 
@@ -929,6 +937,8 @@ void SoftwareEmulation(struct pt_regs *r
 
 #ifdef CONFIG_MATH_EMULATION
 	errcode = do_mathemu(regs);
+	if (errcode >= 0)
+		WARN_EMULATE(math);
 
 	switch (errcode) {
 	case 0:
@@ -950,6 +960,9 @@ void SoftwareEmulation(struct pt_regs *r
 
 #elif defined(CONFIG_8XX_MINIMAL_FPEMU)
 	errcode = Soft_emulate_8xx(regs);
+	if (errcode >= 0)
+		WARN_EMULATE(8xx);
+
 	switch (errcode) {
 	case 0:
 		emulate_single_step(regs);
--- /dev/null
+++ b/include/asm-powerpc/emulator.h
@@ -0,0 +1,60 @@
+/*
+ *  Copyright 2007 Sony Corp.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; version 2 of the License.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef _ASM_POWERPC_EMULATOR_H
+#define _ASM_POWERPC_EMULATOR_H
+
+#include <linux/kernel.h>
+#include <linux/percpu.h>
+
+#include <asm/atomic.h>
+
+DECLARE_PER_CPU(atomic_long_t, emulated_dcba);
+DECLARE_PER_CPU(atomic_long_t, emulated_dcbz);
+DECLARE_PER_CPU(atomic_long_t, emulated_fp_pair);
+DECLARE_PER_CPU(atomic_long_t, emulated_mcrxr);
+DECLARE_PER_CPU(atomic_long_t, emulated_mfpvr);
+DECLARE_PER_CPU(atomic_long_t, emulated_multiple);
+DECLARE_PER_CPU(atomic_long_t, emulated_popcntb);
+DECLARE_PER_CPU(atomic_long_t, emulated_spe);
+DECLARE_PER_CPU(atomic_long_t, emulated_string);
+#ifdef CONFIG_MATH_EMULATION
+DECLARE_PER_CPU(atomic_long_t, emulated_math);
+#elif defined(CONFIG_8XX_MINIMAL_FPEMU)
+DECLARE_PER_CPU(atomic_long_t, emulated_8xx);
+#endif
+
+#ifdef CONFIG_DEBUG_WARN_EMULATED
+static inline void do_warn_emulate(const char *type)
+{
+	if (printk_ratelimit())
+		pr_warning("%s used emulated %s instruction\n", current->comm,
+			   type);
+}
+#else
+static inline void do_warn_emulate(const char *type) {}
+#endif
+
+#define WARN_EMULATE(type)						\
+	do {								\
+		atomic_long_inc(&per_cpu(emulated_ ## type,		\
+					 raw_smp_processor_id()));	\
+		do_warn_emulate(#type);					\
+	} while (0)
+
+
+#endif /* _ASM_POWERPC_EMULATOR_H */

With kind regards,
 
Geert Uytterhoeven
Software Architect

Sony Network and Software Technology Center Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
 
Phone:    +32 (0)2 700 8453	
Fax:      +32 (0)2 700 8622	
E-mail:   Geert.Uytterhoeven@sonycom.com	
Internet: http://www.sony-europe.com/
 	
Sony Network and Software Technology Center Europe	
A division of Sony Service Centre (Europe) N.V.	
Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium	
VAT BE 0413.825.160 · RPR Brussels	
Fortis Bank Zaventem · Swift GEBABEBB08A · IBAN BE39001382358619

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-27 14:56       ` Geert Uytterhoeven
@ 2007-11-27 15:23         ` Olof Johansson
  2007-11-28 10:49           ` Geert Uytterhoeven
  0 siblings, 1 reply; 24+ messages in thread
From: Olof Johansson @ 2007-11-27 15:23 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev

On Tue, Nov 27, 2007 at 03:56:53PM +0100, Geert Uytterhoeven wrote:
> On Wed, 21 Nov 2007, 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?
> 
> New version below.
> 
> Do we want it in sysfs? Or should we use debugfs instead?

I like this, and I'd say it's useful to have in sysfs. Few production
systems enable debugfs, and this is something that could be useful to
have access to there.

> Subject: powerpc: Keep track of emulated instructions
> 
> From: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
> 
> powerpc: Keep track of emulated instructions
> 
> Counters for the various classes of emulated instructions are available under
> /sys/devices/system/cpu/cpu*/emulated/.
> Optionally, rate-limited warnings can be printed to the console when
> instructions are emulated.
> 
> Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
> ---
>  arch/powerpc/Kconfig.debug     |   10 ++++++
>  arch/powerpc/kernel/align.c    |   17 ++++++++--
>  arch/powerpc/kernel/sysfs.c    |   64 ++++++++++++++++++++++++++++++++++++++++-
>  arch/powerpc/kernel/traps.c    |   17 +++++++++-
>  include/asm-powerpc/emulator.h |   60 ++++++++++++++++++++++++++++++++++++++

This name stood out as being a bit too generic, emulator could mean
system support for running under some sort of emulator as well. How
about emulated_ops.h?

> +config DEBUG_WARN_EMULATED
> +	bool "Warn if emulated instructions are used"
> +	depends on DEBUG_KERNEL && SYSFS
> +	help
> +	  This option will cause messages to be printed if an instruction is
> +	  emulated.
> +	  Counters for emulated instruction usages are always available under
> +	  /sys/devices/system/cpu/cpu*/emulated/, irrespective of the state
> +	  of this option.

How about making it a sysctl instead, so it can be flipped at runtime
(but default off)?


-Olof

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-27 15:23         ` Olof Johansson
@ 2007-11-28 10:49           ` Geert Uytterhoeven
  2007-11-29 15:13             ` Geert Uytterhoeven
  0 siblings, 1 reply; 24+ messages in thread
From: Geert Uytterhoeven @ 2007-11-28 10:49 UTC (permalink / raw)
  To: Olof Johansson; +Cc: linuxppc-dev

[-- Attachment #1: Type: TEXT/PLAIN, Size: 11545 bytes --]

On Tue, 27 Nov 2007, Olof Johansson wrote:
> On Tue, Nov 27, 2007 at 03:56:53PM +0100, Geert Uytterhoeven wrote:
> >  include/asm-powerpc/emulator.h |   60 ++++++++++++++++++++++++++++++++++++++
> 
> This name stood out as being a bit too generic, emulator could mean
> system support for running under some sort of emulator as well. How
> about emulated_ops.h?

Changed.

> > +config DEBUG_WARN_EMULATED
> > +	bool "Warn if emulated instructions are used"
> > +	depends on DEBUG_KERNEL && SYSFS
> > +	help
> > +	  This option will cause messages to be printed if an instruction is
> > +	  emulated.
> > +	  Counters for emulated instruction usages are always available under
> > +	  /sys/devices/system/cpu/cpu*/emulated/, irrespective of the state
> > +	  of this option.
> 
> How about making it a sysctl instead, so it can be flipped at runtime
> (but default off)?

Converted to a sysctl.

Subject: powerpc: Keep track of emulated instructions

From: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>

powerpc: Keep track of emulated instructions

Counters for the various classes of emulated instructions are available under
/sys/devices/system/cpu/cpu*/emulated/.
Optionally (controlled by /proc/sys/kernel/cpu_emulation_warnings),
rate-limited warnings can be printed to the console when instructions are
emulated.

Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
---
 arch/powerpc/kernel/align.c        |   17 ++++--
 arch/powerpc/kernel/sysfs.c        |  100 ++++++++++++++++++++++++++++++++++++-
 arch/powerpc/kernel/traps.c        |   24 ++++++++
 include/asm-powerpc/emulated_ops.h |   52 +++++++++++++++++++
 4 files changed, 186 insertions(+), 7 deletions(-)

--- a/arch/powerpc/kernel/align.c
+++ b/arch/powerpc/kernel/align.c
@@ -24,6 +24,7 @@
 #include <asm/system.h>
 #include <asm/cache.h>
 #include <asm/cputable.h>
+#include <asm/emulated_ops.h>
 
 struct aligninfo {
 	unsigned char len;
@@ -696,8 +697,10 @@ int fix_alignment(struct pt_regs *regs)
 	areg = dsisr & 0x1f;		/* register to update */
 
 #ifdef CONFIG_SPE
-	if ((instr >> 26) == 0x4)
+	if ((instr >> 26) == 0x4) {
+		WARN_EMULATE(spe);
 		return emulate_spe(regs, reg, instr);
+	}
 #endif
 
 	instr = (dsisr >> 10) & 0x7f;
@@ -731,17 +734,21 @@ int fix_alignment(struct pt_regs *regs)
 	/* A size of 0 indicates an instruction we don't support, with
 	 * the exception of DCBZ which is handled as a special case here
 	 */
-	if (instr == DCBZ)
+	if (instr == DCBZ) {
+		WARN_EMULATE(dcbz);
 		return emulate_dcbz(regs, addr);
+	}
 	if (unlikely(nb == 0))
 		return 0;
 
 	/* Load/Store Multiple instructions are handled in their own
 	 * function
 	 */
-	if (flags & M)
+	if (flags & M) {
+		WARN_EMULATE(multiple);
 		return emulate_multiple(regs, addr, reg, nb,
 					flags, instr, swiz);
+	}
 
 	/* Verify the address of the operand */
 	if (unlikely(user_mode(regs) &&
@@ -758,8 +765,10 @@ int fix_alignment(struct pt_regs *regs)
 	}
 
 	/* Special case for 16-byte FP loads and stores */
-	if (nb == 16)
+	if (nb == 16) {
+		WARN_EMULATE(fp_pair);
 		return emulate_fp_pair(regs, addr, reg, flags);
+	}
 
 	/* If we are loading, get the data from user space, else
 	 * get it from register values
--- a/arch/powerpc/kernel/sysfs.c
+++ b/arch/powerpc/kernel/sysfs.c
@@ -8,6 +8,7 @@
 #include <linux/nodemask.h>
 #include <linux/cpumask.h>
 #include <linux/notifier.h>
+#include <linux/sysctl.h>
 
 #include <asm/current.h>
 #include <asm/processor.h>
@@ -19,6 +20,7 @@
 #include <asm/lppaca.h>
 #include <asm/machdep.h>
 #include <asm/smp.h>
+#include <asm/emulated_ops.h>
 
 static DEFINE_PER_CPU(struct cpu, cpu_devices);
 
@@ -291,12 +293,101 @@ static struct sysdev_attribute pa6t_attr
 };
 
 
+#define SYSFS_EMULATED_SETUP(type)					\
+DEFINE_PER_CPU(atomic_long_t, emulated_ ## type);			\
+static ssize_t show_emulated_ ## type (struct sys_device *dev,		\
+				       char *buf)			\
+{									\
+	struct cpu *cpu = container_of(dev, struct cpu, sysdev);	\
+									\
+	return sprintf(buf, "%lu\n",					\
+		       atomic_long_read(&per_cpu(emulated_ ## type,	\
+					cpu->sysdev.id)));		\
+}									\
+									\
+static struct sysdev_attribute emulated_ ## type ## _attr = {		\
+	.attr = { .name = #type, .mode = 0400 },			\
+	.show = show_emulated_ ## type,					\
+};
+
+SYSFS_EMULATED_SETUP(dcba);
+SYSFS_EMULATED_SETUP(dcbz);
+SYSFS_EMULATED_SETUP(fp_pair);
+SYSFS_EMULATED_SETUP(mcrxr);
+SYSFS_EMULATED_SETUP(mfpvr);
+SYSFS_EMULATED_SETUP(multiple);
+SYSFS_EMULATED_SETUP(popcntb);
+SYSFS_EMULATED_SETUP(spe);
+SYSFS_EMULATED_SETUP(string);
+#ifdef CONFIG_MATH_EMULATION
+SYSFS_EMULATED_SETUP(math);
+#elif defined(CONFIG_8XX_MINIMAL_FPEMU)
+SYSFS_EMULATED_SETUP(8xx);
+#endif
+
+static struct attribute *emulated_attrs[] = {
+	&emulated_dcba_attr.attr,
+	&emulated_dcbz_attr.attr,
+	&emulated_fp_pair_attr.attr,
+	&emulated_mcrxr_attr.attr,
+	&emulated_mfpvr_attr.attr,
+	&emulated_multiple_attr.attr,
+	&emulated_popcntb_attr.attr,
+	&emulated_spe_attr.attr,
+	&emulated_string_attr.attr,
+#ifdef CONFIG_MATH_EMULATION
+	&emulated_math_attr.attr,
+#elif defined(CONFIG_8XX_MINIMAL_FPEMU)
+	&emulated_8xx_attr.attr,
+#endif
+	NULL
+};
+
+static struct attribute_group emulated_attr_group = {
+	.attrs = emulated_attrs,
+	.name = "emulated"
+};
+
+int sysctl_warn_emulated;
+
+#ifdef CONFIG_SYSCTL
+static ctl_table warn_emulated_ctl_table[]={
+	{
+		.procname	= "cpu_emulation_warnings",
+		.data		= &sysctl_warn_emulated,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+	},
+	{}
+};
+
+static ctl_table warn_emulated_sysctl_root[] = {
+	{
+		.ctl_name	= CTL_KERN,
+		.procname	= "kernel",
+		.mode		= 0555,
+		.child		= warn_emulated_ctl_table,
+	},
+	{}
+};
+
+static inline void warn_emulated_sysctl_register(void)
+{
+	int res = register_sysctl_table(warn_emulated_sysctl_root);
+	printk("@@@ register_sysctl_table() returned %d\n", res);
+}
+#else /* !CONFIG_SYSCTL */
+static inline void warn_emulated_sysctl_register(void) {}
+#endif /* !CONFIG_SYSCTL */
+
+
 static void register_cpu_online(unsigned int cpu)
 {
 	struct cpu *c = &per_cpu(cpu_devices, cpu);
 	struct sys_device *s = &c->sysdev;
 	struct sysdev_attribute *attrs, *pmc_attrs;
-	int i, nattrs;
+	int i, nattrs, res;
 
 	if (!firmware_has_feature(FW_FEATURE_ISERIES) &&
 			cpu_has_feature(CPU_FTR_SMT))
@@ -339,6 +430,11 @@ static void register_cpu_online(unsigned
 
 	if (cpu_has_feature(CPU_FTR_DSCR))
 		sysdev_create_file(s, &attr_dscr);
+
+	res = sysfs_create_group(&s->kobj, &emulated_attr_group);
+	if (res)
+		pr_warning("Cannot create emulated sysfs group for cpu %u\n",
+			   cpu);
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -560,6 +656,8 @@ static int __init topology_init(void)
 			register_cpu_online(cpu);
 	}
 
+	warn_emulated_sysctl_register();
+
 	return 0;
 }
 subsys_initcall(topology_init);
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -53,6 +53,7 @@
 #include <asm/processor.h>
 #endif
 #include <asm/kexec.h>
+#include <asm/emulated_ops.h>
 
 #ifdef CONFIG_DEBUGGER
 int (*__debugger)(struct pt_regs *regs);
@@ -707,6 +708,13 @@ static int emulate_popcntb_inst(struct p
 	return 0;
 }
 
+void do_warn_emulate(const char *type)
+{
+	if (printk_ratelimit())
+		pr_warning("%s used emulated %s instruction\n", current->comm,
+			   type);
+}
+
 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);
 	}
 
@@ -929,6 +944,8 @@ void SoftwareEmulation(struct pt_regs *r
 
 #ifdef CONFIG_MATH_EMULATION
 	errcode = do_mathemu(regs);
+	if (errcode >= 0)
+		WARN_EMULATE(math);
 
 	switch (errcode) {
 	case 0:
@@ -950,6 +967,9 @@ void SoftwareEmulation(struct pt_regs *r
 
 #elif defined(CONFIG_8XX_MINIMAL_FPEMU)
 	errcode = Soft_emulate_8xx(regs);
+	if (errcode >= 0)
+		WARN_EMULATE(8xx);
+
 	switch (errcode) {
 	case 0:
 		emulate_single_step(regs);
--- /dev/null
+++ b/include/asm-powerpc/emulated_ops.h
@@ -0,0 +1,52 @@
+/*
+ *  Copyright 2007 Sony Corp.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; version 2 of the License.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef _ASM_POWERPC_EMULATED_OPS_H
+#define _ASM_POWERPC_EMULATED_OPS_H
+
+#include <linux/percpu.h>
+
+#include <asm/atomic.h>
+
+DECLARE_PER_CPU(atomic_long_t, emulated_dcba);
+DECLARE_PER_CPU(atomic_long_t, emulated_dcbz);
+DECLARE_PER_CPU(atomic_long_t, emulated_fp_pair);
+DECLARE_PER_CPU(atomic_long_t, emulated_mcrxr);
+DECLARE_PER_CPU(atomic_long_t, emulated_mfpvr);
+DECLARE_PER_CPU(atomic_long_t, emulated_multiple);
+DECLARE_PER_CPU(atomic_long_t, emulated_popcntb);
+DECLARE_PER_CPU(atomic_long_t, emulated_spe);
+DECLARE_PER_CPU(atomic_long_t, emulated_string);
+#ifdef CONFIG_MATH_EMULATION
+DECLARE_PER_CPU(atomic_long_t, emulated_math);
+#elif defined(CONFIG_8XX_MINIMAL_FPEMU)
+DECLARE_PER_CPU(atomic_long_t, emulated_8xx);
+#endif
+
+extern int sysctl_warn_emulated;
+extern void do_warn_emulate(const char *type);
+
+#define WARN_EMULATE(type)						\
+	do {								\
+		atomic_long_inc(&per_cpu(emulated_ ## type,		\
+					 raw_smp_processor_id()));	\
+		if (sysctl_warn_emulated)				\
+			do_warn_emulate(#type);				\
+	} while (0)
+
+
+#endif /* _ASM_POWERPC_EMULATED_OPS_H */

With kind regards,
 
Geert Uytterhoeven
Software Architect

Sony Network and Software Technology Center Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
 
Phone:    +32 (0)2 700 8453	
Fax:      +32 (0)2 700 8622	
E-mail:   Geert.Uytterhoeven@sonycom.com	
Internet: http://www.sony-europe.com/
 	
Sony Network and Software Technology Center Europe	
A division of Sony Service Centre (Europe) N.V.	
Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium	
VAT BE 0413.825.160 · RPR Brussels	
Fortis Bank Zaventem · Swift GEBABEBB08A · IBAN BE39001382358619

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-28 10:49           ` Geert Uytterhoeven
@ 2007-11-29 15:13             ` Geert Uytterhoeven
  2007-12-14  8:12               ` Olof Johansson
  0 siblings, 1 reply; 24+ messages in thread
From: Geert Uytterhoeven @ 2007-11-29 15:13 UTC (permalink / raw)
  To: Olof Johansson; +Cc: linuxppc-dev

[-- Attachment #1: Type: TEXT/PLAIN, Size: 975 bytes --]

On Wed, 28 Nov 2007, Geert Uytterhoeven wrote:
> +static inline void warn_emulated_sysctl_register(void)
> +{
> +	int res = register_sysctl_table(warn_emulated_sysctl_root);
        ^^^^^^^^^^
> +	printk("@@@ register_sysctl_table() returned %d\n", res);
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +}

Woops, that part shouldn't have been there...

With kind regards,
 
Geert Uytterhoeven
Software Architect

Sony Network and Software Technology Center Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
 
Phone:    +32 (0)2 700 8453	
Fax:      +32 (0)2 700 8622	
E-mail:   Geert.Uytterhoeven@sonycom.com	
Internet: http://www.sony-europe.com/
 	
Sony Network and Software Technology Center Europe	
A division of Sony Service Centre (Europe) N.V.	
Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium	
VAT BE 0413.825.160 · RPR Brussels	
Fortis Bank Zaventem · Swift GEBABEBB08A · IBAN BE39001382358619

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-12-14  8:12               ` Olof Johansson
@ 2007-12-14  8:08                 ` Kumar Gala
  2007-12-14  8:17                   ` Olof Johansson
  2007-12-14  8:16                 ` Olof Johansson
  1 sibling, 1 reply; 24+ messages in thread
From: Kumar Gala @ 2007-12-14  8:08 UTC (permalink / raw)
  To: Olof Johansson; +Cc: Geert Uytterhoeven, linuxppc-dev


On Dec 14, 2007, at 2:12 AM, Olof Johansson wrote:

> On Thu, Nov 29, 2007 at 04:13:14PM +0100, Geert Uytterhoeven wrote:
>> On Wed, 28 Nov 2007, Geert Uytterhoeven wrote:
>>> +static inline void warn_emulated_sysctl_register(void)
>>> +{
>>> +	int res = register_sysctl_table(warn_emulated_sysctl_root);
>>        ^^^^^^^^^^
>>> +	printk("@@@ register_sysctl_table() returned %d\n", res);
>>        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> +}
>>
>> Woops, that part shouldn't have been there...
>
> Care to resubmit a clean patch under a fresh subject? Paul didn't  
> chime
> in but hopefully he can pick it up for 2.6.25.

I'd say wait for Paul to pickup my 2.6.25 request.  Than the base will  
have the isel emulation as well.

- k

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-11-29 15:13             ` Geert Uytterhoeven
@ 2007-12-14  8:12               ` Olof Johansson
  2007-12-14  8:08                 ` Kumar Gala
  2007-12-14  8:16                 ` Olof Johansson
  0 siblings, 2 replies; 24+ messages in thread
From: Olof Johansson @ 2007-12-14  8:12 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev

On Thu, Nov 29, 2007 at 04:13:14PM +0100, Geert Uytterhoeven wrote:
> On Wed, 28 Nov 2007, Geert Uytterhoeven wrote:
> > +static inline void warn_emulated_sysctl_register(void)
> > +{
> > +	int res = register_sysctl_table(warn_emulated_sysctl_root);
>         ^^^^^^^^^^
> > +	printk("@@@ register_sysctl_table() returned %d\n", res);
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > +}
> 
> Woops, that part shouldn't have been there...

Care to resubmit a clean patch under a fresh subject? Paul didn't chime
in but hopefully he can pick it up for 2.6.25.


Thanks,

Olof

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-12-14  8:12               ` Olof Johansson
  2007-12-14  8:08                 ` Kumar Gala
@ 2007-12-14  8:16                 ` Olof Johansson
  1 sibling, 0 replies; 24+ messages in thread
From: Olof Johansson @ 2007-12-14  8:16 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: linuxppc-dev

On Fri, Dec 14, 2007 at 02:12:10AM -0600, Olof Johansson wrote:
> Care to resubmit a clean patch under a fresh subject? Paul didn't chime
> in but hopefully he can pick it up for 2.6.25.

Next time I will take the time to re-read the whole thread. :)

Seems like the open question was how to warn only for excessive
amounts of emulated ops. Maybe a simple count/threshold per process
(+ printk_ratelimit)? Warning on every power of 10 occurrances was also
suggested, either works for me.


-Olof

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] [POWERPC] Emulate isel (Integer Select) instruction
  2007-12-14  8:08                 ` Kumar Gala
@ 2007-12-14  8:17                   ` Olof Johansson
  0 siblings, 0 replies; 24+ messages in thread
From: Olof Johansson @ 2007-12-14  8:17 UTC (permalink / raw)
  To: Kumar Gala; +Cc: Geert Uytterhoeven, linuxppc-dev

On Fri, Dec 14, 2007 at 02:08:14AM -0600, Kumar Gala wrote:

> I'd say wait for Paul to pickup my 2.6.25 request.  Than the base will  
> have the isel emulation as well.

It was spotting the isel patch in your queue that made me go back and
look at the thread. :)


-Olof

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2007-12-14  8:12 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-20  3:36 [PATCH] [POWERPC] Emulate isel (Integer Select) instruction Kumar Gala
2007-11-20 17:54 ` Scott Wood
2007-11-20 21:01   ` Kumar Gala
2007-11-21  9:12     ` Benjamin Herrenschmidt
2007-11-21 14:19       ` Kumar Gala
2007-11-21 13:09     ` Geert Uytterhoeven
2007-11-21 14:22       ` Kumar Gala
2007-11-21 14:33         ` Geert Uytterhoeven
2007-11-21 15:34           ` Kumar Gala
2007-11-21 16:50         ` Geert Uytterhoeven
2007-11-21 19:22           ` Kumar Gala
2007-11-21 21:31       ` Paul Mackerras
2007-11-21 21:36       ` Paul Mackerras
2007-11-21 21:41         ` Scott Wood
2007-11-21 21:48           ` Kim Phillips
2007-11-21 21:38       ` Paul Mackerras
2007-11-27 14:56       ` Geert Uytterhoeven
2007-11-27 15:23         ` Olof Johansson
2007-11-28 10:49           ` Geert Uytterhoeven
2007-11-29 15:13             ` Geert Uytterhoeven
2007-12-14  8:12               ` Olof Johansson
2007-12-14  8:08                 ` Kumar Gala
2007-12-14  8:17                   ` Olof Johansson
2007-12-14  8:16                 ` Olof Johansson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).