1.1 --- a/stage2/board.h Mon Oct 03 15:26:26 2016 +0200
1.2 +++ b/stage2/board.h Mon Oct 03 16:36:26 2016 +0200
1.3 @@ -1,6 +1,8 @@
1.4 #ifndef __BOARD_H__
1.5 #define __BOARD_H__
1.6
1.7 +#ifndef __ASSEMBLER__
1.8 +
1.9 /* Utility functions. */
1.10
1.11 void udelay(unsigned long);
1.12 @@ -29,6 +31,10 @@
1.13
1.14 #endif /* CONFIG_CPU_JZ4730 */
1.15
1.16 +#endif /* __ASSEMBLER__ */
1.17 +
1.18 +
1.19 +
1.20 /* Select the board definitions according to the configuration. */
1.21
1.22 #ifdef CONFIG_CPU_JZ4730_MINIPC
2.1 --- a/stage2/entry.S Mon Oct 03 15:26:26 2016 +0200
2.2 +++ b/stage2/entry.S Mon Oct 03 16:36:26 2016 +0200
2.3 @@ -47,7 +47,7 @@
2.4 andi $k1, $k0, 0xff /* ASID */
2.5 li $k0, STAGE2_PAGE_TABLE_TASK
2.6 mul $k0, $k0, $k1 /* [ASID] (ASID * STAGE2_PAGE_TABLE_TASK) */
2.7 - li $k1, STAGE2_PAGE_TABLE /* page_table */
2.8 + li $k1, STAGE2_PAGE_TABLE_BASE /* page_table */
2.9 addu $k1, $k0, $k1 /* page_table[ASID] */
2.10
2.11 mfc0 $k0, CP0_CONTEXT
3.1 --- a/stage2/memory.h Mon Oct 03 15:26:26 2016 +0200
3.2 +++ b/stage2/memory.h Mon Oct 03 16:36:26 2016 +0200
3.3 @@ -1,18 +1,30 @@
3.4 #ifndef __MEMORY_H__
3.5 #define __MEMORY_H__
3.6
3.7 -/* Kernel mode addresses. */
3.8 +#include "board.h"
3.9 +
3.10 +/* Kernel stack addresses. */
3.11
3.12 #define STAGE2_INIT_STACK 0x80004000
3.13 #define STAGE2_EXCEPTION_STACK 0x80008000
3.14
3.15 -#define STAGE2_PAGE_TABLE 0x81400000
3.16 -#define STAGE2_PAGE_TABLE_TASK 0x00008000
3.17 +/* Page table details accessed in kernel mode. */
3.18 +
3.19 +#define STAGE2_PAGE_TABLE_TOP 0x82000000
3.20 +#define STAGE2_PAGE_TABLE_BASE 0x81400000
3.21 +
3.22 +/* Page table virtual address limit. */
3.23 +
3.24 +#define STAGE2_VIRTUAL_TOP 0x08000000
3.25 +
3.26 +/* Page table computed task structure size. */
3.27 +
3.28 +#define STAGE2_PAGE_TABLE_TASK (STAGE2_VIRTUAL_TOP / (2 * STAGE2_PAGESIZE))
3.29
3.30 /* User mode and physical addresses. */
3.31
3.32 -#define TASK_GPIO_BASE 0x7fff0000
3.33 -#define TASK_STACK_TOP 0x7fff0000
3.34 +#define TASK_GPIO_BASE (STAGE2_VIRTUAL_TOP - GPIO_REGION_SIZE)
3.35 +#define TASK_STACK_TOP TASK_GPIO_BASE
3.36 #define TASK_STACK_PHYSICAL 0x01c00000
3.37 #define TASK_STACK_SIZE 0x00002000
3.38
4.1 --- a/stage2/task_gpio.c Mon Oct 03 15:26:26 2016 +0200
4.2 +++ b/stage2/task_gpio.c Mon Oct 03 16:36:26 2016 +0200
4.3 @@ -26,12 +26,17 @@
4.4
4.5 void task_gpio_init(unsigned short task)
4.6 {
4.7 + u32 virtual, physical;
4.8 +
4.9 /* Map the I/O region to the task. */
4.10
4.11 - init_page_table(STAGE2_PAGE_TABLE,
4.12 - TASK_GPIO_BASE,
4.13 - GPIO_BASE,
4.14 - page_size(GPIO_REGION_SIZE), TLB_WRITE, task);
4.15 + for (virtual = TASK_GPIO_BASE, physical = GPIO_BASE;
4.16 + virtual < (u32) TASK_GPIO_BASE + (u32) GPIO_REGION_SIZE;
4.17 + virtual += page_size(STAGE2_PAGESIZE), physical += page_size(STAGE2_PAGESIZE))
4.18 + {
4.19 + init_page_table(STAGE2_PAGE_TABLE_BASE, virtual, physical,
4.20 + page_size(STAGE2_PAGESIZE), TLB_WRITE, task);
4.21 + }
4.22 }
4.23
4.24 inline void task_gpio_set_pin(unsigned short pin)
5.1 --- a/stage2/tasks.c Mon Oct 03 15:26:26 2016 +0200
5.2 +++ b/stage2/tasks.c Mon Oct 03 16:36:26 2016 +0200
5.3 @@ -81,7 +81,7 @@
5.4
5.5 physical = TASK_STACK_PHYSICAL - TASK_STACK_SIZE * task;
5.6
5.7 - init_page_table(STAGE2_PAGE_TABLE,
5.8 + init_page_table(STAGE2_PAGE_TABLE_BASE,
5.9 previous_page(virtual, STAGE2_PAGESIZE),
5.10 previous_page(physical, STAGE2_PAGESIZE),
5.11 STAGE2_PAGESIZE, TLB_WRITE, task);
5.12 @@ -102,7 +102,7 @@
5.13
5.14 /* Map the global object table for the task. */
5.15
5.16 - init_page_table(STAGE2_PAGE_TABLE,
5.17 + init_page_table(STAGE2_PAGE_TABLE_BASE,
5.18 user_address((u32) &_got_start),
5.19 user_address((u32) &_got_copy_start),
5.20 STAGE2_PAGESIZE, TLB_READ, task);
5.21 @@ -113,7 +113,7 @@
5.22 address < (u32) &_got_start;
5.23 address = next_page(address, STAGE2_PAGESIZE))
5.24 {
5.25 - init_page_table(STAGE2_PAGE_TABLE,
5.26 + init_page_table(STAGE2_PAGE_TABLE_BASE,
5.27 user_address(address),
5.28 user_address(address),
5.29 STAGE2_PAGESIZE, TLB_READ, task);
5.30 @@ -125,7 +125,7 @@
5.31 address < (u32) &_memory_end;
5.32 address = next_page(address, STAGE2_PAGESIZE))
5.33 {
5.34 - init_page_table(STAGE2_PAGE_TABLE,
5.35 + init_page_table(STAGE2_PAGE_TABLE_BASE,
5.36 user_address(address),
5.37 user_address(address),
5.38 STAGE2_PAGESIZE, TLB_WRITE, task);