/* Set the upper memory limit parameter */
        subl    $CONFIG_SYS_STACK_SIZE, %eax
 
-       /* Reserve space for global data */
-       subl    $(GD_SIZE * 4), %eax
+       /* Pointer to temporary global data */
+       movl    $CONFIG_SYS_INIT_GD_ADDR, %edx
 
-       /* %eax points to the global data structure */
-       movl    %esp, (GD_RAM_SIZE * 4)(%eax)
-       movl    %ebx, (GD_FLAGS * 4)(%eax)
-       movl    %ecx, (GD_LOAD_OFF * 4)(%eax)
+       /* %edx points to the global data structure */
+       movl    %esp, (GD_RAM_SIZE * 4)(%edx)
+       movl    %ebx, (GD_FLAGS * 4)(%edx)
+       movl    %ecx, (GD_LOAD_OFF * 4)(%edx)
 
        call    board_init_f    /* Enter, U-boot! */
 
 
 #include <miiphy.h>
 #endif
 
-DECLARE_GLOBAL_DATA_PTR;
+/*
+ * Pointer to initial global data area
+ *
+ * Here we initialize it.
+ */
+#undef XTRN_DECLARE_GLOBAL_DATA_PTR
+#define XTRN_DECLARE_GLOBAL_DATA_PTR   /* empty = allocate here */
+DECLARE_GLOBAL_DATA_PTR = (gd_t *) (CONFIG_SYS_INIT_GD_ADDR);
+
 
 /* Exports from the Linker Script */
 extern ulong __text_start;
 /*
  * Load U-Boot into RAM, initialize BSS, perform relocation adjustments
  */
-void board_init_f (ulong gdp)
+void board_init_f(ulong mem_top)
 {
        void *text_start = &__text_start;
        void *data_end = &__data_end;
        Elf32_Rel *re_end;
 
        /* Calculate destination RAM Address and relocation offset */
-       dest_addr  = (void *)gdp - (bss_end - text_start);
+       dest_addr  = (void *)mem_top - (bss_end - text_start);
        rel_offset = text_start - dest_addr;
 
        /* Perform low-level initialization only when cold booted */
-       if (((gd_t *)gdp)->flags & GD_FLG_COLD_BOOT) {
+       if (gd->flags & GD_FLG_COLD_BOOT) {
                /* First stage CPU initialization */
                if (cpu_init_f() != 0)
                        hang();
 
        /* Copy U-Boot into RAM */
        dst_addr = (ulong *)dest_addr;
-       src_addr = (ulong *)(text_start + ((gd_t *)gdp)->load_off);
-       end_addr = (ulong *)(data_end  + ((gd_t *)gdp)->load_off);
+       src_addr = (ulong *)(text_start + gd->load_off);
+       end_addr = (ulong *)(data_end  + gd->load_off);
 
        while (src_addr < end_addr)
                *dst_addr++ = *src_addr++;
                *dst_addr++ = 0x00000000;
 
        /* Perform relocation adjustments */
-       re_src = (Elf32_Rel *)(rel_dyn_start + ((gd_t *)gdp)->load_off);
-       re_end = (Elf32_Rel *)(rel_dyn_end + ((gd_t *)gdp)->load_off);
+       re_src = (Elf32_Rel *)(rel_dyn_start + gd->load_off);
+       re_end = (Elf32_Rel *)(rel_dyn_end + gd->load_off);
 
        do {
                if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE)
                                *(Elf32_Addr *)(re_src->r_offset - rel_offset) -= rel_offset;
        } while (re_src++ < re_end);
 
-       ((gd_t *)gdp)->reloc_off = rel_offset;
-       ((gd_t *)gdp)->flags |= GD_FLG_RELOC;
+       gd->reloc_off = rel_offset;
+       gd->flags |= GD_FLG_RELOC;
 
        /* Enter the relocated U-Boot! */
-       (board_init_r - rel_offset)((gd_t *)gdp, (ulong)dest_addr);
+       (board_init_r - rel_offset)(gd, (ulong)dest_addr);
 
        /* NOTREACHED - board_init_f() does not return */
        while(1);
        int i;
        ulong size;
        static bd_t bd_data;
+       static gd_t gd_data;
        init_fnc_t **init_fnc_ptr;
 
        show_boot_progress(0x21);
 
-       gd = id;
+       /* Global data pointer is now writable */
+       gd = &gd_data;
+       memcpy(gd, id, sizeof(gd_t));
+
        /* compiler optimization barrier needed for GCC >= 3.4 */
        __asm__ __volatile__("": : :"memory");