diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2007-08-20 00:58:36 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-08-22 01:21:46 -0400 |
commit | 16a15a30f8a09af6ce2dc4fd6eec9b454c1fe488 (patch) | |
tree | b9a2be9818f41d92df001950374ed6bc49e44751 /arch/powerpc/kernel/head_64.S | |
parent | 556ecf9be66f4d493e19bc71a7ce84366d512b71 (diff) |
[POWERPC] iSeries: Clean up lparmap mess
We need to have xLparMap in head_64.S so that it is at a fixed address
(because the linker will not resolve (address & 0xffffffff) for us).
But the assembler miscalculates the KERNEL_VSID() expressions. So put
the confusing expressions into asm-offsets.c.
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/head_64.S')
-rw-r--r-- | arch/powerpc/kernel/head_64.S | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 171800002ede..1e6d9cc06ca0 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/iseries/lpar_map.h> | 34 | #include <asm/iseries/lpar_map.h> |
35 | #include <asm/thread_info.h> | 35 | #include <asm/thread_info.h> |
36 | #include <asm/firmware.h> | 36 | #include <asm/firmware.h> |
37 | #include <asm/page_64.h> | ||
37 | 38 | ||
38 | #define DO_SOFT_DISABLE | 39 | #define DO_SOFT_DISABLE |
39 | 40 | ||
@@ -1519,8 +1520,8 @@ _GLOBAL(do_stab_bolted) | |||
1519 | * Space for CPU0's segment table. | 1520 | * Space for CPU0's segment table. |
1520 | * | 1521 | * |
1521 | * On iSeries, the hypervisor must fill in at least one entry before | 1522 | * On iSeries, the hypervisor must fill in at least one entry before |
1522 | * we get control (with relocate on). The address is give to the hv | 1523 | * we get control (with relocate on). The address is given to the hv |
1523 | * as a page number (see xLparMap in lpardata.c), so this must be at a | 1524 | * as a page number (see xLparMap below), so this must be at a |
1524 | * fixed address (the linker can't compute (u64)&initial_stab >> | 1525 | * fixed address (the linker can't compute (u64)&initial_stab >> |
1525 | * PAGE_SHIFT). | 1526 | * PAGE_SHIFT). |
1526 | */ | 1527 | */ |
@@ -1542,12 +1543,22 @@ fwnmi_data_area: | |||
1542 | * both pSeries and iSeries */ | 1543 | * both pSeries and iSeries */ |
1543 | #ifdef CONFIG_PPC_ISERIES | 1544 | #ifdef CONFIG_PPC_ISERIES |
1544 | . = LPARMAP_PHYS | 1545 | . = LPARMAP_PHYS |
1545 | #include "lparmap.s" | 1546 | .globl xLparMap |
1546 | /* | 1547 | xLparMap: |
1547 | * This ".text" is here for old compilers that generate a trailing | 1548 | .quad HvEsidsToMap /* xNumberEsids */ |
1548 | * .note section when compiling .c files to .s | 1549 | .quad HvRangesToMap /* xNumberRanges */ |
1549 | */ | 1550 | .quad STAB0_PAGE /* xSegmentTableOffs */ |
1550 | .text | 1551 | .zero 40 /* xRsvd */ |
1552 | /* xEsids (HvEsidsToMap entries of 2 quads) */ | ||
1553 | .quad PAGE_OFFSET_ESID /* xKernelEsid */ | ||
1554 | .quad PAGE_OFFSET_VSID /* xKernelVsid */ | ||
1555 | .quad VMALLOC_START_ESID /* xKernelEsid */ | ||
1556 | .quad VMALLOC_START_VSID /* xKernelVsid */ | ||
1557 | /* xRanges (HvRangesToMap entries of 3 quads) */ | ||
1558 | .quad HvPagesToMap /* xPages */ | ||
1559 | .quad 0 /* xOffset */ | ||
1560 | .quad PAGE_OFFSET_VSID << (SID_SHIFT - HW_PAGE_SHIFT) /* xVPN */ | ||
1561 | |||
1551 | #endif /* CONFIG_PPC_ISERIES */ | 1562 | #endif /* CONFIG_PPC_ISERIES */ |
1552 | 1563 | ||
1553 | . = 0x8000 | 1564 | . = 0x8000 |