aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/include/arch/boot/multiboot.hpp160
-rw-r--r--arch/x86_64/include/arch/memory/multiboot.hpp174
-rw-r--r--arch/x86_64/src/kernel/main.cpp33
3 files changed, 193 insertions, 174 deletions
diff --git a/arch/x86_64/include/arch/boot/multiboot.hpp b/arch/x86_64/include/arch/boot/multiboot.hpp
deleted file mode 100644
index d3787f2..0000000
--- a/arch/x86_64/include/arch/boot/multiboot.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-#include <cstdint>
-
-struct multiboot_tag
-{
- uint32_t type;
- uint32_t size;
-};
-
-struct basic_memory_info
-{
- uint32_t type;
- uint32_t size;
- uint32_t mem_lower;
- uint32_t mem_upper;
-};
-
-struct multiboot_info
-{
- uint32_t total_size;
- uint32_t reserved;
- /*
- * field "tags" is an array of multiboot_tag, however the array is never
- * being accessed by index we don't know the real size at compile-time,
- * and using an array definition with size 0 produces a compiler error.
- */
- struct multiboot_tag tags;
-};
-
-struct memory_map_entry
-{
- uint64_t base_addr;
- uint64_t length;
-#define MULTIBOOT_MEMORY_AVAILABLE 1
-#define MULTIBOOT_MEMORY_RESERVED 2
-#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
-#define MULTIBOOT_MEMORY_NVS 4
-#define MULTIBOOT_MEMORY_BADRAM 5
- uint32_t type;
- uint32_t reserved;
-};
-
-struct memory_map_info
-{
- multiboot_tag tag;
- uint32_t entry_size;
- uint32_t entry_version;
- /*
- * field "entries" is an array of memory_map_entry, however the array is never
- * being accessed by index, we don't know the real size at compile-time,
- * and using an array definition with size 0 produces a compiler error.
- */
- struct memory_map_entry entries;
-};
-
-#define EI_NIDENT 16
-
-/* ELF standard typedefs (yet more proof that <stdint.h> was way overdue) */
-typedef uint16_t Elf64_Half;
-typedef int16_t Elf64_SHalf;
-typedef uint32_t Elf64_Word;
-typedef int32_t Elf64_Sword;
-typedef uint64_t Elf64_Xword;
-typedef int64_t Elf64_Sxword;
-
-typedef uint64_t Elf64_Off;
-typedef uint64_t Elf64_Addr;
-typedef uint16_t Elf64_Section;
-
-struct executable_header
-{
- unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
- Elf64_Half e_type; /* Object file type */
- Elf64_Half e_machine; /* Architecture */
- Elf64_Word e_version; /* Object file version */
- Elf64_Addr e_entry; /* Entry point virtual address */
- Elf64_Off e_phoff; /* Program header table file offset */
- Elf64_Off e_shoff; /* Section header table file offset */
- Elf64_Word e_flags; /* Processor-specific flags */
- Elf64_Half e_ehsize; /* ELF header size in bytes */
- Elf64_Half e_phentsize; /* Program header table entry size */
- Elf64_Half e_phnum; /* Program header table entry count */
- Elf64_Half e_shentsize; /* Section header table entry size */
- Elf64_Half e_shnum; /* Section header table entry count */
- Elf64_Half e_shstrndx; /* Section header string table index */
-};
-
-struct program_header
-{
- Elf64_Word p_type; /* Segment type */
- Elf64_Word p_flags; /* Segment flags */
- Elf64_Off p_offset; /* Segment file offset */
- Elf64_Addr p_vaddr; /* Segment virtual address */
- Elf64_Addr p_paddr; /* Segment physical address */
- Elf64_Xword p_filesz; /* Segment size in file */
- Elf64_Xword p_memsz; /* Segment size in memory */
- Elf64_Xword p_align; /* Segment alignment */
-};
-
-struct elf_section_header
-{
- Elf64_Word sh_name; /* Section name (string tbl index) */
- Elf64_Word sh_type; /* Section type */
- Elf64_Xword sh_flags; /* Section flags */
- Elf64_Addr sh_addr; /* Section virtual addr at execution */
- Elf64_Off sh_offset; /* Section file offset */
- Elf64_Xword sh_size; /* Section size in bytes */
- Elf64_Word sh_link; /* Link to another section */
- Elf64_Word sh_info; /* Additional section information */
- Elf64_Xword sh_addralign; /* Section alignment */
- Elf64_Xword sh_entsize; /* Entry size if section holds table */
-};
-
-struct elf_symbol
-{
- Elf64_Word st_name; /* Symbol name (string tbl index) */
- unsigned char st_info; /* Symbol type and binding */
- unsigned char st_other; /* Symbol visibility */
- Elf64_Section st_shndx; /* Section index */
- Elf64_Addr st_value; /* Symbol value */
- Elf64_Xword st_size; /* Symbol size */
-};
-
-struct elf_symbols_section
-{
- multiboot_tag tag;
- uint16_t num;
- uint16_t entsize;
- uint16_t shndx;
- uint16_t reserved;
- struct elf_section_header sections;
-};
-
-/*
- * Define all multiboot tag types to ther respective values
- * The gnu boot information format is defined here:
- * https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Boot-information-format
- */
-#define MULTIBOOT_TAG_ALIGN 8
-#define MULTIBOOT_TAG_TYPE_END 0
-#define MULTIBOOT_TAG_TYPE_CMDLINE 1
-#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
-#define MULTIBOOT_TAG_TYPE_MODULE 3
-#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
-#define MULTIBOOT_TAG_TYPE_BOOTDEV 5
-#define MULTIBOOT_TAG_TYPE_MMAP 6
-#define MULTIBOOT_TAG_TYPE_VBE 7
-#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
-#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
-#define MULTIBOOT_TAG_TYPE_APM 10
-#define MULTIBOOT_TAG_TYPE_EFI32 11
-#define MULTIBOOT_TAG_TYPE_EFI64 12
-#define MULTIBOOT_TAG_TYPE_SMBIOS 13
-#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14
-#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15
-#define MULTIBOOT_TAG_TYPE_NETWORK 16
-#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17
-#define MULTIBOOT_TAG_TYPE_EFI_BS 18
-#define MULTIBOOT_TAG_TYPE_EFI32_IH 19
-#define MULTIBOOT_TAG_TYPE_EFI64_IH 20
-#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21
diff --git a/arch/x86_64/include/arch/memory/multiboot.hpp b/arch/x86_64/include/arch/memory/multiboot.hpp
new file mode 100644
index 0000000..95e6404
--- /dev/null
+++ b/arch/x86_64/include/arch/memory/multiboot.hpp
@@ -0,0 +1,174 @@
+#ifndef TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_HPP
+#define TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_HPP
+
+#include <cstdint>
+
+namespace teachos::arch::memory
+{
+ /*
+ * Define all multiboot tag types to ther respective values
+ * The gnu boot information format is defined here:
+ * https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Boot-information-format
+ */
+ enum class MultibootTagType : uint32_t
+ {
+ END,
+ CMDLINE,
+ BOOT_LOADER_NAME,
+ MODULE,
+ BASIC_MEMORY_INFO,
+ BOOTDEV,
+ MEMORY_MAP,
+ VBE,
+ FRAMEBUFFER,
+ ELF_SECTIONS,
+ APM,
+ EFI32,
+ EFI64,
+ SMBIOS,
+ ACPI_OLD,
+ ACPI_NEW,
+ NETWORK,
+ EFI_MEMORY_MAP,
+ EFI_BS,
+ EFI32_IH,
+ EFI64_IH,
+ LOAD_BASE_ADDRESS
+ };
+
+ struct MultibootTag
+ {
+ MultibootTagType type;
+ uint32_t size;
+ };
+
+ struct MemoryInfo
+ {
+ uint32_t type;
+ uint32_t size;
+ uint32_t mem_lower;
+ uint32_t mem_upper;
+ };
+
+ struct MultibootInfo
+ {
+ uint32_t total_size;
+ uint32_t reserved;
+ /*
+ * field "tags" is an array of MultibootTag, however the array is never
+ * being accessed by index we don't know the real size at compile-time,
+ * and using an array definition with size 0 produces a compiler error.
+ */
+ struct MultibootTag tags;
+ };
+
+ enum class MemoryAreaType : uint32_t
+ {
+ AVAILABLE = 1,
+ RESERVED,
+ ACPI_AVAILABLE,
+ RESERVED_HIBERNATION,
+ DEFECTIVE
+ };
+
+ struct MemoryArea
+ {
+ uint64_t base_addr;
+ uint64_t length;
+ MemoryAreaType type;
+ uint32_t reserved;
+ };
+
+ struct MemoryMap
+ {
+ MultibootTag tag;
+ uint32_t entry_size;
+ uint32_t entry_version;
+ /*
+ * field "entries" is an array of MemoryArea, however the array is never
+ * being accessed by index, we don't know the real size at compile-time,
+ * and using an array definition with size 0 produces a compiler error.
+ */
+ struct MemoryArea entries;
+ };
+
+#define EI_NIDENT 16
+
+ /* ELF standard typedefs (yet more proof that <stdint.h> was way overdue) */
+ typedef uint16_t Elf64_Half;
+ typedef int16_t Elf64_SHalf;
+ typedef uint32_t Elf64_Word;
+ typedef int32_t Elf64_Sword;
+ typedef uint64_t Elf64_Xword;
+ typedef int64_t Elf64_Sxword;
+
+ typedef uint64_t Elf64_Off;
+ typedef uint64_t Elf64_Addr;
+ typedef uint16_t Elf64_Section;
+
+ struct executable_header
+ {
+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
+ Elf64_Half e_type; /* Object file type */
+ Elf64_Half e_machine; /* Architecture */
+ Elf64_Word e_version; /* Object file version */
+ Elf64_Addr e_entry; /* Entry point virtual address */
+ Elf64_Off e_phoff; /* Program header table file offset */
+ Elf64_Off e_shoff; /* Section header table file offset */
+ Elf64_Word e_flags; /* Processor-specific flags */
+ Elf64_Half e_ehsize; /* ELF header size in bytes */
+ Elf64_Half e_phentsize; /* Program header table entry size */
+ Elf64_Half e_phnum; /* Program header table entry count */
+ Elf64_Half e_shentsize; /* Section header table entry size */
+ Elf64_Half e_shnum; /* Section header table entry count */
+ Elf64_Half e_shstrndx; /* Section header string table index */
+ };
+
+ struct program_header
+ {
+ Elf64_Word p_type; /* Segment type */
+ Elf64_Word p_flags; /* Segment flags */
+ Elf64_Off p_offset; /* Segment file offset */
+ Elf64_Addr p_vaddr; /* Segment virtual address */
+ Elf64_Addr p_paddr; /* Segment physical address */
+ Elf64_Xword p_filesz; /* Segment size in file */
+ Elf64_Xword p_memsz; /* Segment size in memory */
+ Elf64_Xword p_align; /* Segment alignment */
+ };
+
+ struct elf_section_header
+ {
+ Elf64_Word sh_name; /* Section name (string tbl index) */
+ Elf64_Word sh_type; /* Section type */
+ Elf64_Xword sh_flags; /* Section flags */
+ Elf64_Addr sh_addr; /* Section virtual addr at execution */
+ Elf64_Off sh_offset; /* Section file offset */
+ Elf64_Xword sh_size; /* Section size in bytes */
+ Elf64_Word sh_link; /* Link to another section */
+ Elf64_Word sh_info; /* Additional section information */
+ Elf64_Xword sh_addralign; /* Section alignment */
+ Elf64_Xword sh_entsize; /* Entry size if section holds table */
+ };
+
+ struct elf_symbol
+ {
+ Elf64_Word st_name; /* Symbol name (string tbl index) */
+ unsigned char st_info; /* Symbol type and binding */
+ unsigned char st_other; /* Symbol visibility */
+ Elf64_Section st_shndx; /* Section index */
+ Elf64_Addr st_value; /* Symbol value */
+ Elf64_Xword st_size; /* Symbol size */
+ };
+
+ struct elf_symbols_section
+ {
+ MultibootTag tag;
+ uint16_t num;
+ uint16_t entsize;
+ uint16_t shndx;
+ uint16_t reserved;
+ struct elf_section_header sections;
+ };
+} // namespace teachos::arch::memory
+
+#endif // TEACHOS_ARCH_X86_64_MEMORY_MULTIBOOT_HPP
diff --git a/arch/x86_64/src/kernel/main.cpp b/arch/x86_64/src/kernel/main.cpp
index da496a6..cffbfb8 100644
--- a/arch/x86_64/src/kernel/main.cpp
+++ b/arch/x86_64/src/kernel/main.cpp
@@ -1,12 +1,12 @@
#include "arch/kernel/main.hpp"
-#include "arch/boot/multiboot.hpp"
#include "arch/boot/pointers.hpp"
+#include "arch/memory/multiboot.hpp"
#include "arch/video/vga/text.hpp"
namespace teachos::arch::kernel
{
- auto print_mem_info(basic_memory_info * mem_info) -> void
+ auto print_mem_info(arch::memory::MemoryInfo * mem_info) -> void
{
using namespace video::vga;
@@ -19,7 +19,7 @@ namespace teachos::arch::kernel
text::write_number(mem_upper, text::common_attributes::green_on_black);
}
- auto print_memory_map(memory_map_info * mminfo) -> void
+ auto print_memory_map(arch::memory::MemoryMap * mminfo) -> void
{
using namespace video::vga;
@@ -45,14 +45,15 @@ namespace teachos::arch::kernel
text::write_number(entry->length, text::common_attributes::green_on_black);
text::write("Type: ", text::common_attributes::green_on_black);
- text::write_number(entry->type, text::common_attributes::green_on_black);
+ text::write_number(static_cast<std::underlying_type<arch::memory::MemoryAreaType>::type>(entry->type),
+ text::common_attributes::green_on_black);
text::write("Reserved: ", text::common_attributes::green_on_black);
text::write_number(entry->reserved, text::common_attributes::green_on_black);
}
}
- auto print_elf_sections(elf_symbols_section * symbol) -> void
+ auto print_elf_sections(arch::memory::elf_symbols_section * symbol) -> void
{
using namespace video::vga;
@@ -122,7 +123,8 @@ namespace teachos::arch::kernel
text::cursor(false);
text::write("TeachOS is starting up...", text::common_attributes::green_on_black);
- multiboot_info * multiboot_information_pointer = (multiboot_info *)arch::boot::multiboot_information_pointer;
+ arch::memory::MultibootInfo * multiboot_information_pointer =
+ (arch::memory::MultibootInfo *)arch::boot::multiboot_information_pointer;
auto multiboot_tag = &(multiboot_information_pointer->tags);
text::write("Multiboot Start: ", text::common_attributes::green_on_black);
@@ -138,19 +140,22 @@ namespace teachos::arch::kernel
*
* The increment part aligns the size to an 8-byte address.
*/
- for (auto tag = multiboot_tag; tag->type != MULTIBOOT_TAG_TYPE_END;
- tag = (struct multiboot_tag *)(((uint8_t *)tag) + ((tag->size + 7) & ~7)))
+ for (auto tag = multiboot_tag; tag->type != arch::memory::MultibootTagType::END;
+ tag = (arch::memory::MultibootTag *)(((uint8_t *)tag) + ((tag->size + 7) & ~7)))
{
switch (tag->type)
{
- case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
- print_mem_info((struct basic_memory_info *)tag);
+ case arch::memory::MultibootTagType::BASIC_MEMORY_INFO:
+ print_mem_info((arch::memory::MemoryInfo *)tag);
break;
- case MULTIBOOT_TAG_TYPE_ELF_SECTIONS:
- print_elf_sections((struct elf_symbols_section *)tag);
+ case arch::memory::MultibootTagType::ELF_SECTIONS:
+ print_elf_sections((arch::memory::elf_symbols_section *)tag);
break;
- case MULTIBOOT_TAG_TYPE_MMAP:
- print_memory_map((struct memory_map_info *)tag);
+ case arch::memory::MultibootTagType::MEMORY_MAP:
+ print_memory_map((arch::memory::MemoryMap *)tag);
+ break;
+ default:
+ // All other cases are not important and can be ignored
break;
}
}