aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--README.md23
-rw-r--r--build.zig8
-rw-r--r--src/kernel.zig6
-rw-r--r--src/lib/process.zig23
-rw-r--r--src/lib/userinit.zig5
6 files changed, 13 insertions, 55 deletions
diff --git a/.gitignore b/.gitignore
index bd6ab7e..5d30384 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,5 +7,4 @@
/.zig-*/
/hwi
/hwi.o
-/src/lib/cfg/userinit/
-/src/lib/cfg/userinit.tar
+/src/lib/cfg/init
diff --git a/README.md b/README.md
index 89a8e65..349f792 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ QEMU can be adapted to use this boot flow as well (the default is different).
Required dependencies:
* zig ^0.12.0
-* userinit.tar (see below)
+* init executable (see below)
To make a debug build of this kernel, run:
@@ -56,23 +56,14 @@ You can also use any other Zig build mode, e.g. `--release=fast`.
This results in a `zig-out/bin/srvre_kernel.elf` file.
You may `strip(1)` this file if you want to.
-### Create a userinit
+### init executable
-A userinit is an uncompressed tar file containing an initramfs.
-It is embedded into the kernel binary to avoid running drivers in S-mode
-as much as possible, meaning that a rebuild is required to apply modifications.
-Its directory structure is made available as VFS resources.
-On startup, the kernel looks for a file named `init` and attempts to execute it
-in U-mode. Example programs are provided in the `examples/` directory.
-The file has to be a statically linked ELF executable with program headers.
+The init executable is expected to be a statically linked ELF
+(with program headers) at `src/lib/cfg/init`. It is embedded in the kernel
+binary to avoid running (filesystem) drivers in S-mode, meaning that a kernel
+rebuild is required to apply modifications.
-The build process expects the tar to exist at `src/lib/cfg/userinit.tar`.
-Assuming your directory tree is at `src/lib/cfg/userinit/` you can use
-the following command to create the archive:
-
-```
-tar -C src/lib/cfg/userinit -cvf src/lib/cfg/userinit.tar .
-```
+Example programs are provided in the `examples/` directory.
## Build OpenSBI
diff --git a/build.zig b/build.zig
index 42a013f..c2762d2 100644
--- a/build.zig
+++ b/build.zig
@@ -9,14 +9,6 @@ const std = @import("std");
// declaratively construct a build graph that will be executed by an external
// runner.
pub fn build(b: *std.Build) void {
- const create_userinit = b.addSystemCommand(&.{"tar"});
- create_userinit.addArg("-C");
- create_userinit.addDirectoryArg(b.path("src/lib/cfg/userinit"));
- create_userinit.addArg("-cf");
- create_userinit.addFileArg(b.path("src/lib/cfg/userinit.tar"));
- create_userinit.addArg(".");
- b.getInstallStep().dependOn(&create_userinit.step);
-
const riscv64_freestanding = std.zig.CrossTarget{
.cpu_arch = std.Target.Cpu.Arch.riscv64,
.os_tag = std.Target.Os.Tag.freestanding,
diff --git a/src/kernel.zig b/src/kernel.zig
index 648946d..b415d17 100644
--- a/src/kernel.zig
+++ b/src/kernel.zig
@@ -11,7 +11,8 @@ const paging = @import("lib/paging.zig");
const plic = @import("lib/plic.zig");
const process = @import("lib/process.zig");
const riscv = @import("lib/riscv.zig");
-const userinit = @import("lib/userinit.zig");
+
+const init = @embedFile("lib/cfg/init");
const Error = error{
HartIdOutOfRange,
@@ -166,6 +167,5 @@ fn pagedRun() !noreturn {
try w.print("\r\n", .{});
try w.print("Start init process\r\n", .{});
- var userinit_stream = std.io.fixedBufferStream(userinit.tarball);
- try process.runInit(allocator, userinit_stream.reader());
+ try process.run(allocator, @alignCast(init));
}
diff --git a/src/lib/process.zig b/src/lib/process.zig
index b59d255..b5afade 100644
--- a/src/lib/process.zig
+++ b/src/lib/process.zig
@@ -318,27 +318,8 @@ pub fn create(allocator: Allocator, elf_buf: []align(@alignOf(elf.Elf64_Ehdr)) c
return &proc_node.data;
}
-pub fn runInit(allocator: Allocator, reader: anytype) !noreturn {
- var file_name_buffer: [4096]u8 = undefined;
- var link_name_buffer: [4096]u8 = undefined;
-
- var it = std.tar.iterator(reader, .{
- .file_name_buffer = file_name_buffer[0..],
- .link_name_buffer = link_name_buffer[0..],
- });
- const exe = while (try it.next()) |file| {
- if (std.mem.eql(u8, file.name, "./init")) {
- break file;
- }
- } else return Error.NoInit;
-
- const alignment = @alignOf(elf.Elf64_Ehdr);
-
- var exe_list = std.ArrayListAligned(u8, alignment).init(allocator);
- defer exe_list.deinit();
- try exe.reader().readAllArrayListAligned(alignment, &exe_list, exe.size);
-
- const proc = try create(allocator, exe_list.items);
+pub fn run(allocator: Allocator, bytes: []align(@alignOf(elf.Elf64_Ehdr)) const u8) !noreturn {
+ const proc = try create(allocator, @alignCast(bytes[0..]));
try time.interruptInMillis(schedule_interval_millis);
switchTo(proc);
diff --git a/src/lib/userinit.zig b/src/lib/userinit.zig
deleted file mode 100644
index 8c77cdd..0000000
--- a/src/lib/userinit.zig
+++ /dev/null
@@ -1,5 +0,0 @@
-// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org>
-//
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-pub const tarball = @embedFile("cfg/userinit.tar");