diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2010-02-26 16:37:53 -0500 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2010-02-26 16:37:33 -0500 |
commit | 1844c9bc0b2fed3023551c1affe033ab38e90b9a (patch) | |
tree | b9aca066ec58a0b211a4931032b74093fdb6ff49 /arch/s390/kernel | |
parent | 73bfa5f2f71efcdcaad8d18cbed96b9d7ed86948 (diff) |
[S390] add support for compressed kernels
Add the "bzImage" compile target and the necessary code to generate
compressed kernel images. The old style uncompressed "image" target
is preserved, a simple make will build them both.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel')
-rw-r--r-- | arch/s390/kernel/Makefile | 1 | ||||
-rw-r--r-- | arch/s390/kernel/head.S | 41 | ||||
-rw-r--r-- | arch/s390/kernel/head31.S | 16 | ||||
-rw-r--r-- | arch/s390/kernel/head64.S | 24 | ||||
-rw-r--r-- | arch/s390/kernel/sclp.S | 36 |
5 files changed, 78 insertions, 40 deletions
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 20f861256774..64230bc392fa 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile | |||
@@ -29,6 +29,7 @@ obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) | |||
29 | obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o) | 29 | obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o) |
30 | 30 | ||
31 | extra-y += head.o init_task.o vmlinux.lds | 31 | extra-y += head.o init_task.o vmlinux.lds |
32 | extra-y += $(if $(CONFIG_64BIT),head64.o,head31.o) | ||
32 | 33 | ||
33 | obj-$(CONFIG_MODULES) += s390_ksyms.o module.o | 34 | obj-$(CONFIG_MODULES) += s390_ksyms.o module.o |
34 | obj-$(CONFIG_SMP) += smp.o topology.o | 35 | obj-$(CONFIG_SMP) += smp.o topology.o |
diff --git a/arch/s390/kernel/head.S b/arch/s390/kernel/head.S index 1fb59055c7ca..ca4a62bd862f 100644 --- a/arch/s390/kernel/head.S +++ b/arch/s390/kernel/head.S | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright IBM Corp. 1999,2009 | 2 | * Copyright IBM Corp. 1999,2010 |
3 | * | 3 | * |
4 | * Author(s): Hartmut Penner <hp@de.ibm.com> | 4 | * Author(s): Hartmut Penner <hp@de.ibm.com> |
5 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 5 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
@@ -22,11 +22,9 @@ | |||
22 | */ | 22 | */ |
23 | 23 | ||
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <asm/setup.h> | ||
26 | #include <asm/asm-offsets.h> | 25 | #include <asm/asm-offsets.h> |
27 | #include <asm/thread_info.h> | 26 | #include <asm/thread_info.h> |
28 | #include <asm/page.h> | 27 | #include <asm/page.h> |
29 | #include <asm/cpu.h> | ||
30 | 28 | ||
31 | #ifdef CONFIG_64BIT | 29 | #ifdef CONFIG_64BIT |
32 | #define ARCH_OFFSET 4 | 30 | #define ARCH_OFFSET 4 |
@@ -450,16 +448,15 @@ start: | |||
450 | # or linload or SALIPL | 448 | # or linload or SALIPL |
451 | # | 449 | # |
452 | .org 0x10000 | 450 | .org 0x10000 |
453 | startup:basr %r13,0 # get base | 451 | .globl startup |
452 | startup: | ||
453 | basr %r13,0 # get base | ||
454 | .LPG0: | 454 | .LPG0: |
455 | xc 0x200(256),0x200 # partially clear lowcore | 455 | xc 0x200(256),0x200 # partially clear lowcore |
456 | xc 0x300(256),0x300 | 456 | xc 0x300(256),0x300 |
457 | l %r1,5f-.LPG0(%r13) | 457 | stck __LC_LAST_UPDATE_CLOCK |
458 | stck 0(%r1) | 458 | spt 5f-.LPG0(%r13) |
459 | spt 6f-.LPG0(%r13) | 459 | mvc __LC_LAST_UPDATE_TIMER(8),5f-.LPG0(%r13) |
460 | mvc __LC_LAST_UPDATE_CLOCK(8),0(%r1) | ||
461 | mvc __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13) | ||
462 | mvc __LC_EXIT_TIMER(8),5f-.LPG0(%r13) | ||
463 | #ifndef CONFIG_MARCH_G5 | 460 | #ifndef CONFIG_MARCH_G5 |
464 | # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10} | 461 | # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10} |
465 | xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST | 462 | xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST |
@@ -477,7 +474,6 @@ startup:basr %r13,0 # get base | |||
477 | cl %r0,2f+12-.LPG0(%r13) | 474 | cl %r0,2f+12-.LPG0(%r13) |
478 | je 3f | 475 | je 3f |
479 | 1: l %r15,.Lstack-.LPG0(%r13) | 476 | 1: l %r15,.Lstack-.LPG0(%r13) |
480 | ahi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union+THREAD_SIZE | ||
481 | ahi %r15,-96 | 477 | ahi %r15,-96 |
482 | la %r2,.Lals_string-.LPG0(%r13) | 478 | la %r2,.Lals_string-.LPG0(%r13) |
483 | l %r3,.Lsclp_print-.LPG0(%r13) | 479 | l %r3,.Lsclp_print-.LPG0(%r13) |
@@ -488,7 +484,7 @@ startup:basr %r13,0 # get base | |||
488 | .Lsclp_print: | 484 | .Lsclp_print: |
489 | .long _sclp_print_early | 485 | .long _sclp_print_early |
490 | .Lstack: | 486 | .Lstack: |
491 | .long init_thread_union | 487 | .long 0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER)) |
492 | .align 16 | 488 | .align 16 |
493 | 2: .long 0x000a0000,0x8badcccc | 489 | 2: .long 0x000a0000,0x8badcccc |
494 | #if defined(CONFIG_64BIT) | 490 | #if defined(CONFIG_64BIT) |
@@ -515,13 +511,22 @@ startup:basr %r13,0 # get base | |||
515 | 3: | 511 | 3: |
516 | #endif | 512 | #endif |
517 | 513 | ||
514 | #ifdef CONFIG_64BIT | ||
515 | mvi __LC_AR_MODE_ID,1 # set esame flag | ||
516 | slr %r0,%r0 # set cpuid to zero | ||
517 | lhi %r1,2 # mode 2 = esame (dump) | ||
518 | sigp %r1,%r0,0x12 # switch to esame mode | ||
519 | sam64 # switch to 64 bit mode | ||
520 | jg startup_continue | ||
521 | #else | ||
522 | mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0) | ||
518 | l %r13,4f-.LPG0(%r13) | 523 | l %r13,4f-.LPG0(%r13) |
519 | b 0(%r13) | 524 | b 0(%r13) |
520 | .align 4 | 525 | .align 8 |
521 | 4: .long startup_continue | 526 | 4: .long startup_continue |
522 | 5: .long sched_clock_base_cc | 527 | #endif |
523 | .align 8 | 528 | .align 8 |
524 | 6: .long 0x7fffffff,0xffffffff | 529 | 5: .long 0x7fffffff,0xffffffff |
525 | 530 | ||
526 | # | 531 | # |
527 | # params at 10400 (setup.h) | 532 | # params at 10400 (setup.h) |
@@ -535,8 +540,4 @@ startup:basr %r13,0 # get base | |||
535 | .byte "root=/dev/ram0 ro" | 540 | .byte "root=/dev/ram0 ro" |
536 | .byte 0 | 541 | .byte 0 |
537 | 542 | ||
538 | #ifdef CONFIG_64BIT | 543 | .org 0x11000 |
539 | #include "head64.S" | ||
540 | #else | ||
541 | #include "head31.S" | ||
542 | #endif | ||
diff --git a/arch/s390/kernel/head31.S b/arch/s390/kernel/head31.S index 602b508cd4c4..1bbcc499d455 100644 --- a/arch/s390/kernel/head31.S +++ b/arch/s390/kernel/head31.S | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/head31.S | 2 | * arch/s390/kernel/head31.S |
3 | * | 3 | * |
4 | * Copyright (C) IBM Corp. 2005,2006 | 4 | * Copyright (C) IBM Corp. 2005,2010 |
5 | * | 5 | * |
6 | * Author(s): Hartmut Penner <hp@de.ibm.com> | 6 | * Author(s): Hartmut Penner <hp@de.ibm.com> |
7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
@@ -10,13 +10,19 @@ | |||
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
13 | .org 0x11000 | 13 | #include <linux/init.h> |
14 | #include <asm/asm-offsets.h> | ||
15 | #include <asm/thread_info.h> | ||
16 | #include <asm/page.h> | ||
14 | 17 | ||
18 | __HEAD | ||
19 | .globl startup_continue | ||
15 | startup_continue: | 20 | startup_continue: |
16 | basr %r13,0 # get base | 21 | basr %r13,0 # get base |
17 | .LPG1: | 22 | .LPG1: |
18 | 23 | ||
19 | mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0) | 24 | l %r1,.Lbase_cc-.LPG1(%r13) |
25 | mvc 0(8,%r1),__LC_LAST_UPDATE_CLOCK | ||
20 | lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers | 26 | lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers |
21 | l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area | 27 | l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area |
22 | # move IPL device to lowcore | 28 | # move IPL device to lowcore |
@@ -69,10 +75,12 @@ startup_continue: | |||
69 | .Lduald:.rept 8 | 75 | .Lduald:.rept 8 |
70 | .long 0x80000000,0,0,0 # invalid access-list entries | 76 | .long 0x80000000,0,0,0 # invalid access-list entries |
71 | .endr | 77 | .endr |
78 | .Lbase_cc: | ||
79 | .long sched_clock_base_cc | ||
72 | 80 | ||
73 | .org 0x12000 | ||
74 | .globl _ehead | 81 | .globl _ehead |
75 | _ehead: | 82 | _ehead: |
83 | |||
76 | #ifdef CONFIG_SHARED_KERNEL | 84 | #ifdef CONFIG_SHARED_KERNEL |
77 | .org 0x100000 | 85 | .org 0x100000 |
78 | #endif | 86 | #endif |
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index 5419aabf8a66..39580e768658 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/head64.S | 2 | * arch/s390/kernel/head64.S |
3 | * | 3 | * |
4 | * Copyright (C) IBM Corp. 1999,2006 | 4 | * Copyright (C) IBM Corp. 1999,2010 |
5 | * | 5 | * |
6 | * Author(s): Hartmut Penner <hp@de.ibm.com> | 6 | * Author(s): Hartmut Penner <hp@de.ibm.com> |
7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 7 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
@@ -10,18 +10,17 @@ | |||
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
13 | .org 0x11000 | 13 | #include <linux/init.h> |
14 | #include <asm/asm-offsets.h> | ||
15 | #include <asm/thread_info.h> | ||
16 | #include <asm/page.h> | ||
14 | 17 | ||
18 | __HEAD | ||
19 | .globl startup_continue | ||
15 | startup_continue: | 20 | startup_continue: |
16 | basr %r13,0 # get base | 21 | larl %r1,sched_clock_base_cc |
17 | .LPG1: sll %r13,1 # remove high order bit | 22 | mvc 0(8,%r1),__LC_LAST_UPDATE_CLOCK |
18 | srl %r13,1 | 23 | larl %r13,.LPG1 # get base |
19 | mvi __LC_AR_MODE_ID,1 # set esame flag | ||
20 | slr %r0,%r0 # set cpuid to zero | ||
21 | lhi %r1,2 # mode 2 = esame (dump) | ||
22 | sigp %r1,%r0,0x12 # switch to esame mode | ||
23 | sam64 # switch to 64 bit mode | ||
24 | llgfr %r13,%r13 # clear high-order half of base reg | ||
25 | lmh %r0,%r15,.Lzero64-.LPG1(%r13) # clear high-order half | 24 | lmh %r0,%r15,.Lzero64-.LPG1(%r13) # clear high-order half |
26 | lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers | 25 | lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers |
27 | lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area | 26 | lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area |
@@ -46,6 +45,7 @@ startup_continue: | |||
46 | lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space, | 45 | lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space, |
47 | # virtual and never return ... | 46 | # virtual and never return ... |
48 | .align 16 | 47 | .align 16 |
48 | .LPG1: | ||
49 | .Lentry:.quad 0x0000000180000000,_stext | 49 | .Lentry:.quad 0x0000000180000000,_stext |
50 | .Lctl: .quad 0x04350002 # cr0: various things | 50 | .Lctl: .quad 0x04350002 # cr0: various things |
51 | .quad 0 # cr1: primary space segment table | 51 | .quad 0 # cr1: primary space segment table |
@@ -78,9 +78,9 @@ startup_continue: | |||
78 | .long 0x80000000,0,0,0 # invalid access-list entries | 78 | .long 0x80000000,0,0,0 # invalid access-list entries |
79 | .endr | 79 | .endr |
80 | 80 | ||
81 | .org 0x12000 | ||
82 | .globl _ehead | 81 | .globl _ehead |
83 | _ehead: | 82 | _ehead: |
83 | |||
84 | #ifdef CONFIG_SHARED_KERNEL | 84 | #ifdef CONFIG_SHARED_KERNEL |
85 | .org 0x100000 | 85 | .org 0x100000 |
86 | #endif | 86 | #endif |
diff --git a/arch/s390/kernel/sclp.S b/arch/s390/kernel/sclp.S index e27ca63076d1..27af3bf3a009 100644 --- a/arch/s390/kernel/sclp.S +++ b/arch/s390/kernel/sclp.S | |||
@@ -9,8 +9,10 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | LC_EXT_NEW_PSW = 0x58 # addr of ext int handler | 11 | LC_EXT_NEW_PSW = 0x58 # addr of ext int handler |
12 | LC_EXT_NEW_PSW_64 = 0x1b0 # addr of ext int handler 64 bit | ||
12 | LC_EXT_INT_PARAM = 0x80 # addr of ext int parameter | 13 | LC_EXT_INT_PARAM = 0x80 # addr of ext int parameter |
13 | LC_EXT_INT_CODE = 0x86 # addr of ext int code | 14 | LC_EXT_INT_CODE = 0x86 # addr of ext int code |
15 | LC_AR_MODE_ID = 0xa3 | ||
14 | 16 | ||
15 | # | 17 | # |
16 | # Subroutine which waits synchronously until either an external interruption | 18 | # Subroutine which waits synchronously until either an external interruption |
@@ -30,8 +32,16 @@ _sclp_wait_int: | |||
30 | .LbaseS1: | 32 | .LbaseS1: |
31 | ahi %r15,-96 # create stack frame | 33 | ahi %r15,-96 # create stack frame |
32 | la %r8,LC_EXT_NEW_PSW # register int handler | 34 | la %r8,LC_EXT_NEW_PSW # register int handler |
33 | mvc .LoldpswS1-.LbaseS1(8,%r13),0(%r8) | 35 | la %r9,.LextpswS1-.LbaseS1(%r13) |
34 | mvc 0(8,%r8),.LextpswS1-.LbaseS1(%r13) | 36 | #ifdef CONFIG_64BIT |
37 | tm LC_AR_MODE_ID,1 | ||
38 | jno .Lesa1 | ||
39 | la %r8,LC_EXT_NEW_PSW_64 # register int handler 64 bit | ||
40 | la %r9,.LextpswS1_64-.LbaseS1(%r13) | ||
41 | .Lesa1: | ||
42 | #endif | ||
43 | mvc .LoldpswS1-.LbaseS1(16,%r13),0(%r8) | ||
44 | mvc 0(16,%r8),0(%r9) | ||
35 | lhi %r6,0x0200 # cr mask for ext int (cr0.54) | 45 | lhi %r6,0x0200 # cr mask for ext int (cr0.54) |
36 | ltr %r2,%r2 | 46 | ltr %r2,%r2 |
37 | jz .LsetctS1 | 47 | jz .LsetctS1 |
@@ -64,15 +74,19 @@ _sclp_wait_int: | |||
64 | .LtimeoutS1: | 74 | .LtimeoutS1: |
65 | lctl %c0,%c0,.LctlS1-.LbaseS1(%r13) # restore interrupt setting | 75 | lctl %c0,%c0,.LctlS1-.LbaseS1(%r13) # restore interrupt setting |
66 | # restore old handler | 76 | # restore old handler |
67 | mvc 0(8,%r8),.LoldpswS1-.LbaseS1(%r13) | 77 | mvc 0(16,%r8),.LoldpswS1-.LbaseS1(%r13) |
68 | lm %r6,%r15,120(%r15) # restore registers | 78 | lm %r6,%r15,120(%r15) # restore registers |
69 | br %r14 # return to caller | 79 | br %r14 # return to caller |
70 | 80 | ||
71 | .align 8 | 81 | .align 8 |
72 | .LoldpswS1: | 82 | .LoldpswS1: |
73 | .long 0, 0 # old ext int PSW | 83 | .long 0, 0, 0, 0 # old ext int PSW |
74 | .LextpswS1: | 84 | .LextpswS1: |
75 | .long 0x00080000, 0x80000000+.LwaitS1 # PSW to handle ext int | 85 | .long 0x00080000, 0x80000000+.LwaitS1 # PSW to handle ext int |
86 | #ifdef CONFIG_64BIT | ||
87 | .LextpswS1_64: | ||
88 | .quad 0x0000000180000000, .LwaitS1 # PSW to handle ext int, 64 bit | ||
89 | #endif | ||
76 | .LwaitpswS1: | 90 | .LwaitpswS1: |
77 | .long 0x010a0000, 0x00000000+.LloopS1 # PSW to wait for ext int | 91 | .long 0x010a0000, 0x00000000+.LloopS1 # PSW to wait for ext int |
78 | .LtimeS1: | 92 | .LtimeS1: |
@@ -250,6 +264,13 @@ _sclp_print: | |||
250 | _sclp_print_early: | 264 | _sclp_print_early: |
251 | stm %r6,%r15,24(%r15) # save registers | 265 | stm %r6,%r15,24(%r15) # save registers |
252 | ahi %r15,-96 # create stack frame | 266 | ahi %r15,-96 # create stack frame |
267 | #ifdef CONFIG_64BIT | ||
268 | tm LC_AR_MODE_ID,1 | ||
269 | jno .Lesa2 | ||
270 | ahi %r15,-80 | ||
271 | stmh %r6,%r15,96(%r15) # store upper register halves | ||
272 | .Lesa2: | ||
273 | #endif | ||
253 | lr %r10,%r2 # save string pointer | 274 | lr %r10,%r2 # save string pointer |
254 | lhi %r2,0 | 275 | lhi %r2,0 |
255 | bras %r14,_sclp_setup # enable console | 276 | bras %r14,_sclp_setup # enable console |
@@ -262,6 +283,13 @@ _sclp_print_early: | |||
262 | lhi %r2,1 | 283 | lhi %r2,1 |
263 | bras %r14,_sclp_setup # disable console | 284 | bras %r14,_sclp_setup # disable console |
264 | .LendS5: | 285 | .LendS5: |
286 | #ifdef CONFIG_64BIT | ||
287 | tm LC_AR_MODE_ID,1 | ||
288 | jno .Lesa3 | ||
289 | lmh %r6,%r15,96(%r15) # store upper register halves | ||
290 | ahi %r15,80 | ||
291 | .Lesa3: | ||
292 | #endif | ||
265 | lm %r6,%r15,120(%r15) # restore registers | 293 | lm %r6,%r15,120(%r15) # restore registers |
266 | br %r14 | 294 | br %r14 |
267 | 295 | ||