From 0d9721d9070c356f4ffaf6f4a312bccdb574b8a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Quei=C3=9Fner?= Date: Sat, 8 Oct 2022 13:01:40 +0200 Subject: [PATCH] Adds microzig.initializeSystemMemories (#87) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Felix "xq" Queißner --- src/core/microzig.zig | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/core/microzig.zig b/src/core/microzig.zig index 76ff4b1..c755315 100644 --- a/src/core/microzig.zig +++ b/src/core/microzig.zig @@ -200,3 +200,36 @@ export fn microzig_main() noreturn { // main returned, just hang around here a bit hang(); } + +/// Contains references to the microzig .data and .bss sections, also +/// contains the initial load address for .data if it is in flash. +pub const sections = struct { + extern var microzig_data_start: anyopaque; + extern var microzig_data_end: anyopaque; + extern var microzig_bss_start: anyopaque; + extern var microzig_bss_end: anyopaque; + extern const microzig_data_load_start: anyopaque; +}; + +pub fn initializeSystemMemories() void { + @setCold(true); + + // fill .bss with zeroes + { + const bss_start = @ptrCast([*]u8, §ions.microzig_bss_start); + const bss_end = @ptrCast([*]u8, §ions.microzig_bss_end); + const bss_len = @ptrToInt(bss_end) - @ptrToInt(bss_start); + + std.mem.set(u8, bss_start[0..bss_len], 0); + } + + // load .data from flash + { + const data_start = @ptrCast([*]u8, §ions.microzig_data_start); + const data_end = @ptrCast([*]u8, §ions.microzig_data_end); + const data_len = @ptrToInt(data_end) - @ptrToInt(data_start); + const data_src = @ptrCast([*]const u8, §ions.microzig_data_load_start); + + std.mem.copy(u8, data_start[0..data_len], data_src[0..data_len]); + } +}