commit 9d9d7b85fa8238dba3798e260472d31e5e7f9473
parent 30e4911af3d7a3913c1043b8441dbdefcf3cd30a
Author: Sylvia Ivory <git@sivory.net>
Date: Tue, 13 Jan 2026 19:04:51 -0800
Hide nop from Zig
Diffstat:
5 files changed, 25 insertions(+), 40 deletions(-)
diff --git a/build.zig b/build.zig
@@ -30,6 +30,7 @@ fn add_exe(exe_name: []const u8, path: std.Build.LazyPath, b: *std.Build) !*std.
}),
});
exe.setLinkerScript(b.path("linker.ld"));
+ exe.addAssemblyFile(b.path("start.s"));
const asm_name = try std.fmt.allocPrint(b.allocator, "{s}.s", .{exe_name});
defer b.allocator.free(asm_name);
@@ -52,15 +53,8 @@ fn lab(name: []const u8, units: []const []const u8, b: *std.Build) !void {
const template =
\\ const lab = @import("{s}");
- \\ export fn _start() callconv(.naked) noreturn {{
- \\ asm volatile (
- \\ \\ mov sp, 0x800000
- \\ \\ bl %[main:P]
- \\ :
- \\ : [main] "X" (&lab.{s})
- \\ );
- \\ while (true) {{ }}
- \\ }}
+ \\ export fn abort() void {{ while(true) {{}} }}
+ \\ export fn main() void {{ _ = lab.{s}() catch {{}}; }}
;
const root_src = try std.fmt.allocPrint(b.allocator, template, .{ lab_path, unit });
diff --git a/src/labs/2-gpio.zig b/src/labs/2-gpio.zig
@@ -67,11 +67,11 @@ pub fn all() !void {
for (0..10) |_| {
try gpio.set_on(led0);
try gpio.set_on(led1);
- try gpio.set_on(act);
+ try gpio.set_off(act);
util.delay_cycles(1000000);
try gpio.set_off(led0);
try gpio.set_off(led1);
- try gpio.set_off(act);
+ try gpio.set_on(act);
util.delay_cycles(1000000);
}
try gpio.set_on(act);
diff --git a/src/root.zig b/src/root.zig
@@ -6,6 +6,10 @@ export fn abort() noreturn {
while (true) {}
}
+export fn main() void {
+ _ = fake_main();
+}
+
fn panic_handler(msg: []const u8, trace_addr: ?usize) noreturn {
_ = msg;
_ = trace_addr;
@@ -13,13 +17,3 @@ fn panic_handler(msg: []const u8, trace_addr: ?usize) noreturn {
}
pub const panic = std.debug.FullPanic(panic_handler);
-
-export fn _start() callconv(.naked) noreturn {
- asm volatile (
- \\ mov sp, 0x800000
- \\ bl %[main:P]
- \\ bl abort
- :
- : [main] "X" (&fake_main),
- );
-}
diff --git a/src/util.zig b/src/util.zig
@@ -1,23 +1,6 @@
-pub fn get_32(addr: *u32) u32 {
- return asm ("ldr %[result], %[addr]"
- : [result] "=r" (-> u32),
- : [addr] "m" (addr),
- );
-}
-
-pub fn put_32(addr: *u32, value: u32) void {
- asm volatile ("str %[value], %[addr]"
- :
- : [value] "r" (value),
- [addr] "m" (addr),
- );
-}
-
-pub fn nop() void {
- asm volatile ("bx lr");
-}
+extern fn nop() void;
-pub fn delay_cycles(ticks: usize) void {
+pub noinline fn delay_cycles(ticks: usize) void {
var counter = ticks;
while (counter > 0) {
counter -= 1;
diff --git a/start.s b/start.s
@@ -0,0 +1,14 @@
+.global _start
+.type _start, function
+.align 8
+_start:
+ mov sp, 0x800000
+ bl main
+ bl abort
+
+.global nop
+.type nop, function
+.align 8
+
+nop:
+ bx lr