sylveos

Toy Operating System
Log | Files | Refs

commit c8030e031cbd861761a7b54caea213fb3b2fe2f6
parent f6c8030703bc450e08c8d1400d8e55163b9b2f8d
Author: Sylvia Ivory <git@sivory.net>
Date:   Thu, 15 Jan 2026 20:48:19 -0800

Add support for new tests

Diffstat:
Mfake-pi/devices/gpio.zig | 16++++++++--------
Mfake-pi/root.zig | 40++++++++++++++++++++--------------------
Minclude/rpi.h | 3+++
Minclude/test-helper.h | 1-
Msrc/devices/gpio.zig | 2+-
Msrc/test-runner.zig | 46++++++++++++++++++++++++++++++----------------
Mtests/runner | 22+++++++++++++++++-----
7 files changed, 79 insertions(+), 51 deletions(-)

diff --git a/fake-pi/devices/gpio.zig b/fake-pi/devices/gpio.zig @@ -15,10 +15,10 @@ const GPCLR0_OFFSET: usize = START_OFFSET + 0x0028; const GPLEV0_OFFSET: usize = START_OFFSET + 0x0034; var base_address: u32 = 0; -var gpfsel0 = ~@as(u32, 0); -var gpfsel1 = ~@as(u32, 0); -var gpfsel2 = ~@as(u32, 0); -var gpfsel3 = ~@as(u32, 0); +var gpfsel0 = @as(u32, 0); +var gpfsel1 = @as(u32, 0); +var gpfsel2 = @as(u32, 0); +var gpfsel3 = @as(u32, 0); var gpfsel4 = ~@as(u32, 0); var gpfsel5 = ~@as(u32, 0); @@ -44,14 +44,14 @@ pub fn initialize(base_addr: u32) void { gpfsel1 = c.fake_random(); gpfsel2 = c.fake_random(); gpfsel3 = c.fake_random(); - gpfsel4 = gpfsel3; // Extend bits - gpfsel5 = gpfsel3; + gpfsel4 = ~@as(u32, 0); // Extend bits + gpfsel5 = ~@as(u32, 0); gpset0 = c.fake_random(); - gpset1 = gpset0; + gpset1 = ~@as(u32, 0); gpclr0 = c.fake_random(); - gpclr1 = gpclr0; + gpclr1 = ~@as(u32, 0); } pub fn read_u32(address: *u32) Error!u32 { diff --git a/fake-pi/root.zig b/fake-pi/root.zig @@ -10,29 +10,19 @@ const MAX_TRACE: usize = 128; var trace_count: usize = 0; -var stdout_buffer: [4096]u8 = undefined; +var stdout_buffer: [0]u8 = undefined; var stdout = std.fs.File.stdout().writer(&stdout_buffer); const writer = &stdout.interface; fn trace_no_count(comptime format: []const u8, args: anytype) void { - writer.print("TRACE: " ++ format, args) catch |e| { - std.log.err("trace() -> {t}", .{e}); - }; - writer.flush() catch |e| { - std.log.err("trace() -> {t}", .{e}); - }; + writer.print("TRACE: " ++ format, args) catch {}; + writer.flush() catch {}; } fn trace(comptime format: []const u8, args: anytype) void { - writer.print("TRACE:{}: ", .{trace_count}) catch |e| { - std.log.err("trace() -> {t}", .{e}); - }; - writer.print(format, args) catch |e| { - std.log.err("trace() -> {t}", .{e}); - }; - writer.flush() catch |e| { - std.log.err("trace() -> {t}", .{e}); - }; + writer.print("TRACE:{}: ", .{trace_count}) catch {}; + writer.print(format, args) catch {}; + writer.flush() catch {}; trace_count += 1; @@ -86,14 +76,24 @@ export fn put_u32(address: *u32, value: u32) void { } } +// TODO; these should not be here ideally as they only relate to test-runner +// but there is a chance we mess up stdout if we don't have it here... export fn nop() void {} export fn delay_cycles(cycles: u32) void { trace("delaying {} cycles\n", .{cycles}); } -export fn gpio_panic_simple(pin: u8) void { - writer.print("GPIO_PANIC: illegal pin {}\n", .{pin}) catch |e| { - std.log.err("gpio_panic() -> {t}", .{e}); - }; +export fn gpio_panic_pin(pin: u32) void { + writer.print("GPIO_PANIC:illegal pin={}\n", .{pin}) catch {}; + writer.flush() catch {}; +} + +export fn gpio_panic_func(func: u32) void { + writer.print("GPIO_PANIC:illegal func={x}\n", .{func}) catch {}; + writer.flush() catch {}; +} + +export fn gpio_bad_pin(pin: u32, func: u32) void { + trace_no_count("about to set bad fn: pin={}, func={}\n", .{ pin, func }); } diff --git a/include/rpi.h b/include/rpi.h @@ -7,7 +7,10 @@ int gpio_read(unsigned pin); void gpio_set_on(unsigned pin); void gpio_set_off(unsigned pin); +void gpio_set_function(unsigned pin, unsigned function); + int output(const char *format, ...); +int panic(const char *format, ...); void delay_cycles(unsigned ticks); void notmain(void); diff --git a/include/test-helper.h b/include/test-helper.h @@ -6,7 +6,6 @@ // 2. with random input <ntrials> times. static inline void run_test(const char *name, void (*fp)(unsigned), int ntrials) { - printf("testing: <%s>\n", name); // test pins 0..32, then a bunch of random. for(int i = 0; i < 32; i++) fp(i); diff --git a/src/devices/gpio.zig b/src/devices/gpio.zig @@ -47,7 +47,7 @@ fn get_address(pin: u8, offset: usize, chunk: ?u32) Error!*u32 { return address; } -fn fn_sel(pin: u8, sel: FunctionSelect) Error!void { +pub fn fn_sel(pin: u8, sel: FunctionSelect) Error!void { const address = try get_address(pin, GPFSEL0_OFFSET, GPIO_PER_FSEL); const offset: u5 = @truncate((pin % GPIO_PER_FSEL) * 3); diff --git a/src/test-runner.zig b/src/test-runner.zig @@ -11,37 +11,51 @@ export fn output(format: [*:0]const u8, ...) u32 { defer @cVaEnd(&ap); _ = format; - // TODO; is format necessary? return 0; } -extern fn gpio_panic_simple(pin: u8) void; +export fn panic(format: [*:0]const u8, ...) u32 { + var ap = @cVaStart(); + defer @cVaEnd(&ap); + + _ = format; + return 0; +} + +extern fn gpio_panic_pin(pin: u32) void; +extern fn gpio_panic_func(func: u32) void; -fn gpio_panic(pin: u8) noreturn { +fn gpio_panic(pin: u32) noreturn { // only 1 error code - gpio_panic_simple(pin); + gpio_panic_pin(pin); std.process.exit(1); } -export fn gpio_read(pin: u8) bool { - return gpio.read(pin) catch gpio_panic(pin); +export fn gpio_read(pin: u32) bool { + return gpio.read(@truncate(pin)) catch gpio_panic(pin); } -export fn gpio_write(pin: u8, state: bool) void { - gpio.write(pin, state) catch gpio_panic(pin); +export fn gpio_write(pin: u32, state: bool) void { + gpio.write(@truncate(pin), state) catch gpio_panic(pin); } -export fn gpio_set_on(pin: u8) void { - gpio.set_on(pin) catch gpio_panic(pin); +export fn gpio_set_on(pin: u32) void { + gpio.set_on(@truncate(pin)) catch gpio_panic(pin); } -export fn gpio_set_off(pin: u8) void { - gpio.set_off(pin) catch gpio_panic(pin); +export fn gpio_set_off(pin: u32) void { + gpio.set_off(@truncate(pin)) catch gpio_panic(pin); } -export fn gpio_set_input(pin: u8) void { - gpio.set_input(pin) catch gpio_panic(pin); +export fn gpio_set_input(pin: u32) void { + gpio.set_input(@truncate(pin)) catch gpio_panic(pin); +} +export fn gpio_set_output(pin: u32) void { + gpio.set_output(@truncate(pin)) catch gpio_panic(pin); } -export fn gpio_set_output(pin: u8) void { - gpio.set_output(pin) catch gpio_panic(pin); + +export fn gpio_set_function(pin: u32, func: u32) void { + if ((func & 0b111) != func) gpio_panic_func(func); + + gpio.fn_sel(@truncate(pin), @enumFromInt(func & 0b111)) catch gpio_panic(pin); } pub fn kmain() void { diff --git a/tests/runner b/tests/runner @@ -9,19 +9,31 @@ for ref in tests/$1/*.ref; do name=$(basename $ref) tmp_name=$(mktemp) + if [ "${name%.*}" = "5-set-function-N" ]; then + continue + fi + ./zig-out/bin/${name%.*}.c-test > ${tmp_name} - cmp -s ${tmp_name} ${ref} || echo "failed test: ${name%.*}" + if ! cmp -s ${tmp_name} ${ref}; then + echo "failed ${name%.*}" + diff ${tmp_name} ${ref} + exit + fi done -echo "success" +echo -e "success\n" # Final checksum -echo -n "calculating final checksum: " tmp_name=$(mktemp -d) for test in tests/$1/*.c; do name=$(basename $test) - ./zig-out/bin/${name}-test > ${tmp_name}/${name}.out + ./zig-out/bin/${name}-test | grep 'TRACE:\|ERROR:\|PANIC:' > ${tmp_name}/${name}.out done -cd ${tmp_name} && ls | sort | xargs cksum | cksum +cd ${tmp_name} && find -type f | sort | xargs cksum + +echo -e "\nTotal files: $(ls ${tmp_name} | wc -l)\n" + +echo "=== USE THIS VALUE FOR CHECKOFF ===" +cd ${tmp_name} && find -type f | sort | xargs cksum | cksum