mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: bst@pengutronix.de, Ahmad Fatoum <a.fatoum@pengutronix.de>
Subject: [PATCH master v3 1/2] ARM: MXS: fix breakage for non-DT boards
Date: Tue, 11 Oct 2022 13:49:26 +0200	[thread overview]
Message-ID: <20221011114927.546670-1-a.fatoum@pengutronix.de> (raw)

boarddata, the third argument passed from barebox PBL to barebox proper,
is usually either a pointer to an optionally compressed flattened device tree
or a machien type integer casted to a pointer.

In order to support device trees located in the first 8192 bytes of
address space, barebox has been trying to dereference boarddata, before
falling back to treating it as integer.

This resulted in breakage as boarddata may be an integer not divisible
by 4 and thus an unaligned exception would occur.

The already existing barebox_arm_boarddata mechanism sidesteps this
issue: With it, the machine type integer is not passed as is, but the
address of a suitably aligned structure that contains it is passed
instead.

Searching for MACH_TYPE in arch/arm/boards shows 5 boards to be
affected in-tree, which are all fixed with this commit.

Fixes: 390bc7834ffc ("ARM: start: check for machine type last")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v2 -> v3:
  - move variable reference into non-naked noinline function (Sascha)
v1 -> v2:
  - Do full relocation instead of get_runtime_offset(). This is
    required, because GCC[1] generated a pc-relative reference
    to boarddata as it's in the same translation unit and as
    such get_runtime_offset() being added was wrong.
    Instead of relying on compiler whims, we instead set up
    a full C environment and play it safe.
  -  s/MACHINE_TYPE/MACH_TYPE/ (Bastian)
---
 arch/arm/boards/chumby_falconwing/lowlevel.c     | 16 +++++++++++++++-
 arch/arm/boards/crystalfontz-cfa10036/lowlevel.c | 16 +++++++++++++++-
 arch/arm/boards/freescale-mx23-evk/lowlevel.c    | 16 +++++++++++++++-
 arch/arm/boards/imx233-olinuxino/lowlevel.c      | 15 ++++++++++++++-
 arch/arm/boards/karo-tx28/lowlevel.c             | 15 ++++++++++++++-
 5 files changed, 73 insertions(+), 5 deletions(-)

diff --git a/arch/arm/boards/chumby_falconwing/lowlevel.c b/arch/arm/boards/chumby_falconwing/lowlevel.c
index 091dd1955260..f0c3143e8d03 100644
--- a/arch/arm/boards/chumby_falconwing/lowlevel.c
+++ b/arch/arm/boards/chumby_falconwing/lowlevel.c
@@ -7,8 +7,22 @@
 #include <mach/imx23-regs.h>
 #include <generated/mach-types.h>
 
+static noinline void continue_imx_entry(size_t size)
+{
+	static struct barebox_arm_boarddata boarddata = {
+		.magic = BAREBOX_ARM_BOARDDATA_MAGIC,
+		.machine = MACH_TYPE_CHUMBY,
+	};
+
+	barebox_arm_entry(IMX_MEMORY_BASE, size, &boarddata);
+}
+
 ENTRY_FUNCTION(start_chumby_falconwing, r0, r1, r2)
 {
 	arm_cpu_lowlevel_init();
-	barebox_arm_entry(IMX_MEMORY_BASE, SZ_64M, (void *)MACH_TYPE_CHUMBY);
+
+	relocate_to_current_adr();
+	setup_c();
+
+	continue_imx_entry(SZ_64M);
 }
diff --git a/arch/arm/boards/crystalfontz-cfa10036/lowlevel.c b/arch/arm/boards/crystalfontz-cfa10036/lowlevel.c
index 92b42aa89350..8ebea0fedc9c 100644
--- a/arch/arm/boards/crystalfontz-cfa10036/lowlevel.c
+++ b/arch/arm/boards/crystalfontz-cfa10036/lowlevel.c
@@ -7,8 +7,22 @@
 #include <mach/imx28-regs.h>
 #include <generated/mach-types.h>
 
+static noinline void continue_imx_entry(size_t size)
+{
+	static struct barebox_arm_boarddata boarddata = {
+		.magic = BAREBOX_ARM_BOARDDATA_MAGIC,
+		.machine = MACH_TYPE_CFA10036,
+	};
+
+	barebox_arm_entry(IMX_MEMORY_BASE, size, &boarddata);
+}
+
 ENTRY_FUNCTION(start_cfa10036, r0, r1, r2)
 {
 	arm_cpu_lowlevel_init();
-	barebox_arm_entry(IMX_MEMORY_BASE, SZ_128M, (void *)MACH_TYPE_CFA10036);
+
+	relocate_to_current_adr();
+	setup_c();
+
+	continue_imx_entry(SZ_128M);
 }
diff --git a/arch/arm/boards/freescale-mx23-evk/lowlevel.c b/arch/arm/boards/freescale-mx23-evk/lowlevel.c
index 62560bbff733..319e9784a4fd 100644
--- a/arch/arm/boards/freescale-mx23-evk/lowlevel.c
+++ b/arch/arm/boards/freescale-mx23-evk/lowlevel.c
@@ -7,8 +7,22 @@
 #include <asm/barebox-arm.h>
 #include <mach/imx23-regs.h>
 
+static noinline void continue_imx_entry(size_t size)
+{
+	static struct barebox_arm_boarddata boarddata = {
+		.magic = BAREBOX_ARM_BOARDDATA_MAGIC,
+		.machine = MACH_TYPE_MX23EVK,
+	};
+
+	barebox_arm_entry(IMX_MEMORY_BASE, size, &boarddata);
+}
+
 ENTRY_FUNCTION(start_imx23_evk, r0, r1, r2)
 {
 	arm_cpu_lowlevel_init();
-	barebox_arm_entry(IMX_MEMORY_BASE, SZ_32M, (void *)MACH_TYPE_MX23EVK);
+
+	relocate_to_current_adr();
+	setup_c();
+
+	continue_imx_entry(SZ_32M);
 }
diff --git a/arch/arm/boards/imx233-olinuxino/lowlevel.c b/arch/arm/boards/imx233-olinuxino/lowlevel.c
index 71fc379f0487..6e80e6889b51 100644
--- a/arch/arm/boards/imx233-olinuxino/lowlevel.c
+++ b/arch/arm/boards/imx233-olinuxino/lowlevel.c
@@ -11,9 +11,22 @@
 #include <mach/iomux.h>
 #include <generated/mach-types.h>
 
+static noinline void continue_imx_entry(size_t size)
+{
+	static struct barebox_arm_boarddata boarddata = {
+		.magic = BAREBOX_ARM_BOARDDATA_MAGIC,
+		.machine = MACH_TYPE_IMX233_OLINUXINO,
+	};
+
+	barebox_arm_entry(IMX_MEMORY_BASE, size, &boarddata);
+}
+
 ENTRY_FUNCTION(start_barebox_olinuxino_imx23, r0, r1, r2)
 {
-	barebox_arm_entry(IMX_MEMORY_BASE, SZ_64M, (void *)MACH_TYPE_IMX233_OLINUXINO);
+	relocate_to_current_adr();
+	setup_c();
+
+	continue_imx_entry(SZ_64M);
 }
 
 static const uint32_t pad_setup[] = {
diff --git a/arch/arm/boards/karo-tx28/lowlevel.c b/arch/arm/boards/karo-tx28/lowlevel.c
index 28d96f3e1a5f..9e90e40926e8 100644
--- a/arch/arm/boards/karo-tx28/lowlevel.c
+++ b/arch/arm/boards/karo-tx28/lowlevel.c
@@ -15,9 +15,22 @@
 #include <stmp-device.h>
 #include <generated/mach-types.h>
 
+static noinline void continue_imx_entry(size_t size)
+{
+	static struct barebox_arm_boarddata boarddata = {
+		.magic = BAREBOX_ARM_BOARDDATA_MAGIC,
+		.machine = MACH_TYPE_TX28,
+	};
+
+	barebox_arm_entry(IMX_MEMORY_BASE, size, &boarddata);
+}
+
 ENTRY_FUNCTION(start_barebox_karo_tx28, r0, r1, r2)
 {
-	barebox_arm_entry(IMX_MEMORY_BASE, SZ_128M, (void *)MACH_TYPE_TX28);
+	relocate_to_current_adr();
+	setup_c();
+
+	continue_imx_entry(SZ_128M);
 }
 
 static const uint32_t iomux_pads[] = {
-- 
2.30.2




             reply	other threads:[~2022-10-11 11:51 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-11 11:49 Ahmad Fatoum [this message]
2022-10-11 11:49 ` [PATCH v3 2/2] ARM: start: drop support for machine type casted to boarddata pointer Ahmad Fatoum
2022-10-12 11:05   ` Bastian Krause
2022-10-12 11:05 ` [PATCH master v3 1/2] ARM: MXS: fix breakage for non-DT boards Bastian Krause
2022-10-12 12:18 ` Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221011114927.546670-1-a.fatoum@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=bst@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox