Linux Remote Processor Subsystem development
 help / color / mirror / Atom feed
From: Stephan Gerhold <stephan.gerhold@linaro.org>
To: "François Roux" <info@humanlearning.ch>
Cc: Bjorn Andersson <andersson@kernel.org>,
	Mathieu Poirier <mathieu.poirier@linaro.org>,
	linux-remoteproc@vger.kernel.org
Subject: Re: [BUG] qcom_q6v5_pas: NULL deref in recovery when using attach-only ops (qcom,broken-reset)
Date: Wed, 12 Aug 2026 15:52:15 +0200	[thread overview]
Message-ID: <anx6j8UX3BzvZ7JN@linaro.org> (raw)
In-Reply-To: <20260811171546.188660-1-info@humanlearning.ch>

On Tue, Aug 11, 2026 at 07:15:46PM +0200, François Roux wrote:
> Running your remoteproc "attach" series on a Surface Pro 12in (X1P42100) at
> EL2, I hit a kernel oops when the CDSP crashed on its own during a long
> build. I was not trying to break anything -- this was a 28-minute kernel
> compile as a stability test, and the DSP failed unprompted.
> 
> Reproducer: any remoteproc using qcom_pas_ops_no_reset (i.e. a node with
> qcom,broken-reset) that crashes at runtime. No user action needed.
> 

Thanks for the report. Please note that this is a non-upstream change,
so while I appreciate the report we should not ping the upstream
maintainers about it. They have likely never seen the change.

> What happens
> ============
> 
> 	qcom_q6v5_pas 32300000.remoteproc: fatal error received: sleep_statsi.c:537:
> 	remoteproc remoteproc1: crash detected in cdsp: type fatal error
> 	remoteproc remoteproc1: handling crash #1 in cdsp
> 	remoteproc remoteproc1: recovering cdsp
> 	remoteproc remoteproc1: stopped remote processor cdsp
> 	Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> 	Mem abort info:
> 	  ESR = 0x0000000086000004
> 	  EC = 0x21: IABT (current EL), IL = 32 bits
> 	  FSC = 0x04: level 0 translation fault
> 	Internal error: Oops: 0000000086000004 [#1]  SMP
> 	CPU: 3 UID: 0 PID: 82168 Comm: kworker/u34:5 Not tainted 7.1.0-next-20260626 #10
> 	Hardware name: Microsoft Corporation Surface Pro 12in 1st Ed with Snapdragon
> 	Workqueue: rproc_recovery_wq rproc_crash_handler_work
> 	pc : 0x0
> 	lr : rproc_start+0xc0/0x164
> 	Call trace:
> 	 rproc_trigger_recovery+0x148/0x164
> 	 rproc_crash_handler_work+0xb4/0xb8
> 	 process_one_work+0x15c/0x29c
> 	 worker_thread+0x18c/0x2e0
> 	 kthread+0x11c/0x13c
> 	 ret_from_fork+0x10/0x20
> 
> Analysis
> ========
> 
> The link register points at rproc_start+0xc0, and the instruction before it
> is the indirect call:
> 
> 	rproc_start+0xbc:  ldr x1, [x0, #16]   <- rproc->ops->start
> 	                   blr x1              <- x1 == NULL
> 
> which is remoteproc_core.c:1292:
> 
> 	ret = rproc->ops->start(rproc);
> 
> rproc_start() calls ops->start unconditionally, and qcom_pas_ops_no_reset
> does not provide one:
> 
> 	static const struct rproc_ops qcom_pas_ops_no_reset = {
> 		.attach    = qcom_pas_attach,
> 		.da_to_va  = qcom_pas_da_to_va,
> 		.stop      = qcom_pas_stop,
> 		.panic     = qcom_pas_panic,
> 	};
> 
> The reason that path is reached at all is the branch in
> rproc_trigger_recovery():
> 
> 	if (rproc_has_feature(rproc, RPROC_FEAT_ATTACH_ON_RECOVERY))
> 		ret = rproc_attach_recovery(rproc);
> 	else
> 		ret = rproc_boot_recovery(rproc);
> 
> qcom_q6v5_pas.c never calls rproc_set_feature(..., RPROC_FEAT_ATTACH_ON_RECOVERY)
> -- in this tree only imx_rproc.c does. So an attach-only remoteproc takes the
> boot path on recovery, which tries to load firmware and start it, neither of
> which it can do.
> 
> Suggested direction (untested)
> ==============================
> 
> Setting RPROC_FEAT_ATTACH_ON_RECOVERY when qcom_pas_ops_no_reset is selected
> looks like the natural fix, so recovery goes through rproc_attach_recovery().
> Note that path calls __rproc_detach() first, and .detach is also absent from
> qcom_pas_ops_no_reset -- but __rproc_detach() does check for it and returns
> an error rather than dereferencing NULL, so the failure would at least be
> graceful.
> 

We can't recover the remoteproc in this case, because we don't know how
to restart it. Attaching a crashed remoteproc (that is no longer
functional) does not make sense either.

I think we should set rproc->recovery_disabled = true to fix this.
Practically speaking though, the whole qcom,broken-reset approach is
kind of controversial and I'm not sure yet if I will ever post it
upstream in the current state.

Thanks,
Stephan

  reply	other threads:[~2026-08-12 13:52 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-11 17:15 [BUG] qcom_q6v5_pas: NULL deref in recovery when using attach-only ops (qcom,broken-reset) François Roux
2026-08-12 13:52 ` Stephan Gerhold [this message]
2026-08-18 14:14   ` François Roux

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=anx6j8UX3BzvZ7JN@linaro.org \
    --to=stephan.gerhold@linaro.org \
    --cc=andersson@kernel.org \
    --cc=info@humanlearning.ch \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=mathieu.poirier@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox