feat(loader, kernel): impl part of loader and initialize kernel structure
This commit is contained in:
62
arch/x86_64/boot/ident_map.zig
Normal file
62
arch/x86_64/boot/ident_map.zig
Normal file
@@ -0,0 +1,62 @@
|
||||
const std = @import("std");
|
||||
const processor = @import("arch").processor;
|
||||
const mem = @import("arch").mem;
|
||||
const PFType = mem.PFType;
|
||||
const early_serial_console = @import("early_serial_console.zig");
|
||||
const assert = std.debug.assert;
|
||||
|
||||
var pgtable_buffer: struct {
|
||||
buffer: [*][mem.PAGE_SIZE]u8,
|
||||
size: usize,
|
||||
used_pages: usize,
|
||||
} = undefined;
|
||||
|
||||
fn allocPgtablePage() error.OutOfMemory![4096]u8 {
|
||||
// if (used + mem.PAGE_SIZE > size) {
|
||||
// early_serial_console.dprint("Out of page table memory!\n", .{});
|
||||
// return error.OutOfMemory;
|
||||
// }
|
||||
// const page = buffer + used;
|
||||
// return page;
|
||||
}
|
||||
// fn pgdIdentInit() {
|
||||
|
||||
// }
|
||||
|
||||
// fn pudIdentInit() {
|
||||
|
||||
// }
|
||||
|
||||
fn kernelAddIdentityMap(pgdt_page: [*]mem.PGDEntry, start: u64, end: u64) void {
|
||||
assert(start % mem.PMD_SIZE == 0);
|
||||
assert(end % mem.PMD_SIZE == 0);
|
||||
var address = start;
|
||||
while (address < end) {
|
||||
// var pgd = &pgdt_page[mem.PGDEntry.getIndex(address)];
|
||||
// if ()
|
||||
address += mem.PMD_SIZE;
|
||||
}
|
||||
}
|
||||
export fn initializeIdentMap() void {
|
||||
// var pgd_table = processor.readCr3();
|
||||
// if (pgdtable == _pgtable) {
|
||||
|
||||
// }
|
||||
}
|
||||
fn printPF(msg: []const u8, errorCode: u64, faultAddress: u64, ip: u64) void {
|
||||
early_serial_console.dprint(
|
||||
\\{s}:
|
||||
\\error code: 0x{x}
|
||||
\\fault address: 0x{x}
|
||||
\\instruction pointer: 0x{x}
|
||||
\\
|
||||
, .{msg, errorCode, faultAddress, ip});
|
||||
}
|
||||
export fn doBootPageFault(regs: processor.PtRegs, errorCode: u64) void {
|
||||
const faultAddress = processor.readCr2();
|
||||
if (errorCode & (PFType.PROT | PFType.USER | PFType.RSVD) == 0) {
|
||||
printPF("Unexpected page fault", errorCode, faultAddress, regs.ip);
|
||||
}
|
||||
const address = faultAddress & mem.PMD_MASK;
|
||||
kernelAddIdentityMap(address, address + mem.PMD_SIZE);
|
||||
}
|
||||
Reference in New Issue
Block a user