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,
                           int flags, ulong mark)
 {
 
 #if defined(CONFIG_BOOTSTAGE) && !defined(CONFIG_SPL_BUILD)
 /* 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
  *
  * 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)
 {
        show_boot_progress(id);