From 288acd3748c0dd496831987b0f44f6eedef5d552 Mon Sep 17 00:00:00 2001
From: Arvind S Raj <sraj.arvind@gmail.com>
Date: Thu, 7 Aug 2014 17:15:27 +0530
Subject: [PATCH] Reserve 8MB space for kernel before RAM_loader so that kernel
does not overwrite the loader.
---
build/jam/board/beagle/BoardSetup | 10 +++----
headers/private/kernel/arch/arm/omap3.h | 2 ++
src/system/boot/arch/arm/arch_mmu.cpp | 35 ++++++++++++++++--------
src/system/boot/platform/u-boot/Jamfile | 4 +--
src/system/boot/platform/u-boot/arch/arm/shell.S | 2 +-
5 files changed, 33 insertions(+), 20 deletions(-)
diff --git a/build/jam/board/beagle/BoardSetup b/build/jam/board/beagle/BoardSetup
index 0c54643..50ac16b 100644
a
|
b
|
HAIKU_BOARD_DESCRIPTION = "BeagleBoard" ;
|
8 | 8 | # |
9 | 9 | |
10 | 10 | # load address for haiku_loader |
11 | | HAIKU_BOARD_LOADER_BASE = 0x80008000 ; |
| 11 | HAIKU_BOARD_LOADER_BASE = 0x80800000 ; |
12 | 12 | # entry points (raw binary, and netbsd loader emulation) |
13 | | HAIKU_BOARD_LOADER_ENTRY_RAW = 0x80008000 ; |
14 | | HAIKU_BOARD_LOADER_ENTRY_NBSD = 0x80008008 ; |
| 13 | HAIKU_BOARD_LOADER_ENTRY_RAW = 0x80800000 ; |
| 14 | HAIKU_BOARD_LOADER_ENTRY_NBSD = 0x80800008 ; |
15 | 15 | |
16 | 16 | HAIKU_BOARD_LOADER_ENTRY = $(HAIKU_BOARD_LOADER_ENTRY_NBSD) ; |
17 | 17 | HAIKU_BOARD_LOADER_FAKE_OS = netbsd ; |
18 | 18 | |
19 | 19 | # load address for haiku_loader uimage |
20 | 20 | # (must be different than real load address) |
21 | | HAIKU_BOARD_LOADER_UIBASE = 0x84000000 ; |
| 21 | HAIKU_BOARD_LOADER_UIBASE = 0x82800000 ; |
22 | 22 | |
23 | | HAIKU_BOARD_LOADER_STACK_BASE = 0x84000000 ; |
| 23 | HAIKU_BOARD_LOADER_STACK_BASE = 0x83000000 ; |
24 | 24 | |
25 | 25 | # |
26 | 26 | # Flash image |
diff --git a/headers/private/kernel/arch/arm/omap3.h b/headers/private/kernel/arch/arm/omap3.h
index c0b7e18..44a8325 100644
a
|
b
|
|
24 | 24 | #define __PLATFORM_OMAP3_H |
25 | 25 | |
26 | 26 | #define SDRAM_BASE 0x80000000 |
| 27 | // Offset of stack top defined with respect to SDRAM_BASE |
| 28 | #define KSTACK_TOP 0x27fffff |
27 | 29 | |
28 | 30 | #define VECT_BASE 0x00000000 |
29 | 31 | #define VECT_SIZE 0x1000 |
diff --git a/src/system/boot/arch/arm/arch_mmu.cpp b/src/system/boot/arch/arm/arch_mmu.cpp
index 22dc535..2be2a86 100644
a
|
b
|
TODO:
|
58 | 58 | */ |
59 | 59 | |
60 | 60 | |
| 61 | // 8 MB for the kernel, kernel args, modules, driver settings, ... |
| 62 | static const size_t kMaxKernelSize = 0x800000; |
| 63 | |
| 64 | // Base address for loader |
| 65 | static const size_t kLoaderBaseAddress = KERNEL_LOAD_BASE + kMaxKernelSize; |
| 66 | |
61 | 67 | /* |
62 | 68 | *defines a block in memory |
63 | 69 | */ |
… |
… |
static struct memblock LOADER_MEMORYMAP[] = {
|
81 | 87 | ARM_MMU_L2_FLAG_B, |
82 | 88 | }, |
83 | 89 | { |
| 90 | "RAM_kernel", // 8MB space for kernel, drivers etc |
| 91 | KERNEL_LOAD_BASE, |
| 92 | KERNEL_LOAD_BASE + kMaxKernelSize - 1, |
| 93 | ARM_MMU_L2_FLAG_C, |
| 94 | }, |
| 95 | { |
84 | 96 | "RAM_loader", // 1MB loader |
85 | | SDRAM_BASE + 0, |
86 | | SDRAM_BASE + 0x0fffff, |
| 97 | kLoaderBaseAddress + 0, |
| 98 | kLoaderBaseAddress + 0x0fffff, |
87 | 99 | ARM_MMU_L2_FLAG_C, |
88 | 100 | }, |
89 | 101 | { |
90 | 102 | "RAM_pt", // Page Table 1MB |
91 | | SDRAM_BASE + 0x100000, |
92 | | SDRAM_BASE + 0x1FFFFF, |
| 103 | kLoaderBaseAddress + 0x100000, |
| 104 | kLoaderBaseAddress + 0x1FFFFF, |
93 | 105 | ARM_MMU_L2_FLAG_C, |
94 | 106 | }, |
95 | 107 | { |
96 | 108 | "RAM_free", // 16MB free RAM (more but we don't map it automaticaly) |
97 | | SDRAM_BASE + 0x0200000, |
98 | | SDRAM_BASE + 0x11FFFFF, |
| 109 | kLoaderBaseAddress + 0x0200000, |
| 110 | kLoaderBaseAddress + 0x11FFFFF, |
99 | 111 | ARM_MMU_L2_FLAG_C, |
100 | 112 | }, |
101 | 113 | { |
102 | 114 | "RAM_stack", // stack |
103 | | SDRAM_BASE + 0x1200000, |
104 | | SDRAM_BASE + 0x2000000, |
| 115 | kLoaderBaseAddress + 0x1200000, |
| 116 | kLoaderBaseAddress + 0x1ffffff, |
105 | 117 | ARM_MMU_L2_FLAG_C, |
106 | 118 | }, |
107 | 119 | { |
108 | 120 | "RAM_initrd", // stack |
109 | | SDRAM_BASE + 0x2000000, |
110 | | SDRAM_BASE + 0x2500000, |
| 121 | kLoaderBaseAddress + 0x2000000, |
| 122 | kLoaderBaseAddress + 0x2500000, |
111 | 123 | ARM_MMU_L2_FLAG_C, |
112 | 124 | }, |
113 | 125 | |
… |
… |
static struct memblock LOADER_MEMORYMAP[] = {
|
124 | 136 | |
125 | 137 | //static const uint32 kDefaultPageTableFlags = MMU_FLAG_READWRITE; |
126 | 138 | // not cached not buffered, R/W |
127 | | static const size_t kMaxKernelSize = 0x200000; // 2 MB for the kernel |
128 | 139 | |
129 | 140 | static addr_t sNextPhysicalAddress = 0; //will be set by mmu_init |
130 | | static addr_t sNextVirtualAddress = KERNEL_LOAD_BASE + kMaxKernelSize; |
| 141 | static addr_t sNextVirtualAddress = LOADER_MEMORYMAP[4].start; |
131 | 142 | |
132 | 143 | static addr_t sNextPageTableAddress = 0; |
133 | 144 | //the page directory is in front of the pagetable |
diff --git a/src/system/boot/platform/u-boot/Jamfile b/src/system/boot/platform/u-boot/Jamfile
index fc61049..6f2cab6 100644
a
|
b
|
actions BuildUBootSDImage1
|
184 | 184 | # We load the uImage 2MB above its final destination, bootm will decode |
185 | 185 | # it to the proper location. Our image is smaller than 2MB so this works. |
186 | 186 | echo 'uenvcmd=run loadImage; run mmcboot; |
187 | | loadImage=fatload mmc0 0 0x80200000 haiku_loader_nbsd.ub |
188 | | mmcboot=bootm 0x80200000' > uEnv.txt |
| 187 | loadImage=fatload mmc0 0 $(HAIKU_BOARD_LOADER_UIBASE) haiku_loader_nbsd.ub |
| 188 | mmcboot=bootm $(HAIKU_BOARD_LOADER_UIBASE)' > uEnv.txt |
189 | 189 | # populate |
190 | 190 | MTOOLSRC=$(1).mtools mcopy $(2[1-]) i: |
191 | 191 | MTOOLSRC=$(1).mtools mcopy uEnv.txt i: |
diff --git a/src/system/boot/platform/u-boot/arch/arm/shell.S b/src/system/boot/platform/u-boot/arch/arm/shell.S
index 69b1ff3..ca945c9 100644
a
|
b
|
SYMBOL(_start_common):
|
62 | 62 | |
63 | 63 | |
64 | 64 | |
65 | | ldr sp,=SDRAM_BASE + 0x2000000 |
| 65 | ldr sp,=SDRAM_BASE + KSTACK_TOP |
66 | 66 | ldrb r4,gUBootOS |
67 | 67 | cmp r4,#0 |
68 | 68 | beq start_raw |