Don't put multiboot data in page stack
This commit is contained in:
parent
36c517dd82
commit
df0df93da7
@ -50,7 +50,8 @@ int parse_multiboot2(struct taglist *tags)
|
||||
break;
|
||||
case MBOOT2_MMAP:
|
||||
mmap = kernel_boot_data.mmap = (void *)tag->data;
|
||||
kernel_boot_data.mmap_size = (tag->size - 8)/mmap->entry_size;
|
||||
kernel_boot_data.mmap_len = (tag->size - 8)/mmap->entry_size;
|
||||
kernel_boot_data.mmap_size = (tag->size - 8);
|
||||
break;
|
||||
default:
|
||||
debug_warning("Unknown multiboot tag type:%d \n", tag->type);
|
||||
@ -76,7 +77,7 @@ int multiboot_init(uint64_t magic, void *mboot_info)
|
||||
|
||||
int multiboot_get_memory_area(size_t count, uintptr_t *start, uintptr_t *end, uint32_t *type)
|
||||
{
|
||||
if(count >= kernel_boot_data.mmap_size) return 1;
|
||||
if(count >= kernel_boot_data.mmap_len) return 1;
|
||||
|
||||
struct mmap *mmap = kernel_boot_data.mmap;
|
||||
struct mmap_entry *entry = mmap->entries;
|
||||
@ -87,3 +88,16 @@ int multiboot_get_memory_area(size_t count, uintptr_t *start, uintptr_t *end, ui
|
||||
*type = entry->type;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int multiboot_page_used(uintptr_t start)
|
||||
{
|
||||
#define overlap(st, len) ((uintptr_t)st < (start + PAGE_SIZE) && start <= ((uintptr_t)st + len))
|
||||
if(
|
||||
overlap(kernel_boot_data.bootloader, strlen(kernel_boot_data.bootloader)) ||
|
||||
overlap(kernel_boot_data.commandline, strlen(kernel_boot_data.commandline)) ||
|
||||
overlap(kernel_boot_data.mmap, kernel_boot_data.mmap_size) ||
|
||||
0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -161,7 +161,7 @@ TEST(reads_mmap_tag)
|
||||
);
|
||||
multiboot_init(MAGIC, tags);
|
||||
|
||||
ASSERT_EQ_INT(kernel_boot_data.mmap_size, 1);
|
||||
ASSERT_EQ_INT(kernel_boot_data.mmap_len, 1);
|
||||
free(tags);
|
||||
}
|
||||
void setup_memory_areas()
|
||||
@ -179,7 +179,7 @@ void setup_memory_areas()
|
||||
TEST(reads_multiple_mmap_tags)
|
||||
{
|
||||
setup_memory_areas();
|
||||
ASSERT_EQ_INT(kernel_boot_data.mmap_size, 2);
|
||||
ASSERT_EQ_INT(kernel_boot_data.mmap_len, 2);
|
||||
}
|
||||
TEST(returns_memory_area_start)
|
||||
{
|
||||
|
@ -7,6 +7,7 @@ struct kernel_boot_data_st
|
||||
char *bootloader;
|
||||
char *commandline;
|
||||
size_t mmap_size;
|
||||
unsigned int mmap_len;
|
||||
void *mmap;
|
||||
};
|
||||
|
||||
@ -16,3 +17,4 @@ extern struct kernel_boot_data_st kernel_boot_data;
|
||||
|
||||
int multiboot_init(uint64_t magic, void *mboot_info);
|
||||
int multiboot_get_memory_area(size_t count, uintptr_t *start, uintptr_t *end, uint32_t *type);
|
||||
int multiboot_page_used(uintptr_t start);
|
||||
|
@ -17,6 +17,8 @@ void memory_init()
|
||||
{
|
||||
if(p >= V2P(&kernel_start) && p < V2P(&kernel_end))
|
||||
continue;
|
||||
if(multiboot_page_used(p))
|
||||
continue;
|
||||
|
||||
uint64_t addr = (uint64_t)P2V(p);
|
||||
uint64_t page = vmm_get_page(kernel_P4, addr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user