bootstage: Copy bootstage strings post-relocation
Any pointers to name strings that were passed to bootstage_mark_name() pre-relocation should be copied post-relocation so that they don't get trashed as the original location of U-Boot is re-used for other purposes. This change introduces a new API call that should be called from board_init_r() after malloc has been initted on any board that uses bootstage. Signed-off-by: Doug Anderson <dianders@chromium.org> Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
e802ee0f99
commit
150678a582
|
@ -56,6 +56,21 @@ struct bootstage_hdr {
|
||||||
uint32_t magic; /* Unused */
|
uint32_t magic; /* Unused */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int bootstage_relocate(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Duplicate all strings. They may point to an old location in the
|
||||||
|
* program .text section that can eventually get trashed.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < BOOTSTAGE_ID_COUNT; i++)
|
||||||
|
if (record[i].name)
|
||||||
|
record[i].name = strdup(record[i].name);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ulong bootstage_add_record(enum bootstage_id id, const char *name,
|
ulong bootstage_add_record(enum bootstage_id id, const char *name,
|
||||||
int flags, ulong mark)
|
int flags, ulong mark)
|
||||||
{
|
{
|
||||||
|
|
|
@ -236,6 +236,16 @@ void show_boot_progress(int val);
|
||||||
#if defined(CONFIG_BOOTSTAGE) && !defined(CONFIG_SPL_BUILD)
|
#if defined(CONFIG_BOOTSTAGE) && !defined(CONFIG_SPL_BUILD)
|
||||||
/* This is the full bootstage implementation */
|
/* This is the full bootstage implementation */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Relocate existing bootstage records
|
||||||
|
*
|
||||||
|
* Call this after relocation has happened and after malloc has been initted.
|
||||||
|
* We need to copy any pointers in bootstage records that were added pre-
|
||||||
|
* relocation, since memory can be overritten later.
|
||||||
|
* @return Always returns 0, to indicate success
|
||||||
|
*/
|
||||||
|
int bootstage_relocate(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new bootstage record
|
* Add a new bootstage record
|
||||||
*
|
*
|
||||||
|
@ -326,6 +336,11 @@ static inline ulong bootstage_add_record(enum bootstage_id id,
|
||||||
* and won't even do that unless CONFIG_SHOW_BOOT_PROGRESS is defined
|
* and won't even do that unless CONFIG_SHOW_BOOT_PROGRESS is defined
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static inline int bootstage_relocate(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline ulong bootstage_mark(enum bootstage_id id)
|
static inline ulong bootstage_mark(enum bootstage_id id)
|
||||||
{
|
{
|
||||||
show_boot_progress(id);
|
show_boot_progress(id);
|
||||||
|
|
Loading…
Reference in New Issue