[PATCH 5/6] ARM: kprobes: Fix emulation of SMUAD, SMUSD and SMMUL instructions
Sergei Shtylyov
sshtylyov at mvista.com
Tue Apr 12 07:42:52 EDT 2011
Hello.
On 12-04-2011 10:45, Tixy wrote:
> From: Jon Medhurst<tixy at yxit.co.uk>
> The signed multiply instructions were being decoded incorrectly.
> Signed-off-by: Jon Medhurst <tixy at yxit.co.uk>
> ---
> arch/arm/kernel/kprobes-decode.c | 22 +++++++++++++++-------
> 1 files changed, 15 insertions(+), 7 deletions(-)
> diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c
> index 30ba313..915b057 100644
> --- a/arch/arm/kernel/kprobes-decode.c
> +++ b/arch/arm/kernel/kprobes-decode.c
> @@ -1436,18 +1436,26 @@ space_cccc_0111__1(kprobe_opcode_t insn, struct arch_specific_insn *asi)
> return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi);
>
> /* SMLAD : cccc 0111 0000 xxxx xxxx xxxx 00x1 xxxx :Q */
> + /* SMUAD : cccc 0111 0000 xxxx 1111 xxxx 00x1 xxxx :Q */
> /* SMLSD : cccc 0111 0000 xxxx xxxx xxxx 01x1 xxxx :Q */
> + /* SMUSD : cccc 0111 0000 xxxx 1111 xxxx 01x1 xxxx : */
> /* SMMLA : cccc 0111 0101 xxxx xxxx xxxx 00x1 xxxx : */
> - /* SMMLS : cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx : */
> + /* SMMUL : cccc 0111 0101 xxxx 1111 xxxx 00x1 xxxx : */
> if ((insn& 0x0ff00090) == 0x07000010 ||
> - (insn& 0x0ff000d0) == 0x07500010 ||
> - (insn& 0x0ff000d0) == 0x075000d0)
> + (insn& 0x0ff000d0) == 0x07500010) {
> +
> + if ((insn& 0x0000f000) == 0x0000f000) {
> + return prep_emulate_rd16rs8rm0_wflags(insn, asi);
> + } else {
> + return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi);
> + }
Why use {} around the single statements here?
> + }
> +
> + /* SMMLS : cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx : */
> + if ((insn & 0x0ff000d0) == 0x075000d0)
> return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi);
... but not here. It's at least inconsistent. :-)
WBR, Sergei
More information about the linux-arm-kernel
mailing list