summaryrefslogtreecommitdiff
path: root/common/bootstage.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2019-10-21 17:26:49 -0600
committerSimon Glass <sjg@chromium.org>2019-10-27 10:56:51 -0600
commit65b2d96f4c5e3f9084bc04cf5a5d7fc7a2285a72 (patch)
tree4be404e23883cac805c67e93a176a7ef512facdd /common/bootstage.c
parented54bdaf88758854905b5d8ca5036a078b9ef168 (diff)
bootstage: Avoid conflicts between stash/unstash
At present there is a single shared address for bootstage data in both TPL and SPL. If SPL unstashs TPL bootstage info and then stashes it again to pass it to U-Boot, the new stash overwrites the strings of the old stash. Fix this by duplicating the strings into the malloc() region. This should be a small code. Fix the header-file order at the same time. This problem doesn't happen at the next stage (SPL->U-Boot) since U-Boot relocates the boostage data. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common/bootstage.c')
-rw-r--r--common/bootstage.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/common/bootstage.c b/common/bootstage.c
index fe36bac047..4557ed4508 100644
--- a/common/bootstage.c
+++ b/common/bootstage.c
@@ -10,9 +10,10 @@
*/
#include <common.h>
-#include <linux/libfdt.h>
#include <malloc.h>
+#include <spl.h>
#include <linux/compiler.h>
+#include <linux/libfdt.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -472,6 +473,8 @@ int bootstage_unstash(const void *base, int size)
for (rec = data->record + data->next_id, i = 0; i < hdr->count;
i++, rec++) {
rec->name = ptr;
+ if (spl_phase() == PHASE_SPL)
+ rec->name = strdup(ptr);
/* Assume no data corruption here */
ptr += strlen(ptr) + 1;