Commit c59c464a3e29830bcfae5eea1777cad9e00087f3

Authored by David Gibson
Committed by Paul Mackerras
1 parent ec465515ee

[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>

Showing 3 changed files with 24 additions and 19 deletions Side-by-side Diff

arch/ppc64/kernel/head.S
... ... @@ -52,9 +52,10 @@
52 52 * We layout physical memory as follows:
53 53 * 0x0000 - 0x00ff : Secondary processor spin code
54 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 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 @@
1257 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 1275 * Data area reserved for FWNMI option.
1261 1276 * This address (0x7000) is fixed by the RPA.
1262 1277 */
... ... @@ -1264,19 +1279,6 @@
1264 1279 .globl fwnmi_data_area
1265 1280 fwnmi_data_area:
1266 1281 .space PAGE_SIZE
1267   -
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 1282  
1281 1283 /*
1282 1284 * On pSeries, secondary processors spin in the following code.
arch/ppc64/kernel/pacaData.c
... ... @@ -78,7 +78,7 @@
78 78  
79 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 82 PACA_INIT_ISERIES(number) \
83 83 }
84 84  
... ... @@ -90,7 +90,7 @@
90 90  
91 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 95 #endif
96 96  
include/asm-ppc64/mmu.h
... ... @@ -28,9 +28,12 @@
28 28 #define STE_VSID_SHIFT 12
29 29  
30 30 /* Location of cpu0's segment table */
31   -#define STAB0_PAGE 0x9
  31 +#define STAB0_PAGE 0x6
32 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 39 * SLB