summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/board_f.c1
-rw-r--r--common/board_r.c1
-rw-r--r--common/bootstage.c25
3 files changed, 23 insertions, 4 deletions
diff --git a/common/board_f.c b/common/board_f.c
index 4852a3b0d8..e3591cbaeb 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -696,6 +696,7 @@ static int reloc_bootstage(void)
gd->bootstage, gd->new_bootstage, size);
memcpy(gd->new_bootstage, gd->bootstage, size);
gd->bootstage = gd->new_bootstage;
+ bootstage_relocate();
}
#endif
diff --git a/common/board_r.c b/common/board_r.c
index d6fb5047a2..c1ecb06b74 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -670,7 +670,6 @@ static init_fnc_t init_sequence_r[] = {
#ifdef CONFIG_SYS_NONCACHED_MEMORY
initr_noncached,
#endif
- bootstage_relocate,
#ifdef CONFIG_OF_LIVE
initr_of_live,
#endif
diff --git a/common/bootstage.c b/common/bootstage.c
index 4557ed4508..e8b7bbf81a 100644
--- a/common/bootstage.c
+++ b/common/bootstage.c
@@ -53,14 +53,23 @@ int bootstage_relocate(void)
{
struct bootstage_data *data = gd->bootstage;
int i;
+ char *ptr;
+
+ /* Figure out where to relocate the strings to */
+ ptr = (char *)(data + 1);
/*
* Duplicate all strings. They may point to an old location in the
* program .text section that can eventually get trashed.
*/
debug("Relocating %d records\n", data->rec_count);
- for (i = 0; i < data->rec_count; i++)
- data->record[i].name = strdup(data->record[i].name);
+ for (i = 0; i < data->rec_count; i++) {
+ const char *from = data->record[i].name;
+
+ strcpy(ptr, from);
+ data->record[i].name = ptr;
+ ptr += strlen(ptr) + 1;
+ }
return 0;
}
@@ -490,7 +499,17 @@ int bootstage_unstash(const void *base, int size)
int bootstage_get_size(void)
{
- return sizeof(struct bootstage_data);
+ struct bootstage_data *data = gd->bootstage;
+ struct bootstage_record *rec;
+ int size;
+ int i;
+
+ size = sizeof(struct bootstage_data);
+ for (rec = data->record, i = 0; i < data->rec_count;
+ i++, rec++)
+ size += strlen(rec->name) + 1;
+
+ return size;
}
int bootstage_init(bool first)