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
This commit is contained in:
josh 2009-06-30 21:29:44 +00:00
parent 6ea8fe1a27
commit be8d6015ff
5 changed files with 56 additions and 1 deletions

View File

@ -3,6 +3,7 @@
#include "hos_defines.h" #include "hos_defines.h"
#include "multiboot.h" #include "multiboot.h"
#include "k_early_panic.h" #include "k_early_panic.h"
#include "mm/mm.h"
#define DEBUG_LETTER(col,chr) *(u16_t *)(CONSOLE_MEMORY + 160 * 8 + (col) * 2) \ #define DEBUG_LETTER(col,chr) *(u16_t *)(CONSOLE_MEMORY + 160 * 8 + (col) * 2) \
= 0x0700 | (chr) = 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!"); 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'); DEBUG_LETTER(3, 'd');
return 0; return 0;

View File

@ -2,11 +2,13 @@
#ifndef HOS_DEFINES_H #ifndef HOS_DEFINES_H
#define HOS_DEFINES_H #define HOS_DEFINES_H
#define HOS_KERNEL_OFFSET 0xE0000000
#define PAGE_LOG_SIZE 12 #define PAGE_LOG_SIZE 12
#define PAGE_SIZE (1 << PAGE_LOG_SIZE) #define PAGE_SIZE (1 << PAGE_LOG_SIZE)
#define PAGE_HIGH_MASK (0xFFFFFFFFu << PAGE_LOG_SIZE) #define PAGE_HIGH_MASK (0xFFFFFFFFu << PAGE_LOG_SIZE)
#define PAGE_LOW_MASK (0xFFFFFFFFu >> (32 - PAGE_LOG_SIZE)) #define PAGE_LOW_MASK (0xFFFFFFFFu >> (32 - PAGE_LOG_SIZE))
#define CONSOLE_MEMORY 0xE00B8000 #define CONSOLE_MEMORY (HOS_KERNEL_OFFSET + 0xB8000)
#endif #endif

View File

@ -30,6 +30,8 @@
#define MB_DRIVE_MODE_CHS 0 #define MB_DRIVE_MODE_CHS 0
#define MB_DRIVE_MODE_LBA 1 #define MB_DRIVE_MODE_LBA 1
#define MB_MMAP_TYPE_RAM 1
/* The Multiboot header. */ /* The Multiboot header. */
typedef struct typedef struct
{ {

View File

@ -1,4 +1,30 @@
#include "mm.h" #include "mm.h"
#include "boot/k_early_panic.h"
#define MM_MAX_MMAP_ENTRIES 64
pagedirectory_t page_directory __attribute__ ((aligned (4096))); 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!");
}
}

View File

@ -4,6 +4,7 @@
#include "hos_types.h" #include "hos_types.h"
#include "hos_defines.h" #include "hos_defines.h"
#include "multiboot.h"
typedef u32_t pagedirectory_entry_t; typedef u32_t pagedirectory_entry_t;
@ -12,5 +13,13 @@ typedef pagedirectory_entry_t
extern pagedirectory_t page_directory; 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 #endif