diff --git a/bsp/espressif/esp/src/cpus/espressif-riscv.zig b/bsp/espressif/esp/src/cpus/espressif-riscv.zig index c68e720..cb8a760 100644 --- a/bsp/espressif/esp/src/cpus/espressif-riscv.zig +++ b/bsp/espressif/esp/src/cpus/espressif-riscv.zig @@ -67,7 +67,12 @@ pub const startup_logic = struct { : : [eos] "r" (@as(u32, microzig.config.end_of_stack)), ); - asm volatile ("la gp, __global_pointer$"); + asm volatile ( + \\.option push + \\.option norelax + \\la gp, __global_pointer$ + \\.option pop + ); microzig.cpu.setStatusBit(.mtvec, microzig.config.end_of_stack); root.initialize_system_memories(); microzig_main(); diff --git a/build/src/generate_linkerscript.zig b/build/src/generate_linkerscript.zig index 0e66a5d..75e5d28 100644 --- a/build/src/generate_linkerscript.zig +++ b/build/src/generate_linkerscript.zig @@ -121,8 +121,9 @@ pub fn main() !void { \\ .data : \\ { \\ microzig_data_start = .; - \\ *(.rodata*) + \\ *(.sdata*) \\ *(.data*) + \\ *(.rodata*) \\ microzig_data_end = .; \\ } > ram0 AT> flash0 \\ @@ -137,6 +138,14 @@ pub fn main() !void { \\ ); } + + switch (program_args.cpu_arch) { + .riscv32, .riscv64 => try writer.writeAll( + \\ PROVIDE(__global_pointer$ = microzig_data_start + 0x800); + ), + else => {}, + } + try writer.writeAll("}\n"); // TODO: Assert that the flash can actually hold all data!