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:
parent
6ea8fe1a27
commit
be8d6015ff
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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!");
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user