From 270c8f02867bf959fa86a44fcb76bb0680571695 Mon Sep 17 00:00:00 2001 From: Himbeer Date: Tue, 30 Jul 2024 12:24:01 +0200 Subject: syscall: Provide userinit access (permissions controlled via paging in the future) Fixes #69. --- linker.ld | 7 +++++++ src/lib/paging.zig | 3 +++ src/lib/process.zig | 4 ++++ src/lib/syscall.zig | 9 +++++++++ src/lib/userinit.zig | 2 +- 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/linker.ld b/linker.ld index 30c410a..1d16384 100644 --- a/linker.ld +++ b/linker.ld @@ -38,6 +38,13 @@ SECTIONS { PROVIDE(_rodata_end = .); } > ram AT > ram : lo_r + .userinit : ALIGN(4K) { + PROVIDE(_userinit_start = .); + + *(.userinit .userinit.*) + + PROVIDE(_userinit_end = .); + } > ram AT > ram : lo_r .data : ALIGN(4K) { PROVIDE(_data_start = .); 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"); -- cgit v1.2.3