Skip to contentSkip to conversation

Emulate more instructions in software

PATCH In review Ananth N Mavinakayanahalli 2 participants 6 messages Apr 18, 2007 – Apr 19, 2007 PowerPC

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Emulate more instructions in software

Emulate a few more instructions in software - especially useful during singlestepping (xmon/kprobes).

Instructions emulated with this patch are mfcr/mtcr rX, mfxer/mtxer rX, mflr/mtlr rX, mfctr/mtctr rX and mr rA,rB.

---
 arch/powerpc/lib/sstep.c |   45 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 44 insertions(+), 1 deletion(-)
arch/powerpc/lib/sstep.c +44 -1
Index: linux-2.6.21-rc7/arch/powerpc/lib/sstep.c
===================================================================
@@ -54,7 +54,7 @@ static int __kprobes branch_taken(unsign
  */
 int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
 {
-	unsigned int opcode, rd;
+	unsigned int opcode, rs, rb, rd, spr;
 	unsigned long int imm;
 
 	opcode = instr >> 26;
@@ -152,6 +152,49 @@ int __kprobes emulate_step(struct pt_reg
 				regs->nip &= 0xffffffffUL;
 			return 1;
 #endif
+		case 0x26:	/* mfcr */
+			regs->gpr[rd] = regs->ccr;
+			regs->gpr[rd] &= 0xffffffffUL;
+			goto mtspr_out;
+		case 0x2a6:	/* mfspr */
+			spr = (instr >> 11) & 0x3ff;
+			switch (spr) {
+			case 0x20:	/* mfxer */
+				regs->gpr[rd] = regs->xer;
+				regs->gpr[rd] &= 0xffffffffUL;
+				goto mtspr_out;
+			case 0x100:	/* mflr */
+				regs->gpr[rd] = regs->link;
+				goto mtspr_out;
+			case 0x120:	/* mfctr */
+				regs->gpr[rd] = regs->ctr;
+				goto mtspr_out;
+			}
+			break;
+		case 0x378:	/* orx */
+			rs = (instr >> 21) & 0x1f;
+			rb = (instr >> 11) & 0x1f;
+			if (rs == rb) {		/* mr */
+				rd = (instr >> 16) & 0x1f;
+				regs->gpr[rd] = regs->gpr[rs];
+				goto mtspr_out;
+			}
+			break;
+		case 0x3a6:	/* mtspr */
+			spr = (instr >> 11) & 0x3ff;
+			switch (spr) {
+			case 0x20:	/* mtxer */
+				regs->xer = (regs->gpr[rd] & 0xffffffffUL);
+				goto mtspr_out;
+			case 0x100:	/* mtlr */
+				regs->link = regs->gpr[rd];
+				goto mtspr_out;
+			case 0x120:	/* mtctr */
+				regs->ctr = regs->gpr[rd];
+mtspr_out:
+				regs->nip += 4;
+				return 1;
+			}
 		}
 	}
 	return 0;
#1 lore raw
Quoted 8 lines · Ananth N Mavinakayanahalli

Emulate a few more instructions in software - especially useful during singlestepping (xmon/kprobes).

Instructions emulated with this patch are mfcr/mtcr rX, mfxer/mtxer rX, mflr/mtlr rX, mfctr/mtctr rX and mr rA,rB.

When do we actually need to emulate any of these instructions? I don't see why single stepping would effect the ability to execute these instructions.

- k

#2 lore raw
Quoted 11 lines · Kumar Gala
Quoted 8 lines · Ananth N Mavinakayanahalli

Emulate a few more instructions in software - especially useful during singlestepping (xmon/kprobes).

Instructions emulated with this patch are mfcr/mtcr rX, mfxer/mtxer rX,
mflr/mtlr rX, mfctr/mtctr rX and mr rA,rB.

Quoted 5 lines
Quoted 1 line

When do we actually need to emulate any of these instructions? I don't see why single stepping would effect the ability to execute these instructions.

In cases when these instructions are kprobed, it'd be possible to eliminate the single step exception as we can emulate them.

Most usecases of kprobes are at function entry and in most cases, the instruction at function entry is mflr r0, which can be emulated. So you can get rid of one exception and get a nice speedup too. My other patch did just this.

Ananth

#3 lore raw
Quoted 18 lines · Ananth N Mavinakayanahalli
Quoted 11 lines · Kumar Gala
Quoted 8 lines · Ananth N Mavinakayanahalli

Emulate a few more instructions in software - especially useful during singlestepping (xmon/kprobes).

Instructions emulated with this patch are mfcr/mtcr rX, mfxer/mtxer rX,
mflr/mtlr rX, mfctr/mtctr rX and mr rA,rB.

Quoted 5 lines
Quoted 1 line

When do we actually need to emulate any of these instructions? I don't see why single stepping would effect the ability to execute these instructions.

Quoted 7 lines

In cases when these instructions are kprobed, it'd be possible to eliminate the single step exception as we can emulate them.

Most usecases of kprobes are at function entry and in most cases, the instruction at function entry is mflr r0, which can be emulated. So you can get rid of one exception and get a nice speedup too. My other patch did just this.

Makes sense, how about wrapping the emulation of those instructions in a #if defined(CONFIG_KPROBES) || defined(CONFIG_XMON). Plus adding a comment about these instructions just be emulated for singlestepping performance and not because they are missing on some platform.

Also, do you really see that many mfxer/mtxer. I'd expect them to be rare.

- k

#4 lore raw
Quoted 32 lines · Kumar Gala
Quoted 22 lines · Ananth N Mavinakayanahalli
Quoted 12 lines · Kumar Gala
Quoted 9 lines · Ananth N Mavinakayanahalli

Emulate a few more instructions in software - especially useful during
singlestepping (xmon/kprobes).

Instructions emulated with this patch are mfcr/mtcr rX, mfxer/mtxer rX,
mflr/mtlr rX, mfctr/mtctr rX and mr rA,rB.

Quoted 5 lines
Quoted 1 line

When do we actually need to emulate any of these instructions? I don't see why single stepping would effect the ability to execute these instructions.

In cases when these instructions are kprobed, it'd be possible to eliminate the single step exception as we can emulate them.

Quoted 6 lines

Most usecases of kprobes are at function entry and in most cases, the instruction at function entry is mflr r0, which can be emulated. So you
can get rid of one exception and get a nice speedup too. My other patch
did just this.

Quoted 5 lines

Makes sense, how about wrapping the emulation of those instructions in a #if defined(CONFIG_KPROBES) || defined(CONFIG_XMON). Plus adding a comment about these instructions just be emulated for singlestepping performance and not because they are missing on some platform.

Ignore this, I see this code is in lib/sstep.c not the main emulation path.

Quoted 9 lines

Also, do you really see that many mfxer/mtxer. I'd expect them to be rare.

- k

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://ozlabs.org/mailman/listinfo/linuxppc-dev

#5 lore raw
Quoted 35 lines · Kumar Gala
Quoted 32 lines · Kumar Gala
Quoted 28 lines · Ananth N Mavinakayanahalli
Quoted 12 lines · Kumar Gala
Quoted 9 lines · Ananth N Mavinakayanahalli

Emulate a few more instructions in software - especially useful during
singlestepping (xmon/kprobes).

Instructions emulated with this patch are mfcr/mtcr rX, mfxer/mtxer rX,
mflr/mtlr rX, mfctr/mtctr rX and mr rA,rB.

Quoted 5 lines
Quoted 1 line

When do we actually need to emulate any of these instructions? I don't see why single stepping would effect the ability to execute these instructions.

In cases when these instructions are kprobed, it'd be possible to eliminate the single step exception as we can emulate them.

Most usecases of kprobes are at function entry and in most cases, the instruction at function entry is mflr r0, which can be emulated. So you
can get rid of one exception and get a nice speedup too. My other patch
did just this.

Quoted 11 lines
Quoted 5 lines

Makes sense, how about wrapping the emulation of those instructions in a #if defined(CONFIG_KPROBES) || defined(CONFIG_XMON). Plus adding a comment about these instructions just be emulated for singlestepping performance and not because they are missing on some platform.

Ignore this, I see this code is in lib/sstep.c not the main emulation path.

Quoted 2 lines

Also, do you really see that many mfxer/mtxer. I'd expect them to be rare.

Right. In fact, there were none in the .o files I checked. I put the code for it for completeness wrt registers exposed by pt_regs.

Ananth