diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-30 12:24:01 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-30 12:24:01 +0200 |
commit | 270c8f02867bf959fa86a44fcb76bb0680571695 (patch) | |
tree | d60a5eb5ab50533176cb67d2fb57c2934c4cf6d6 | |
parent | 864b96499db9e9233465b79cbbc3a32399fcf946 (diff) |
syscall: Provide userinit access (permissions controlled via paging in the future)
Fixes #69.
-rw-r--r-- | linker.ld | 7 | ||||
-rw-r--r-- | src/lib/paging.zig | 3 | ||||
-rw-r--r-- | src/lib/process.zig | 4 | ||||
-rw-r--r-- | src/lib/syscall.zig | 9 | ||||
-rw-r--r-- | src/lib/userinit.zig | 2 |
5 files changed, 24 insertions, 1 deletions
@@ -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"); |