s390/boot: make head.S and als.c be part of the decompressor only
authorVasily Gorbik <gor@linux.ibm.com>
Tue, 12 Jun 2018 13:11:40 +0000 (15:11 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 25 Jun 2018 08:14:38 +0000 (10:14 +0200)
Since uncompressed kernel image does not have to be bootable anymore,
move head.S, head_kdump.S and als.c to boot/ folder and compile them
in just in the decompressor.

Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
13 files changed:
arch/s390/Makefile
arch/s390/boot/Makefile
arch/s390/boot/als.c [new file with mode: 0644]
arch/s390/boot/compressed/Makefile
arch/s390/boot/head.S [new file with mode: 0644]
arch/s390/boot/head_kdump.S [new file with mode: 0644]
arch/s390/kernel/Makefile
arch/s390/kernel/als.c [deleted file]
arch/s390/kernel/entry.h
arch/s390/kernel/head.S [deleted file]
arch/s390/kernel/head64.S
arch/s390/kernel/head_kdump.S [deleted file]
arch/s390/kernel/vmlinux.lds.S

index ea3e610ead75cddad3fb064ebdf2e85a25f9bf92..d25fbc17016427ad1f06e274d37cdea0fb2624ff 100644 (file)
@@ -113,8 +113,7 @@ export KBUILD_CFLAGS_DECOMPRESSOR
 
 OBJCOPYFLAGS   := -O binary
 
-head-y         := arch/s390/kernel/head.o
-head-y         += arch/s390/kernel/head64.o
+head-y         := arch/s390/kernel/head64.o
 
 # See arch/s390/Kbuild for content of core part of the kernel
 core-y         += arch/s390/
index da5f299dcd18c391fd9214d944bb28b4c6cf972c..05e92d43d383548dfd10724fca8477e92b7028f0 100644 (file)
@@ -3,15 +3,42 @@
 # Makefile for the linux s390-specific parts of the memory manager.
 #
 
-targets := bzImage
-subdir- := compressed
+KCOV_INSTRUMENT := n
+GCOV_PROFILE := n
+UBSAN_SANITIZE := n
+
+KBUILD_AFLAGS := $(KBUILD_AFLAGS_DECOMPRESSOR)
+KBUILD_CFLAGS := $(KBUILD_CFLAGS_DECOMPRESSOR)
+
+#
+# Use -march=z900 for als.c to be able to print an error
+# message if the kernel is started on a machine which is too old
+#
+ifneq ($(CC_FLAGS_MARCH),-march=z900)
+AFLAGS_REMOVE_head.o   += $(CC_FLAGS_MARCH)
+AFLAGS_head.o          += -march=z900
+CFLAGS_REMOVE_als.o    += $(CC_FLAGS_MARCH)
+CFLAGS_als.o           += -march=z900
+endif
+
+obj-y  := head.o als.o
+targets        := bzImage startup.a $(obj-y)
+subdir-        := compressed
+
+OBJECTS := $(addprefix $(obj)/,$(obj-y))
 
 $(obj)/bzImage: $(obj)/compressed/vmlinux FORCE
        $(call if_changed,objcopy)
 
-$(obj)/compressed/vmlinux: FORCE
+$(obj)/compressed/vmlinux: $(obj)/startup.a FORCE
        $(Q)$(MAKE) $(build)=$(obj)/compressed $@
 
+quiet_cmd_ar = AR      $@
+      cmd_ar = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(filter-out FORCE, $^)
+
+$(obj)/startup.a: $(OBJECTS) FORCE
+       $(call if_changed,ar)
+
 install: $(CONFIGURE) $(obj)/bzImage
        sh -x  $(srctree)/$(obj)/install.sh $(KERNELRELEASE) $(obj)/bzImage \
              System.map "$(INSTALL_PATH)"
diff --git a/arch/s390/boot/als.c b/arch/s390/boot/als.c
new file mode 100644 (file)
index 0000000..b6287a9
--- /dev/null
@@ -0,0 +1,127 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *    Copyright IBM Corp. 2016
+ */
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <asm/processor.h>
+#include <asm/facility.h>
+#include <asm/lowcore.h>
+#include <asm/sclp.h>
+
+/*
+ * The code within this file will be called very early. It may _not_
+ * access anything within the bss section, since that is not cleared
+ * yet and may contain data (e.g. initrd) that must be saved by other
+ * code.
+ * For temporary objects the stack (16k) should be used.
+ */
+
+static unsigned long als[] __initdata = { FACILITIES_ALS };
+
+static void __init u16_to_hex(char *str, u16 val)
+{
+       int i, num;
+
+       for (i = 1; i <= 4; i++) {
+               num = (val >> (16 - 4 * i)) & 0xf;
+               if (num >= 10)
+                       num += 7;
+               *str++ = '0' + num;
+       }
+       *str = '\0';
+}
+
+static void __init print_machine_type(void)
+{
+       static char mach_str[80] __initdata = "Detected machine-type number: ";
+       char type_str[5];
+       struct cpuid id;
+
+       get_cpu_id(&id);
+       u16_to_hex(type_str, id.machine);
+       strcat(mach_str, type_str);
+       strcat(mach_str, "\n");
+       sclp_early_printk(mach_str);
+}
+
+static void __init u16_to_decimal(char *str, u16 val)
+{
+       int div = 1;
+
+       while (div * 10 <= val)
+               div *= 10;
+       while (div) {
+               *str++ = '0' + val / div;
+               val %= div;
+               div /= 10;
+       }
+       *str = '\0';
+}
+
+static void __init print_missing_facilities(void)
+{
+       static char als_str[80] __initdata = "Missing facilities: ";
+       unsigned long val;
+       char val_str[6];
+       int i, j, first;
+
+       first = 1;
+       for (i = 0; i < ARRAY_SIZE(als); i++) {
+               val = ~S390_lowcore.stfle_fac_list[i] & als[i];
+               for (j = 0; j < BITS_PER_LONG; j++) {
+                       if (!(val & (1UL << (BITS_PER_LONG - 1 - j))))
+                               continue;
+                       if (!first)
+                               strcat(als_str, ",");
+                       /*
+                        * Make sure we stay within one line. Consider that
+                        * each facility bit adds up to five characters and
+                        * z/VM adds a four character prefix.
+                        */
+                       if (strlen(als_str) > 70) {
+                               strcat(als_str, "\n");
+                               sclp_early_printk(als_str);
+                               *als_str = '\0';
+                       }
+                       u16_to_decimal(val_str, i * BITS_PER_LONG + j);
+                       strcat(als_str, val_str);
+                       first = 0;
+               }
+       }
+       strcat(als_str, "\n");
+       sclp_early_printk(als_str);
+       sclp_early_printk("See Principles of Operations for facility bits\n");
+}
+
+static void __init facility_mismatch(void)
+{
+       sclp_early_printk("The Linux kernel requires more recent processor hardware\n");
+       print_machine_type();
+       print_missing_facilities();
+       disabled_wait(0x8badcccc);
+}
+
+void __init verify_facilities(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(S390_lowcore.stfle_fac_list); i++)
+               S390_lowcore.stfle_fac_list[i] = 0;
+       asm volatile(
+               "       stfl    0(0)\n"
+               : "=m" (S390_lowcore.stfl_fac_list));
+       S390_lowcore.stfle_fac_list[0] = (u64)S390_lowcore.stfl_fac_list << 32;
+       if (S390_lowcore.stfl_fac_list & 0x01000000) {
+               register unsigned long reg0 asm("0") = ARRAY_SIZE(als) - 1;
+
+               asm volatile(".insn s,0xb2b00000,0(%1)" /* stfle */
+                            : "+d" (reg0)
+                            : "a" (&S390_lowcore.stfle_fac_list)
+                            : "memory", "cc");
+       }
+       for (i = 0; i < ARRAY_SIZE(als); i++) {
+               if ((S390_lowcore.stfle_fac_list[i] & als[i]) != als[i])
+                       facility_mismatch();
+       }
+}
index 9b48e7b86fc80543778e86354d5c76efaba5d3ae..855f7fdb1f6111684aac8291688351dfeb52f405 100644 (file)
@@ -16,12 +16,12 @@ targets += misc.o piggy.o sizes.h head.o
 KBUILD_AFLAGS := $(KBUILD_AFLAGS_DECOMPRESSOR)
 KBUILD_CFLAGS := $(KBUILD_CFLAGS_DECOMPRESSOR)
 
-OBJECTS := $(addprefix $(objtree)/arch/s390/kernel/, head.o ebcdic.o als.o)
+OBJECTS := $(objtree)/arch/s390/kernel/ebcdic.o
 OBJECTS += $(objtree)/drivers/s390/char/sclp_early_core.o
 OBJECTS += $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o
 
 LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup -T
-$(obj)/vmlinux: $(obj)/vmlinux.lds $(OBJECTS)
+$(obj)/vmlinux: $(obj)/vmlinux.lds $(objtree)/arch/s390/boot/startup.a $(OBJECTS)
        $(call if_changed,ld)
 
 TRIM_HEAD_SIZE := 0x100000
diff --git a/arch/s390/boot/head.S b/arch/s390/boot/head.S
new file mode 100644 (file)
index 0000000..5c42f16
--- /dev/null
@@ -0,0 +1,339 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright IBM Corp. 1999, 2010
+ *
+ *    Author(s): Hartmut Penner <hp@de.ibm.com>
+ *              Martin Schwidefsky <schwidefsky@de.ibm.com>
+ *              Rob van der Heij <rvdhei@iae.nl>
+ *              Heiko Carstens <heiko.carstens@de.ibm.com>
+ *
+ * There are 5 different IPL methods
+ *  1) load the image directly into ram at address 0 and do an PSW restart
+ *  2) linload will load the image from address 0x10000 to memory 0x10000
+ *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
+ *  3) generate the tape ipl header, store the generated image on a tape
+ *     and ipl from it
+ *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
+ *  4) generate the vm reader ipl header, move the generated image to the
+ *     VM reader (use option NOH!) and do a ipl from reader (VM only)
+ *  5) direct call of start by the SALIPL loader
+ *  We use the cpuid to distinguish between VM and native ipl
+ *  params for kernel are pushed to 0x10400 (see setup.h)
+ *
+ */
+
+#include <linux/init.h>
+#include <linux/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/thread_info.h>
+#include <asm/page.h>
+#include <asm/ptrace.h>
+
+#define ARCH_OFFSET    4
+
+__HEAD
+
+#define IPL_BS 0x730
+       .org    0
+       .long   0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
+       .long   0x02000018,0x60000050           # by ipl to addresses 0-23.
+       .long   0x02000068,0x60000050           # (a PSW and two CCWs).
+       .fill   80-24,1,0x40                    # bytes 24-79 are discarded !!
+       .long   0x020000f0,0x60000050           # The next 160 byte are loaded
+       .long   0x02000140,0x60000050           # to addresses 0x18-0xb7
+       .long   0x02000190,0x60000050           # They form the continuation
+       .long   0x020001e0,0x60000050           # of the CCW program started
+       .long   0x02000230,0x60000050           # by ipl and load the range
+       .long   0x02000280,0x60000050           # 0x0f0-0x730 from the image
+       .long   0x020002d0,0x60000050           # to the range 0x0f0-0x730
+       .long   0x02000320,0x60000050           # in memory. At the end of
+       .long   0x02000370,0x60000050           # the channel program the PSW
+       .long   0x020003c0,0x60000050           # at location 0 is loaded.
+       .long   0x02000410,0x60000050           # Initial processing starts
+       .long   0x02000460,0x60000050           # at 0x200 = iplstart.
+       .long   0x020004b0,0x60000050
+       .long   0x02000500,0x60000050
+       .long   0x02000550,0x60000050
+       .long   0x020005a0,0x60000050
+       .long   0x020005f0,0x60000050
+       .long   0x02000640,0x60000050
+       .long   0x02000690,0x60000050
+       .long   0x020006e0,0x20000050
+
+       .org    0x200
+
+#
+# subroutine to wait for end I/O
+#
+.Lirqwait:
+       mvc     __LC_IO_NEW_PSW(16),.Lnewpsw    # set up IO interrupt psw
+       lpsw    .Lwaitpsw
+.Lioint:
+       br      %r14
+       .align  8
+.Lnewpsw:
+       .quad   0x0000000080000000,.Lioint
+.Lwaitpsw:
+       .long   0x020a0000,0x80000000+.Lioint
+
+#
+# subroutine for loading cards from the reader
+#
+.Lloader:
+       la      %r4,0(%r14)
+       la      %r3,.Lorb               # r2 = address of orb into r2
+       la      %r5,.Lirb               # r4 = address of irb
+       la      %r6,.Lccws
+       la      %r7,20
+.Linit:
+       st      %r2,4(%r6)              # initialize CCW data addresses
+       la      %r2,0x50(%r2)
+       la      %r6,8(%r6)
+       bct     7,.Linit
+
+       lctl    %c6,%c6,.Lcr6           # set IO subclass mask
+       slr     %r2,%r2
+.Lldlp:
+       ssch    0(%r3)                  # load chunk of 1600 bytes
+       bnz     .Llderr
+.Lwait4irq:
+       bas     %r14,.Lirqwait
+       c       %r1,__LC_SUBCHANNEL_ID  # compare subchannel number
+       bne     .Lwait4irq
+       tsch    0(%r5)
+
+       slr     %r0,%r0
+       ic      %r0,8(%r5)              # get device status
+       chi     %r0,8                   # channel end ?
+       be      .Lcont
+       chi     %r0,12                  # channel end + device end ?
+       be      .Lcont
+
+       l       %r0,4(%r5)
+       s       %r0,8(%r3)              # r0/8 = number of ccws executed
+       mhi     %r0,10                  # *10 = number of bytes in ccws
+       lh      %r3,10(%r5)             # get residual count
+       sr      %r0,%r3                 # #ccws*80-residual=#bytes read
+       ar      %r2,%r0
+
+       br      %r4                     # r2 contains the total size
+
+.Lcont:
+       ahi     %r2,0x640               # add 0x640 to total size
+       la      %r6,.Lccws
+       la      %r7,20
+.Lincr:
+       l       %r0,4(%r6)              # update CCW data addresses
+       ahi     %r0,0x640
+       st      %r0,4(%r6)
+       ahi     %r6,8
+       bct     7,.Lincr
+
+       b       .Lldlp
+.Llderr:
+       lpsw    .Lcrash
+
+       .align  8
+.Lorb: .long   0x00000000,0x0080ff00,.Lccws
+.Lirb: .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+.Lcr6: .long   0xff000000
+.Lloadp:.long  0,0
+       .align  8
+.Lcrash:.long  0x000a0000,0x00000000
+
+       .align  8
+.Lccws: .rept  19
+       .long   0x02600050,0x00000000
+       .endr
+       .long   0x02200050,0x00000000
+
+iplstart:
+       mvi     __LC_AR_MODE_ID,1       # set esame flag
+       slr     %r0,%r0                 # set cpuid to zero
+       lhi     %r1,2                   # mode 2 = esame (dump)
+       sigp    %r1,%r0,0x12            # switch to esame mode
+       bras    %r13,0f
+       .fill   16,4,0x0
+0:     lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
+       sam31                           # switch to 31 bit addressing mode
+       lh      %r1,__LC_SUBCHANNEL_ID  # test if subchannel number
+       bct     %r1,.Lnoload            #  is valid
+       l       %r1,__LC_SUBCHANNEL_ID  # load ipl subchannel number
+       la      %r2,IPL_BS              # load start address
+       bas     %r14,.Lloader           # load rest of ipl image
+       l       %r12,.Lparm             # pointer to parameter area
+       st      %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
+
+#
+# load parameter file from ipl device
+#
+.Lagain1:
+       l       %r2,.Linitrd            # ramdisk loc. is temp
+       bas     %r14,.Lloader           # load parameter file
+       ltr     %r2,%r2                 # got anything ?
+       bz      .Lnopf
+       chi     %r2,895
+       bnh     .Lnotrunc
+       la      %r2,895
+.Lnotrunc:
+       l       %r4,.Linitrd
+       clc     0(3,%r4),.L_hdr         # if it is HDRx
+       bz      .Lagain1                # skip dataset header
+       clc     0(3,%r4),.L_eof         # if it is EOFx
+       bz      .Lagain1                # skip dateset trailer
+       la      %r5,0(%r4,%r2)
+       lr      %r3,%r2
+       la      %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
+       mvc     0(256,%r3),0(%r4)
+       mvc     256(256,%r3),256(%r4)
+       mvc     512(256,%r3),512(%r4)
+       mvc     768(122,%r3),768(%r4)
+       slr     %r0,%r0
+       b       .Lcntlp
+.Ldelspc:
+       ic      %r0,0(%r2,%r3)
+       chi     %r0,0x20                # is it a space ?
+       be      .Lcntlp
+       ahi     %r2,1
+       b       .Leolp
+.Lcntlp:
+       brct    %r2,.Ldelspc
+.Leolp:
+       slr     %r0,%r0
+       stc     %r0,0(%r2,%r3)          # terminate buffer
+.Lnopf:
+
+#
+# load ramdisk from ipl device
+#
+.Lagain2:
+       l       %r2,.Linitrd            # addr of ramdisk
+       st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
+       bas     %r14,.Lloader           # load ramdisk
+       st      %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
+       ltr     %r2,%r2
+       bnz     .Lrdcont
+       st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
+.Lrdcont:
+       l       %r2,.Linitrd
+
+       clc     0(3,%r2),.L_hdr         # skip HDRx and EOFx
+       bz      .Lagain2
+       clc     0(3,%r2),.L_eof
+       bz      .Lagain2
+
+#
+# reset files in VM reader
+#
+       stidp   .Lcpuid                 # store cpuid
+       tm      .Lcpuid,0xff            # running VM ?
+       bno     .Lnoreset
+       la      %r2,.Lreset
+       lhi     %r3,26
+       diag    %r2,%r3,8
+       la      %r5,.Lirb
+       stsch   0(%r5)                  # check if irq is pending
+       tm      30(%r5),0x0f            # by verifying if any of the
+       bnz     .Lwaitforirq            # activity or status control
+       tm      31(%r5),0xff            # bits is set in the schib
+       bz      .Lnoreset
+.Lwaitforirq:
+       bas     %r14,.Lirqwait          # wait for IO interrupt
+       c       %r1,__LC_SUBCHANNEL_ID  # compare subchannel number
+       bne     .Lwaitforirq
+       la      %r5,.Lirb
+       tsch    0(%r5)
+.Lnoreset:
+       b       .Lnoload
+
+#
+# everything loaded, go for it
+#
+.Lnoload:
+       l       %r1,.Lstartup
+       br      %r1
+
+.Linitrd:.long _end                    # default address of initrd
+.Lparm:        .long  PARMAREA
+.Lstartup: .long startup
+.Lreset:.byte  0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
+       .byte   0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
+       .byte   0xc8,0xd6,0xd3,0xc4     # "change rdr all keep nohold"
+.L_eof: .long  0xc5d6c600       /* C'EOF' */
+.L_hdr: .long  0xc8c4d900       /* C'HDR' */
+       .align  8
+.Lcpuid:.fill  8,1,0
+
+#
+# startup-code at 0x10000, running in absolute addressing mode
+# this is called either by the ipl loader or directly by PSW restart
+# or linload or SALIPL
+#
+       .org    0x10000
+ENTRY(startup)
+       j       .Lep_startup_normal
+       .org    0x10008
+#
+# This is a list of s390 kernel entry points. At address 0x1000f the number of
+# valid entry points is stored.
+#
+# IMPORTANT: Do not change this table, it is s390 kernel ABI!
+#
+       .ascii  "S390EP"
+       .byte   0x00,0x01
+#
+# kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
+#
+       .org    0x10010
+ENTRY(startup_kdump)
+       j       .Lep_startup_kdump
+.Lep_startup_normal:
+       mvi     __LC_AR_MODE_ID,1       # set esame flag
+       slr     %r0,%r0                 # set cpuid to zero
+       lhi     %r1,2                   # mode 2 = esame (dump)
+       sigp    %r1,%r0,0x12            # switch to esame mode
+       bras    %r13,0f
+       .fill   16,4,0x0
+0:     lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
+       sam64                           # switch to 64 bit addressing mode
+       basr    %r13,0                  # get base
+.LPG0:
+       xc      0x200(256),0x200        # partially clear lowcore
+       xc      0x300(256),0x300
+       xc      0xe00(256),0xe00
+       xc      0xf00(256),0xf00
+       lctlg   %c0,%c15,0x200(%r0)     # initialize control registers
+       stcke   __LC_BOOT_CLOCK
+       mvc     __LC_LAST_UPDATE_CLOCK(8),__LC_BOOT_CLOCK+1
+       spt     6f-.LPG0(%r13)
+       mvc     __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
+       l       %r15,.Lstack-.LPG0(%r13)
+       ahi     %r15,-STACK_FRAME_OVERHEAD
+       brasl   %r14,verify_facilities
+# For uncompressed images, continue in
+# arch/s390/kernel/head64.S. For compressed images, continue in
+# arch/s390/boot/compressed/head.S.
+       jg      startup_continue
+
+.Lstack:
+       .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_SIZE_ORDER))
+       .align  8
+6:     .long   0x7fffffff,0xffffffff
+
+#include "head_kdump.S"
+
+#
+# params at 10400 (setup.h)
+#
+       .org    PARMAREA
+       .long   0,0                     # IPL_DEVICE
+       .long   0,0                     # INITRD_START
+       .long   0,0                     # INITRD_SIZE
+       .long   0,0                     # OLDMEM_BASE
+       .long   0,0                     # OLDMEM_SIZE
+
+       .org    COMMAND_LINE
+       .byte   "root=/dev/ram0 ro"
+       .byte   0
+
+       .org    0x11000
diff --git a/arch/s390/boot/head_kdump.S b/arch/s390/boot/head_kdump.S
new file mode 100644 (file)
index 0000000..174d695
--- /dev/null
@@ -0,0 +1,101 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * S390 kdump lowlevel functions (new kernel)
+ *
+ * Copyright IBM Corp. 2011
+ * Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com>
+ */
+
+#include <asm/sigp.h>
+
+#define DATAMOVER_ADDR 0x4000
+#define COPY_PAGE_ADDR 0x6000
+
+#ifdef CONFIG_CRASH_DUMP
+
+#
+# kdump entry (new kernel - not yet relocated)
+#
+# Note: This code has to be position independent
+#
+
+.align 2
+.Lep_startup_kdump:
+       lhi     %r1,2                           # mode 2 = esame (dump)
+       sigp    %r1,%r0,SIGP_SET_ARCHITECTURE   # Switch to esame mode
+       sam64                                   # Switch to 64 bit addressing
+       basr    %r13,0
+.Lbase:
+       larl    %r2,.Lbase_addr                 # Check, if we have been
+       lg      %r2,0(%r2)                      # already relocated:
+       clgr    %r2,%r13                        #
+       jne     .Lrelocate                      # No : Start data mover
+       lghi    %r2,0                           # Yes: Start kdump kernel
+       brasl   %r14,startup_kdump_relocated
+
+.Lrelocate:
+       larl    %r4,startup
+       lg      %r2,0x418(%r4)                  # Get kdump base
+       lg      %r3,0x420(%r4)                  # Get kdump size
+
+       larl    %r10,.Lcopy_start               # Source of data mover
+       lghi    %r8,DATAMOVER_ADDR              # Target of data mover
+       mvc     0(256,%r8),0(%r10)              # Copy data mover code
+
+       agr     %r8,%r2                         # Copy data mover to
+       mvc     0(256,%r8),0(%r10)              # reserved mem
+
+       lghi    %r14,DATAMOVER_ADDR             # Jump to copied data mover
+       basr    %r14,%r14
+.Lbase_addr:
+       .quad   .Lbase
+
+#
+# kdump data mover code (runs at address DATAMOVER_ADDR)
+#
+# r2: kdump base address
+# r3: kdump size
+#
+.Lcopy_start:
+       basr    %r13,0                          # Base
+0:
+       lgr     %r11,%r2                        # Save kdump base address
+       lgr     %r12,%r2
+       agr     %r12,%r3                        # Compute kdump end address
+
+       lghi    %r5,0
+       lghi    %r10,COPY_PAGE_ADDR             # Load copy page address
+1:
+       mvc     0(256,%r10),0(%r5)              # Copy old kernel to tmp
+       mvc     0(256,%r5),0(%r11)              # Copy new kernel to old
+       mvc     0(256,%r11),0(%r10)             # Copy tmp to new
+       aghi    %r11,256
+       aghi    %r5,256
+       clgr    %r11,%r12
+       jl      1b
+
+       lg      %r14,.Lstartup_kdump-0b(%r13)
+       basr    %r14,%r14                       # Start relocated kernel
+.Lstartup_kdump:
+       .long   0x00000000,0x00000000 + startup_kdump_relocated
+.Lcopy_end:
+
+#
+# Startup of kdump (relocated new kernel)
+#
+.align 2
+startup_kdump_relocated:
+       basr    %r13,0
+0:     lpswe   .Lrestart_psw-0b(%r13)          # Start new kernel...
+.align 8
+.Lrestart_psw:
+       .quad   0x0000000080000000,0x0000000000000000 + startup
+#else
+.align 2
+.Lep_startup_kdump:
+       larl    %r13,startup_kdump_crash
+       lpswe   0(%r13)
+.align 8
+startup_kdump_crash:
+       .quad   0x0002000080000000,0x0000000000000000 + startup_kdump_crash
+#endif /* CONFIG_CRASH_DUMP */
index 2fed39b26b42e598ac1bdcc8c8a11bcf0dd5279a..dbfd1730e631acfb71d8688ca4383ff98385a106 100644 (file)
@@ -9,38 +9,20 @@ ifdef CONFIG_FUNCTION_TRACER
 CFLAGS_REMOVE_ftrace.o         = $(CC_FLAGS_FTRACE)
 
 # Do not trace early setup code
-CFLAGS_REMOVE_als.o            = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_early.o          = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_early_nobss.o    = $(CC_FLAGS_FTRACE)
 
 endif
 
-GCOV_PROFILE_als.o             := n
 GCOV_PROFILE_early.o           := n
 GCOV_PROFILE_early_nobss.o     := n
 
-KCOV_INSTRUMENT_als.o          := n
 KCOV_INSTRUMENT_early.o                := n
 KCOV_INSTRUMENT_early_nobss.o  := n
 
-UBSAN_SANITIZE_als.o           := n
 UBSAN_SANITIZE_early.o         := n
 UBSAN_SANITIZE_early_nobss.o   := n
 
-#
-# Use -march=z900 for als.c to be able to print an error
-# message if the kernel is started on a machine which is too old
-#
-ifneq ($(CC_FLAGS_MARCH),-march=z900)
-CFLAGS_REMOVE_als.o    += $(CC_FLAGS_MARCH)
-CFLAGS_REMOVE_als.o    += $(CC_FLAGS_EXPOLINE)
-CFLAGS_als.o           += -march=z900
-AFLAGS_REMOVE_head.o   += $(CC_FLAGS_MARCH)
-AFLAGS_head.o          += -march=z900
-endif
-
-CFLAGS_als.o           += -D__NO_FORTIFY
-
 #
 # Passing null pointers is ok for smp code, since we access the lowcore here.
 #
@@ -61,13 +43,13 @@ CFLAGS_ptrace.o             += -DUTS_MACHINE='"$(UTS_MACHINE)"'
 
 obj-y  := traps.o time.o process.o base.o early.o setup.o idle.o vtime.o
 obj-y  += processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o
-obj-y  += debug.o irq.o ipl.o dis.o diag.o vdso.o als.o early_nobss.o
+obj-y  += debug.o irq.o ipl.o dis.o diag.o vdso.o early_nobss.o
 obj-y  += sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o
 obj-y  += runtime_instr.o cache.o fpu.o dumpstack.o guarded_storage.o sthyi.o
 obj-y  += entry.o reipl.o relocate_kernel.o kdebugfs.o alternative.o
 obj-y  += nospec-branch.o
 
-extra-y                                += head.o head64.o vmlinux.lds
+extra-y                                += head64.o vmlinux.lds
 
 obj-$(CONFIG_SYSFS)            += nospec-sysfs.o
 CFLAGS_REMOVE_nospec-branch.o  += $(CC_FLAGS_EXPOLINE)
@@ -99,5 +81,5 @@ obj-$(CONFIG_TRACEPOINTS)     += trace.o
 obj-y                          += vdso64/
 obj-$(CONFIG_COMPAT)           += vdso32/
 
-chkbss := head.o head64.o als.o early_nobss.o
+chkbss := head64.o early_nobss.o
 include $(srctree)/arch/s390/scripts/Makefile.chkbss
diff --git a/arch/s390/kernel/als.c b/arch/s390/kernel/als.c
deleted file mode 100644 (file)
index d1892bf..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- *    Copyright IBM Corp. 2016
- */
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <asm/processor.h>
-#include <asm/facility.h>
-#include <asm/lowcore.h>
-#include <asm/sclp.h>
-#include "entry.h"
-
-/*
- * The code within this file will be called very early. It may _not_
- * access anything within the bss section, since that is not cleared
- * yet and may contain data (e.g. initrd) that must be saved by other
- * code.
- * For temporary objects the stack (16k) should be used.
- */
-
-static unsigned long als[] __initdata = { FACILITIES_ALS };
-
-static void __init u16_to_hex(char *str, u16 val)
-{
-       int i, num;
-
-       for (i = 1; i <= 4; i++) {
-               num = (val >> (16 - 4 * i)) & 0xf;
-               if (num >= 10)
-                       num += 7;
-               *str++ = '0' + num;
-       }
-       *str = '\0';
-}
-
-static void __init print_machine_type(void)
-{
-       static char mach_str[80] __initdata = "Detected machine-type number: ";
-       char type_str[5];
-       struct cpuid id;
-
-       get_cpu_id(&id);
-       u16_to_hex(type_str, id.machine);
-       strcat(mach_str, type_str);
-       strcat(mach_str, "\n");
-       sclp_early_printk(mach_str);
-}
-
-static void __init u16_to_decimal(char *str, u16 val)
-{
-       int div = 1;
-
-       while (div * 10 <= val)
-               div *= 10;
-       while (div) {
-               *str++ = '0' + val / div;
-               val %= div;
-               div /= 10;
-       }
-       *str = '\0';
-}
-
-static void __init print_missing_facilities(void)
-{
-       static char als_str[80] __initdata = "Missing facilities: ";
-       unsigned long val;
-       char val_str[6];
-       int i, j, first;
-
-       first = 1;
-       for (i = 0; i < ARRAY_SIZE(als); i++) {
-               val = ~S390_lowcore.stfle_fac_list[i] & als[i];
-               for (j = 0; j < BITS_PER_LONG; j++) {
-                       if (!(val & (1UL << (BITS_PER_LONG - 1 - j))))
-                               continue;
-                       if (!first)
-                               strcat(als_str, ",");
-                       /*
-                        * Make sure we stay within one line. Consider that
-                        * each facility bit adds up to five characters and
-                        * z/VM adds a four character prefix.
-                        */
-                       if (strlen(als_str) > 70) {
-                               strcat(als_str, "\n");
-                               sclp_early_printk(als_str);
-                               *als_str = '\0';
-                       }
-                       u16_to_decimal(val_str, i * BITS_PER_LONG + j);
-                       strcat(als_str, val_str);
-                       first = 0;
-               }
-       }
-       strcat(als_str, "\n");
-       sclp_early_printk(als_str);
-       sclp_early_printk("See Principles of Operations for facility bits\n");
-}
-
-static void __init facility_mismatch(void)
-{
-       sclp_early_printk("The Linux kernel requires more recent processor hardware\n");
-       print_machine_type();
-       print_missing_facilities();
-       disabled_wait(0x8badcccc);
-}
-
-void __init verify_facilities(void)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(S390_lowcore.stfle_fac_list); i++)
-               S390_lowcore.stfle_fac_list[i] = 0;
-       asm volatile(
-               "       stfl    0(0)\n"
-               : "=m" (S390_lowcore.stfl_fac_list));
-       S390_lowcore.stfle_fac_list[0] = (u64)S390_lowcore.stfl_fac_list << 32;
-       if (S390_lowcore.stfl_fac_list & 0x01000000) {
-               register unsigned long reg0 asm("0") = ARRAY_SIZE(als) - 1;
-
-               asm volatile(".insn s,0xb2b00000,0(%1)" /* stfle */
-                            : "+d" (reg0)
-                            : "a" (&S390_lowcore.stfle_fac_list)
-                            : "memory", "cc");
-       }
-       for (i = 0; i < ARRAY_SIZE(als); i++) {
-               if ((S390_lowcore.stfle_fac_list[i] & als[i]) != als[i])
-                       facility_mismatch();
-       }
-}
index 961abfac2c5fb0b39d6a11a21c1292c6138dbf6c..472fa2f1a4a593f9ac96dfc99089b5bcab732e51 100644 (file)
@@ -83,7 +83,6 @@ long sys_s390_sthyi(unsigned long function_code, void __user *buffer, u64 __user
 
 DECLARE_PER_CPU(u64, mt_cycles[8]);
 
-void verify_facilities(void);
 void gs_load_bc_cb(struct pt_regs *regs);
 void set_fs_fixup(void);
 
diff --git a/arch/s390/kernel/head.S b/arch/s390/kernel/head.S
deleted file mode 100644 (file)
index 5c42f16..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright IBM Corp. 1999, 2010
- *
- *    Author(s): Hartmut Penner <hp@de.ibm.com>
- *              Martin Schwidefsky <schwidefsky@de.ibm.com>
- *              Rob van der Heij <rvdhei@iae.nl>
- *              Heiko Carstens <heiko.carstens@de.ibm.com>
- *
- * There are 5 different IPL methods
- *  1) load the image directly into ram at address 0 and do an PSW restart
- *  2) linload will load the image from address 0x10000 to memory 0x10000
- *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
- *  3) generate the tape ipl header, store the generated image on a tape
- *     and ipl from it
- *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
- *  4) generate the vm reader ipl header, move the generated image to the
- *     VM reader (use option NOH!) and do a ipl from reader (VM only)
- *  5) direct call of start by the SALIPL loader
- *  We use the cpuid to distinguish between VM and native ipl
- *  params for kernel are pushed to 0x10400 (see setup.h)
- *
- */
-
-#include <linux/init.h>
-#include <linux/linkage.h>
-#include <asm/asm-offsets.h>
-#include <asm/thread_info.h>
-#include <asm/page.h>
-#include <asm/ptrace.h>
-
-#define ARCH_OFFSET    4
-
-__HEAD
-
-#define IPL_BS 0x730
-       .org    0
-       .long   0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
-       .long   0x02000018,0x60000050           # by ipl to addresses 0-23.
-       .long   0x02000068,0x60000050           # (a PSW and two CCWs).
-       .fill   80-24,1,0x40                    # bytes 24-79 are discarded !!
-       .long   0x020000f0,0x60000050           # The next 160 byte are loaded
-       .long   0x02000140,0x60000050           # to addresses 0x18-0xb7
-       .long   0x02000190,0x60000050           # They form the continuation
-       .long   0x020001e0,0x60000050           # of the CCW program started
-       .long   0x02000230,0x60000050           # by ipl and load the range
-       .long   0x02000280,0x60000050           # 0x0f0-0x730 from the image
-       .long   0x020002d0,0x60000050           # to the range 0x0f0-0x730
-       .long   0x02000320,0x60000050           # in memory. At the end of
-       .long   0x02000370,0x60000050           # the channel program the PSW
-       .long   0x020003c0,0x60000050           # at location 0 is loaded.
-       .long   0x02000410,0x60000050           # Initial processing starts
-       .long   0x02000460,0x60000050           # at 0x200 = iplstart.
-       .long   0x020004b0,0x60000050
-       .long   0x02000500,0x60000050
-       .long   0x02000550,0x60000050
-       .long   0x020005a0,0x60000050
-       .long   0x020005f0,0x60000050
-       .long   0x02000640,0x60000050
-       .long   0x02000690,0x60000050
-       .long   0x020006e0,0x20000050
-
-       .org    0x200
-
-#
-# subroutine to wait for end I/O
-#
-.Lirqwait:
-       mvc     __LC_IO_NEW_PSW(16),.Lnewpsw    # set up IO interrupt psw
-       lpsw    .Lwaitpsw
-.Lioint:
-       br      %r14
-       .align  8
-.Lnewpsw:
-       .quad   0x0000000080000000,.Lioint
-.Lwaitpsw:
-       .long   0x020a0000,0x80000000+.Lioint
-
-#
-# subroutine for loading cards from the reader
-#
-.Lloader:
-       la      %r4,0(%r14)
-       la      %r3,.Lorb               # r2 = address of orb into r2
-       la      %r5,.Lirb               # r4 = address of irb
-       la      %r6,.Lccws
-       la      %r7,20
-.Linit:
-       st      %r2,4(%r6)              # initialize CCW data addresses
-       la      %r2,0x50(%r2)
-       la      %r6,8(%r6)
-       bct     7,.Linit
-
-       lctl    %c6,%c6,.Lcr6           # set IO subclass mask
-       slr     %r2,%r2
-.Lldlp:
-       ssch    0(%r3)                  # load chunk of 1600 bytes
-       bnz     .Llderr
-.Lwait4irq:
-       bas     %r14,.Lirqwait
-       c       %r1,__LC_SUBCHANNEL_ID  # compare subchannel number
-       bne     .Lwait4irq
-       tsch    0(%r5)
-
-       slr     %r0,%r0
-       ic      %r0,8(%r5)              # get device status
-       chi     %r0,8                   # channel end ?
-       be      .Lcont
-       chi     %r0,12                  # channel end + device end ?
-       be      .Lcont
-
-       l       %r0,4(%r5)
-       s       %r0,8(%r3)              # r0/8 = number of ccws executed
-       mhi     %r0,10                  # *10 = number of bytes in ccws
-       lh      %r3,10(%r5)             # get residual count
-       sr      %r0,%r3                 # #ccws*80-residual=#bytes read
-       ar      %r2,%r0
-
-       br      %r4                     # r2 contains the total size
-
-.Lcont:
-       ahi     %r2,0x640               # add 0x640 to total size
-       la      %r6,.Lccws
-       la      %r7,20
-.Lincr:
-       l       %r0,4(%r6)              # update CCW data addresses
-       ahi     %r0,0x640
-       st      %r0,4(%r6)
-       ahi     %r6,8
-       bct     7,.Lincr
-
-       b       .Lldlp
-.Llderr:
-       lpsw    .Lcrash
-
-       .align  8
-.Lorb: .long   0x00000000,0x0080ff00,.Lccws
-.Lirb: .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-.Lcr6: .long   0xff000000
-.Lloadp:.long  0,0
-       .align  8
-.Lcrash:.long  0x000a0000,0x00000000
-
-       .align  8
-.Lccws: .rept  19
-       .long   0x02600050,0x00000000
-       .endr
-       .long   0x02200050,0x00000000
-
-iplstart:
-       mvi     __LC_AR_MODE_ID,1       # set esame flag
-       slr     %r0,%r0                 # set cpuid to zero
-       lhi     %r1,2                   # mode 2 = esame (dump)
-       sigp    %r1,%r0,0x12            # switch to esame mode
-       bras    %r13,0f
-       .fill   16,4,0x0
-0:     lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
-       sam31                           # switch to 31 bit addressing mode
-       lh      %r1,__LC_SUBCHANNEL_ID  # test if subchannel number
-       bct     %r1,.Lnoload            #  is valid
-       l       %r1,__LC_SUBCHANNEL_ID  # load ipl subchannel number
-       la      %r2,IPL_BS              # load start address
-       bas     %r14,.Lloader           # load rest of ipl image
-       l       %r12,.Lparm             # pointer to parameter area
-       st      %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
-
-#
-# load parameter file from ipl device
-#
-.Lagain1:
-       l       %r2,.Linitrd            # ramdisk loc. is temp
-       bas     %r14,.Lloader           # load parameter file
-       ltr     %r2,%r2                 # got anything ?
-       bz      .Lnopf
-       chi     %r2,895
-       bnh     .Lnotrunc
-       la      %r2,895
-.Lnotrunc:
-       l       %r4,.Linitrd
-       clc     0(3,%r4),.L_hdr         # if it is HDRx
-       bz      .Lagain1                # skip dataset header
-       clc     0(3,%r4),.L_eof         # if it is EOFx
-       bz      .Lagain1                # skip dateset trailer
-       la      %r5,0(%r4,%r2)
-       lr      %r3,%r2
-       la      %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
-       mvc     0(256,%r3),0(%r4)
-       mvc     256(256,%r3),256(%r4)
-       mvc     512(256,%r3),512(%r4)
-       mvc     768(122,%r3),768(%r4)
-       slr     %r0,%r0
-       b       .Lcntlp
-.Ldelspc:
-       ic      %r0,0(%r2,%r3)
-       chi     %r0,0x20                # is it a space ?
-       be      .Lcntlp
-       ahi     %r2,1
-       b       .Leolp
-.Lcntlp:
-       brct    %r2,.Ldelspc
-.Leolp:
-       slr     %r0,%r0
-       stc     %r0,0(%r2,%r3)          # terminate buffer
-.Lnopf:
-
-#
-# load ramdisk from ipl device
-#
-.Lagain2:
-       l       %r2,.Linitrd            # addr of ramdisk
-       st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
-       bas     %r14,.Lloader           # load ramdisk
-       st      %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
-       ltr     %r2,%r2
-       bnz     .Lrdcont
-       st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
-.Lrdcont:
-       l       %r2,.Linitrd
-
-       clc     0(3,%r2),.L_hdr         # skip HDRx and EOFx
-       bz      .Lagain2
-       clc     0(3,%r2),.L_eof
-       bz      .Lagain2
-
-#
-# reset files in VM reader
-#
-       stidp   .Lcpuid                 # store cpuid
-       tm      .Lcpuid,0xff            # running VM ?
-       bno     .Lnoreset
-       la      %r2,.Lreset
-       lhi     %r3,26
-       diag    %r2,%r3,8
-       la      %r5,.Lirb
-       stsch   0(%r5)                  # check if irq is pending
-       tm      30(%r5),0x0f            # by verifying if any of the
-       bnz     .Lwaitforirq            # activity or status control
-       tm      31(%r5),0xff            # bits is set in the schib
-       bz      .Lnoreset
-.Lwaitforirq:
-       bas     %r14,.Lirqwait          # wait for IO interrupt
-       c       %r1,__LC_SUBCHANNEL_ID  # compare subchannel number
-       bne     .Lwaitforirq
-       la      %r5,.Lirb
-       tsch    0(%r5)
-.Lnoreset:
-       b       .Lnoload
-
-#
-# everything loaded, go for it
-#
-.Lnoload:
-       l       %r1,.Lstartup
-       br      %r1
-
-.Linitrd:.long _end                    # default address of initrd
-.Lparm:        .long  PARMAREA
-.Lstartup: .long startup
-.Lreset:.byte  0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
-       .byte   0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
-       .byte   0xc8,0xd6,0xd3,0xc4     # "change rdr all keep nohold"
-.L_eof: .long  0xc5d6c600       /* C'EOF' */
-.L_hdr: .long  0xc8c4d900       /* C'HDR' */
-       .align  8
-.Lcpuid:.fill  8,1,0
-
-#
-# startup-code at 0x10000, running in absolute addressing mode
-# this is called either by the ipl loader or directly by PSW restart
-# or linload or SALIPL
-#
-       .org    0x10000
-ENTRY(startup)
-       j       .Lep_startup_normal
-       .org    0x10008
-#
-# This is a list of s390 kernel entry points. At address 0x1000f the number of
-# valid entry points is stored.
-#
-# IMPORTANT: Do not change this table, it is s390 kernel ABI!
-#
-       .ascii  "S390EP"
-       .byte   0x00,0x01
-#
-# kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
-#
-       .org    0x10010
-ENTRY(startup_kdump)
-       j       .Lep_startup_kdump
-.Lep_startup_normal:
-       mvi     __LC_AR_MODE_ID,1       # set esame flag
-       slr     %r0,%r0                 # set cpuid to zero
-       lhi     %r1,2                   # mode 2 = esame (dump)
-       sigp    %r1,%r0,0x12            # switch to esame mode
-       bras    %r13,0f
-       .fill   16,4,0x0
-0:     lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
-       sam64                           # switch to 64 bit addressing mode
-       basr    %r13,0                  # get base
-.LPG0:
-       xc      0x200(256),0x200        # partially clear lowcore
-       xc      0x300(256),0x300
-       xc      0xe00(256),0xe00
-       xc      0xf00(256),0xf00
-       lctlg   %c0,%c15,0x200(%r0)     # initialize control registers
-       stcke   __LC_BOOT_CLOCK
-       mvc     __LC_LAST_UPDATE_CLOCK(8),__LC_BOOT_CLOCK+1
-       spt     6f-.LPG0(%r13)
-       mvc     __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
-       l       %r15,.Lstack-.LPG0(%r13)
-       ahi     %r15,-STACK_FRAME_OVERHEAD
-       brasl   %r14,verify_facilities
-# For uncompressed images, continue in
-# arch/s390/kernel/head64.S. For compressed images, continue in
-# arch/s390/boot/compressed/head.S.
-       jg      startup_continue
-
-.Lstack:
-       .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_SIZE_ORDER))
-       .align  8
-6:     .long   0x7fffffff,0xffffffff
-
-#include "head_kdump.S"
-
-#
-# params at 10400 (setup.h)
-#
-       .org    PARMAREA
-       .long   0,0                     # IPL_DEVICE
-       .long   0,0                     # INITRD_START
-       .long   0,0                     # INITRD_SIZE
-       .long   0,0                     # OLDMEM_BASE
-       .long   0,0                     # OLDMEM_SIZE
-
-       .org    COMMAND_LINE
-       .byte   "root=/dev/ram0 ro"
-       .byte   0
-
-       .org    0x11000
index 53e5cb0d6f7f01b45b4fcc55f5040c27fd37cbf9..6a840bcb27157556cd85ca5e8015ee170528aba2 100644 (file)
@@ -16,7 +16,7 @@
 #include <asm/page.h>
 
 __HEAD
-       .org    0x100000 - 0x11000              # head.o ends at 0x11000
+       .org    0x100000
 ENTRY(startup_continue)
        tm      __LC_STFLE_FAC_LIST+5,0x80      # LPP available ?
        jz      0f
diff --git a/arch/s390/kernel/head_kdump.S b/arch/s390/kernel/head_kdump.S
deleted file mode 100644 (file)
index 174d695..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * S390 kdump lowlevel functions (new kernel)
- *
- * Copyright IBM Corp. 2011
- * Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com>
- */
-
-#include <asm/sigp.h>
-
-#define DATAMOVER_ADDR 0x4000
-#define COPY_PAGE_ADDR 0x6000
-
-#ifdef CONFIG_CRASH_DUMP
-
-#
-# kdump entry (new kernel - not yet relocated)
-#
-# Note: This code has to be position independent
-#
-
-.align 2
-.Lep_startup_kdump:
-       lhi     %r1,2                           # mode 2 = esame (dump)
-       sigp    %r1,%r0,SIGP_SET_ARCHITECTURE   # Switch to esame mode
-       sam64                                   # Switch to 64 bit addressing
-       basr    %r13,0
-.Lbase:
-       larl    %r2,.Lbase_addr                 # Check, if we have been
-       lg      %r2,0(%r2)                      # already relocated:
-       clgr    %r2,%r13                        #
-       jne     .Lrelocate                      # No : Start data mover
-       lghi    %r2,0                           # Yes: Start kdump kernel
-       brasl   %r14,startup_kdump_relocated
-
-.Lrelocate:
-       larl    %r4,startup
-       lg      %r2,0x418(%r4)                  # Get kdump base
-       lg      %r3,0x420(%r4)                  # Get kdump size
-
-       larl    %r10,.Lcopy_start               # Source of data mover
-       lghi    %r8,DATAMOVER_ADDR              # Target of data mover
-       mvc     0(256,%r8),0(%r10)              # Copy data mover code
-
-       agr     %r8,%r2                         # Copy data mover to
-       mvc     0(256,%r8),0(%r10)              # reserved mem
-
-       lghi    %r14,DATAMOVER_ADDR             # Jump to copied data mover
-       basr    %r14,%r14
-.Lbase_addr:
-       .quad   .Lbase
-
-#
-# kdump data mover code (runs at address DATAMOVER_ADDR)
-#
-# r2: kdump base address
-# r3: kdump size
-#
-.Lcopy_start:
-       basr    %r13,0                          # Base
-0:
-       lgr     %r11,%r2                        # Save kdump base address
-       lgr     %r12,%r2
-       agr     %r12,%r3                        # Compute kdump end address
-
-       lghi    %r5,0
-       lghi    %r10,COPY_PAGE_ADDR             # Load copy page address
-1:
-       mvc     0(256,%r10),0(%r5)              # Copy old kernel to tmp
-       mvc     0(256,%r5),0(%r11)              # Copy new kernel to old
-       mvc     0(256,%r11),0(%r10)             # Copy tmp to new
-       aghi    %r11,256
-       aghi    %r5,256
-       clgr    %r11,%r12
-       jl      1b
-
-       lg      %r14,.Lstartup_kdump-0b(%r13)
-       basr    %r14,%r14                       # Start relocated kernel
-.Lstartup_kdump:
-       .long   0x00000000,0x00000000 + startup_kdump_relocated
-.Lcopy_end:
-
-#
-# Startup of kdump (relocated new kernel)
-#
-.align 2
-startup_kdump_relocated:
-       basr    %r13,0
-0:     lpswe   .Lrestart_psw-0b(%r13)          # Start new kernel...
-.align 8
-.Lrestart_psw:
-       .quad   0x0000000080000000,0x0000000000000000 + startup
-#else
-.align 2
-.Lep_startup_kdump:
-       larl    %r13,startup_kdump_crash
-       lpswe   0(%r13)
-.align 8
-startup_kdump_crash:
-       .quad   0x0002000080000000,0x0000000000000000 + startup_kdump_crash
-#endif /* CONFIG_CRASH_DUMP */
index f0414f52817b1491ff1437b9ed9a23f798903195..31f530b8a1b35aeac5e34477277e8cd81db7aa37 100644 (file)
@@ -19,7 +19,7 @@
 
 OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
 OUTPUT_ARCH(s390:64-bit)
-ENTRY(startup)
+ENTRY(startup_continue)
 jiffies = jiffies_64;
 
 PHDRS {