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