1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-09 00:00:03 +01:00

reserve 2 page for the multiboot cmdline string

- required for long strings
This commit is contained in:
Stefan Lankes 2017-04-03 09:15:03 +02:00
parent 12733c506d
commit 78922085ac
2 changed files with 8 additions and 6 deletions

View file

@ -155,15 +155,15 @@ int __page_map(size_t viraddr, size_t phyaddr, size_t npages, size_t bits, uint8
if (!(self[lvl][vpn] & PG_PRESENT)) {
/* There's no table available which covers the region.
* Therefore we need to create a new empty table. */
size_t phyaddr = get_pages(1);
if (BUILTIN_EXPECT(!phyaddr, 0))
size_t paddr = get_pages(1);
if (BUILTIN_EXPECT(!paddr, 0))
goto out;
/* Reference the new table within its parent */
#if 0
self[lvl][vpn] = phyaddr | bits | PG_PRESENT | PG_USER | PG_RW | PG_ACCESSED;
self[lvl][vpn] = paddr | bits | PG_PRESENT | PG_USER | PG_RW | PG_ACCESSED;
#else
self[lvl][vpn] = (phyaddr | bits | PG_PRESENT | PG_USER | PG_RW | PG_ACCESSED) & ~PG_XD;
self[lvl][vpn] = (paddr | bits | PG_PRESENT | PG_USER | PG_RW | PG_ACCESSED) & ~PG_XD;
#endif
/* Fill new table with zeros */
@ -328,7 +328,8 @@ int page_init(void)
if (mb_info && ((mb_info->cmdline & PAGE_MASK) != ((size_t) mb_info & PAGE_MASK))) {
LOG_INFO("Map multiboot cmdline 0x%x into the virtual address space\n", mb_info->cmdline);
page_map((size_t) mb_info->cmdline & PAGE_MASK, mb_info->cmdline & PAGE_MASK, 1, PG_GLOBAL|PG_RW|PG_PRESENT);
// reserve 2 pages for long cmdline strings
page_map((size_t) mb_info->cmdline & PAGE_MASK, mb_info->cmdline & PAGE_MASK, 2, PG_GLOBAL|PG_RW|PG_PRESENT);
}
/* Replace default pagefault handler */

View file

@ -38,7 +38,8 @@ int vma_arch_init(void)
goto out;
if ((mb_info->cmdline & PAGE_MASK) != ((size_t) mb_info & PAGE_MASK)) {
ret = vma_add((size_t)mb_info->cmdline & PAGE_MASK, ((size_t)mb_info->cmdline & PAGE_MASK) + PAGE_SIZE, VMA_READ|VMA_WRITE);
// reserve 2 pages for long cmdline strings
ret = vma_add((size_t)mb_info->cmdline & PAGE_MASK, ((size_t)mb_info->cmdline & PAGE_MASK) + 2*PAGE_SIZE, VMA_READ|VMA_WRITE);
if (BUILTIN_EXPECT(ret, 0))
goto out;
}