diff --git a/config/default.json b/config/default.json index e0d3c46..b263f83 100644 --- a/config/default.json +++ b/config/default.json @@ -1,7 +1,7 @@ { "architecture": "x86_64", "bootloader": "birth", - "boot_protocol": "bios", + "boot_protocol": "uefi", "execution_environment": "qemu", "optimize_mode": "Debug", "execution_type": "emulated", diff --git a/src/cpu/arch/x86/64/init.zig b/src/cpu/arch/x86/64/init.zig index 6d32be7..7e97e8f 100644 --- a/src/cpu/arch/x86/64/init.zig +++ b/src/cpu/arch/x86/64/init.zig @@ -779,13 +779,14 @@ pub fn setupMapping(scheduler: *cpu.UserScheduler, user_virtual_region: VirtualM const scheduler_memory_map_flags = .{ .write = true, .user = true, + .huge_pages = false, }; - try map(user_address_space, regions.scheduler.virtual, regions.scheduler.physical, regions.scheduler.size, scheduler_memory_map_flags); - try map(user_address_space, regions.heap.virtual, regions.heap.physical, regions.heap.size, scheduler_memory_map_flags); for (init_file.segments) |segment| { try map(user_address_space, segment.virtual, segment.physical, segment.memory_size, segment.flags); } + try map(user_address_space, regions.scheduler.virtual, regions.scheduler.physical, regions.scheduler.size, scheduler_memory_map_flags); + try map(user_address_space, regions.heap.virtual, regions.heap.physical, regions.heap.size, scheduler_memory_map_flags); // Map protected stack const privileged_stack_physical_region = try cpu.page_allocator.allocate(x86_64.capability_address_space_stack_size, .{ .reason = .user_protected }); @@ -793,6 +794,7 @@ pub fn setupMapping(scheduler: *cpu.UserScheduler, user_virtual_region: VirtualM .write = true, .execute = false, .user = false, + .huge_pages = false, }); const cpu_pml4 = try privileged_address_space.getPML4TableUnchecked(); diff --git a/src/cpu/init.zig b/src/cpu/init.zig index 2f08c80..5e3d1ab 100644 --- a/src/cpu/init.zig +++ b/src/cpu/init.zig @@ -266,6 +266,7 @@ fn spawnInitCommon(init_file: []const u8, cpu_page_tables: paging.CPUPageTables) .execute = program_header.flags.executable, .write = program_header.flags.writable, .user = true, + .huge_pages = false, }, .file_offset = program_header.offset, .file_size = program_header.size_in_file, diff --git a/src/privileged.zig b/src/privileged.zig index dfccc9d..544dc12 100644 --- a/src/privileged.zig +++ b/src/privileged.zig @@ -65,7 +65,8 @@ pub const Mapping = extern struct { execute: bool = false, user: bool = false, secret: bool = false, - reserved: u26 = 0, + huge_pages: bool = true, + reserved: u25 = 0, pub inline fn empty() Flags { return .{}; diff --git a/src/privileged/arch/x86/64/paging.zig b/src/privileged/arch/x86/64/paging.zig index 07b6283..6fa80ed 100644 --- a/src/privileged/arch/x86/64/paging.zig +++ b/src/privileged/arch/x86/64/paging.zig @@ -203,7 +203,7 @@ pub const Specific = extern struct { if (size >= reverse_page_size) { const is_smallest_page_size = reverse_page_index == reverse_valid_page_sizes.len - 1; - if (is_smallest_page_size) { + if (is_smallest_page_size or !general_flags.huge_pages) { var virtual_address = asked_virtual_address.value(); var physical_address = asked_physical_address.value();