mirror of
https://github.com/rdmsr/zag.git
synced 2026-11-01 23:58:21 +00:00
loader: rework kernel entry point
This commit is contained in:
@@ -11,6 +11,9 @@ var thread0: ke.Thread = undefined;
|
|||||||
export fn kmain(boot_info: *r.BootInfo) callconv(.c) void {
|
export fn kmain(boot_info: *r.BootInfo) callconv(.c) void {
|
||||||
r.boot_info = boot_info;
|
r.boot_info = boot_info;
|
||||||
|
|
||||||
|
// Immediately initialize the context of what will eventually become
|
||||||
|
// our idle thread. We keep running on the loader stack up until we switch
|
||||||
|
// into the thread.
|
||||||
thread0.init(
|
thread0.init(
|
||||||
boot_info.kernel_stack,
|
boot_info.kernel_stack,
|
||||||
boot_info.kernel_stack_size,
|
boot_info.kernel_stack_size,
|
||||||
|
|||||||
+6
-1
@@ -137,7 +137,12 @@ pub const Thread = struct {
|
|||||||
arg: ?*anyopaque,
|
arg: ?*anyopaque,
|
||||||
) void {
|
) void {
|
||||||
thread.* = .{
|
thread.* = .{
|
||||||
.context = .init(stack, stack_size, entry, arg),
|
.context = .init(
|
||||||
|
stack,
|
||||||
|
stack_size,
|
||||||
|
entry,
|
||||||
|
arg,
|
||||||
|
),
|
||||||
.lock = .init(),
|
.lock = .init(),
|
||||||
.nice = 0,
|
.nice = 0,
|
||||||
.priority = prio,
|
.priority = prio,
|
||||||
|
|||||||
+2
-3
@@ -1,5 +1,4 @@
|
|||||||
.globl jump_to_kernel
|
.globl jump_to_kernel
|
||||||
jump_to_kernel:
|
jump_to_kernel:
|
||||||
mov %rsi, %rsp
|
xorq %rbp, %rbp /* Call chain ends here */
|
||||||
push $0
|
jmp *%rsi /* rdi = loader_info */
|
||||||
jmp *%rdx ; rdi = loader_info
|
|
||||||
|
|||||||
+14
-10
@@ -4,7 +4,7 @@ const std = @import("std");
|
|||||||
const Entry = r.BootInfo.MemMap.Entry;
|
const Entry = r.BootInfo.MemMap.Entry;
|
||||||
const stack_size = 1024 * 16; // should be enough
|
const stack_size = 1024 * 16; // should be enough
|
||||||
|
|
||||||
extern fn jump_to_kernel(loader_info: usize, stack: usize, entry: usize) void;
|
extern fn jump_to_kernel(loader_info: usize, entry: usize) void;
|
||||||
|
|
||||||
fn load_kernel(kernel: *anyopaque) usize {
|
fn load_kernel(kernel: *anyopaque) usize {
|
||||||
const elf: *std.elf.Elf64.Ehdr = @ptrCast(@alignCast(kernel));
|
const elf: *std.elf.Elf64.Ehdr = @ptrCast(@alignCast(kernel));
|
||||||
@@ -53,12 +53,8 @@ fn load_kernel(kernel: *anyopaque) usize {
|
|||||||
// Copy the file data.
|
// Copy the file data.
|
||||||
@memcpy(dest, source);
|
@memcpy(dest, source);
|
||||||
|
|
||||||
if (filesz_rem == 0) {
|
// Zero the rest.
|
||||||
const zeroes = phdr.memsz - phdr.filesz;
|
@memset(va[file_remaining..r.page_size], 0);
|
||||||
|
|
||||||
// Fill the rest of memsz with 0.
|
|
||||||
@memset(va[0..zeroes], 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now update the page permissions to their true value.
|
// Now update the page permissions to their true value.
|
||||||
r.mem.pagemap.map_page(addr, pa, .{
|
r.mem.pagemap.map_page(addr, pa, .{
|
||||||
@@ -89,15 +85,23 @@ pub fn loader_main(kernel: *anyopaque) void {
|
|||||||
r.arch.init();
|
r.arch.init();
|
||||||
r.mem.init();
|
r.mem.init();
|
||||||
const entry = load_kernel(kernel);
|
const entry = load_kernel(kernel);
|
||||||
const stack = r.mem.alloc(stack_size);
|
|
||||||
|
|
||||||
|
const stack = r.mem.alloc(stack_size);
|
||||||
const memmap = &r.loader_info.memory_map;
|
const memmap = &r.loader_info.memory_map;
|
||||||
|
|
||||||
r.loader_info.kernel_stack = stack;
|
r.loader_info.kernel_stack = stack;
|
||||||
r.loader_info.kernel_stack_size = stack_size;
|
r.loader_info.kernel_stack_size = stack_size;
|
||||||
|
|
||||||
// Finally, sort the memory map once we're done allocating everything.
|
// Finally, sort the memory map once we're done allocating everything.
|
||||||
std.mem.sort(Entry, memmap.entries[0..memmap.entry_count], {}, cmp_entries);
|
std.mem.sort(
|
||||||
|
Entry,
|
||||||
|
memmap.entries[0..memmap.entry_count],
|
||||||
|
{},
|
||||||
|
cmp_entries,
|
||||||
|
);
|
||||||
|
|
||||||
jump_to_kernel(@intFromPtr(&r.loader_info), stack + stack_size, entry);
|
jump_to_kernel(
|
||||||
|
@intFromPtr(&r.loader_info),
|
||||||
|
entry,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user