diff mbox

[U-Boot,v2,06/11] common/board_f: factor out reserve_stacks

Message ID 1422572838-30381-7-git-send-email-andreas.devel@googlemail.com
State Changes Requested, archived
Delegated to: Andreas Bießmann
Headers show

Commit Message

Andreas Bießmann Jan. 29, 2015, 11:07 p.m. UTC
Require each architecture to provide an arch_reserve_stacks() function to
setup the required stacks for the architecture.

Signed-off-by: Andreas Bießmann <andreas.devel@googlemail.com>
---
This patch is _not_ fully compile tested for all ppc/arm boards!

Changes in v2:
- new since v1

Changes in v1: None

 arch/arm/lib/Makefile     |    1 +
 arch/arm/lib/stack.c      |   44 +++++++++++++++++++++++++++++++++++++++++++
 arch/powerpc/lib/Makefile |    1 +
 arch/powerpc/lib/stack.c  |   33 ++++++++++++++++++++++++++++++++
 common/board_f.c          |   46 +--------------------------------------------
 include/common.h          |    9 +++++++++
 6 files changed, 89 insertions(+), 45 deletions(-)
 create mode 100644 arch/arm/lib/stack.c
 create mode 100644 arch/powerpc/lib/stack.c

Comments

Simon Glass Jan. 30, 2015, 1:21 p.m. UTC | #1
Hi Andreas,

On 29 January 2015 at 16:07, Andreas Bießmann
<andreas.devel@googlemail.com> wrote:
> Require each architecture to provide an arch_reserve_stacks() function to
> setup the required stacks for the architecture.
>
> Signed-off-by: Andreas Bießmann <andreas.devel@googlemail.com>
> ---
> This patch is _not_ fully compile tested for all ppc/arm boards!
>
> Changes in v2:
> - new since v1
>
> Changes in v1: None
>
>  arch/arm/lib/Makefile     |    1 +
>  arch/arm/lib/stack.c      |   44 +++++++++++++++++++++++++++++++++++++++++++
>  arch/powerpc/lib/Makefile |    1 +
>  arch/powerpc/lib/stack.c  |   33 ++++++++++++++++++++++++++++++++
>  common/board_f.c          |   46 +--------------------------------------------
>  include/common.h          |    9 +++++++++
>  6 files changed, 89 insertions(+), 45 deletions(-)
>  create mode 100644 arch/arm/lib/stack.c
>  create mode 100644 arch/powerpc/lib/stack.c
>
> diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
> index d74e4b8..da8ed72 100644
> --- a/arch/arm/lib/Makefile
> +++ b/arch/arm/lib/Makefile
> @@ -35,6 +35,7 @@ endif
>  obj-$(CONFIG_SEMIHOSTING) += semihosting.o
>
>  obj-y  += sections.o
> +obj-y  += stack.o
>  ifdef CONFIG_ARM64
>  obj-y  += gic_64.o
>  obj-y  += interrupts_64.o
> diff --git a/arch/arm/lib/stack.c b/arch/arm/lib/stack.c
> new file mode 100644
> index 0000000..b1050a5
> --- /dev/null
> +++ b/arch/arm/lib/stack.c
> @@ -0,0 +1,44 @@
> +/*
> + * Copyright (c) 2015 Andreas Bießmann <andreas.devel@googlemail.com>
> + *
> + * Copyright (c) 2011 The Chromium OS Authors.
> + * (C) Copyright 2002-2006
> + * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Marius Groeger <mgroeger@sysgo.de>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +#include <common.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int arch_reserve_stacks(void)
> +{
> +#ifdef CONFIG_SPL_BUILD
> +       gd->start_addr_sp -= 128;       /* leave 32 words for abort-stack */
> +       gd->irq_sp = gd->start_addr_sp;
> +#else
> +       /* setup stack pointer for exceptions */
> +       gd->start_addr_sp -= 16;
> +       gd->start_addr_sp &= ~0xf;
> +       gd->irq_sp = gd->start_addr_sp;
> +
> +# if !defined(CONFIG_ARM64)
> +#  ifdef CONFIG_USE_IRQ
> +       gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
> +       debug("Reserving %zu Bytes for IRQ stack at: %08lx\n",
> +             CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->start_addr_sp);
> +
> +       /* 8-byte alignment for ARM ABI compliance */
> +       gd->start_addr_sp &= ~0x07;
> +#  endif
> +       /* leave 3 words for abort-stack, plus 1 for alignment */
> +       gd->start_addr_sp -= 16;
> +# endif
> +#endif
> +
> +       return 0;
> +}
> diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
> index 0f62982..05b22bb 100644
> --- a/arch/powerpc/lib/Makefile
> +++ b/arch/powerpc/lib/Makefile
> @@ -40,6 +40,7 @@ obj-y += extable.o
>  obj-y  += interrupts.o
>  obj-$(CONFIG_CMD_KGDB) += kgdb.o
>  obj-$(CONFIG_CMD_IDE) += ide.o
> +obj-y  += stack.o
>  obj-y  += time.o
>
>  # Don't include the MPC5xxx special memcpy into the
> diff --git a/arch/powerpc/lib/stack.c b/arch/powerpc/lib/stack.c
> new file mode 100644
> index 0000000..3a6c91a
> --- /dev/null
> +++ b/arch/powerpc/lib/stack.c
> @@ -0,0 +1,33 @@
> +/*
> + * Copyright (c) 2015 Andreas Bießmann <andreas.devel@googlemail.com>
> + *
> + * Copyright (c) 2011 The Chromium OS Authors.
> + * (C) Copyright 2002-2006
> + * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Marius Groeger <mgroeger@sysgo.de>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +#include <common.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int arch_reserve_stacks(void)
> +{
> +       ulong *s;
> +
> +       /* setup stack pointer for exceptions */
> +       gd->start_addr_sp -= 16;
> +       gd->start_addr_sp &= ~0xf;
> +       gd->irq_sp = gd->start_addr_sp;
> +
> +       /* Clear initial stack frame */
> +       s = (ulong *)gd->start_addr_sp;
> +       *s = 0; /* Terminate back chain */
> +       *++s = 0; /* NULL return address */
> +
> +       return 0;
> +}
> diff --git a/common/board_f.c b/common/board_f.c
> index 215108b..03f1529 100644
> --- a/common/board_f.c
> +++ b/common/board_f.c
> @@ -573,50 +573,6 @@ static int reserve_fdt(void)
>         return 0;
>  }
>
> -static int reserve_stacks(void)
> -{
> -#ifdef CONFIG_SPL_BUILD
> -# ifdef CONFIG_ARM
> -       gd->start_addr_sp -= 128;       /* leave 32 words for abort-stack */
> -       gd->irq_sp = gd->start_addr_sp;
> -# endif
> -#else
> -# ifdef CONFIG_PPC
> -       ulong *s;
> -# endif
> -
> -       /* setup stack pointer for exceptions */
> -       gd->start_addr_sp -= 16;
> -       gd->start_addr_sp &= ~0xf;
> -       gd->irq_sp = gd->start_addr_sp;
> -
> -       /*
> -        * Handle architecture-specific things here
> -        * TODO(sjg@chromium.org): Perhaps create arch_reserve_stack()
> -        * to handle this and put in arch/xxx/lib/stack.c
> -        */
> -# if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
> -#  ifdef CONFIG_USE_IRQ
> -       gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
> -       debug("Reserving %zu Bytes for IRQ stack at: %08lx\n",
> -               CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->start_addr_sp);
> -
> -       /* 8-byte alignment for ARM ABI compliance */
> -       gd->start_addr_sp &= ~0x07;
> -#  endif
> -       /* leave 3 words for abort-stack, plus 1 for alignment */
> -       gd->start_addr_sp -= 16;
> -# elif defined(CONFIG_PPC)
> -       /* Clear initial stack frame */
> -       s = (ulong *) gd->start_addr_sp;
> -       *s = 0; /* Terminate back chain */
> -       *++s = 0; /* NULL return address */
> -# endif /* Architecture specific code */
> -
> -       return 0;
> -#endif
> -}

It's nice to see this clean-up.

This does force every arch to provide this function. For some
architectures I suspect that this will be enough:

       gd->start_addr_sp -= 16;
       gd->start_addr_sp &= ~0xf;

So I think it might be better to put that code in reserve_stacks() and
then call a weak arch_reserve_stacks() after that.

> -
>  static int display_new_sp(void)
>  {
>         debug("New Stack Pointer is: %08lx\n", gd->start_addr_sp);
> @@ -977,7 +933,7 @@ static init_fnc_t init_sequence_f[] = {
>         reserve_global_data,
>         reserve_fdt,
>         reserve_arch,
> -       reserve_stacks,
> +       arch_reserve_stacks,
>         setup_dram_config,
>         show_dram_config,
>  #ifdef CONFIG_PPC
> diff --git a/include/common.h b/include/common.h
> index 4b3e0d3..dcf8255 100644
> --- a/include/common.h
> +++ b/include/common.h
> @@ -251,6 +251,15 @@ int update_flash_size(int flash_size);
>  int arch_early_init_r(void);
>
>  /**
> + * Reserve all necessary stacks
> + *
> + * This is used in generic board init sequence in common/board_f.c. Each
> + * architecture should provide this function and set the gd->start_addr_sp and
> + * gd->irq_sp accordingly.

Should add a little more detail here:

On entry gd->start_addr_sp is pointing to the suggested top of the stack
On exit this should be updated to the position of the stack. The stack
pointer will be set to this later
gd->irq_sp should be set if this is needed by the arch.

also @return 0 if no error

> + */
> +int arch_reserve_stacks(void);
> +
> +/**
>   * Show the DRAM size in a board-specific way
>   *
>   * This is used by boards to display DRAM information in their own way.
> --
> 1.7.10.4
>
diff mbox

Patch

diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
index d74e4b8..da8ed72 100644
--- a/arch/arm/lib/Makefile
+++ b/arch/arm/lib/Makefile
@@ -35,6 +35,7 @@  endif
 obj-$(CONFIG_SEMIHOSTING) += semihosting.o
 
 obj-y	+= sections.o
+obj-y	+= stack.o
 ifdef CONFIG_ARM64
 obj-y	+= gic_64.o
 obj-y	+= interrupts_64.o
diff --git a/arch/arm/lib/stack.c b/arch/arm/lib/stack.c
new file mode 100644
index 0000000..b1050a5
--- /dev/null
+++ b/arch/arm/lib/stack.c
@@ -0,0 +1,44 @@ 
+/*
+ * Copyright (c) 2015 Andreas Bießmann <andreas.devel@googlemail.com>
+ *
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2002-2006
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+#include <common.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int arch_reserve_stacks(void)
+{
+#ifdef CONFIG_SPL_BUILD
+	gd->start_addr_sp -= 128;	/* leave 32 words for abort-stack */
+	gd->irq_sp = gd->start_addr_sp;
+#else
+	/* setup stack pointer for exceptions */
+	gd->start_addr_sp -= 16;
+	gd->start_addr_sp &= ~0xf;
+	gd->irq_sp = gd->start_addr_sp;
+
+# if !defined(CONFIG_ARM64)
+#  ifdef CONFIG_USE_IRQ
+	gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
+	debug("Reserving %zu Bytes for IRQ stack at: %08lx\n",
+	      CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->start_addr_sp);
+
+	/* 8-byte alignment for ARM ABI compliance */
+	gd->start_addr_sp &= ~0x07;
+#  endif
+	/* leave 3 words for abort-stack, plus 1 for alignment */
+	gd->start_addr_sp -= 16;
+# endif
+#endif
+
+	return 0;
+}
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
index 0f62982..05b22bb 100644
--- a/arch/powerpc/lib/Makefile
+++ b/arch/powerpc/lib/Makefile
@@ -40,6 +40,7 @@  obj-y	+= extable.o
 obj-y	+= interrupts.o
 obj-$(CONFIG_CMD_KGDB) += kgdb.o
 obj-$(CONFIG_CMD_IDE) += ide.o
+obj-y	+= stack.o
 obj-y	+= time.o
 
 # Don't include the MPC5xxx special memcpy into the
diff --git a/arch/powerpc/lib/stack.c b/arch/powerpc/lib/stack.c
new file mode 100644
index 0000000..3a6c91a
--- /dev/null
+++ b/arch/powerpc/lib/stack.c
@@ -0,0 +1,33 @@ 
+/*
+ * Copyright (c) 2015 Andreas Bießmann <andreas.devel@googlemail.com>
+ *
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2002-2006
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+#include <common.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int arch_reserve_stacks(void)
+{
+	ulong *s;
+
+	/* setup stack pointer for exceptions */
+	gd->start_addr_sp -= 16;
+	gd->start_addr_sp &= ~0xf;
+	gd->irq_sp = gd->start_addr_sp;
+
+	/* Clear initial stack frame */
+	s = (ulong *)gd->start_addr_sp;
+	*s = 0; /* Terminate back chain */
+	*++s = 0; /* NULL return address */
+
+	return 0;
+}
diff --git a/common/board_f.c b/common/board_f.c
index 215108b..03f1529 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -573,50 +573,6 @@  static int reserve_fdt(void)
 	return 0;
 }
 
-static int reserve_stacks(void)
-{
-#ifdef CONFIG_SPL_BUILD
-# ifdef CONFIG_ARM
-	gd->start_addr_sp -= 128;	/* leave 32 words for abort-stack */
-	gd->irq_sp = gd->start_addr_sp;
-# endif
-#else
-# ifdef CONFIG_PPC
-	ulong *s;
-# endif
-
-	/* setup stack pointer for exceptions */
-	gd->start_addr_sp -= 16;
-	gd->start_addr_sp &= ~0xf;
-	gd->irq_sp = gd->start_addr_sp;
-
-	/*
-	 * Handle architecture-specific things here
-	 * TODO(sjg@chromium.org): Perhaps create arch_reserve_stack()
-	 * to handle this and put in arch/xxx/lib/stack.c
-	 */
-# if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
-#  ifdef CONFIG_USE_IRQ
-	gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
-	debug("Reserving %zu Bytes for IRQ stack at: %08lx\n",
-		CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->start_addr_sp);
-
-	/* 8-byte alignment for ARM ABI compliance */
-	gd->start_addr_sp &= ~0x07;
-#  endif
-	/* leave 3 words for abort-stack, plus 1 for alignment */
-	gd->start_addr_sp -= 16;
-# elif defined(CONFIG_PPC)
-	/* Clear initial stack frame */
-	s = (ulong *) gd->start_addr_sp;
-	*s = 0; /* Terminate back chain */
-	*++s = 0; /* NULL return address */
-# endif /* Architecture specific code */
-
-	return 0;
-#endif
-}
-
 static int display_new_sp(void)
 {
 	debug("New Stack Pointer is: %08lx\n", gd->start_addr_sp);
@@ -977,7 +933,7 @@  static init_fnc_t init_sequence_f[] = {
 	reserve_global_data,
 	reserve_fdt,
 	reserve_arch,
-	reserve_stacks,
+	arch_reserve_stacks,
 	setup_dram_config,
 	show_dram_config,
 #ifdef CONFIG_PPC
diff --git a/include/common.h b/include/common.h
index 4b3e0d3..dcf8255 100644
--- a/include/common.h
+++ b/include/common.h
@@ -251,6 +251,15 @@  int update_flash_size(int flash_size);
 int arch_early_init_r(void);
 
 /**
+ * Reserve all necessary stacks
+ *
+ * This is used in generic board init sequence in common/board_f.c. Each
+ * architecture should provide this function and set the gd->start_addr_sp and
+ * gd->irq_sp accordingly.
+ */
+int arch_reserve_stacks(void);
+
+/**
  * Show the DRAM size in a board-specific way
  *
  * This is used by boards to display DRAM information in their own way.