summaryrefslogtreecommitdiff
path: root/common/board_r.c
diff options
context:
space:
mode:
authorYao Zi <ziyao@disroot.org>2025-04-27 14:50:11 +0000
committerLeo Yu-Chi Liang <ycliang@andestech.com>2025-05-21 16:46:16 +0800
commit307666be28db0d89cbdcfafd2cf0e0cf5bf386db (patch)
tree318ba2cf0407a5e5bd51234177ff04aa03f8bd40 /common/board_r.c
parent60163080949a57ba28bc10cb599dc2a9b53c75c4 (diff)
riscv: Access gd with inline assembly when building with LTO or Clang
Similar to AArch64's case, Clang may wrongly fold accesses to gd pointer which is defined with register qualifier into constants, breaking various components. This patch defines gd as a macro when building with Clang or LTO, which expands to get_gd() that accesses gp pointer in assembly, making RISC-V ports function properly and preparing for introduction of LTO in the future. Board initialization code is also adapted for non-assignable gd. Reported-by: Nathaniel Hourt <I@nathaniel.land> Signed-off-by: Yao Zi <ziyao@disroot.org> Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
Diffstat (limited to 'common/board_r.c')
-rw-r--r--common/board_r.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/common/board_r.c b/common/board_r.c
index b90a4d9ff69..41c8dec8d49 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -815,7 +815,9 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)
if (CONFIG_IS_ENABLED(X86_64) && !IS_ENABLED(CONFIG_EFI_APP))
arch_setup_gd(new_gd);
-#if !defined(CONFIG_X86) && !defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
+#if defined(CONFIG_RISCV)
+ set_gd(new_gd);
+#elif !defined(CONFIG_X86) && !defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
gd = new_gd;
#endif
gd->flags &= ~GD_FLG_LOG_READY;