Merge tag 'm68k-for-v4.9-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert...
[platform/kernel/linux-exynos.git] / arch / s390 / boot / compressed / head.S
1 /*
2  * Startup glue code to uncompress the kernel
3  *
4  * Copyright IBM Corp. 2010
5  *
6  *   Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
7  */
8
9 #include <linux/init.h>
10 #include <linux/linkage.h>
11 #include <asm/asm-offsets.h>
12 #include <asm/thread_info.h>
13 #include <asm/page.h>
14 #include "sizes.h"
15
16 __HEAD
17 ENTRY(startup_continue)
18         basr    %r13,0                  # get base
19 .LPG1:
20         # setup stack
21         lg      %r15,.Lstack-.LPG1(%r13)
22         aghi    %r15,-160
23         brasl   %r14,decompress_kernel
24         # Set up registers for memory mover. We move the decompressed image to
25         # 0x11000, starting at offset 0x11000 in the decompressed image so
26         # that code living at 0x11000 in the image will end up at 0x11000 in
27         # memory.
28         lgr     %r4,%r2
29         lg      %r2,.Loffset-.LPG1(%r13)
30         la      %r4,0(%r2,%r4)
31         lg      %r3,.Lmvsize-.LPG1(%r13)
32         lgr     %r5,%r3
33         # Move the memory mover someplace safe so it doesn't overwrite itself.
34         la      %r1,0x200
35         mvc     0(mover_end-mover,%r1),mover-.LPG1(%r13)
36         # When the memory mover is done we pass control to
37         # arch/s390/kernel/head64.S:startup_continue which lives at 0x11000 in
38         # the decompressed image.
39         lgr     %r6,%r2
40         br      %r1
41 mover:
42         mvcle   %r2,%r4,0
43         jo      mover
44         br      %r6
45 mover_end:
46
47         .align  8
48 .Lstack:
49         .quad   0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
50 .Loffset:
51         .quad   0x11000
52 .Lmvsize:
53         .quad   SZ__bss_start