summaryrefslogtreecommitdiff
path: root/Kernel/Prekernel
diff options
context:
space:
mode:
authorTim Schumacher <timschumi@gmx.de>2023-04-28 17:27:24 +0200
committerJelle Raaijmakers <jelle@gmta.nl>2023-04-28 23:24:19 +0200
commit9ab598af4984c0590358123af630e0e65e310b72 (patch)
treea639e1f19e8da87bd42bbe151d9e954dd98e194b /Kernel/Prekernel
parenta8d08357c9e9eaa6f23a0179a26b8bf0cf52fc02 (diff)
downloadserenity-9ab598af4984c0590358123af630e0e65e310b72.zip
Revert "Kernel/x86: Bake the Prekernel and the Kernel into one image"
Some hardware/software configurations crash KVM as soon as we try to start Serenity. The exact cause is currently unknown, so just fully revert it for now. This reverts commit 897c4e5145474d55b247a4a3b5e6bf5420279e2f.
Diffstat (limited to 'Kernel/Prekernel')
-rw-r--r--Kernel/Prekernel/CMakeLists.txt22
-rw-r--r--Kernel/Prekernel/Prekernel.h5
-rw-r--r--Kernel/Prekernel/init.cpp27
-rw-r--r--Kernel/Prekernel/linker.ld9
4 files changed, 17 insertions, 46 deletions
diff --git a/Kernel/Prekernel/CMakeLists.txt b/Kernel/Prekernel/CMakeLists.txt
index a007bb9376..f554ce4820 100644
--- a/Kernel/Prekernel/CMakeLists.txt
+++ b/Kernel/Prekernel/CMakeLists.txt
@@ -8,21 +8,14 @@ set(SOURCES
)
if ("${SERENITY_ARCH}" STREQUAL "x86_64")
- set(PREKERNEL_TARGET kernel_x86-64)
+ set(PREKERNEL_TARGET Prekernel64)
elseif("${SERENITY_ARCH}" STREQUAL "aarch64")
message(SEND_ERROR "Prekernel is not needed on aarch64 and should not be compiled!")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
-add_library(KernelObject OBJECT IMPORTED)
-
-set_property(TARGET KernelObject PROPERTY
- IMPORTED_OBJECTS ${CMAKE_CURRENT_BINARY_DIR}/../Kernel.o
-)
-
-add_executable(${PREKERNEL_TARGET} ${SOURCES} $<TARGET_OBJECTS:KernelObject>)
-add_dependencies(${PREKERNEL_TARGET} Kernel)
+add_executable(${PREKERNEL_TARGET} ${SOURCES})
target_compile_options(${PREKERNEL_TARGET} PRIVATE -no-pie -fno-pic -fno-threadsafe-statics)
target_link_options(${PREKERNEL_TARGET} PRIVATE LINKER:-T ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld -nostdlib LINKER:--no-pie)
@@ -34,20 +27,13 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang$")
target_link_libraries(${PREKERNEL_TARGET} PRIVATE clang_rt.builtins)
endif()
-if ("${SERENITY_ARCH}" STREQUAL "x86_64")
- set(ELF_OBJCOPY_TARGET "elf32-i386")
-elseif("${SERENITY_ARCH}" STREQUAL "aarch64")
- message(SEND_ERROR "Prekernel is not needed on aarch64 and should not be compiled!")
-endif()
-
-
add_custom_command(
TARGET ${PREKERNEL_TARGET} POST_BUILD
- COMMAND ${CMAKE_OBJCOPY} -O ${ELF_OBJCOPY_TARGET} ${CMAKE_CURRENT_BINARY_DIR}/${PREKERNEL_TARGET} ${CMAKE_CURRENT_BINARY_DIR}/../Kernel
+ COMMAND ${CMAKE_OBJCOPY} -O elf32-i386 ${CMAKE_CURRENT_BINARY_DIR}/${PREKERNEL_TARGET} ${CMAKE_CURRENT_BINARY_DIR}/Prekernel
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/Prekernel
)
-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/../Kernel" DESTINATION boot)
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Prekernel" DESTINATION boot)
# Remove options which the Prekernel environment doesn't support.
get_target_property(PREKERNEL_TARGET_OPTIONS ${PREKERNEL_TARGET} COMPILE_OPTIONS)
diff --git a/Kernel/Prekernel/Prekernel.h b/Kernel/Prekernel/Prekernel.h
index 65e876ad83..7c0176fc12 100644
--- a/Kernel/Prekernel/Prekernel.h
+++ b/Kernel/Prekernel/Prekernel.h
@@ -41,11 +41,8 @@ struct [[gnu::packed]] BootInfo {
u32 multiboot_flags;
u64 multiboot_memory_map;
u32 multiboot_memory_map_count;
- u64 multiboot_modules_physical_ptr;
+ u64 multiboot_modules;
u32 multiboot_modules_count;
- u32 multiboot_module_ramdisk_physical_start;
- u32 multiboot_module_ramdisk_physical_end;
- u32 multiboot_module_ramdisk_physical_string_addr;
u64 multiboot_framebuffer_addr;
u32 multiboot_framebuffer_pitch;
u32 multiboot_framebuffer_width;
diff --git a/Kernel/Prekernel/init.cpp b/Kernel/Prekernel/init.cpp
index 53ff0c94fb..b892b75647 100644
--- a/Kernel/Prekernel/init.cpp
+++ b/Kernel/Prekernel/init.cpp
@@ -27,9 +27,6 @@ extern "C" [[noreturn]] void __stack_chk_fail();
extern "C" u8 start_of_prekernel_image[];
extern "C" u8 end_of_prekernel_image[];
-extern "C" u8 _binary_Kernel_standalone_start[];
-extern "C" u8 end_of_prekernel_image_after_kernel_image[];
-
extern "C" u8 gdt64ptr[];
extern "C" u16 code64_sel;
extern "C" u64 boot_pml4t[512];
@@ -79,7 +76,12 @@ u64 generate_secure_seed();
extern "C" [[noreturn]] void init()
{
- u8* kernel_image = _binary_Kernel_standalone_start;
+ if (multiboot_info_ptr->mods_count < 1)
+ halt();
+
+ multiboot_module_entry_t* kernel_module = (multiboot_module_entry_t*)(FlatPtr)multiboot_info_ptr->mods_addr;
+
+ u8* kernel_image = (u8*)(FlatPtr)kernel_module->start;
// copy the ELF header and program headers because we might end up overwriting them
ElfW(Ehdr) kernel_elf_header = *(ElfW(Ehdr)*)kernel_image;
ElfW(Phdr) kernel_program_headers[16];
@@ -87,8 +89,8 @@ extern "C" [[noreturn]] void init()
halt();
__builtin_memcpy(kernel_program_headers, kernel_image + kernel_elf_header.e_phoff, sizeof(ElfW(Phdr)) * kernel_elf_header.e_phnum);
- FlatPtr kernel_physical_base = (FlatPtr)kernel_image;
- FlatPtr default_kernel_load_base = KERNEL_MAPPING_BASE + kernel_physical_base;
+ FlatPtr kernel_physical_base = 0x200000;
+ FlatPtr default_kernel_load_base = KERNEL_MAPPING_BASE + 0x200000;
FlatPtr kernel_load_base = default_kernel_load_base;
@@ -166,6 +168,9 @@ extern "C" [[noreturn]] void init()
__builtin_memset((u8*)kernel_load_base + kernel_program_header.p_vaddr + kernel_program_header.p_filesz, 0, kernel_program_header.p_memsz - kernel_program_header.p_filesz);
}
+ multiboot_info_ptr->mods_count--;
+ multiboot_info_ptr->mods_addr += sizeof(multiboot_module_entry_t);
+
auto adjust_by_mapping_base = [kernel_mapping_base](auto ptr) {
return (decltype(ptr))((FlatPtr)ptr + kernel_mapping_base);
};
@@ -189,16 +194,8 @@ extern "C" [[noreturn]] void init()
info.multiboot_flags = multiboot_info_ptr->flags;
info.multiboot_memory_map = adjust_by_mapping_base((FlatPtr)multiboot_info_ptr->mmap_addr);
info.multiboot_memory_map_count = multiboot_info_ptr->mmap_length / sizeof(multiboot_memory_map_t);
- info.multiboot_modules_physical_ptr = (FlatPtr)multiboot_info_ptr->mods_addr;
+ info.multiboot_modules = adjust_by_mapping_base((FlatPtr)multiboot_info_ptr->mods_addr);
info.multiboot_modules_count = multiboot_info_ptr->mods_count;
-
- if (info.multiboot_modules_count > 0) {
- auto* entry = reinterpret_cast<multiboot_module_entry*>(multiboot_info_ptr->mods_addr);
- info.multiboot_module_ramdisk_physical_start = entry->start;
- info.multiboot_module_ramdisk_physical_end = entry->end;
- info.multiboot_module_ramdisk_physical_string_addr = entry->string_addr;
- }
-
if ((multiboot_info_ptr->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO) != 0) {
info.multiboot_framebuffer_addr = multiboot_info_ptr->framebuffer_addr;
info.multiboot_framebuffer_pitch = multiboot_info_ptr->framebuffer_pitch;
diff --git a/Kernel/Prekernel/linker.ld b/Kernel/Prekernel/linker.ld
index 32cf31436e..1204520540 100644
--- a/Kernel/Prekernel/linker.ld
+++ b/Kernel/Prekernel/linker.ld
@@ -44,13 +44,4 @@ SECTIONS
} :bss
end_of_prekernel_image = .;
-
- .Kernel_image ALIGN(4K) : AT (ADDR(.Kernel_image))
- {
- _binary_Kernel_standalone_start = .;
- KEEP(*(.Kernel_image))
- }
-
- end_of_prekernel_image_after_kernel_image = .;
-
}