%ebx will hold low-level boot flags and must be preserved
 
 .globl mem_init
 mem_init:
+       /* Preserve Boot Flags */
+       movl    %ebx, %ebp
+
        /* initialize dram controller registers */
        xorw    %ax, %ax
        movl    $DBCTL, %edi
        jmp     bad_reint
 
 dram_done:
+       /* Restore Boot Flags */
+       movl    %ebx, %ebp
        jmp     mem_init_ret
 
 #if CONFIG_SYS_SDRAM_ECC_ENABLE
        jz      bank1
        andl    $0x0000007f, %eax
        shll    $22, %eax
-       movl    %eax, %ebx
+       movl    %eax, %edx
 
 bank1: movl    (%edi), %eax
        movl    %eax, %ecx
        jz      bank2
        andl    $0x00007f00, %eax
        shll    $14, %eax
-       movl    %eax, %ebx
+       movl    %eax, %edx
 
 bank2: movl    (%edi), %eax
        movl    %eax, %ecx
        jz      bank3
        andl    $0x007f0000, %eax
        shll    $6, %eax
-       movl    %eax, %ebx
+       movl    %eax, %edx
 
 bank3: movl    (%edi), %eax
        movl    %eax, %ecx
        jz      done
        andl    $0x7f000000, %eax
        shrl    $2, %eax
-       movl    %eax, %ebx
+       movl    %eax, %edx
 
 done:
-       movl    %ebx, %eax
+       movl    %edx, %eax
        jmp     get_mem_size_ret
 
        cmpl    $0, %eax
        jne     die
        push    $0x55aa55aa
-       popl    %ebx
-       cmpl    $0x55aa55aa, %ebx
+       popl    %ecx
+       cmpl    $0x55aa55aa, %ecx
        jne     die
 
        wbinvd