2.1 --- a/stage2/paging.c Sun May 15 23:35:50 2016 +0200
2.2 +++ b/stage2/paging.c Sun Oct 02 14:58:04 2016 +0200
2.3 @@ -18,8 +18,19 @@
2.4 */
2.5
2.6 #include "paging.h"
2.7 +#include "memory.h"
2.8
2.9 inline u32 user_address(u32 addr)
2.10 {
2.11 return addr & USER_ADDRESS_MASK;
2.12 }
2.13 +
2.14 +inline u32 previous_page(u32 addr, u32 pagesize)
2.15 +{
2.16 + return addr - pagesize * 2;
2.17 +}
2.18 +
2.19 +inline u32 next_page(u32 addr, u32 pagesize)
2.20 +{
2.21 + return addr + pagesize * 2;
2.22 +}
3.1 --- a/stage2/paging.h Sun May 15 23:35:50 2016 +0200
3.2 +++ b/stage2/paging.h Sun Oct 02 14:58:04 2016 +0200
3.3 @@ -8,6 +8,8 @@
3.4 #include "xburst_types.h"
3.5
3.6 u32 user_address(u32 addr);
3.7 +u32 previous_page(u32 addr, u32 pagesize);
3.8 +u32 next_page(u32 addr, u32 pagesize);
3.9
3.10 #endif /* __ASSEMBLER__ */
3.11
4.1 --- a/stage2/tasks.c Sun May 15 23:35:50 2016 +0200
4.2 +++ b/stage2/tasks.c Sun Oct 02 14:58:04 2016 +0200
4.3 @@ -68,7 +68,10 @@
4.4 virtual = STAGE2_TASK_STACK;
4.5 physical = STAGE2_TASK_STACK - STAGE2_TASK_STACK_SIZE * task;
4.6
4.7 - init_page_table(STAGE2_PAGE_TABLE, virtual - STAGE2_PAGESIZE * 2, physical - STAGE2_PAGESIZE * 2, STAGE2_PAGESIZE, TLB_WRITE, task);
4.8 + init_page_table(STAGE2_PAGE_TABLE,
4.9 + previous_page(virtual, STAGE2_PAGESIZE),
4.10 + previous_page(physical, STAGE2_PAGESIZE),
4.11 + STAGE2_PAGESIZE, TLB_WRITE, task);
4.12
4.13 /*
4.14 Subtract from the stack pointer to prevent the called function from
4.15 @@ -86,18 +89,33 @@
4.16
4.17 /* Map the global object table for the task. */
4.18
4.19 - init_page_table(STAGE2_PAGE_TABLE, user_address((u32) &_got_start), user_address((u32) &_got_copy_start), STAGE2_PAGESIZE, TLB_READ, task);
4.20 + init_page_table(STAGE2_PAGE_TABLE,
4.21 + user_address((u32) &_got_start),
4.22 + user_address((u32) &_got_copy_start),
4.23 + STAGE2_PAGESIZE, TLB_READ, task);
4.24
4.25 - /* Map all shared pages for the task. */
4.26 + /* Map all shared pages for the task. First, the read-only code region. */
4.27
4.28 - for (address = (u32) &_payload_start; address < (u32) &_got_start; address += STAGE2_PAGESIZE * 2)
4.29 + for (address = (u32) &_payload_start;
4.30 + address < (u32) &_got_start;
4.31 + address = next_page(address, STAGE2_PAGESIZE))
4.32 {
4.33 - init_page_table(STAGE2_PAGE_TABLE, user_address(address), user_address(address), STAGE2_PAGESIZE, TLB_READ, task);
4.34 + init_page_table(STAGE2_PAGE_TABLE,
4.35 + user_address(address),
4.36 + user_address(address),
4.37 + STAGE2_PAGESIZE, TLB_READ, task);
4.38 }
4.39
4.40 - for (address = (u32) &_got_copy_end + STAGE2_PAGESIZE * 2; address < (u32) &_memory_end; address += STAGE2_PAGESIZE * 2)
4.41 + /* Make the pages after the code writable. */
4.42 +
4.43 + for (address = next_page((u32) &_got_copy_end, STAGE2_PAGESIZE);
4.44 + address < (u32) &_memory_end;
4.45 + address = next_page(address, STAGE2_PAGESIZE))
4.46 {
4.47 - init_page_table(STAGE2_PAGE_TABLE, user_address(address), user_address(address), STAGE2_PAGESIZE, TLB_WRITE, task);
4.48 + init_page_table(STAGE2_PAGE_TABLE,
4.49 + user_address(address),
4.50 + user_address(address),
4.51 + STAGE2_PAGESIZE, TLB_WRITE, task);
4.52 }
4.53 }
4.54