x86,mmiotrace: add support for tracing STOS instruction
PATCH 1/1 x86,mmiotrace: add support for tracing STOS instruction
Signed-off-by Marcin Slusarz <[email protected]>
Cc Pekka Paalanen <[email protected]>
--- arch/x86/mm/pf_in.c | 30 +++++++++++++++++------------- 1 files changed, 17 insertions(+), 13 deletions(-)
arch/x86/mm/pf_in.c +17 -13
@@ -40,16 +40,16 @@ static unsigned char prefix_codes[] = {static unsigned int reg_rop[] = {0x8A ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F }; -static unsigned int reg_wop[] = {0x88 ,0x89 }; +static unsigned int reg_wop[] = {0x88 ,0x89 ,0xAA ,0xAB };static unsigned int imm_wop[] = {0xC6 ,0xC7 };/* IA32 Manual 3, 3-432*/ -static unsigned int rw8[] = {0x88 ,0x8A ,0xC6 }; +static unsigned int rw8[] = {0x88 ,0x8A ,0xC6 ,0xAA };static unsigned int rw32[] = { -0x89 ,0x8B ,0xC7 ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F +0x89 ,0x8B ,0xC7 ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F ,0xAB }; -static unsigned int mw8[] = {0x88 ,0x8A ,0xC6 ,0xB60F ,0xBE0F }; +static unsigned int mw8[] = {0x88 ,0x8A ,0xC6 ,0xB60F ,0xBE0F ,0xAA };static unsigned int mw16[] = {0xB70F ,0xBF0F }; -static unsigned int mw32[] = {0x89 ,0x8B ,0xC7 }; +static unsigned int mw32[] = {0x89 ,0x8B ,0xC7 ,0xAB };static unsigned int mw64[] = {};#else /* not __i386__ */ static unsigned char prefix_codes[] = {
@@ -63,20 +63,20 @@ static unsigned char prefix_codes[] = {static unsigned int reg_rop[] = {0x8A ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F }; -static unsigned int reg_wop[] = {0x88 ,0x89 }; +static unsigned int reg_wop[] = {0x88 ,0x89 ,0xAA ,0xAB };static unsigned int imm_wop[] = {0xC6 ,0xC7 }; -static unsigned int rw8[] = {0xC6 ,0x88 ,0x8A }; +static unsigned int rw8[] = {0xC6 ,0x88 ,0x8A ,0xAA };static unsigned int rw32[] = { -0xC7 ,0x89 ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F +0xC7 ,0x89 ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F ,0xAB };/* 8 bit only */ -static unsigned int mw8[] = {0xC6 ,0x88 ,0x8A ,0xB60F ,0xBE0F }; +static unsigned int mw8[] = {0xC6 ,0x88 ,0x8A ,0xB60F ,0xBE0F ,0xAA };/* 16 bit only */ static unsigned int mw16[] = {0xB70F ,0xBF0F };/* 16 or 32 bit */ static unsigned int mw32[] = {0xC7 };/* 16, 32 or 64 bit */ -static unsigned int mw64[] = {0x89 ,0x8B }; +static unsigned int mw64[] = {0x89 ,0x8B ,0xAB };#endif /* not __i386__ */ struct prefix_bits {
@@ -410,7 +410,6 @@ static unsigned long *get_reg_w32(int no, struct pt_regs *regs)unsigned long get_ins_reg_val (unsigned long ins_addr,struct pt_regs *regs) {unsigned int opcode; -unsigned char mod_rm;int reg;unsigned char *p;struct prefix_bits prf;
@@ -437,8 +436,13 @@ unsigned long get_ins_reg_val(unsigned long ins_addr, struct pt_regs *regs) goto err; do_work: - mod_rm = *p; - reg = ((mod_rm >>3 ) &0x7 ) | (prf.rexr <<3 ); +/* for STOS, source register is fixed */ +if (opcode ==0xAA || opcode ==0xAB ) { + reg = arg_AX; + }else { +unsigned char mod_rm = *p; + reg = ((mod_rm >>3 ) &0x7 ) | (prf.rexr <<3 ); + }switch (get_ins_reg_width (ins_addr)) {case 1 :return *get_reg_w8 (reg, prf.rex, regs);
Signature · 1 line
1.7.1.1
Quoted 2 lines · On Sat, 31 Jul 2010 22:51:01 +0200 Marcin Slusarz…
Signed-off-by Marcin Slusarz <[email protected]>Cc Pekka Paalanen <[email protected]>
I have not checked the correctness of this patch, but otherwise:
Acked-by Pekka Paalanen <[email protected]>
Quoted 82 lines
--- arch/x86/mm/pf_in.c | 30 +++++++++++++++++------------- 1 files changed, 17 insertions(+), 13 deletions(-)arch/x86/mm/pf_in.c +9
-9@@ -40,16 +40,16 @@ static unsigned char prefix_codes[] = {static unsigned int reg_rop[] = {0x8A ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F }; -static unsigned int reg_wop[] = {0x88 ,0x89 }; +static unsigned int reg_wop[] = {0x88 ,0x89 ,0xAA ,0xAB };static unsigned int imm_wop[] = {0xC6 ,0xC7 };/* IA32 Manual 3, 3-432*/ -static unsigned int rw8[] = {0x88 ,0x8A ,0xC6 }; +static unsigned int rw8[] = {0x88 ,0x8A ,0xC6 ,0xAA };static unsigned int rw32[] = { -0x89 ,0x8B ,0xC7 ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F +0x89 ,0x8B ,0xC7 ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F ,0xAB }; -static unsigned int mw8[] = {0x88 ,0x8A ,0xC6 ,0xB60F ,0xBE0F }; +static unsigned int mw8[] = {0x88 ,0x8A ,0xC6 ,0xB60F ,0xBE0F ,0xAA };static unsigned int mw16[] = {0xB70F ,0xBF0F }; -static unsigned int mw32[] = {0x89 ,0x8B ,0xC7 }; +static unsigned int mw32[] = {0x89 ,0x8B ,0xC7 ,0xAB };static unsigned int mw64[] = {};#else /* not __i386__ */ static unsigned char prefix_codes[] = {@@ -63,20 +63,20 @@ static unsigned char prefix_codes[] = {static unsigned int reg_rop[] = {0x8A ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F }; -static unsigned int reg_wop[] = {0x88 ,0x89 }; +static unsigned int reg_wop[] = {0x88 ,0x89 ,0xAA ,0xAB };static unsigned int imm_wop[] = {0xC6 ,0xC7 }; -static unsigned int rw8[] = {0xC6 ,0x88 ,0x8A }; +static unsigned int rw8[] = {0xC6 ,0x88 ,0x8A ,0xAA };static unsigned int rw32[] = { -0xC7 ,0x89 ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F +0xC7 ,0x89 ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F ,0xAB };/* 8 bit only */ -static unsigned int mw8[] = {0xC6 ,0x88 ,0x8A ,0xB60F ,0xBE0F }; +static unsigned int mw8[] = {0xC6 ,0x88 ,0x8A ,0xB60F ,0xBE0F ,
0xAA}; /* 16 bit only */
static unsigned int mw16[] = {0xB70F,0xBF0F};
/* 16 or 32 bit */
static unsigned int mw32[] = {0xC7};
/* 16, 32 or 64 bit */arch/x86/mm/pf_in.c +1
-1-static unsigned int mw64[] = {0x89 ,0x8B }; +static unsigned int mw64[] = {0x89 ,0x8B ,0xAB };#endif /* not __i386__ */ struct prefix_bits {@@ -410,7 +410,6 @@ static unsigned long *get_reg_w32(int no,struct
pt_regs*regs) unsigned longget_ins_reg_val(unsigned long ins_addr, struct pt_regs *regs){arch/x86/mm/pf_in.c +7
-3unsigned int opcode; -unsigned char mod_rm;int reg;unsigned char *p;struct prefix_bits prf;@@ -437,8 +436,13 @@ unsigned long get_ins_reg_val(unsigned long ins_addr, struct pt_regs *regs) goto err; do_work: - mod_rm = *p; - reg = ((mod_rm >>3 ) &0x7 ) | (prf.rexr <<3 ); +/* for STOS, source register is fixed */ +if (opcode ==0xAA || opcode ==0xAB ) { + reg = arg_AX; + }else { +unsigned char mod_rm = *p; + reg = ((mod_rm >>3 ) &0x7 ) | (prf.rexr <<3 ); + }switch (get_ins_reg_width (ins_addr)) {case 1 :return *get_reg_w8 (reg, prf.rex, regs);Signature · 1 line
1.7.1.1
Signature · 2 lines
Pekka Paalanen http://www.iki.fi/pq/
Frederic Weisbecker
AppliedQuoted 8 lines · Pekka Paalanen
Quoted 2 lines · On Sat, 31 Jul 2010 22:51:01 +0200 Marcin Slusarz <[email protected]>…
Signed-off-by Marcin Slusarz <[email protected]>Cc Pekka Paalanen <[email protected]>I have not checked the correctness of this patch, but otherwise:
Acked-by Pekka Paalanen <[email protected]>
Queued, thanks!
[tip:perf/core] x86,mmiotrace: Add support for tracing STOS instruction
In reply to Marcin SlusarzCommit-ID: cc05152ab72d7a65e6ea97d286af4f878c8f7371 Gitweb: http://git.kernel.org/tip/cc05152ab72d7a65e6ea97d286af4f878c8f7371 Author: Marcin Slusarz <[email protected]> AuthorDate: Sat, 31 Jul 2010 22:51:01 +0200 Committer: Frederic Weisbecker <[email protected]> CommitDate: Mon, 2 Aug 2010 01:32:01 +0200
x86,mmiotrace: Add support for tracing STOS instruction
Add support for stos access tracing with mmiotrace.
Signed-off-by Marcin Slusarz <[email protected]>
Acked-by Pekka Paalanen <[email protected]>
Cc Nouveau <[email protected]>
Cc Thomas Gleixner <[email protected]>
Cc H. Peter Anvin <[email protected]>
Cc Ingo Molnar <[email protected]>
Cc Steven Rostedt <[email protected]>
LKML-Reference: <[email protected]>
Signed-off-by Frederic Weisbecker <[email protected]>
--- arch/x86/mm/pf_in.c | 30 +++++++++++++++++------------- 1 files changed, 17 insertions(+), 13 deletions(-)
arch/x86/mm/pf_in.c +17 -13
@@ -40,16 +40,16 @@ static unsigned char prefix_codes[] = {static unsigned int reg_rop[] = {0x8A ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F }; -static unsigned int reg_wop[] = {0x88 ,0x89 }; +static unsigned int reg_wop[] = {0x88 ,0x89 ,0xAA ,0xAB };static unsigned int imm_wop[] = {0xC6 ,0xC7 };/* IA32 Manual 3, 3-432*/ -static unsigned int rw8[] = {0x88 ,0x8A ,0xC6 }; +static unsigned int rw8[] = {0x88 ,0x8A ,0xC6 ,0xAA };static unsigned int rw32[] = { -0x89 ,0x8B ,0xC7 ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F +0x89 ,0x8B ,0xC7 ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F ,0xAB }; -static unsigned int mw8[] = {0x88 ,0x8A ,0xC6 ,0xB60F ,0xBE0F }; +static unsigned int mw8[] = {0x88 ,0x8A ,0xC6 ,0xB60F ,0xBE0F ,0xAA };static unsigned int mw16[] = {0xB70F ,0xBF0F }; -static unsigned int mw32[] = {0x89 ,0x8B ,0xC7 }; +static unsigned int mw32[] = {0x89 ,0x8B ,0xC7 ,0xAB };static unsigned int mw64[] = {};#else /* not __i386__ */ static unsigned char prefix_codes[] = {
@@ -63,20 +63,20 @@ static unsigned char prefix_codes[] = {static unsigned int reg_rop[] = {0x8A ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F }; -static unsigned int reg_wop[] = {0x88 ,0x89 }; +static unsigned int reg_wop[] = {0x88 ,0x89 ,0xAA ,0xAB };static unsigned int imm_wop[] = {0xC6 ,0xC7 }; -static unsigned int rw8[] = {0xC6 ,0x88 ,0x8A }; +static unsigned int rw8[] = {0xC6 ,0x88 ,0x8A ,0xAA };static unsigned int rw32[] = { -0xC7 ,0x89 ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F +0xC7 ,0x89 ,0x8B ,0xB60F ,0xB70F ,0xBE0F ,0xBF0F ,0xAB };/* 8 bit only */ -static unsigned int mw8[] = {0xC6 ,0x88 ,0x8A ,0xB60F ,0xBE0F }; +static unsigned int mw8[] = {0xC6 ,0x88 ,0x8A ,0xB60F ,0xBE0F ,0xAA };/* 16 bit only */ static unsigned int mw16[] = {0xB70F ,0xBF0F };/* 16 or 32 bit */ static unsigned int mw32[] = {0xC7 };/* 16, 32 or 64 bit */ -static unsigned int mw64[] = {0x89 ,0x8B }; +static unsigned int mw64[] = {0x89 ,0x8B ,0xAB };#endif /* not __i386__ */ struct prefix_bits {
@@ -410,7 +410,6 @@ static unsigned long *get_reg_w32(int no, struct pt_regs *regs)unsigned long get_ins_reg_val (unsigned long ins_addr,struct pt_regs *regs) {unsigned int opcode; -unsigned char mod_rm;int reg;unsigned char *p;struct prefix_bits prf;
@@ -437,8 +436,13 @@ unsigned long get_ins_reg_val(unsigned long ins_addr, struct pt_regs *regs) goto err; do_work: - mod_rm = *p; - reg = ((mod_rm >>3 ) &0x7 ) | (prf.rexr <<3 ); +/* for STOS, source register is fixed */ +if (opcode ==0xAA || opcode ==0xAB ) { + reg = arg_AX; + }else { +unsigned char mod_rm = *p; + reg = ((mod_rm >>3 ) &0x7 ) | (prf.rexr <<3 ); + }switch (get_ins_reg_width (ins_addr)) {case 1 :return *get_reg_w8 (reg, prf.rex, regs);