Marcin Slusarz
2010-Jul-31 20:51 UTC
[Nouveau] [PATCH] x86, mmiotrace: add support for tracing STOS instruction
Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com> Cc: Pekka Paalanen <pq at iki.fi> --- arch/x86/mm/pf_in.c | 30 +++++++++++++++++------------- 1 files changed, 17 insertions(+), 13 deletions(-) diff --git a/arch/x86/mm/pf_in.c b/arch/x86/mm/pf_in.c index 308e325..38e6d17 100644 --- a/arch/x86/mm/pf_in.c +++ b/arch/x86/mm/pf_in.c @@ -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); -- 1.7.1.1
Pekka Paalanen
2010-Aug-01 08:23 UTC
[Nouveau] [PATCH] x86, mmiotrace: add support for tracing STOS instruction
On Sat, 31 Jul 2010 22:51:01 +0200 Marcin Slusarz <marcin.slusarz at gmail.com> wrote:> Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com> > Cc: Pekka Paalanen <pq at iki.fi>I have not checked the correctness of this patch, but otherwise: Acked-by: Pekka Paalanen <pq at iki.fi>> --- > arch/x86/mm/pf_in.c | 30 +++++++++++++++++------------- > 1 files changed, 17 insertions(+), 13 deletions(-) > > diff --git a/arch/x86/mm/pf_in.c b/arch/x86/mm/pf_in.c > index 308e325..38e6d17 100644 > --- a/arch/x86/mm/pf_in.c > +++ b/arch/x86/mm/pf_in.c > @@ -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); > -- > 1.7.1.1-- Pekka Paalanen http://www.iki.fi/pq/
Frederic Weisbecker
2010-Aug-01 23:08 UTC
[Nouveau] [PATCH] x86, mmiotrace: add support for tracing STOS instruction
On Sun, Aug 01, 2010 at 11:23:03AM +0300, Pekka Paalanen wrote:> On Sat, 31 Jul 2010 22:51:01 +0200 > Marcin Slusarz <marcin.slusarz at gmail.com> wrote: > > > Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com> > > Cc: Pekka Paalanen <pq at iki.fi> > > I have not checked the correctness of this patch, but otherwise: > Acked-by: Pekka Paalanen <pq at iki.fi>Queued, thanks!
tip-bot for Marcin Slusarz
2010-Aug-02 07:58 UTC
[Nouveau] [tip:perf/core] x86, mmiotrace: Add support for tracing STOS instruction
Commit-ID: cc05152ab72d7a65e6ea97d286af4f878c8f7371 Gitweb: http://git.kernel.org/tip/cc05152ab72d7a65e6ea97d286af4f878c8f7371 Author: Marcin Slusarz <marcin.slusarz at gmail.com> AuthorDate: Sat, 31 Jul 2010 22:51:01 +0200 Committer: Frederic Weisbecker <fweisbec at gmail.com> 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 <marcin.slusarz at gmail.com> Acked-by: Pekka Paalanen <pq at iki.fi> Cc: Nouveau <nouveau at lists.freedesktop.org> Cc: Thomas Gleixner <tglx at linutronix.de> Cc: H. Peter Anvin <hpa at zytor.com> Cc: Ingo Molnar <mingo at elte.hu> Cc: Steven Rostedt <rostedt at goodmis.org> LKML-Reference: <20100731205101.GA5860 at joi.lan> Signed-off-by: Frederic Weisbecker <fweisbec at gmail.com> --- arch/x86/mm/pf_in.c | 30 +++++++++++++++++------------- 1 files changed, 17 insertions(+), 13 deletions(-) diff --git a/arch/x86/mm/pf_in.c b/arch/x86/mm/pf_in.c index 308e325..38e6d17 100644 --- a/arch/x86/mm/pf_in.c +++ b/arch/x86/mm/pf_in.c @@ -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);