openamp: backport patch to fix elf loader bug
* Add 0001-remoteproc-Fix-management-of-non-loadable-program-se.patch to fix elf loader bug Signed-off-by: hanzongcheng <hanzongcheng@huawei.com>
This commit is contained in:
parent
de0c82a1c4
commit
128de2915b
@ -0,0 +1,63 @@
|
|||||||
|
From 79b795e954e15d0d7c37d49fd32ac9cc0315bc3c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Umair Khan <umair_khan@mentor.com>
|
||||||
|
Date: Wed, 7 Feb 2024 19:43:04 +0500
|
||||||
|
Subject: [PATCH] remoteproc: Fix management of non loadable program segments
|
||||||
|
|
||||||
|
The elf loader assumes that the last ELF program segment will always
|
||||||
|
be a LOAD type segment. I deduce this from the fact that the elf_load()
|
||||||
|
function, when loading the remote ELF sections during the
|
||||||
|
RPROC_LOADER_READY_TO_LOAD stage, compares the last load segment num
|
||||||
|
to the total ELF sections to determine if the loading is complete and
|
||||||
|
it can move to the next stage RPROC_LOADER_POST_DATA_LOAD. If the last
|
||||||
|
program segment in the ELF is not of type LOAD, the last loaded LOAD
|
||||||
|
segment never equals total ELF sections. This creates an error
|
||||||
|
condition and the firmware loading fails. This patch fixes this issue
|
||||||
|
by comparing the last loaded LOAD segment number with the max LOAD
|
||||||
|
segment number in the ELF.
|
||||||
|
|
||||||
|
Signed-off-by: Umair Khan <umair_khan@mentor.com>
|
||||||
|
|
||||||
|
diff --git a/lib/remoteproc/elf_loader.c b/lib/remoteproc/elf_loader.c
|
||||||
|
index 4d50183..c0eb116 100644
|
||||||
|
--- a/lib/remoteproc/elf_loader.c
|
||||||
|
+++ b/lib/remoteproc/elf_loader.c
|
||||||
|
@@ -571,20 +571,25 @@ int elf_load(struct remoteproc *rproc,
|
||||||
|
nsegment = *load_state & ELF_NEXT_SEGMENT_MASK;
|
||||||
|
phdr = elf_next_load_segment(*img_info, &nsegment, da,
|
||||||
|
noffset, &nsize, &nsegmsize);
|
||||||
|
- if (!phdr) {
|
||||||
|
- metal_log(METAL_LOG_DEBUG, "cannot find more segment\r\n");
|
||||||
|
- *load_state = (*load_state & (~ELF_NEXT_SEGMENT_MASK)) |
|
||||||
|
- (nsegment & ELF_NEXT_SEGMENT_MASK);
|
||||||
|
- return *load_state;
|
||||||
|
- }
|
||||||
|
- *nlen = nsize;
|
||||||
|
- *nmemsize = nsegmsize;
|
||||||
|
+
|
||||||
|
phnums = elf_phnum(*img_info);
|
||||||
|
- metal_log(METAL_LOG_DEBUG, "segment: %d, total segs %d\r\n",
|
||||||
|
- nsegment, phnums);
|
||||||
|
+ if (phdr) {
|
||||||
|
+ *nlen = nsize;
|
||||||
|
+ *nmemsize = nsegmsize;
|
||||||
|
+ metal_log(METAL_LOG_DEBUG, "segment: %d, total segs %d\r\n",
|
||||||
|
+ nsegment, phnums);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (nsegment == phnums) {
|
||||||
|
- *load_state = (*load_state & (~RPROC_LOADER_MASK)) |
|
||||||
|
+ if (phdr) {
|
||||||
|
+ *load_state = (*load_state & (~RPROC_LOADER_MASK)) |
|
||||||
|
RPROC_LOADER_POST_DATA_LOAD;
|
||||||
|
+ } else {
|
||||||
|
+ metal_log(METAL_LOG_DEBUG, "no more segment to load\r\n");
|
||||||
|
+ *load_state = (*load_state & (~RPROC_LOADER_MASK)) |
|
||||||
|
+ RPROC_LOADER_LOAD_COMPLETE;
|
||||||
|
+ *da = RPROC_LOAD_ANYADDR;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
*load_state = (*load_state & (~ELF_NEXT_SEGMENT_MASK)) |
|
||||||
|
(nsegment & ELF_NEXT_SEGMENT_MASK);
|
||||||
|
--
|
||||||
|
2.34.1
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
Name: openamp
|
Name: openamp
|
||||||
Version: 2022.10.1
|
Version: 2022.10.1
|
||||||
Release: 5
|
Release: 6
|
||||||
Summary: Open asymmetric multiprocessing framework
|
Summary: Open asymmetric multiprocessing framework
|
||||||
|
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
@ -9,6 +9,7 @@ Source0: https://github.com/OpenAMP/open-amp/archive/refs/tags/v%{version}/%{nam
|
|||||||
|
|
||||||
Patch0001:0001-apps-Fix-atomic_flag-error-for-clang-compilation.patch
|
Patch0001:0001-apps-Fix-atomic_flag-error-for-clang-compilation.patch
|
||||||
Patch0002:0002-lib-Fix-atomic_flag-error-for-clang-compilation.patch
|
Patch0002:0002-lib-Fix-atomic_flag-error-for-clang-compilation.patch
|
||||||
|
Patch0003:0001-remoteproc-Fix-management-of-non-loadable-program-se.patch
|
||||||
|
|
||||||
BuildRequires: cmake
|
BuildRequires: cmake
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
@ -70,6 +71,9 @@ cd build
|
|||||||
%{_bindir}/*-shared
|
%{_bindir}/*-shared
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sat Mar 16 2024 hanzongcheng <hanzongcheng@huawei.com> - 2022.10.1-6
|
||||||
|
- Add patch to fix elf loader bug
|
||||||
|
|
||||||
* Mon Jun 05 2023 hanzongcheng <hanzongcheng@huawei.com> - 2022.10.1-5
|
* Mon Jun 05 2023 hanzongcheng <hanzongcheng@huawei.com> - 2022.10.1-5
|
||||||
- Keep changlog and release consistent
|
- Keep changlog and release consistent
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user