.globl ucode_base
 ucode_base:    /* Declared in microcode.h */
        .long   0                       /* microcode base */
+.globl ucode_size
+ucode_size:    /* Declared in microcode.h */
        .long   0                       /* microcode size */
 
        update->data = fdt_getprop(blob, node, "data", &update->size);
        if (!update->data)
                return -ENOENT;
-       update->data += UCODE_HEADER_LEN;
-       update->size -= UCODE_HEADER_LEN;
 
        update->header_version = fdtdec_get_int(blob, node,
                                                "intel,header-version", 0);
 int microcode_update_intel(void)
 {
        struct microcode_update cpu, update;
+       ulong address;
        const void *blob = gd->fdt_blob;
        int skipped;
        int count;
                        skipped++;
                        continue;
                }
-               wrmsr(MSR_IA32_UCODE_WRITE, (ulong)update.data, 0);
+               address = (ulong)update.data + UCODE_HEADER_LEN;
+               wrmsr(MSR_IA32_UCODE_WRITE, address, 0);
                rev = microcode_read_rev();
                debug("microcode: updated to revision 0x%x date=%04x-%02x-%02x\n",
                      rev, update.date_code & 0xffff,
                        return -EFAULT;
                }
                count++;
+               if (!ucode_base) {
+                       ucode_base = (ulong)update.data;
+                       ucode_size = update.size;
+               }
        } while (1);
 }
 
 _dt_ucode_base_size:
        /* These next two fields are filled in by ifdtool */
 .globl ucode_base
-ucode_base:    /* Declared in micrcode.h */
+ucode_base:    /* Declared in microcode.h */
        .long   0                       /* microcode base */
+.globl ucode_size
+ucode_size:    /* Declared in microcode.h */
        .long   0                       /* microcode size */
        .long   CONFIG_SYS_MONITOR_BASE /* code region base */
        .long   CONFIG_SYS_MONITOR_LEN  /* code region size */