Emulate more instructions in software
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
@@ -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 ;
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.
Signed-off-by Ananth N Mavinakayanahalli <[email protected]>
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
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
Signed-off-by Ananth N Mavinakayanahalli <[email protected]>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
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
Signed-off-by Ananth N Mavinakayanahalli <[email protected]>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
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
Signed-off-by Ananth N Mavinakayanahalli <[email protected]>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
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
Signed-off-by Ananth N Mavinakayanahalli <[email protected]>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.cnot 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