]> Git Repo - linux.git/blob - arch/s390/boot/head.S
KVM: x86/mmu: Remove MMU auditing
[linux.git] / arch / s390 / boot / head.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright IBM Corp. 1999, 2010
4  *
5  *    Author(s): Hartmut Penner <[email protected]>
6  *               Martin Schwidefsky <[email protected]>
7  *               Rob van der Heij <[email protected]>
8  *               Heiko Carstens <[email protected]>
9  *
10  * There are 5 different IPL methods
11  *  1) load the image directly into ram at address 0 and do an PSW restart
12  *  2) linload will load the image from address 0x10000 to memory 0x10000
13  *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
14  *  3) generate the tape ipl header, store the generated image on a tape
15  *     and ipl from it
16  *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
17  *  4) generate the vm reader ipl header, move the generated image to the
18  *     VM reader (use option NOH!) and do a ipl from reader (VM only)
19  *  5) direct call of start by the SALIPL loader
20  *  We use the cpuid to distinguish between VM and native ipl
21  *  params for kernel are pushed to 0x10400 (see setup.h)
22  *
23  */
24
25 #include <linux/init.h>
26 #include <linux/linkage.h>
27 #include <asm/asm-offsets.h>
28 #include <asm/page.h>
29 #include <asm/ptrace.h>
30 #include <asm/sclp.h>
31
32 #define ARCH_OFFSET     4
33
34 #define EP_OFFSET       0x10008
35 #define EP_STRING       "S390EP"
36
37 __HEAD
38
39 #define IPL_BS  0x730
40         .org    0
41         .long   0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
42         .long   0x02000018,0x60000050           # by ipl to addresses 0-23.
43         .long   0x02000068,0x60000050           # (a PSW and two CCWs).
44         .fill   80-24,1,0x40                    # bytes 24-79 are discarded !!
45         .long   0x020000f0,0x60000050           # The next 160 byte are loaded
46         .long   0x02000140,0x60000050           # to addresses 0x18-0xb7
47         .long   0x02000190,0x60000050           # They form the continuation
48         .long   0x020001e0,0x60000050           # of the CCW program started
49         .long   0x02000230,0x60000050           # by ipl and load the range
50         .long   0x02000280,0x60000050           # 0x0f0-0x730 from the image
51         .long   0x020002d0,0x60000050           # to the range 0x0f0-0x730
52         .long   0x02000320,0x60000050           # in memory. At the end of
53         .long   0x02000370,0x60000050           # the channel program the PSW
54         .long   0x020003c0,0x60000050           # at location 0 is loaded.
55         .long   0x02000410,0x60000050           # Initial processing starts
56         .long   0x02000460,0x60000050           # at 0x200 = iplstart.
57         .long   0x020004b0,0x60000050
58         .long   0x02000500,0x60000050
59         .long   0x02000550,0x60000050
60         .long   0x020005a0,0x60000050
61         .long   0x020005f0,0x60000050
62         .long   0x02000640,0x60000050
63         .long   0x02000690,0x60000050
64         .long   0x020006e0,0x20000050
65
66         .org    __LC_RST_NEW_PSW                # 0x1a0
67         .quad   0,iplstart
68         .org    __LC_EXT_NEW_PSW                # 0x1b0
69         .quad   0x0002000180000000,0x1b0        # disabled wait
70         .org    __LC_PGM_NEW_PSW                # 0x1d0
71         .quad   0x0000000180000000,startup_pgm_check_handler
72         .org    __LC_IO_NEW_PSW                 # 0x1f0
73         .quad   0x0002000180000000,0x1f0        # disabled wait
74
75         .org    0x200
76
77 #
78 # subroutine to wait for end I/O
79 #
80 .Lirqwait:
81         mvc     __LC_IO_NEW_PSW(16),.Lnewpsw    # set up IO interrupt psw
82         lpsw    .Lwaitpsw
83 .Lioint:
84         br      %r14
85         .align  8
86 .Lnewpsw:
87         .quad   0x0000000080000000,.Lioint
88 .Lwaitpsw:
89         .long   0x020a0000,0x80000000+.Lioint
90
91 #
92 # subroutine for loading cards from the reader
93 #
94 .Lloader:
95         la      %r4,0(%r14)
96         la      %r3,.Lorb               # r2 = address of orb into r2
97         la      %r5,.Lirb               # r4 = address of irb
98         la      %r6,.Lccws
99         la      %r7,20
100 .Linit:
101         st      %r2,4(%r6)              # initialize CCW data addresses
102         la      %r2,0x50(%r2)
103         la      %r6,8(%r6)
104         bct     7,.Linit
105
106         lctl    %c6,%c6,.Lcr6           # set IO subclass mask
107         slr     %r2,%r2
108 .Lldlp:
109         ssch    0(%r3)                  # load chunk of 1600 bytes
110         bnz     .Llderr
111 .Lwait4irq:
112         bas     %r14,.Lirqwait
113         c       %r1,__LC_SUBCHANNEL_ID  # compare subchannel number
114         bne     .Lwait4irq
115         tsch    0(%r5)
116
117         slr     %r0,%r0
118         ic      %r0,8(%r5)              # get device status
119         chi     %r0,8                   # channel end ?
120         be      .Lcont
121         chi     %r0,12                  # channel end + device end ?
122         be      .Lcont
123
124         l       %r0,4(%r5)
125         s       %r0,8(%r3)              # r0/8 = number of ccws executed
126         mhi     %r0,10                  # *10 = number of bytes in ccws
127         lh      %r3,10(%r5)             # get residual count
128         sr      %r0,%r3                 # #ccws*80-residual=#bytes read
129         ar      %r2,%r0
130
131         br      %r4                     # r2 contains the total size
132
133 .Lcont:
134         ahi     %r2,0x640               # add 0x640 to total size
135         la      %r6,.Lccws
136         la      %r7,20
137 .Lincr:
138         l       %r0,4(%r6)              # update CCW data addresses
139         ahi     %r0,0x640
140         st      %r0,4(%r6)
141         ahi     %r6,8
142         bct     7,.Lincr
143
144         b       .Lldlp
145 .Llderr:
146         lpsw    .Lcrash
147
148         .align  8
149 .Lorb:  .long   0x00000000,0x0080ff00,.Lccws
150 .Lirb:  .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
151 .Lcr6:  .long   0xff000000
152 .Lloadp:.long   0,0
153         .align  8
154 .Lcrash:.long   0x000a0000,0x00000000
155
156         .align  8
157 .Lccws: .rept   19
158         .long   0x02600050,0x00000000
159         .endr
160         .long   0x02200050,0x00000000
161
162 iplstart:
163         mvi     __LC_AR_MODE_ID,1       # set esame flag
164         slr     %r0,%r0                 # set cpuid to zero
165         lhi     %r1,2                   # mode 2 = esame (dump)
166         sigp    %r1,%r0,0x12            # switch to esame mode
167         bras    %r13,0f
168         .fill   16,4,0x0
169 0:      lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
170         sam31                           # switch to 31 bit addressing mode
171         lh      %r1,__LC_SUBCHANNEL_ID  # test if subchannel number
172         bct     %r1,.Lnoload            #  is valid
173         l       %r1,__LC_SUBCHANNEL_ID  # load ipl subchannel number
174         la      %r2,IPL_BS              # load start address
175         bas     %r14,.Lloader           # load rest of ipl image
176         l       %r12,.Lparm             # pointer to parameter area
177         st      %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
178
179 #
180 # load parameter file from ipl device
181 #
182 .Lagain1:
183         l       %r2,.Linitrd            # ramdisk loc. is temp
184         bas     %r14,.Lloader           # load parameter file
185         ltr     %r2,%r2                 # got anything ?
186         bz      .Lnopf
187         l       %r3,MAX_COMMAND_LINE_SIZE+ARCH_OFFSET-PARMAREA(%r12)
188         ahi     %r3,-1
189         clr     %r2,%r3
190         bl      .Lnotrunc
191         lr      %r2,%r3
192 .Lnotrunc:
193         l       %r4,.Linitrd
194         clc     0(3,%r4),.L_hdr         # if it is HDRx
195         bz      .Lagain1                # skip dataset header
196         clc     0(3,%r4),.L_eof         # if it is EOFx
197         bz      .Lagain1                # skip dateset trailer
198
199         lr      %r5,%r2
200         la      %r6,COMMAND_LINE-PARMAREA(%r12)
201         lr      %r7,%r2
202         ahi     %r7,1
203         mvcl    %r6,%r4
204 .Lnopf:
205
206 #
207 # load ramdisk from ipl device
208 #
209 .Lagain2:
210         l       %r2,.Linitrd            # addr of ramdisk
211         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
212         bas     %r14,.Lloader           # load ramdisk
213         st      %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
214         ltr     %r2,%r2
215         bnz     .Lrdcont
216         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
217 .Lrdcont:
218         l       %r2,.Linitrd
219
220         clc     0(3,%r2),.L_hdr         # skip HDRx and EOFx
221         bz      .Lagain2
222         clc     0(3,%r2),.L_eof
223         bz      .Lagain2
224
225 #
226 # reset files in VM reader
227 #
228         stidp   .Lcpuid                 # store cpuid
229         tm      .Lcpuid,0xff            # running VM ?
230         bno     .Lnoreset
231         la      %r2,.Lreset
232         lhi     %r3,26
233         diag    %r2,%r3,8
234         la      %r5,.Lirb
235         stsch   0(%r5)                  # check if irq is pending
236         tm      30(%r5),0x0f            # by verifying if any of the
237         bnz     .Lwaitforirq            # activity or status control
238         tm      31(%r5),0xff            # bits is set in the schib
239         bz      .Lnoreset
240 .Lwaitforirq:
241         bas     %r14,.Lirqwait          # wait for IO interrupt
242         c       %r1,__LC_SUBCHANNEL_ID  # compare subchannel number
243         bne     .Lwaitforirq
244         la      %r5,.Lirb
245         tsch    0(%r5)
246 .Lnoreset:
247         b       .Lnoload
248
249 #
250 # everything loaded, go for it
251 #
252 .Lnoload:
253         l       %r1,.Lstartup
254         br      %r1
255
256 .Linitrd:.long _end                     # default address of initrd
257 .Lparm: .long  PARMAREA
258 .Lstartup: .long startup
259 .Lreset:.byte   0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
260         .byte   0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
261         .byte   0xc8,0xd6,0xd3,0xc4     # "change rdr all keep nohold"
262 .L_eof: .long   0xc5d6c600       /* C'EOF' */
263 .L_hdr: .long   0xc8c4d900       /* C'HDR' */
264         .align  8
265 .Lcpuid:.fill   8,1,0
266
267 #
268 # normal startup-code, running in absolute addressing mode
269 # this is called either by the ipl loader or directly by PSW restart
270 # or linload or SALIPL
271 #
272         .org    STARTUP_NORMAL_OFFSET
273 SYM_CODE_START(startup)
274         j       startup_normal
275         .org    EP_OFFSET
276 #
277 # This is a list of s390 kernel entry points. At address 0x1000f the number of
278 # valid entry points is stored.
279 #
280 # IMPORTANT: Do not change this table, it is s390 kernel ABI!
281 #
282         .ascii  EP_STRING
283         .byte   0x00,0x01
284 #
285 # kdump startup-code, running in 64 bit absolute addressing mode
286 #
287         .org    STARTUP_KDUMP_OFFSET
288         j       startup_kdump
289 SYM_CODE_END(startup)
290 SYM_CODE_START_LOCAL(startup_normal)
291         mvi     __LC_AR_MODE_ID,1       # set esame flag
292         slr     %r0,%r0                 # set cpuid to zero
293         lhi     %r1,2                   # mode 2 = esame (dump)
294         sigp    %r1,%r0,0x12            # switch to esame mode
295         bras    %r13,0f
296         .fill   16,4,0x0
297 0:      lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
298         sam64                           # switch to 64 bit addressing mode
299         basr    %r13,0                  # get base
300 .LPG0:
301         mvc     __LC_EXT_NEW_PSW(16),.Lext_new_psw-.LPG0(%r13)
302         mvc     __LC_PGM_NEW_PSW(16),.Lpgm_new_psw-.LPG0(%r13)
303         mvc     __LC_IO_NEW_PSW(16),.Lio_new_psw-.LPG0(%r13)
304         xc      0x200(256),0x200        # partially clear lowcore
305         xc      0x300(256),0x300
306         xc      0xe00(256),0xe00
307         xc      0xf00(256),0xf00
308         lctlg   %c0,%c15,.Lctl-.LPG0(%r13)      # load control registers
309         stcke   __LC_BOOT_CLOCK
310         mvc     __LC_LAST_UPDATE_CLOCK(8),__LC_BOOT_CLOCK+1
311         spt     6f-.LPG0(%r13)
312         mvc     __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
313         larl    %r15,_stack_end-STACK_FRAME_OVERHEAD
314         brasl   %r14,sclp_early_setup_buffer
315         brasl   %r14,verify_facilities
316         brasl   %r14,startup_kernel
317 SYM_CODE_END(startup_normal)
318
319         .align  8
320 6:      .long   0x7fffffff,0xffffffff
321 .Lext_new_psw:
322         .quad   0x0002000180000000,0x1b0        # disabled wait
323 .Lpgm_new_psw:
324         .quad   0x0000000180000000,startup_pgm_check_handler
325 .Lio_new_psw:
326         .quad   0x0002000180000000,0x1f0        # disabled wait
327 .Lctl:  .quad   0x04040000              # cr0: AFP registers & secondary space
328         .quad   0                       # cr1: primary space segment table
329         .quad   0                       # cr2: dispatchable unit control table
330         .quad   0                       # cr3: instruction authorization
331         .quad   0xffff                  # cr4: instruction authorization
332         .quad   0                       # cr5: primary-aste origin
333         .quad   0                       # cr6:  I/O interrupts
334         .quad   0                       # cr7:  secondary space segment table
335         .quad   0x0000000000008000      # cr8:  access registers translation
336         .quad   0                       # cr9:  tracing off
337         .quad   0                       # cr10: tracing off
338         .quad   0                       # cr11: tracing off
339         .quad   0                       # cr12: tracing off
340         .quad   0                       # cr13: home space segment table
341         .quad   0xc0000000              # cr14: machine check handling off
342         .quad   0                       # cr15: linkage stack operations
343
344 #include "head_kdump.S"
345
346 #
347 # This program check is active immediately after kernel start
348 # and until early_pgm_check_handler is set in kernel/early.c
349 # It simply saves general/control registers and psw in
350 # the save area and does disabled wait with a faulty address.
351 #
352 SYM_CODE_START_LOCAL(startup_pgm_check_handler)
353         stmg    %r8,%r15,__LC_SAVE_AREA_SYNC
354         la      %r8,4095
355         stctg   %c0,%c15,__LC_CREGS_SAVE_AREA-4095(%r8)
356         stmg    %r0,%r7,__LC_GPREGS_SAVE_AREA-4095(%r8)
357         mvc     __LC_GPREGS_SAVE_AREA-4095+64(64,%r8),__LC_SAVE_AREA_SYNC
358         mvc     __LC_PSW_SAVE_AREA-4095(16,%r8),__LC_PGM_OLD_PSW
359         mvc     __LC_RETURN_PSW(16),__LC_PGM_OLD_PSW
360         ni      __LC_RETURN_PSW,0xfc    # remove IO and EX bits
361         ni      __LC_RETURN_PSW+1,0xfb  # remove MCHK bit
362         oi      __LC_RETURN_PSW+1,0x2   # set wait state bit
363         larl    %r9,.Lold_psw_disabled_wait
364         stg     %r9,__LC_PGM_NEW_PSW+8
365         larl    %r15,_dump_info_stack_end-STACK_FRAME_OVERHEAD
366         brasl   %r14,print_pgm_check_info
367 .Lold_psw_disabled_wait:
368         la      %r8,4095
369         lmg     %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r8)
370         lpswe   __LC_RETURN_PSW         # disabled wait
371 SYM_CODE_END(startup_pgm_check_handler)
372
373 #
374 # params at 10400 (setup.h)
375 # Must be keept in sync with struct parmarea in setup.h
376 #
377         .org    PARMAREA
378 SYM_DATA_START(parmarea)
379         .quad   0                       # IPL_DEVICE
380         .quad   0                       # INITRD_START
381         .quad   0                       # INITRD_SIZE
382         .quad   0                       # OLDMEM_BASE
383         .quad   0                       # OLDMEM_SIZE
384         .quad   kernel_version          # points to kernel version string
385         .quad   COMMAND_LINE_SIZE
386
387         .org    COMMAND_LINE
388         .byte   "root=/dev/ram0 ro"
389         .byte   0
390         .org    PARMAREA+__PARMAREA_SIZE
391 SYM_DATA_END(parmarea)
This page took 0.054636 seconds and 4 git commands to generate.