diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2005-08-19 00:52:31 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-08-28 20:53:33 -0400 |
commit | c59c464a3e29830bcfae5eea1777cad9e00087f3 (patch) | |
tree | ebf8eb2885e8431c82c011f46138d41630a8ba49 | |
parent | ec465515eeb662f66725c8c483a46b6bdd9bdd48 (diff) |
[PATCH] Change address of ppc64 initial segment table
On ppc64 machines with segment tables, CPU0's segment table is at a
fixed address, currently 0x9000. This patch moves it to the free
space at 0x6000, just below the fwnmi data area. This saves 8k of
space in vmlinux and the runtime kernel image.
Signed-off-by: David Gibson <dwg@au1.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/ppc64/kernel/head.S | 32 | ||||
-rw-r--r-- | arch/ppc64/kernel/pacaData.c | 4 | ||||
-rw-r--r-- | include/asm-ppc64/mmu.h | 7 |
3 files changed, 24 insertions, 19 deletions
diff --git a/arch/ppc64/kernel/head.S b/arch/ppc64/kernel/head.S index eb54f0548b01..7de38ebbe973 100644 --- a/arch/ppc64/kernel/head.S +++ b/arch/ppc64/kernel/head.S | |||
@@ -52,9 +52,10 @@ | |||
52 | * We layout physical memory as follows: | 52 | * We layout physical memory as follows: |
53 | * 0x0000 - 0x00ff : Secondary processor spin code | 53 | * 0x0000 - 0x00ff : Secondary processor spin code |
54 | * 0x0100 - 0x2fff : pSeries Interrupt prologs | 54 | * 0x0100 - 0x2fff : pSeries Interrupt prologs |
55 | * 0x3000 - 0x6fff : interrupt support, iSeries and common interrupt prologs | 55 | * 0x3000 - 0x5fff : interrupt support, iSeries and common interrupt prologs |
56 | * 0x6000 - 0x6fff : Initial (CPU0) segment table | ||
56 | * 0x7000 - 0x7fff : FWNMI data area | 57 | * 0x7000 - 0x7fff : FWNMI data area |
57 | * 0x9000 - 0x9fff : Initial segment table | 58 | * 0x8000 - : Early init and support code |
58 | */ | 59 | */ |
59 | 60 | ||
60 | /* | 61 | /* |
@@ -1257,6 +1258,20 @@ unrecov_slb: | |||
1257 | b 1b | 1258 | b 1b |
1258 | 1259 | ||
1259 | /* | 1260 | /* |
1261 | * Space for CPU0's segment table. | ||
1262 | * | ||
1263 | * On iSeries, the hypervisor must fill in at least one entry before | ||
1264 | * we get control (with relocate on). The address is give to the hv | ||
1265 | * as a page number (see xLparMap in LparData.c), so this must be at a | ||
1266 | * fixed address (the linker can't compute (u64)&initial_stab >> | ||
1267 | * PAGE_SHIFT). | ||
1268 | */ | ||
1269 | . = STAB0_PHYS_ADDR /* 0x6000 */ | ||
1270 | .globl initial_stab | ||
1271 | initial_stab: | ||
1272 | .space 4096 | ||
1273 | |||
1274 | /* | ||
1260 | * Data area reserved for FWNMI option. | 1275 | * Data area reserved for FWNMI option. |
1261 | * This address (0x7000) is fixed by the RPA. | 1276 | * This address (0x7000) is fixed by the RPA. |
1262 | */ | 1277 | */ |
@@ -1265,19 +1280,6 @@ unrecov_slb: | |||
1265 | fwnmi_data_area: | 1280 | fwnmi_data_area: |
1266 | .space PAGE_SIZE | 1281 | .space PAGE_SIZE |
1267 | 1282 | ||
1268 | /* | ||
1269 | * Space for the initial segment table | ||
1270 | * For LPAR, the hypervisor must fill in at least one entry | ||
1271 | * before we get control (with relocate on) | ||
1272 | */ | ||
1273 | . = STAB0_PHYS_ADDR | ||
1274 | .globl __start_stab | ||
1275 | __start_stab: | ||
1276 | |||
1277 | . = (STAB0_PHYS_ADDR + PAGE_SIZE) | ||
1278 | .globl __end_stab | ||
1279 | __end_stab: | ||
1280 | |||
1281 | /* | 1283 | /* |
1282 | * On pSeries, secondary processors spin in the following code. | 1284 | * On pSeries, secondary processors spin in the following code. |
1283 | * At entry, r3 = this processor's number (physical cpu id) | 1285 | * At entry, r3 = this processor's number (physical cpu id) |
diff --git a/arch/ppc64/kernel/pacaData.c b/arch/ppc64/kernel/pacaData.c index 6316188737b6..6182a2cd90a5 100644 --- a/arch/ppc64/kernel/pacaData.c +++ b/arch/ppc64/kernel/pacaData.c | |||
@@ -78,7 +78,7 @@ extern unsigned long __toc_start; | |||
78 | 78 | ||
79 | #define BOOTCPU_PACA_INIT(number) \ | 79 | #define BOOTCPU_PACA_INIT(number) \ |
80 | { \ | 80 | { \ |
81 | PACA_INIT_COMMON(number, 1, 0, STAB0_VIRT_ADDR) \ | 81 | PACA_INIT_COMMON(number, 1, 0, (u64)&initial_stab) \ |
82 | PACA_INIT_ISERIES(number) \ | 82 | PACA_INIT_ISERIES(number) \ |
83 | } | 83 | } |
84 | 84 | ||
@@ -90,7 +90,7 @@ extern unsigned long __toc_start; | |||
90 | 90 | ||
91 | #define BOOTCPU_PACA_INIT(number) \ | 91 | #define BOOTCPU_PACA_INIT(number) \ |
92 | { \ | 92 | { \ |
93 | PACA_INIT_COMMON(number, 1, STAB0_PHYS_ADDR, STAB0_VIRT_ADDR) \ | 93 | PACA_INIT_COMMON(number, 1, STAB0_PHYS_ADDR, (u64)&initial_stab) \ |
94 | } | 94 | } |
95 | #endif | 95 | #endif |
96 | 96 | ||
diff --git a/include/asm-ppc64/mmu.h b/include/asm-ppc64/mmu.h index 959a4bfdcd6a..789c2693483c 100644 --- a/include/asm-ppc64/mmu.h +++ b/include/asm-ppc64/mmu.h | |||
@@ -28,9 +28,12 @@ | |||
28 | #define STE_VSID_SHIFT 12 | 28 | #define STE_VSID_SHIFT 12 |
29 | 29 | ||
30 | /* Location of cpu0's segment table */ | 30 | /* Location of cpu0's segment table */ |
31 | #define STAB0_PAGE 0x9 | 31 | #define STAB0_PAGE 0x6 |
32 | #define STAB0_PHYS_ADDR (STAB0_PAGE<<PAGE_SHIFT) | 32 | #define STAB0_PHYS_ADDR (STAB0_PAGE<<PAGE_SHIFT) |
33 | #define STAB0_VIRT_ADDR (KERNELBASE+STAB0_PHYS_ADDR) | 33 | |
34 | #ifndef __ASSEMBLY__ | ||
35 | extern char initial_stab[]; | ||
36 | #endif /* ! __ASSEMBLY */ | ||
34 | 37 | ||
35 | /* | 38 | /* |
36 | * SLB | 39 | * SLB |