[U-Boot] [PATCH 18/39] x86: Save the BIST value on reset

Bin Meng bmeng.cn at gmail.com
Fri Nov 7 11:21:39 CET 2014


On Fri, Nov 7, 2014 at 4:20 AM, Simon Glass <sjg at chromium.org> wrote:
> The built in self test value is available in register eax on start-up. Save
> it so that it can be accessed later. Unfortunately we must wait until the
> global_data is available before we can do this, so there is a little bit of
> shuffling to keep it around.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>  arch/x86/cpu/start.S               | 9 ++++++---
>  arch/x86/cpu/start16.S             | 7 ++++++-
>  arch/x86/include/asm/global_data.h | 1 +
>  lib/asm-offsets.c                  | 3 +++
>  4 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
> index c41e1ae..7f41475 100644
> --- a/arch/x86/cpu/start.S
> +++ b/arch/x86/cpu/start.S
> @@ -49,6 +49,8 @@ _start:
>          */
>         movw    $GD_FLG_COLD_BOOT, %bx
>  1:
> +       /* Save BIST */
> +       movl    %eax, %ebp
>
>         /* Load the segement registes to match the gdt loaded in start16.S */
>         movl    $(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
> @@ -112,9 +114,10 @@ car_init_ret:
>         addl    $GD_MALLOC_BASE, %edx
>         movl    %esp, (%edx)
>  #endif
> -
> -       /* Align temporary global descriptor table to 16-byte boundary */
> -       andl    $0xfffffff0, %esp
> +       /* Store BIST */
> +       movl    %eax, %edx
> +       addl    $GD_BIST, %edx
> +       movl    %ebp, (%edx)
>
>         /* Set second parameter to setup_gdt */
>         movl    %ecx, %edx
> diff --git a/arch/x86/cpu/start16.S b/arch/x86/cpu/start16.S
> index 445d5a1..9550502 100644
> --- a/arch/x86/cpu/start16.S
> +++ b/arch/x86/cpu/start16.S
> @@ -21,6 +21,9 @@
>  .code16
>  .globl start16
>  start16:
> +       /* Save BIST */
> +       movl    %eax, %ecx
> +
>         /* Set the Cold Boot / Hard Reset flag */
>         movl    $GD_FLG_COLD_BOOT, %ebx
>
> @@ -45,9 +48,11 @@ o32 cs       lgdt    gdt_ptr
>         /* Flush the prefetch queue */
>         jmp     ff
>  ff:
> -       /* Finally jump to the 32bit initialization code */
> +
> +       /* Finally restore BIST and jump to the 32bit initialization code */
>         movw    $code32start, %ax
>         movw    %ax, %bp
> +       movl    %ecx, %eax
>  o32 cs ljmp    *(%bp)
>
>         /* 48-bit far pointer */
> diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
> index 3e8e2cd..9eae228 100644
> --- a/arch/x86/include/asm/global_data.h
> +++ b/arch/x86/include/asm/global_data.h
> @@ -17,6 +17,7 @@ struct arch_global_data {
>         uint32_t tsc_base_kclocks;      /* Initial tsc as a kclocks value */
>         uint32_t tsc_prev;              /* For show_boot_progress() */
>         void *new_fdt;                  /* Relocated FDT */
> +       uint32_t bist;                  /* Built-in self test value */
>  };
>
>  #endif
> diff --git a/lib/asm-offsets.c b/lib/asm-offsets.c
> index 129bc3e..580f763 100644
> --- a/lib/asm-offsets.c
> +++ b/lib/asm-offsets.c
> @@ -31,6 +31,9 @@ int main(void)
>  #ifdef CONFIG_SYS_MALLOC_F_LEN
>         DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base));
>  #endif
> +#ifdef CONFIG_X86
> +       DEFINE(GD_BIST, offsetof(struct global_data, arch.bist));
> +#endif
>
>  #if defined(CONFIG_ARM)
>
> --

Reviewed-by: Bin Meng <bmeng.cn at gmail.com>


More information about the U-Boot mailing list