[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