aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/paging.zig3
-rw-r--r--src/lib/process.zig4
-rw-r--r--src/lib/syscall.zig9
-rw-r--r--src/lib/userinit.zig2
4 files changed, 17 insertions, 1 deletions
diff --git a/src/lib/paging.zig b/src/lib/paging.zig
index dd1feeb..d69a17c 100644
--- a/src/lib/paging.zig
+++ b/src/lib/paging.zig
@@ -14,6 +14,8 @@ pub const text_start = @extern(*anyopaque, .{ .name = "_text_start" });
pub const text_end = @extern(*anyopaque, .{ .name = "_text_end" });
pub const rodata_start = @extern(*anyopaque, .{ .name = "_rodata_start" });
pub const rodata_end = @extern(*anyopaque, .{ .name = "_rodata_end" });
+pub const userinit_start = @extern(*anyopaque, .{ .name = "_userinit_start" });
+pub const userinit_end = @extern(*anyopaque, .{ .name = "_userinit_end" });
pub const data_start = @extern(*anyopaque, .{ .name = "_data_start" });
pub const data_end = @extern(*anyopaque, .{ .name = "_data_end" });
pub const bss_start = @extern(*anyopaque, .{ .name = "_bss_start" });
@@ -458,6 +460,7 @@ pub const Table = struct {
pub fn mapKernel(root: *Table) !void {
try root.identityMapRange(@intFromPtr(text_start), @intFromPtr(text_end), EntryFlags.readExec);
try root.identityMapRange(@intFromPtr(rodata_start), @intFromPtr(rodata_end), EntryFlags.readOnly);
+ try root.identityMapRange(@intFromPtr(userinit_start), @intFromPtr(userinit_end), EntryFlags.readOnly);
try root.identityMapRange(@intFromPtr(data_start), @intFromPtr(data_end), EntryFlags.readWrite);
try root.identityMapRange(@intFromPtr(bss_start), @intFromPtr(bss_end), EntryFlags.readWrite);
try root.identityMapRange(@intFromPtr(stack_start), @intFromPtr(stack_end), EntryFlags.readWrite);
diff --git a/src/lib/process.zig b/src/lib/process.zig
index c8e6d5e..99a89bd 100644
--- a/src/lib/process.zig
+++ b/src/lib/process.zig
@@ -235,6 +235,10 @@ pub fn create(allocator: Allocator, elf_buf: []align(@alignOf(elf.Elf64_Ehdr)) c
try procmem.mapKernel();
+ const userinit_start = @intFromPtr(paging.userinit_start);
+ const userinit_end = @intFromPtr(paging.userinit_end);
+ try procmem.identityMapRange(userinit_start, userinit_end, paging.EntryFlags.userReadOnly);
+
const parse_source = std.io.fixedBufferStream(elf_buf);
var it = hdr.program_header_iterator(parse_source);
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index 03abade..8d42e7a 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -9,6 +9,7 @@ const mem = @import("mem.zig");
const paging = @import("paging.zig");
const process = @import("process.zig");
const riscv = @import("riscv.zig");
+const userinit = @import("userinit.zig");
pub const Error = error{
ZeroAddressSupplied,
@@ -27,6 +28,7 @@ pub fn handler(proc: *process.Info, trap_frame: *TrapFrame) !void {
100004 => trap_frame.setReturnValue(terminate(proc, trap_frame)),
100005 => trap_frame.setReturnValue(processId(proc)),
100006 => trap_frame.setReturnValue(threadId(proc)),
+ 100007 => trap_frame.setReturnValue(rawUserinit(trap_frame)),
else => return HandleError.UnknownSyscall,
}
}
@@ -138,3 +140,10 @@ fn processId(proc: *const process.Info) usize {
fn threadId(proc: *const process.Info) usize {
return proc.thread_id;
}
+
+// rawUserinit(ptr: *[*]const u8) usize
+fn rawUserinit(trap_frame: *const TrapFrame) usize {
+ const ptr: *[*]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
+ ptr.* = userinit.tarball;
+ return userinit.tarball.len;
+}
diff --git a/src/lib/userinit.zig b/src/lib/userinit.zig
index 8c77cdd..7eb0eea 100644
--- a/src/lib/userinit.zig
+++ b/src/lib/userinit.zig
@@ -2,4 +2,4 @@
//
// SPDX-License-Identifier: AGPL-3.0-or-later
-pub const tarball = @embedFile("cfg/userinit.tar");
+pub export var tarball linksection(".userinit") = @embedFile("cfg/userinit.tar");