sylveos

Toy Operating System
Log | Files | Refs

commit 9d9d7b85fa8238dba3798e260472d31e5e7f9473
parent 30e4911af3d7a3913c1043b8441dbdefcf3cd30a
Author: Sylvia Ivory <git@sivory.net>
Date:   Tue, 13 Jan 2026 19:04:51 -0800

Hide nop from Zig

Diffstat:
Mbuild.zig | 12+++---------
Msrc/labs/2-gpio.zig | 4++--
Msrc/root.zig | 14++++----------
Msrc/util.zig | 21++-------------------
Astart.s | 14++++++++++++++
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