
On 10.09.20 13:04, Sean Anderson wrote:
On 9/10/20 7:00 AM, Heinrich Schuchardt wrote:
Function set_gd() is needed in the UEFI sub-system if the global data pointer is stored in a register.
Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de
arch/riscv/include/asm/global_data.h | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/arch/riscv/include/asm/global_data.h b/arch/riscv/include/asm/global_data.h index 2eb14815bc..b711fcc44d 100644 --- a/arch/riscv/include/asm/global_data.h +++ b/arch/riscv/include/asm/global_data.h @@ -39,4 +39,13 @@ struct arch_global_data {
#define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm ("gp")
+static inline void set_gd(volatile gd_t *gd_ptr) +{ +#ifdef CONFIG_64BIT
- asm volatile("ld gp, %0\n" : : "m"(gd_ptr));
+#else
- asm volatile("lw gp, %0\n" : : "m"(gd_ptr));
+#endif +}
#endif /* __ASM_GBL_DATA_H */
2.28.0
Can't we just use arch_setup_gd?
The variables that we use to store gd have been defined as volatile to ensure that the compiler does not optimize them away. See lib/trace.c) and lib/efi_loader/efi_boottime.c. (A further patch for lib/trace.c will be needed if we want to trace UEFI API calls on RISC-V.)
arch_setup_gd() does not take a volatile variable.
I looked at using WRITE_ONCE() instead of volatile variables. But if gd is a register, &gd is undefined and WRITE_ONCE() is not usable.
Best regards
Heinrich
--Sean