x86-32: fix cmpxchg8b_emu build error with clang
[linux-2.6-block.git] / arch / s390 / kernel / relocate_kernel.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright IBM Corp. 2005
4  *
5  * Author(s): Rolf Adelsberger
6  *
7  */
8
9 #include <linux/linkage.h>
10 #include <asm/page.h>
11 #include <asm/sigp.h>
12
13 /*
14  * moves the new kernel to its destination...
15  * %r2 = pointer to first kimage_entry_t
16  * %r3 = start address - where to jump to after the job is done...
17  * %r4 = subcode
18  *
19  * %r5 will be used as temp. storage
20  * %r6 holds the destination address
21  * %r7 = PAGE_SIZE
22  * %r8 holds the source address
23  * %r9 = PAGE_SIZE
24  *
25  * 0xf000 is a page_mask
26  */
27
28         .text
29 SYM_CODE_START(relocate_kernel)
30         basr    %r13,0          # base address
31 .base:
32         lghi    %r7,PAGE_SIZE   # load PAGE_SIZE in r7
33         lghi    %r9,PAGE_SIZE   # load PAGE_SIZE in r9
34         lg      %r5,0(%r2)      # read another word for indirection page
35         aghi    %r2,8           # increment pointer
36         tml     %r5,0x1         # is it a destination page?
37         je      .indir_check    # NO, goto "indir_check"
38         lgr     %r6,%r5         # r6 = r5
39         nill    %r6,0xf000      # mask it out and...
40         j       .base           # ...next iteration
41 .indir_check:
42         tml     %r5,0x2         # is it a indirection page?
43         je      .done_test      # NO, goto "done_test"
44         nill    %r5,0xf000      # YES, mask out,
45         lgr     %r2,%r5         # move it into the right register,
46         j       .base           # and read next...
47 .done_test:
48         tml     %r5,0x4         # is it the done indicator?
49         je      .source_test    # NO! Well, then it should be the source indicator...
50         j       .done           # ok, lets finish it here...
51 .source_test:
52         tml     %r5,0x8         # it should be a source indicator...
53         je      .base           # NO, ignore it...
54         lgr     %r8,%r5         # r8 = r5
55         nill    %r8,0xf000      # masking
56 0:      mvcle   %r6,%r8,0x0     # copy PAGE_SIZE bytes from r8 to r6 - pad with 0
57         jo      0b
58         j       .base
59 .done:
60         lgr     %r0,%r4         # subcode
61         cghi    %r3,0
62         je      .diag
63         la      %r4,load_psw-.base(%r13)        # load psw-address into the register
64         o       %r3,4(%r4)      # or load address into psw
65         st      %r3,4(%r4)
66         mvc     0(8,%r0),0(%r4) # copy psw to absolute address 0
67 .diag:
68         diag    %r0,%r0,0x308
69 SYM_CODE_END(relocate_kernel)
70
71         .balign 8
72 SYM_DATA_START_LOCAL(load_psw)
73         .long   0x00080000,0x80000000
74 SYM_DATA_END_LABEL(load_psw, SYM_L_LOCAL, relocate_kernel_end)
75         .balign 8
76 SYM_DATA(relocate_kernel_len, .quad relocate_kernel_end - relocate_kernel)