sylveos

Toy Operating System
Log | Files | Refs

commit f9d07df75fb361af7e6fb0c3734faac0c877fde1
parent 15f260c0eab9b264cd5567ee09abd70fb0c1663e
Author: Sylvia Ivory <git@sivory.net>
Date:   Wed,  4 Feb 2026 19:49:03 -0800

Remove old fake-pi

Diffstat:
D.gitmodules | 3---
D.rgignore | 1-
Dfake-pi/device.zig | 5-----
Dfake-pi/devices/gpio.zig | 92-------------------------------------------------------------------------------
Dfake-pi/main.zig | 10----------
Dfake-pi/pi.zig | 29-----------------------------
Dfake-pi/root.zig | 94-------------------------------------------------------------------------------
Dinclude/fake-pi.h | 1-
Dinclude/fake-random.c | 46----------------------------------------------
Dinclude/fake-random.h | 22----------------------
Dinclude/pi-random.c | 390-------------------------------------------------------------------------------
Dinclude/pi-random.h | 23-----------------------
Dinclude/rpi.h | 16----------------
Dinclude/test-helper.h | 28----------------------------
Dsubmodules/cs140e | 1-
Dtests/gpio | 2--
Dtests/gpio.zig | 59-----------------------------------------------------------
Dtests/runner | 39---------------------------------------
18 files changed, 0 insertions(+), 861 deletions(-)

diff --git a/.gitmodules b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "submodules/cs140e"] - path = submodules/cs140e - url = https://github.com/dddrrreee/cs140e-26win.git diff --git a/.rgignore b/.rgignore @@ -1 +0,0 @@ -/submodules diff --git a/fake-pi/device.zig b/fake-pi/device.zig @@ -1,5 +0,0 @@ -pub const Error = error{ - InvalidAddress, - IllegalWrite, - IllegalRead, -}; diff --git a/fake-pi/devices/gpio.zig b/fake-pi/devices/gpio.zig @@ -1,92 +0,0 @@ -const std = @import("std"); - -const device = @import("../device.zig"); -const c = @cImport({ - @cInclude("fake-random.h"); -}); - -// TODO; these constants should come from src/devices/gpio.zig -pub const START_OFFSET: usize = 0x0020_0000; -pub const END_OFFSET: usize = 0x0020_00B0; - -const GPFSEL0_OFFSET: usize = START_OFFSET + 0x0000; -const GPSET0_OFFSET: usize = START_OFFSET + 0x001C; -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 gpfsel4 = ~@as(u32, 0); -var gpfsel5 = ~@as(u32, 0); - -var gpset0: u32 = 0; -var gpset1: u32 = 0; - -var gpclr0: u32 = 0; -var gpclr1: u32 = 0; - -var gplev0: u32 = 0; -var gplev1: u32 = 0; - -pub const Error = error{ - ReadGPFSEL, - ReadGPCLR, - WriteGPLEV, -} || device.Error; - -pub fn initialize(base_addr: u32) void { - base_address = base_addr; - - gpfsel0 = c.fake_random(); - gpfsel1 = c.fake_random(); - gpfsel2 = c.fake_random(); - gpfsel3 = c.fake_random(); - gpfsel4 = ~@as(u32, 0); // Extend bits - gpfsel5 = ~@as(u32, 0); - - gpset0 = c.fake_random(); - gpset1 = ~@as(u32, 0); - - gpclr0 = c.fake_random(); - gpclr1 = ~@as(u32, 0); -} - -pub fn read_u32(address: *u32) Error!u32 { - switch (@intFromPtr(address) - base_address) { - GPFSEL0_OFFSET + @sizeOf(u32) * 0 => return gpfsel0, - GPFSEL0_OFFSET + @sizeOf(u32) * 1 => return gpfsel1, - GPFSEL0_OFFSET + @sizeOf(u32) * 2 => return gpfsel2, - GPFSEL0_OFFSET + @sizeOf(u32) * 3 => return gpfsel3, - GPFSEL0_OFFSET + @sizeOf(u32) * 4 => return gpfsel4, - GPFSEL0_OFFSET + @sizeOf(u32) * 5 => return gpfsel5, - - GPSET0_OFFSET...(GPSET0_OFFSET + @sizeOf(u32)) => return Error.ReadGPFSEL, - GPCLR0_OFFSET...(GPCLR0_OFFSET + @sizeOf(u32)) => return Error.ReadGPCLR, - - GPLEV0_OFFSET...(GPLEV0_OFFSET + @sizeOf(u32)) => return c.fake_random(), - else => return Error.IllegalRead, - } -} - -pub fn put_u32(address: *u32, value: u32) Error!void { - switch (@intFromPtr(address) - base_address) { - GPFSEL0_OFFSET + @sizeOf(u32) * 0 => gpfsel0 = value, - GPFSEL0_OFFSET + @sizeOf(u32) * 1 => gpfsel1 = value, - GPFSEL0_OFFSET + @sizeOf(u32) * 2 => gpfsel2 = value, - GPFSEL0_OFFSET + @sizeOf(u32) * 3 => gpfsel3 = value, - GPFSEL0_OFFSET + @sizeOf(u32) * 4 => gpfsel4 = value, - GPFSEL0_OFFSET + @sizeOf(u32) * 5 => gpfsel5 = value, - - GPSET0_OFFSET => gpset0 = value, - GPSET0_OFFSET + @sizeOf(u32) => gpset0 = value, - - GPCLR0_OFFSET => gpclr0 = value, - GPCLR0_OFFSET + @sizeOf(u32) => gpclr1 = value, - - GPLEV0_OFFSET...(GPLEV0_OFFSET + @sizeOf(u32)) => return Error.WriteGPLEV, - else => return Error.IllegalWrite, - } -} diff --git a/fake-pi/main.zig b/fake-pi/main.zig @@ -1,10 +0,0 @@ -const std = @import("std"); -const boot = @import("boot"); - -const root = @import("root.zig"); - -pub fn main() void { - root.initialize(); - boot.kmain(); - root.finalize(); -} diff --git a/fake-pi/pi.zig b/fake-pi/pi.zig @@ -1,29 +0,0 @@ -pub const mem = struct { - pub const BASE_ADDRESS: usize = 0x2000_0000; - - const Operation = enum { - Read, - Write, - General, - }; - - pub inline fn barrier(op: Operation) void { - _ = op; - } - - pub extern fn put_u32(address: *u32, value: u32) void; - pub inline fn put_u32_barrier(address: *u32, value: u32) void { - return put_u32(address, value); - } - - pub extern fn get_u32(address: *u32) u32; - pub inline fn get_u32_barrier(address: *u32) u32 { - return get_u32(address); - } -}; - -// Stubs -pub fn cycle_counter_init() void {} -pub fn cycle_counter_get() u32 { - return 0; -} diff --git a/fake-pi/root.zig b/fake-pi/root.zig @@ -1,94 +0,0 @@ -const std = @import("std"); - -const gpio = @import("devices/gpio.zig"); -const c = @cImport({ - @cInclude("fake-random.h"); -}); - -const BASE_ADDRESS: u32 = 0x2000_0000; -const MAX_TRACE: usize = 128; - -var trace_count: usize = 0; - -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 {}; - writer.flush() catch {}; -} - -fn trace(comptime format: []const u8, args: anytype) void { - writer.print("TRACE:{}: ", .{trace_count}) catch {}; - writer.print(format, args) catch {}; - writer.flush() catch {}; - - trace_count += 1; - - if (trace_count >= MAX_TRACE) { - trace_no_count("exiting after {} trace statements\n", .{trace_count}); - trace_no_count("pi exited cleanly: {} calls to random\n", .{c.fake_random_calls()}); - std.process.exit(0); - } -} - -pub fn initialize() void { - c.fake_random_init(); - - trace("calling pi code\n", .{}); -} - -pub fn finalize() void { - trace_no_count("pi exited cleanly: {} calls to random\n", .{c.fake_random_calls()}); -} - -export fn get_u32(address: *u32) u32 { - switch (@intFromPtr(address)) { - (BASE_ADDRESS + gpio.START_OFFSET)...(BASE_ADDRESS + gpio.END_OFFSET) => { - const value = gpio.read_u32(address) catch |e| { - std.log.err("read_u32 gpio error: {t}", .{e}); - return c.fake_random(); - }; - - trace("GET32(0x{x}) = 0x{x}\n", .{ @intFromPtr(address), value }); - return value; - }, - else => { - std.log.err("read_u32: illegal read", .{}); - return c.fake_random(); - }, - } -} - -export fn put_u32(address: *u32, value: u32) void { - trace("PUT32(0x{x}) = 0x{x}\n", .{ @intFromPtr(address), value }); - switch (@intFromPtr(address)) { - (BASE_ADDRESS + gpio.START_OFFSET)...(BASE_ADDRESS + gpio.END_OFFSET) => { - gpio.put_u32(address, value) catch |e| { - std.log.err("put_u32 gpio error: {t}", .{e}); - }; - }, - else => { - std.log.err("put_u32: illegal write", .{}); - }, - } -} - -export fn delay_cycles(cycles: u32) void { - trace("delaying {} cycles\n", .{cycles}); -} - -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/fake-pi.h b/include/fake-pi.h @@ -1 +0,0 @@ -#include "fake-random.h" diff --git a/include/fake-random.c b/include/fake-random.c @@ -1,46 +0,0 @@ -// wrapper for the our local random() implementation (in pi-random.c). -#include <string.h> -#include <assert.h> -#include <stdlib.h> - -#include "fake-random.h" -#include "pi-random.h" - - - -#define STATESIZE 128 -static int seed = 0; -static char statebuf[STATESIZE]; -static struct pi_random_data r; -static int init_p = 0; - -void fake_random_seed(unsigned x) { - init_p = 1; - memset(&r, 0, sizeof r); - if(pi_initstate_r(seed, statebuf, STATESIZE, &r)) - assert(0); - if(pi_srandom_r(seed, &r)) - assert(0); -} - -// make sure that everyone has the same random. -void fake_random_init(void) { - fake_random_seed(0x140e); - unsigned u = fake_random(); - assert(0x6b8b4567 == u); -} - -static unsigned nrandom_calls; -unsigned fake_random_calls(void) { - return nrandom_calls; -} - -unsigned (fake_random)(void) { - assert(init_p); - - nrandom_calls++; - int x; - if(pi_random_r(&r, &x)) - assert(0); - return x; -} diff --git a/include/fake-random.h b/include/fake-random.h @@ -1,22 +0,0 @@ -#ifndef __FAKE_PI_H__ -#define __FAKE_PI_H__ - -#define random() "do not call random() directly" - -// prototypes for our fake_random implementation - -// must call this first: used to check that everyone -// has the same seed. -void fake_random_init(void); - -// call to change seed. -void fake_random_seed(unsigned x); - -// total number of random calls (can be used to debug -// your fake implementation). -unsigned fake_random_calls(void); - -// call this to get a 32-bit pseudo-random number. -unsigned fake_random(void); - -#endif diff --git a/include/pi-random.c b/include/pi-random.c @@ -1,390 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * This is derived from the Berkeley source: - * @(#)random.c 5.5 (Berkeley) 7/6/88 - * It was reworked for the GNU C Library by Roland McGrath. - * Rewritten to be reentrant by Ulrich Drepper, 1995 - */ - -#include <stddef.h> -#include "pi-random.h" - - -/* An improved random number generation package. In addition to the standard - rand()/srand() like interface, this package also has a special state info - interface. The initstate() routine is called with a seed, an array of - bytes, and a count of how many bytes are being passed in; this array is - then initialized to contain information for random number generation with - that much state information. Good sizes for the amount of state - information are 32, 64, 128, and 256 bytes. The state can be switched by - calling the setstate() function with the same array as was initialized - with initstate(). By default, the package runs with 128 bytes of state - information and generates far better random numbers than a linear - congruential generator. If the amount of state information is less than - 32 bytes, a simple linear congruential R.N.G. is used. Internally, the - state information is treated as an array of longs; the zeroth element of - the array is the type of R.N.G. being used (small integer); the remainder - of the array is the state information for the R.N.G. Thus, 32 bytes of - state information will give 7 longs worth of state information, which will - allow a degree seven polynomial. (Note: The zeroth word of state - information also has some other information stored in it; see setstate - for details). The random number generation technique is a linear feedback - shift register approach, employing trinomials (since there are fewer terms - to sum up that way). In this approach, the least significant bit of all - the numbers in the state table will act as a linear feedback shift register, - and will have period 2^deg - 1 (where deg is the degree of the polynomial - being used, assuming that the polynomial is irreducible and primitive). - The higher order bits will have longer periods, since their values are - also influenced by pseudo-random carries out of the lower bits. The - total period of the generator is approximately deg*(2**deg - 1); thus - doubling the amount of state information has a vast influence on the - period of the generator. Note: The deg*(2**deg - 1) is an approximation - only good for large deg, when the period of the shift register is the - dominant factor. With deg equal to seven, the period is actually much - longer than the 7*(2**7 - 1) predicted by this formula. */ - - - -/* For each of the currently supported random number generators, we have a - break value on the amount of state information (you need at least this many - bytes of state info to support this random number generator), a degree for - the polynomial (actually a trinomial) that the R.N.G. is based on, and - separation between the two lower order coefficients of the trinomial. */ - -/* Linear congruential. */ -#define TYPE_0 0 -#define BREAK_0 8 -#define DEG_0 0 -#define SEP_0 0 - -/* x**7 + x**3 + 1. */ -#define TYPE_1 1 -#define BREAK_1 32 -#define DEG_1 7 -#define SEP_1 3 - -/* x**15 + x + 1. */ -#define TYPE_2 2 -#define BREAK_2 64 -#define DEG_2 15 -#define SEP_2 1 - -/* x**31 + x**3 + 1. */ -#define TYPE_3 3 -#define BREAK_3 128 -#define DEG_3 31 -#define SEP_3 3 - -/* x**63 + x + 1. */ -#define TYPE_4 4 -#define BREAK_4 256 -#define DEG_4 63 -#define SEP_4 1 - - -/* Array versions of the above information to make code run faster. - Relies on fact that TYPE_i == i. */ - -#define MAX_TYPES 5 /* Max number of types above. */ - -struct random_poly_info -{ - int seps[MAX_TYPES]; - int degrees[MAX_TYPES]; -}; - -static const struct random_poly_info random_poly_info = -{ - { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }, - { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 } -}; - - - - -/* If we are using the trivial TYPE_0 R.N.G., just do the old linear - congruential bit. Otherwise, we do our fancy trinomial stuff, which is the - same in all the other cases due to all the global variables that have been - set up. The basic operation is to add the number at the rear pointer into - the one at the front pointer. Then both pointers are advanced to the next - location cyclically in the table. The value returned is the sum generated, - reduced to 31 bits by throwing away the "least random" low bit. - Note: The code takes advantage of the fact that both the front and - rear pointers can't wrap on the same call by not testing the rear - pointer if the front one has wrapped. Returns a 31-bit random number. */ -int pi_random_r(struct pi_random_data *buf, int32_t *result) -{ - int32_t *state; - - if (buf == NULL || result == NULL) - goto fail; - - state = buf->state; - - if (buf->rand_type == TYPE_0) - { - int32_t val = state[0]; - val = ((state[0] * 1103515245) + 12345) & 0x7fffffff; - state[0] = val; - *result = val; - } - else - { - int32_t *fptr = buf->fptr; - int32_t *rptr = buf->rptr; - int32_t *end_ptr = buf->end_ptr; - int32_t val; - - val = *fptr += *rptr; - /* Chucking least random bit. */ - *result = (val >> 1) & 0x7fffffff; - ++fptr; - if (fptr >= end_ptr) - { - fptr = state; - ++rptr; - } - else - { - ++rptr; - if (rptr >= end_ptr) - rptr = state; - } - buf->fptr = fptr; - buf->rptr = rptr; - } - return 0; - -fail: - return -1; -} - -/* Initialize the random number generator based on the given seed. If the - type is the trivial no-state-information type, just remember the seed. - Otherwise, initializes state[] based on the given "seed" via a linear - congruential generator. Then, the pointers are set to known locations - that are exactly rand_sep places apart. Lastly, it cycles the state - information a given number of times to get rid of any initial dependencies - introduced by the L.C.R.N.G. Note that the initialization of randtbl[] - for default usage relies on values produced by this routine. */ -int pi_srandom_r (unsigned int seed, struct pi_random_data *buf) { - int type; - int32_t *state; - long int i; - long int word; - int32_t *dst; - int kc; - - if (buf == NULL) - goto fail; - type = buf->rand_type; - if ((unsigned int) type >= MAX_TYPES) - goto fail; - - state = buf->state; - /* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */ - if (seed == 0) - seed = 1; - state[0] = seed; - if (type == TYPE_0) - goto done; - - dst = state; - word = seed; - kc = buf->rand_deg; - for (i = 1; i < kc; ++i) - { - /* This does: - state[i] = (16807 * state[i - 1]) % 2147483647; - but avoids overflowing 31 bits. */ - long int hi = word / 127773; - long int lo = word % 127773; - word = 16807 * lo - 2836 * hi; - if (word < 0) - word += 2147483647; - *++dst = word; - } - - buf->fptr = &state[buf->rand_sep]; - buf->rptr = &state[0]; - kc *= 10; - while (--kc >= 0) - { - int32_t discard; - (void) pi_random_r (buf, &discard); - } - -done: - return 0; - -fail: - return -1; -} - -/* Initialize the state information in the given array of N bytes for - future random number generation. Based on the number of bytes we - are given, and the break values for the different R.N.G.'s, we choose - the best (largest) one we can and set things up for it. srandom is - then called to initialize the state information. Note that on return - from srandom, we set state[-1] to be the type multiplexed with the current - value of the rear pointer; this is so successive calls to initstate won't - lose this information and will be able to restart with setstate. - Note: The first thing we do is save the current state, if any, just like - setstate so that it doesn't matter when initstate is called. - Returns a pointer to the old state. */ -int pi_initstate_r (unsigned int seed, char *arg_state, size_t n, struct pi_random_data *buf) -{ - int type; - int degree; - int separation; - int32_t *state; - - if (buf == NULL) - goto fail; - - if (n >= BREAK_3) - type = n < BREAK_4 ? TYPE_3 : TYPE_4; - else if (n < BREAK_1) - { - if (n < BREAK_0) - { - goto fail; - } - type = TYPE_0; - } - else - type = n < BREAK_2 ? TYPE_1 : TYPE_2; - - degree = random_poly_info.degrees[type]; - separation = random_poly_info.seps[type]; - - buf->rand_type = type; - buf->rand_sep = separation; - buf->rand_deg = degree; - state = &((int32_t *) arg_state)[1]; /* First location. */ - /* Must set END_PTR before srandom. */ - buf->end_ptr = &state[degree]; - - buf->state = state; - - pi_srandom_r (seed, buf); - - state[-1] = TYPE_0; - if (type != TYPE_0) - state[-1] = (buf->rptr - state) * MAX_TYPES + type; - - return 0; - -fail: - return -1; -} - -/* Restore the state from the given state array. - Note: It is important that we also remember the locations of the pointers - in the current state information, and restore the locations of the pointers - from the old state information. This is done by multiplexing the pointer - location into the zeroth word of the state information. Note that due - to the order in which things are done, it is OK to call setstate with the - same state as the current state - Returns a pointer to the old state information. */ -int pi_setstate_r (char *arg_state, struct pi_random_data *buf) -{ - int32_t *new_state = 1 + (int32_t *) arg_state; - int type; - int old_type; - int32_t *old_state; - int degree; - int separation; - - if (arg_state == NULL || buf == NULL) - goto fail; - - old_type = buf->rand_type; - old_state = buf->state; - if (old_type == TYPE_0) - old_state[-1] = TYPE_0; - else - old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type; - - type = new_state[-1] % MAX_TYPES; - if (type < TYPE_0 || type > TYPE_4) - goto fail; - - buf->rand_deg = degree = random_poly_info.degrees[type]; - buf->rand_sep = separation = random_poly_info.seps[type]; - buf->rand_type = type; - - if (type != TYPE_0) - { - int rear = new_state[-1] / MAX_TYPES; - buf->rptr = &new_state[rear]; - buf->fptr = &new_state[(rear + separation) % degree]; - } - buf->state = new_state; - /* Set end_ptr too. */ - buf->end_ptr = &new_state[degree]; - - return 0; - -fail: - return -1; -} - - -#ifdef TEST - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <time.h> -#include <assert.h> - -#define STATESIZE 128 - -// we are not guaranteed that the libc implement of random is the same. -// we provide our own. - -static void print_random(struct pi_random_data *r, unsigned n) { - for(int i = 0; i < n; i++) { - int x; - if(pi_random_r(r, &x)) - assert(0); - printf("x=%x, %d\n", x,x%1024); - } -} - -int main() { - int seed = 0; - char statebuf[STATESIZE]; - struct pi_random_data r; - - memset(&r, 0, sizeof r); - if(pi_initstate_r(seed, statebuf, STATESIZE, &r)) - assert(0); - if(pi_srandom_r(seed, &r)) - assert(0); - - // should be same. - print_random(&r, 8); - pi_srandom_r(seed, &r); - print_random(&r, 8); - - return 0; -} -#endif diff --git a/include/pi-random.h b/include/pi-random.h @@ -1,23 +0,0 @@ -#ifndef __PI_RANDOM_H__ -#define __PI_RANDOM_H__ - -#include <stdint.h> -#include <stddef.h> - -struct pi_random_data - { - int32_t *fptr; /* Front pointer. */ - int32_t *rptr; /* Rear pointer. */ - int32_t *state; /* Array of state values. */ - int rand_type; /* Type of random number generator. */ - int rand_deg; /* Degree of random number generator. */ - int rand_sep; /* Distance between front and rear. */ - int32_t *end_ptr; /* Pointer behind state table. */ - }; - -int pi_random_r(struct pi_random_data *buf, int32_t *result); -int pi_srandom_r (unsigned int seed, struct pi_random_data *buf); -int pi_initstate_r (unsigned int seed, char *arg_state, size_t n, struct pi_random_data *buf); -int pi_setstate_r (char *arg_state, struct pi_random_data *buf); - -#endif diff --git a/include/rpi.h b/include/rpi.h @@ -1,16 +0,0 @@ -void gpio_set_input(unsigned pin); -void gpio_set_output(unsigned pin); - -void gpio_write(unsigned pin, unsigned val); -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 @@ -1,28 +0,0 @@ -#include "rpi.h" -#include "pi-random.h" - -// run <fp>: -// 1. on the values [0..32) -// 2. with random input <ntrials> times. -static inline void -run_test(const char *name, void (*fp)(unsigned), int ntrials) { - // test pins 0..32, then a bunch of random. - for(int i = 0; i < 32; i++) - fp(i); - for(int i = 0; i < ntrials; i++) - fp(fake_random()); -} - -// run the different tests <ntrials> times. -static inline void test_gpio_set_output(int ntrials) { - run_test(__FUNCTION__, gpio_set_output, ntrials); -} -static inline void test_gpio_set_input(int ntrials) { - run_test(__FUNCTION__, gpio_set_input, ntrials); -} -static inline void test_gpio_set_on(int ntrials) { - run_test(__FUNCTION__, gpio_set_on, ntrials); -} -static inline void test_gpio_set_off(int ntrials) { - run_test(__FUNCTION__, gpio_set_off, ntrials); -} diff --git a/submodules/cs140e b/submodules/cs140e @@ -1 +0,0 @@ -Subproject commit ffed91069b4db267abbbd3dff3a952d7368a3c0a diff --git a/tests/gpio b/tests/gpio @@ -1 +0,0 @@ -../submodules/cs140e/labs/3-cross-checking/1-fake-pi/tests/ -\ No newline at end of file diff --git a/tests/gpio.zig b/tests/gpio.zig @@ -1,59 +0,0 @@ -const std = @import("std"); - -pub fn build(b: *std.Build) !void { - const relative_path = b.path("tests/gpio"); - const path = try relative_path.getPath3(b, null).toString(b.allocator); - defer b.allocator.free(path); - - var dir = try std.fs.openDirAbsolute(path, .{ .access_sub_paths = false, .iterate = true }); - defer dir.close(); - - var iter = dir.iterate(); - while (try iter.next()) |entry| { - if (entry.kind != .file) continue; - if (!std.mem.endsWith(u8, entry.name, ".c")) continue; - - const pi = b.createModule(.{ - .root_source_file = b.path("fake-pi/pi.zig"), - .target = b.graph.host, - .optimize = .ReleaseSafe, - }); - - // C files - const runner = b.createModule(.{ - .root_source_file = b.path("src/test-runner.zig"), - .target = b.graph.host, - .optimize = .ReleaseSafe, - .link_libc = true, - }); - runner.addCSourceFile(.{ .file = b.path(b.pathJoin(&.{ "tests/gpio", entry.name })) }); - runner.addIncludePath(b.path("include/")); - runner.addImport("pi", pi); - - // TODO; this is duplicated code - const fake_pi = b.createModule(.{ - .root_source_file = b.path("fake-pi/main.zig"), - .target = b.graph.host, - .optimize = .ReleaseFast, - }); - - fake_pi.addImport("boot", runner); - - // TODO; C should get its own module so we can have fake-pi be in debug for faster comp - const CFlags = &.{"-O2"}; - fake_pi.addCSourceFile(.{ .file = b.path("include/fake-random.c"), .flags = CFlags }); - fake_pi.addCSourceFile(.{ .file = b.path("include/pi-random.c"), .flags = CFlags }); - fake_pi.addIncludePath(b.path("include/")); - - const exe_name = try std.fmt.allocPrint(b.allocator, "{s}-test", .{entry.name}); - defer b.allocator.free(exe_name); - - const exe = b.addExecutable(.{ - .name = exe_name, - .linkage = .dynamic, - .root_module = fake_pi, - }); - - b.installArtifact(exe); - } -} diff --git a/tests/runner b/tests/runner @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -# Compile tests -zig build -Dtest="$1" - -# Quick Check -echo -n "running smoke check: " -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} - if ! cmp -s ${tmp_name} ${ref}; then - echo "failed ${name%.*}" - diff ${tmp_name} ${ref} - exit - fi -done - -echo -e "success\n" - -# Final checksum -tmp_name=$(mktemp -d) -for test in tests/$1/*.c; do - name=$(basename $test) - - ./zig-out/bin/${name}-test | grep 'TRACE:\|ERROR:\|PANIC:' > ${tmp_name}/${name}.out -done - -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