]> git.baikalelectronics.ru Git - kernel.git/commit
firmware: qcom: scm: Fix crash in qcom_scm_call_atomic1()
authorNiklas Cassel <niklas.cassel@linaro.org>
Mon, 9 Apr 2018 21:40:15 +0000 (23:40 +0200)
committerAndy Gross <andy.gross@linaro.org>
Fri, 25 May 2018 03:36:45 +0000 (22:36 -0500)
commitd0f8f89f1d629b6aacbe96add4e9a665b2135465
treef248c80eb4170515e7c886f23dc7805327096489
parent79a4347c21dc3c02727157c3d73c83bff31de497
firmware: qcom: scm: Fix crash in qcom_scm_call_atomic1()

qcom_scm_call_atomic1() can crash with a NULL pointer dereference at
qcom_scm_call_atomic1+0x30/0x48.

disassembly of qcom_scm_call_atomic1():
...
<0xc08d73b0 <+12>: ldr r3, [r12]
... (no instruction explicitly modifies r12)
0xc08d73cc <+40>: smc 0
... (no instruction explicitly modifies r12)
0xc08d73d4 <+48>: ldr r3, [r12] <- crashing instruction
...

Since the first ldr is successful, and since r12 isn't explicitly
modified by any instruction between the first and the second ldr,
it must have been modified by the smc call, which is ok,
since r12 is caller save according to the AAPCS.

Add r12 to the clobber list so that the compiler knows that the
callee potentially overwrites the value in r12.
Clobber descriptions may not in any way overlap with an input or
output operand.

Signed-off-by: Niklas Cassel <niklas.cassel@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Reviewed-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Andy Gross <andy.gross@linaro.org>
drivers/firmware/qcom_scm-32.c