ARM: omap: fix omap_save_bootinfo
omap_save_bootinfo derefences the argument passed to barebox without checking it for validity. This breaks 2nd stage booting where r0 is undefined. The best we can do is to check whether the pointer is somewhere in SRAM and is word aligned. This at least makes sure that we do not oops. This introduces SoC specific xxx_save_bootinfo variants since the SRAM addresses/sizes differ between SoCs. Additionally fix the prototype for omap_save_bootinfo. It uses r0, so it must be passed this variable. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
be322768f0
commit
65504828dd
|
@ -17,6 +17,7 @@
|
|||
#include <mach/generic.h>
|
||||
#include <mach/omap4-mux.h>
|
||||
#include <mach/omap4-silicon.h>
|
||||
#include <mach/omap4-generic.h>
|
||||
#include <mach/omap4-clock.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <asm/barebox-arm.h>
|
||||
|
@ -67,7 +68,7 @@ static noinline void archosg9_init_lowlevel(void)
|
|||
|
||||
void __naked __bare_init barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
omap4_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <mach/control.h>
|
||||
#include <mach/generic.h>
|
||||
#include <mach/omap3-silicon.h>
|
||||
#include <mach/omap3-generic.h>
|
||||
#include <mach/omap3-mux.h>
|
||||
#include <mach/sdrc.h>
|
||||
#include <mach/syslib.h>
|
||||
|
@ -182,7 +183,7 @@ static int beagle_board_init(void)
|
|||
|
||||
void __naked __bare_init barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
omap3_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <mach/sys_info.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <mach/am33xx-mux.h>
|
||||
#include <mach/am33xx-generic.h>
|
||||
#include <mach/wdt.h>
|
||||
|
||||
/* UART Defines */
|
||||
|
@ -251,7 +252,7 @@ static int beaglebone_board_init(void)
|
|||
|
||||
void __bare_init __naked barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
am33xx_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <mach/control.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <mach/omap3-silicon.h>
|
||||
#include <mach/omap3-generic.h>
|
||||
#include <mach/sys_info.h>
|
||||
|
||||
/**
|
||||
|
@ -549,7 +550,7 @@ static int sdp343x_board_init(void)
|
|||
|
||||
void __naked __bare_init barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
omap3_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <mach/control.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <mach/omap3-silicon.h>
|
||||
#include <mach/omap3-generic.h>
|
||||
#include <mach/sys_info.h>
|
||||
|
||||
|
||||
|
@ -162,7 +163,7 @@ static int omap3_evm_board_init(void)
|
|||
|
||||
void __naked __bare_init barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
omap3_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <mach/generic.h>
|
||||
#include <mach/omap4-mux.h>
|
||||
#include <mach/omap4-silicon.h>
|
||||
#include <mach/omap4-generic.h>
|
||||
#include <mach/omap4-clock.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <asm/barebox-arm.h>
|
||||
|
@ -80,7 +81,7 @@ static void noinline panda_init_lowlevel(void)
|
|||
|
||||
void __bare_init __naked barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
omap4_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <mach/generic.h>
|
||||
#include <mach/omap4-mux.h>
|
||||
#include <mach/omap4-silicon.h>
|
||||
#include <mach/omap4-generic.h>
|
||||
#include <mach/omap4-clock.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <asm/barebox-arm.h>
|
||||
|
@ -110,7 +111,7 @@ static void noinline pcm049_init_lowlevel(void)
|
|||
|
||||
void __bare_init __naked barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
omap4_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <mach/sys_info.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <mach/am33xx-mux.h>
|
||||
#include <mach/am33xx-generic.h>
|
||||
#include <mach/wdt.h>
|
||||
|
||||
/* UART Defines */
|
||||
|
@ -210,7 +211,7 @@ static int pcm051_board_init(void)
|
|||
|
||||
void __naked __bare_init barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
am33xx_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <mach/control.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <mach/omap3-silicon.h>
|
||||
#include <mach/omap3-generic.h>
|
||||
#include <mach/sys_info.h>
|
||||
|
||||
/* Slower full frequency range default timings for x32 operation */
|
||||
|
@ -253,7 +254,7 @@ static int pcaal1_board_init(void)
|
|||
|
||||
void __bare_init __naked barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
omap3_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <mach/generic.h>
|
||||
#include <mach/omap4-mux.h>
|
||||
#include <mach/omap4-silicon.h>
|
||||
#include <mach/omap4-generic.h>
|
||||
#include <mach/omap4-clock.h>
|
||||
#include <mach/syslib.h>
|
||||
#include <asm/barebox-arm.h>
|
||||
|
@ -90,7 +91,7 @@ static noinline void pcaaxl2_init_lowlevel(void)
|
|||
|
||||
void __bare_init __naked barebox_arm_reset_vector(uint32_t *data)
|
||||
{
|
||||
omap_save_bootinfo();
|
||||
omap4_save_bootinfo(data);
|
||||
|
||||
arm_cpu_lowlevel_init();
|
||||
|
||||
|
|
|
@ -1,6 +1,23 @@
|
|||
#ifndef __MACH_AM33XX_GENERIC_H
|
||||
#define __MACH_AM33XX_GENERIC_H
|
||||
|
||||
#include <mach/generic.h>
|
||||
#include <mach/am33xx-silicon.h>
|
||||
|
||||
int am33xx_register_ethaddr(int eth_id, int mac_id);
|
||||
|
||||
static inline void am33xx_save_bootinfo(uint32_t *info)
|
||||
{
|
||||
unsigned long i = (unsigned long)info;
|
||||
|
||||
if (i & 0x3)
|
||||
return;
|
||||
if (i < AM33XX_SRAM0_START)
|
||||
return;
|
||||
if (i > AM33XX_SRAM0_START + AM33XX_SRAM0_SIZE)
|
||||
return;
|
||||
|
||||
omap_save_bootinfo(info);
|
||||
}
|
||||
|
||||
#endif /* __MACH_AM33XX_GENERIC_H */
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
#ifndef __ASM_ARCH_AM33XX_H
|
||||
#define __ASM_ARCH_AM33XX_H
|
||||
|
||||
#include <sizes.h>
|
||||
|
||||
/** AM335x Internal Bus Base addresses */
|
||||
#define AM33XX_L4_WKUP_BASE 0x44C00000
|
||||
#define AM33XX_L4_PER_BASE 0x48000000
|
||||
|
@ -115,11 +117,10 @@
|
|||
#define AM33XX_VTP1_CTRL_REG 0x48140E10
|
||||
|
||||
/* OCMC */
|
||||
#define AM33XX_SRAM0_SIZE (0x1B400) /* 109 KB */
|
||||
#define AM33XX_SRAM0_START 0x402f0400
|
||||
#define AM33XX_SRAM0_SIZE (SZ_128K - SZ_1K)
|
||||
#define AM33XX_SRAM_GPMC_STACK_SIZE (0x40)
|
||||
|
||||
#define AM33XX_LOW_LEVEL_SRAM_STACK (AM33XX_SRAM0_START + AM33XX_SRAM0_SIZE - 4)
|
||||
|
||||
/* DDR offsets */
|
||||
#define AM33XX_DDR_PHY_BASE_ADDR 0x44E12000
|
||||
#define AM33XX_DDR_IO_CTRL 0x44E10E04
|
||||
|
|
|
@ -55,7 +55,7 @@ static inline int omap_set_mmc_dev(const char *mmcdev)
|
|||
#endif
|
||||
|
||||
extern uint32_t omap_bootinfo[3];
|
||||
void omap_save_bootinfo(void);
|
||||
void omap_save_bootinfo(void *data);
|
||||
|
||||
void omap_set_bootmmc_devname(const char *devname);
|
||||
const char *omap_get_bootmmc_devname(void);
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
#ifndef __MACH_OMAP3_GENERIC_H
|
||||
#define __MACH_OMAP3_GENERIC_H
|
||||
|
||||
#include <mach/generic.h>
|
||||
#include <mach/omap3-silicon.h>
|
||||
|
||||
static inline void omap3_save_bootinfo(uint32_t *info)
|
||||
{
|
||||
unsigned long i = (unsigned long)info;
|
||||
|
||||
if (i & 0x3)
|
||||
return;
|
||||
if (i < OMAP3_SRAM_BASE)
|
||||
return;
|
||||
if (i > OMAP3_SRAM_BASE + SZ_64K)
|
||||
return;
|
||||
|
||||
omap_save_bootinfo(info);
|
||||
}
|
||||
|
||||
#endif /* __MACH_OMAP3_GENERIC_H */
|
|
@ -0,0 +1,21 @@
|
|||
#ifndef __MACH_OMAP4_GENERIC_H
|
||||
#define __MACH_OMAP4_GENERIC_H
|
||||
|
||||
#include <mach/generic.h>
|
||||
#include <mach/omap4-silicon.h>
|
||||
|
||||
static inline void omap4_save_bootinfo(uint32_t *info)
|
||||
{
|
||||
unsigned long i = (unsigned long)info;
|
||||
|
||||
if (i & 0x3)
|
||||
return;
|
||||
if (i < OMAP44XX_SRAM_BASE)
|
||||
return;
|
||||
if (i > OMAP44XX_SRAM_BASE + SZ_64K)
|
||||
return;
|
||||
|
||||
omap_save_bootinfo(info);
|
||||
}
|
||||
|
||||
#endif /* __MACH_OMAP4_GENERIC_H */
|
Loading…
Reference in New Issue