From be8d6015ff249e45f0c489fafda5da762488fa08 Mon Sep 17 00:00:00 2001 From: josh Date: Tue, 30 Jun 2009 21:29:44 +0000 Subject: [PATCH] Added mm_record_mmap_entry() and calls to it in k_bootstrap(). git-svn-id: svn://anubis/hos/trunk@26 5b3e749e-e535-0410-8002-a9bb6afbdfca --- kernel/boot/k_bootstrap.c | 16 ++++++++++++++++ kernel/include/hos_defines.h | 4 +++- kernel/include/multiboot.h | 2 ++ kernel/mm/mm.c | 26 ++++++++++++++++++++++++++ kernel/mm/mm.h | 9 +++++++++ 5 files changed, 56 insertions(+), 1 deletion(-) diff --git a/kernel/boot/k_bootstrap.c b/kernel/boot/k_bootstrap.c index 08ac117..8848732 100644 --- a/kernel/boot/k_bootstrap.c +++ b/kernel/boot/k_bootstrap.c @@ -3,6 +3,7 @@ #include "hos_defines.h" #include "multiboot.h" #include "k_early_panic.h" +#include "mm/mm.h" #define DEBUG_LETTER(col,chr) *(u16_t *)(CONSOLE_MEMORY + 160 * 8 + (col) * 2) \ = 0x0700 | (chr) @@ -20,6 +21,21 @@ u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic) k_early_panic("Bad multiboot magic identifier!"); } + if ( ! (mb_info->flags & MB_BOOTLOADER_MMAP) ) + { + k_early_panic("No memory map provided by bootloader!"); + } + + mb_mmap_t * mmap = (mb_mmap_t *) (mb_info->mmap_addr + HOS_KERNEL_OFFSET - 4); + { + int sz; + for (sz = 0; sz < mb_info->mmap_length; sz += mmap->size + 4) + { + mm_record_mmap_entry(mmap); + mmap = (mb_mmap_t *) (((u32_t)mmap) + mmap->size + 4); + } + } + DEBUG_LETTER(3, 'd'); return 0; diff --git a/kernel/include/hos_defines.h b/kernel/include/hos_defines.h index cd96969..dbbfd83 100644 --- a/kernel/include/hos_defines.h +++ b/kernel/include/hos_defines.h @@ -2,11 +2,13 @@ #ifndef HOS_DEFINES_H #define HOS_DEFINES_H +#define HOS_KERNEL_OFFSET 0xE0000000 + #define PAGE_LOG_SIZE 12 #define PAGE_SIZE (1 << PAGE_LOG_SIZE) #define PAGE_HIGH_MASK (0xFFFFFFFFu << PAGE_LOG_SIZE) #define PAGE_LOW_MASK (0xFFFFFFFFu >> (32 - PAGE_LOG_SIZE)) -#define CONSOLE_MEMORY 0xE00B8000 +#define CONSOLE_MEMORY (HOS_KERNEL_OFFSET + 0xB8000) #endif diff --git a/kernel/include/multiboot.h b/kernel/include/multiboot.h index 90c936c..2f0145d 100644 --- a/kernel/include/multiboot.h +++ b/kernel/include/multiboot.h @@ -30,6 +30,8 @@ #define MB_DRIVE_MODE_CHS 0 #define MB_DRIVE_MODE_LBA 1 +#define MB_MMAP_TYPE_RAM 1 + /* The Multiboot header. */ typedef struct { diff --git a/kernel/mm/mm.c b/kernel/mm/mm.c index 30000c5..3f02ccb 100644 --- a/kernel/mm/mm.c +++ b/kernel/mm/mm.c @@ -1,4 +1,30 @@ #include "mm.h" +#include "boot/k_early_panic.h" + +#define MM_MAX_MMAP_ENTRIES 64 pagedirectory_t page_directory __attribute__ ((aligned (4096))); + +static mm_mem_range_t mm_mmap_entries[MM_MAX_MMAP_ENTRIES]; +static int mm_mmap_num_entries = 0; + +/************************************************************************** + * This function is run in segmented memory before paging is in effect. * + *************************************************************************/ +void mm_record_mmap_entry(mb_mmap_t * mmap) +{ + if (mm_mmap_num_entries < MM_MAX_MMAP_ENTRIES) + { + if (mmap->type == MB_MMAP_TYPE_RAM) + { + mm_mmap_entries[mm_mmap_num_entries].base = mmap->base; + mm_mmap_entries[mm_mmap_num_entries].length = mmap->length; + mm_mmap_num_entries++; + } + } + else + { + k_early_panic("Too many mmap_entries!"); + } +} diff --git a/kernel/mm/mm.h b/kernel/mm/mm.h index 43420ba..df38d94 100644 --- a/kernel/mm/mm.h +++ b/kernel/mm/mm.h @@ -4,6 +4,7 @@ #include "hos_types.h" #include "hos_defines.h" +#include "multiboot.h" typedef u32_t pagedirectory_entry_t; @@ -12,5 +13,13 @@ typedef pagedirectory_entry_t extern pagedirectory_t page_directory; +typedef struct +{ + u64_t base; + u64_t length; +} mm_mem_range_t; + +void mm_record_mmap_entry(mb_mmap_t * mmap); + #endif