watchdog: Move watchdog_dev to data section (BSS may not be cleared)
authorStefan Roese <sr@denx.de>
Wed, 3 Apr 2019 07:12:48 +0000 (09:12 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 8 Apr 2019 13:21:39 +0000 (09:21 -0400)
This patch moves all instances of static "watchdog_dev" declarations to
the "data" section. This may be needed, as the BSS may not be cleared
in the early U-Boot phase, where watchdog_reset() is already beeing
called. This may result in incorrect pointer access, as the check to
"!watchdog_dev" in watchdog_reset() may not be true and the function
may continue to run.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Heiko Schocher <hs@denx.de>
Cc: Tom Rini <trini@konsulko.com>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: "Marek BehĂșn" <marek.behun@nic.cz>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Tested-by: Michal Simek <michal.simek@xilinx.com> (on zcu100)
Reviewed-by: Michal Simek <michal.simek@xilinx.com>
arch/mips/mach-mt7620/cpu.c
board/CZ.NIC/turris_mox/turris_mox.c
board/CZ.NIC/turris_omnia/turris_omnia.c
board/xilinx/microblaze-generic/microblaze-generic.c
board/xilinx/zynq/board.c
board/xilinx/zynqmp/zynqmp.c

index 9e0ca716f72bc101a00aeffc30a7c472f405f8c4..fe74f26a545dd6cb1789c0b83719f9291350f2e1 100644 (file)
@@ -70,7 +70,7 @@ int print_cpuinfo(void)
 }
 
 #ifdef CONFIG_WATCHDOG
-static struct udevice *watchdog_dev;
+static struct udevice *watchdog_dev __attribute__((section(".data"))) = NULL;
 
 /* Called by macro WATCHDOG_RESET */
 void watchdog_reset(void)
index 65d50a92ddfe7b5a898d3757b8726943653b5488..96cb9c7e5c6e2543e7084b7228c7f374b63c3384 100644 (file)
@@ -120,7 +120,7 @@ int board_fix_fdt(void *blob)
 #endif
 
 #ifdef CONFIG_WDT_ARMADA_37XX
-static struct udevice *watchdog_dev;
+static struct udevice *watchdog_dev __attribute__((section(".data"))) = NULL;
 
 void watchdog_reset(void)
 {
index 1f7650cb3610a2b1186bf1f4a1348d6bdba5fc10..c7f6479a0cf040e4bedcc8cb3f680aad6e875492 100644 (file)
@@ -365,7 +365,7 @@ static bool disable_mcu_watchdog(void)
 #endif
 
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT_ORION)
-static struct udevice *watchdog_dev = NULL;
+static struct udevice *watchdog_dev __attribute__((section(".data"))) = NULL;
 #endif
 
 int board_init(void)
index c946ec320855949ed12397299831b0f1be6f91e0..28c9efa3a2e0714e7df9d04ef44a3dad9f303bb8 100644 (file)
@@ -25,7 +25,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT)
-static struct udevice *watchdog_dev;
+static struct udevice *watchdog_dev __attribute__((section(".data"))) = NULL;
 #endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */
 
 ulong ram_base;
index b4b84df57645dc3fd448165cb89ace396de96250..ea26aad16f841ab7170bf057c266dbb1051a1053 100644 (file)
 DECLARE_GLOBAL_DATA_PTR;
 
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT)
-static struct udevice *watchdog_dev;
+static struct udevice *watchdog_dev __attribute__((section(".data"))) = NULL;
 #endif
 
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_BOARD_EARLY_INIT_F)
 int board_early_init_f(void)
 {
-# if defined(CONFIG_WDT)
-       /* bss is not cleared at time when watchdog_reset() is called */
-       watchdog_dev = NULL;
-# endif
-
        return 0;
 }
 #endif
index 5e1d2116bc32f42458d5d30ad522ba96891de70c..db272478506fb0a1cd2a1f956682f3a2dbcac3ea 100644 (file)
@@ -25,7 +25,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT)
-static struct udevice *watchdog_dev;
+static struct udevice *watchdog_dev __attribute__((section(".data"))) = NULL;
 #endif
 
 #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \
@@ -322,11 +322,6 @@ int board_early_init_f(void)
        ret = psu_init();
 #endif
 
-#if defined(CONFIG_WDT) && !defined(CONFIG_SPL_BUILD)
-       /* bss is not cleared at time when watchdog_reset() is called */
-       watchdog_dev = NULL;
-#endif
-
        return ret;
 }