feat(loader, kernel): impl part of loader and initialize kernel structure
This commit is contained in:
20
arch/x86_64/boot/relocate.zig
Normal file
20
arch/x86_64/boot/relocate.zig
Normal file
@@ -0,0 +1,20 @@
|
||||
const std = @import("std");
|
||||
const elf = std.elf;
|
||||
|
||||
extern var __rela_dyn_start: u8;
|
||||
extern var __rela_dyn_end: u8;
|
||||
|
||||
pub fn relocateSelf(base_addr: usize) callconv(.c) void {
|
||||
const rela_size = (@intFromPtr(&__rela_dyn_end) - @intFromPtr(&__rela_dyn_start)) / @sizeOf(elf.Elf64_Rela);
|
||||
const relas = @as([*]elf.Elf64_Rela, @ptrCast(@alignCast(&__rela_dyn_start)))[0..rela_size];
|
||||
for (relas) |rela| {
|
||||
const offset = rela.r_offset;
|
||||
const addend = rela.r_addend;
|
||||
// const sym_index = rela.r_info >> 32;
|
||||
const type_ = rela.r_info & 0xffffffff;
|
||||
if (type_ == @intFromEnum(elf.R_X86_64.RELATIVE)) {
|
||||
const reloc_addr: *u64 = @ptrFromInt(offset + base_addr);
|
||||
reloc_addr.* = base_addr + @as(usize, @intCast(addend));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user