From d39db2695ba626b9c0ee38652fe160b4e84b15d9 Mon Sep 17 00:00:00 2001 From: Ming Huang Date: Thu, 9 Sep 2021 17:42:27 +0800 Subject: [PATCH] fix(sdei): fix assert while kdump issue Assert condition: 1 Register secure timer(ppi=29) for sdei nmi watchdog; 2 kernel panic and then kdump; While kdump, kernel mask all cores sdei, secure timer trigger and go to handle_masked_trigger() and assert here: assert(se->affinity == my_mpidr); As kernel register with flag=0, mpidr=0 and TF-A set flag to SDEI_REGF_RM_PE but leave mpidr=0. So set mpidr to fix his assert issue. Signed-off-by: Ming Huang Change-Id: Ia9182f40bde94fb004b46e2a72b186eb0ef05166 --- services/std_svc/sdei/sdei_main.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/services/std_svc/sdei/sdei_main.c b/services/std_svc/sdei/sdei_main.c index 4ceaae891..7c85c2380 100644 --- a/services/std_svc/sdei/sdei_main.c +++ b/services/std_svc/sdei/sdei_main.c @@ -359,8 +359,20 @@ static int64_t sdei_event_register(int ev_num, return SDEI_EINVAL; /* Private events always target the PE */ - if (is_event_private(map)) + if (is_event_private(map)) { + /* + * SDEI internally handles private events in the same manner + * as public events with routing mode=RM_PE, since the routing + * mode flag and affinity fields are not used when registering + * a private event, set them here. + */ flags = SDEI_REGF_RM_PE; + /* + * Kernel may pass 0 as mpidr, as we set flags to + * SDEI_REGF_RM_PE, so set mpidr also. + */ + mpidr = read_mpidr_el1(); + } se = get_event_entry(map);