summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Kernel/Boot/boot.S6
-rw-r--r--Kernel/Multiboot.h97
-rw-r--r--Kernel/Process.cpp28
-rw-r--r--Kernel/init.cpp7
-rwxr-xr-xKernel/run5
5 files changed, 115 insertions, 28 deletions
diff --git a/Kernel/Boot/boot.S b/Kernel/Boot/boot.S
index ff0c5665d3..d37bfe964b 100644
--- a/Kernel/Boot/boot.S
+++ b/Kernel/Boot/boot.S
@@ -39,8 +39,8 @@ stack_top:
.extern init
.type init, @function
-.extern multiboot_ptr
-.type multiboot_ptr, @object
+.extern multiboot_info_ptr
+.type multiboot_info_ptr, @object
start:
cli
@@ -54,7 +54,7 @@ start:
pushl %eax /* Multiboot header magic */
pushl %ebx /* Multiboot header pointer */
- mov %ebx, multiboot_ptr
+ mov %ebx, multiboot_info_ptr
call init
diff --git a/Kernel/Multiboot.h b/Kernel/Multiboot.h
new file mode 100644
index 0000000000..6f586bc395
--- /dev/null
+++ b/Kernel/Multiboot.h
@@ -0,0 +1,97 @@
+#pragma once
+
+#include <AK/Types.h>
+
+struct multiboot_aout_symbol_table {
+ dword tabsize;
+ dword strsize;
+ dword addr;
+ dword reserved;
+};
+typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t;
+
+struct multiboot_elf_section_header_table {
+ dword num;
+ dword size;
+ dword addr;
+ dword shndx;
+};
+typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t;
+
+struct multiboot_info {
+ // Multiboot info version number.
+ dword flags;
+
+ // Available memory from BIOS.
+ dword mem_lower;
+ dword mem_upper;
+
+ // "root" partition.
+ dword boot_device;
+
+ // Kernel command line.
+ dword cmdline;
+
+ // Boot-Module list.
+ dword mods_count;
+ dword mods_addr;
+
+ union {
+ multiboot_aout_symbol_table_t aout_sym;
+ multiboot_elf_section_header_table_t elf_sec;
+ } u;
+
+ // Memory Mapping buffer.
+ dword mmap_length;
+ dword mmap_addr;
+
+ // Drive Info buffer.
+ dword drives_length;
+ dword drives_addr;
+
+ // ROM configuration table.
+ dword config_table;
+
+ // Boot Loader Name.
+ dword boot_loader_name;
+
+ // APM table.
+ dword apm_table;
+
+ // Video.
+ dword vbe_control_info;
+ dword vbe_mode_info;
+ word vbe_mode;
+ word vbe_interface_seg;
+ word vbe_interface_off;
+ word vbe_interface_len;
+
+ qword framebuffer_addr;
+ dword framebuffer_pitch;
+ dword framebuffer_width;
+ dword framebuffer_height;
+ byte framebuffer_bpp;
+#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
+#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
+#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
+ byte framebuffer_type;
+ union {
+ struct
+ {
+ dword framebuffer_palette_addr;
+ word framebuffer_palette_num_colors;
+ };
+ struct
+ {
+ byte framebuffer_red_field_position;
+ byte framebuffer_red_mask_size;
+ byte framebuffer_green_field_position;
+ byte framebuffer_green_mask_size;
+ byte framebuffer_blue_field_position;
+ byte framebuffer_blue_mask_size;
+ };
+ };
+};
+typedef struct multiboot_info multiboot_info_t;
+
+extern "C" multiboot_info_t* multiboot_info_ptr;
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index d8d7767241..5b84737ac2 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -25,6 +25,7 @@
#include <Kernel/SharedMemory.h>
#include <Kernel/ProcessTracer.h>
#include <Kernel/FileSystem/Custody.h>
+#include <Kernel/Multiboot.h>
//#define DEBUG_POLL_SELECT
//#define DEBUG_IO
@@ -1433,33 +1434,12 @@ enum class KernelMemoryCheckResult {
AccessDenied
};
-// FIXME: Nothing about this is really super...
-// This structure is only present at offset 28 in the main multiboot info struct
-// if bit 5 of offset 0 (flags) is set. We're just assuming that the flag is set.
-//
-// Also, there's almost certainly a better way to get that information here than
-// a global set by boot.S
-//
-// Also I'm not 100% sure any of this is correct...
-
-struct mb_elf {
- uint32_t num;
- uint32_t size;
- uint32_t addr;
- uint32_t shndx;
-};
-
-extern "C" {
-void* multiboot_ptr;
-}
-
static KernelMemoryCheckResult check_kernel_memory_access(LinearAddress laddr, bool is_write)
{
- // FIXME: It would be better to have a proper structure for this...
- auto* sections = (const mb_elf*)((const byte*)multiboot_ptr + 28);
+ auto& sections = multiboot_info_ptr->u.elf_sec;
- auto* kernel_program_headers = (Elf32_Phdr*)(sections->addr);
- for (unsigned i = 0; i < sections->num; ++i) {
+ auto* kernel_program_headers = (Elf32_Phdr*)(sections.addr);
+ for (unsigned i = 0; i < sections.num; ++i) {
auto& segment = kernel_program_headers[i];
if (segment.p_type != PT_LOAD || !segment.p_vaddr || !segment.p_memsz)
continue;
diff --git a/Kernel/init.cpp b/Kernel/init.cpp
index 32f7a2c00a..5f9e0c3f06 100644
--- a/Kernel/init.cpp
+++ b/Kernel/init.cpp
@@ -25,6 +25,7 @@
#include <Kernel/Net/E1000NetworkAdapter.h>
#include <Kernel/Net/NetworkTask.h>
#include <Kernel/Devices/DebugLogDevice.h>
+#include <Kernel/Multiboot.h>
//#define STRESS_TEST_SPAWNING
@@ -94,9 +95,13 @@ VFS* vfs;
ASSERT_NOT_REACHED();
}
+extern "C" {
+multiboot_info_t* multiboot_info_ptr;
+}
+
extern "C" [[noreturn]] void init()
{
- cli();
+ kprintf("Kernel command line: '%s'\n", multiboot_info_ptr->cmdline);
sse_init();
diff --git a/Kernel/run b/Kernel/run
index 199b818919..ef3cec9d7b 100755
--- a/Kernel/run
+++ b/Kernel/run
@@ -2,6 +2,8 @@
[ -z "$SERENITY_QEMU_BIN" ] && SERENITY_QEMU_BIN="qemu-system-i386"
+SERENITY_KERNEL_CMDLINE="hello"
+
export SDL_VIDEO_X11_DGAMOUSE=0
ram_size=128
@@ -17,6 +19,7 @@ elif [ "$1" = "qn" ]; then
-debugcon stdio \
-device e1000 \
-kernel kernel \
+ -append ${SERENITY_KERNEL_CMDLINE} \
-hda _fs_contents \
-soundhw pcspk
elif [ "$1" = "qtap" ]; then
@@ -30,6 +33,7 @@ elif [ "$1" = "qtap" ]; then
-netdev tap,ifname=tap0,id=br0 \
-device e1000,netdev=br0 \
-kernel kernel \
+ -append ${SERENITY_KERNEL_CMDLINE} \
-hda _fs_contents \
-soundhw pcspk
else
@@ -43,6 +47,7 @@ else
-netdev user,id=breh,hostfwd=tcp:127.0.0.1:8888-192.168.5.2:8888 \
-device e1000,netdev=breh \
-kernel kernel \
+ -append ${SERENITY_KERNEL_CMDLINE} \
-hda _fs_contents \
-soundhw pcspk
fi