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;
|
break;
|
||||||
case MBOOT2_MMAP:
|
case MBOOT2_MMAP:
|
||||||
mmap = kernel_boot_data.mmap = (void *)tag->data;
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
debug_warning("Unknown multiboot tag type:%d \n", tag->type);
|
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)
|
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 *mmap = kernel_boot_data.mmap;
|
||||||
struct mmap_entry *entry = mmap->entries;
|
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;
|
*type = entry->type;
|
||||||
return 0;
|
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);
|
multiboot_init(MAGIC, tags);
|
||||||
|
|
||||||
ASSERT_EQ_INT(kernel_boot_data.mmap_size, 1);
|
ASSERT_EQ_INT(kernel_boot_data.mmap_len, 1);
|
||||||
free(tags);
|
free(tags);
|
||||||
}
|
}
|
||||||
void setup_memory_areas()
|
void setup_memory_areas()
|
||||||
@ -179,7 +179,7 @@ void setup_memory_areas()
|
|||||||
TEST(reads_multiple_mmap_tags)
|
TEST(reads_multiple_mmap_tags)
|
||||||
{
|
{
|
||||||
setup_memory_areas();
|
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)
|
TEST(returns_memory_area_start)
|
||||||
{
|
{
|
||||||
|
@ -7,6 +7,7 @@ struct kernel_boot_data_st
|
|||||||
char *bootloader;
|
char *bootloader;
|
||||||
char *commandline;
|
char *commandline;
|
||||||
size_t mmap_size;
|
size_t mmap_size;
|
||||||
|
unsigned int mmap_len;
|
||||||
void *mmap;
|
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_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_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))
|
if(p >= V2P(&kernel_start) && p < V2P(&kernel_end))
|
||||||
continue;
|
continue;
|
||||||
|
if(multiboot_page_used(p))
|
||||||
|
continue;
|
||||||
|
|
||||||
uint64_t addr = (uint64_t)P2V(p);
|
uint64_t addr = (uint64_t)P2V(p);
|
||||||
uint64_t page = vmm_get_page(kernel_P4, addr);
|
uint64_t page = vmm_get_page(kernel_P4, addr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user