diff --git a/.gitmodules b/.gitmodules index 00fb0bddb..d59cd2938 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,11 @@ path = linux url = git@github.com:RWTH-OS/linux.git branch = hermit +[submodule "hermit/newlib/pte"] + path = hermit/newlib/pte + url = git@github.com:RWTH-OS/pthread-embeded.git + branch = hermit +[submodule "hermit/newlib/gcc"] + path = hermit/newlib/gcc + url = git@github.com:RWTH-OS/gcc.git + branch = gcc-5-branch diff --git a/hermit/arch/x86/kernel/tasks.c b/hermit/arch/x86/kernel/tasks.c index fef765fb7..27734b895 100644 --- a/hermit/arch/x86/kernel/tasks.c +++ b/hermit/arch/x86/kernel/tasks.c @@ -198,8 +198,9 @@ static int load_task(load_args_t* largs) if (!prog_header.virt_addr) continue; - npages = (prog_header.mem_size >> PAGE_BITS); - if (prog_header.mem_size & (PAGE_SIZE-1)) + npages = (prog_header.virt_addr + prog_header.mem_size) - (prog_header.virt_addr & ~(PAGE_SIZE-1)); + npages = (npages >> PAGE_BITS); + if ((prog_header.virt_addr + prog_header.mem_size) & (PAGE_SIZE-1)) npages++; addr = get_pages(npages); @@ -214,14 +215,14 @@ static int load_task(load_args_t* largs) flags |= PG_XD; // map page frames in the address space of the current task - if (page_map(prog_header.virt_addr, addr, npages, flags|PG_RW)) { + if (page_map(prog_header.virt_addr & ~(PAGE_SIZE-1), addr, npages, flags|PG_RW)) { kprintf("Could not map 0x%x at 0x%x\n", addr, prog_header.virt_addr); ret = -ENOMEM; goto Lerr; } // clear pages - memset((void*) prog_header.virt_addr, 0x00, npages*PAGE_SIZE); + memset((void*) (prog_header.virt_addr & ~(PAGE_SIZE-1)), 0x00, npages*PAGE_SIZE); // update heap location if (heap < prog_header.virt_addr + prog_header.mem_size) @@ -281,6 +282,8 @@ static int load_task(load_args_t* largs) flags |= VMA_EXECUTE; vma_add(stack, stack+npages*PAGE_SIZE-1, flags); break; + default: + kprintf("Unknown type 0x%lx in program header\n", prog_header.type); } } diff --git a/hermit/newlib/gcc b/hermit/newlib/gcc new file mode 160000 index 000000000..103e14549 --- /dev/null +++ b/hermit/newlib/gcc @@ -0,0 +1 @@ +Subproject commit 103e1454982e711374d12cac05d48238f982a4ea diff --git a/hermit/newlib/pte b/hermit/newlib/pte new file mode 160000 index 000000000..dd62610a3 --- /dev/null +++ b/hermit/newlib/pte @@ -0,0 +1 @@ +Subproject commit dd62610a3d3ca59b1034e73286a7d3f5903b0bee