obj-$(CONFIG_CRYPTO_HW)                += crypto/
 obj-$(CONFIG_S390_HYPFS_FS)    += hypfs/
 obj-$(CONFIG_APPLDATA_BASE)    += appldata/
-obj-$(CONFIG_MATHEMU)          += math-emu/
 obj-y                          += net/
 obj-$(CONFIG_PCI)              += pci/
 
        def_bool y
 
 config ARCH_DMA_ADDR_T_64BIT
-       def_bool 64BIT
+       def_bool y
 
 config GENERIC_LOCKBREAK
        def_bool y if SMP && PREEMPT
        def_bool n
 
 config ARCH_SUPPORTS_UPROBES
-       def_bool 64BIT
+       def_bool y
 
 config S390
        def_bool y
        select GENERIC_TIME_VSYSCALL
        select HAVE_ALIGNED_STRUCT_PAGE if SLUB
        select HAVE_ARCH_AUDITSYSCALL
-       select HAVE_ARCH_JUMP_LABEL if !MARCH_G5
+       select HAVE_ARCH_JUMP_LABEL
        select HAVE_ARCH_SECCOMP_FILTER
        select HAVE_ARCH_TRACEHOOK
-       select HAVE_ARCH_TRANSPARENT_HUGEPAGE if 64BIT
-       select HAVE_BPF_JIT if 64BIT && PACK_STACK
+       select HAVE_ARCH_TRANSPARENT_HUGEPAGE
+       select HAVE_BPF_JIT if PACK_STACK
        select HAVE_CMPXCHG_DOUBLE
        select HAVE_CMPXCHG_LOCAL
        select HAVE_DEBUG_KMEMLEAK
-       select HAVE_DYNAMIC_FTRACE if 64BIT
-       select HAVE_DYNAMIC_FTRACE_WITH_REGS if 64BIT
+       select HAVE_DYNAMIC_FTRACE
+       select HAVE_DYNAMIC_FTRACE_WITH_REGS
        select HAVE_FTRACE_MCOUNT_RECORD
-       select HAVE_FUNCTION_GRAPH_TRACER if 64BIT
-       select HAVE_FUNCTION_TRACER if 64BIT
+       select HAVE_FUNCTION_GRAPH_TRACER
+       select HAVE_FUNCTION_TRACER
        select HAVE_FUTEX_CMPXCHG if FUTEX
        select HAVE_KERNEL_BZIP2
        select HAVE_KERNEL_GZIP
        select HAVE_KERNEL_XZ
        select HAVE_KPROBES
        select HAVE_KRETPROBES
-       select HAVE_KVM if 64BIT
+       select HAVE_KVM
        select HAVE_MEMBLOCK
        select HAVE_MEMBLOCK_NODE_MAP
        select HAVE_MEMBLOCK_PHYS_MAP
        select HAVE_PERF_EVENTS
        select HAVE_REGS_AND_STACK_ACCESS_API
        select HAVE_SYSCALL_TRACEPOINTS
-       select HAVE_UID16 if 32BIT
        select HAVE_VIRT_CPU_ACCOUNTING
        select MODULES_USE_ELF_RELA
        select NO_BOOTMEM
 
 choice
        prompt "Processor type"
-       default MARCH_G5
-
-config MARCH_G5
-       bool "System/390 model G5 and G6"
-       depends on !64BIT
-       help
-         Select this to build a 31 bit kernel that works
-         on all ESA/390 and z/Architecture machines.
+       default MARCH_Z900
 
 config MARCH_Z900
        bool "IBM zSeries model z800 and z900"
-       select HAVE_MARCH_Z900_FEATURES if 64BIT
+       select HAVE_MARCH_Z900_FEATURES
        help
          Select this to enable optimizations for model z800/z900 (2064 and
          2066 series). This will enable some optimizations that are not
 
 config MARCH_Z990
        bool "IBM zSeries model z890 and z990"
-       select HAVE_MARCH_Z990_FEATURES if 64BIT
+       select HAVE_MARCH_Z990_FEATURES
        help
          Select this to enable optimizations for model z890/z990 (2084 and
          2086 series). The kernel will be slightly faster but will not work
 
 config MARCH_Z9_109
        bool "IBM System z9"
-       select HAVE_MARCH_Z9_109_FEATURES if 64BIT
+       select HAVE_MARCH_Z9_109_FEATURES
        help
          Select this to enable optimizations for IBM System z9 (2094 and
          2096 series). The kernel will be slightly faster but will not work
 
 config MARCH_Z10
        bool "IBM System z10"
-       select HAVE_MARCH_Z10_FEATURES if 64BIT
+       select HAVE_MARCH_Z10_FEATURES
        help
          Select this to enable optimizations for IBM System z10 (2097 and
          2098 series). The kernel will be slightly faster but will not work
 
 config MARCH_Z196
        bool "IBM zEnterprise 114 and 196"
-       select HAVE_MARCH_Z196_FEATURES if 64BIT
+       select HAVE_MARCH_Z196_FEATURES
        help
          Select this to enable optimizations for IBM zEnterprise 114 and 196
          (2818 and 2817 series). The kernel will be slightly faster but will
 
 config MARCH_ZEC12
        bool "IBM zBC12 and zEC12"
-       select HAVE_MARCH_ZEC12_FEATURES if 64BIT
+       select HAVE_MARCH_ZEC12_FEATURES
        help
          Select this to enable optimizations for IBM zBC12 and zEC12 (2828 and
          2827 series). The kernel will be slightly faster but will not work on
 
 config MARCH_Z13
        bool "IBM z13"
-       select HAVE_MARCH_Z13_FEATURES if 64BIT
+       select HAVE_MARCH_Z13_FEATURES
        help
          Select this to enable optimizations for IBM z13 (2964 series).
          The kernel will be slightly faster but will not work on older
 
 endchoice
 
-config MARCH_G5_TUNE
-       def_bool TUNE_G5 || MARCH_G5 && TUNE_DEFAULT
-
 config MARCH_Z900_TUNE
        def_bool TUNE_Z900 || MARCH_Z900 && TUNE_DEFAULT
 
          Tune the generated code for the target processor for which the kernel
          will be compiled.
 
-config TUNE_G5
-       bool "System/390 model G5 and G6"
-
 config TUNE_Z900
        bool "IBM zSeries model z800 and z900"
 
 
 config 64BIT
        def_bool y
-       prompt "64 bit kernel"
-       help
-         Select this option if you have an IBM z/Architecture machine
-         and want to use the 64 bit addressing mode.
-
-config 32BIT
-       def_bool y if !64BIT
 
 config COMPAT
        def_bool y
        prompt "Kernel support for 31 bit emulation"
-       depends on 64BIT
        select COMPAT_BINFMT_ELF if BINFMT_ELF
        select ARCH_WANT_OLD_COMPAT_IPC
        select COMPAT_OLD_SIGACTION
        int "Maximum number of CPUs (2-512)"
        range 2 512
        depends on SMP
-       default "32" if !64BIT
-       default "64" if 64BIT
+       default "64"
        help
          This allows you to specify the maximum number of CPUs which this
          kernel will support. The maximum supported value is 512 and the
 
 source kernel/Kconfig.preempt
 
-config MATHEMU
-       def_bool y
-       prompt "IEEE FPU emulation"
-       depends on MARCH_G5
-       help
-         This option is required for IEEE compliant floating point arithmetic
-         on older ESA/390 machines. Say Y unless you know your machine doesn't
-         need this.
-
 source kernel/Kconfig.hz
 
 endmenu
        def_bool y
        select SPARSEMEM_VMEMMAP_ENABLE
        select SPARSEMEM_VMEMMAP
-       select SPARSEMEM_STATIC if !64BIT
 
 config ARCH_SPARSEMEM_DEFAULT
        def_bool y
 
 config ARCH_ENABLE_SPLIT_PMD_PTLOCK
        def_bool y
-       depends on 64BIT
 
 config FORCE_MAX_ZONEORDER
        int
 
 menuconfig PCI
        bool "PCI support"
-       depends on 64BIT
        select HAVE_DMA_ATTRS
        select PCI_MSI
        help
 
 config SCM_BUS
        def_bool y
-       depends on 64BIT
        prompt "SCM bus driver"
        help
          Bus driver for Storage Class Memory.
 
 config CRASH_DUMP
        bool "kernel crash dumps"
-       depends on 64BIT && SMP
+       depends on SMP
        select KEXEC
        help
          Generate crash dump after being started by kexec.
 menu "Power Management"
 
 config ARCH_HIBERNATION_POSSIBLE
-       def_bool y if 64BIT
+       def_bool y
 
 source "kernel/power/Kconfig"
 
 config S390_GUEST
        def_bool y
        prompt "s390 support for virtio devices"
-       depends on 64BIT
        select TTY
        select VIRTUALIZATION
        select VIRTIO
 
 # Copyright (C) 1994 by Linus Torvalds
 #
 
-ifndef CONFIG_64BIT
-LD_BFD         := elf32-s390
-LDFLAGS                := -m elf_s390
-KBUILD_CFLAGS  += -m31
-KBUILD_AFLAGS  += -m31
-UTS_MACHINE    := s390
-STACK_SIZE     := 8192
-CHECKFLAGS     += -D__s390__ -msize-long
-else
 LD_BFD         := elf64-s390
 LDFLAGS                := -m elf64_s390
 KBUILD_AFLAGS_MODULE += -fPIC
 UTS_MACHINE    := s390x
 STACK_SIZE     := 16384
 CHECKFLAGS     += -D__s390__ -D__s390x__
-endif
 
 export LD_BFD
 
-mflags-$(CONFIG_MARCH_G5)     := -march=g5
 mflags-$(CONFIG_MARCH_Z900)   := -march=z900
 mflags-$(CONFIG_MARCH_Z990)   := -march=z990
 mflags-$(CONFIG_MARCH_Z9_109) := -march=z9-109
 aflags-y += $(mflags-y)
 cflags-y += $(mflags-y)
 
-cflags-$(CONFIG_MARCH_G5_TUNE)         += -mtune=g5
 cflags-$(CONFIG_MARCH_Z900_TUNE)       += -mtune=z900
 cflags-$(CONFIG_MARCH_Z990_TUNE)       += -mtune=z990
 cflags-$(CONFIG_MARCH_Z9_109_TUNE)     += -mtune=z9-109
 OBJCOPYFLAGS   := -O binary
 
 head-y         := arch/s390/kernel/head.o
-head-y         += arch/s390/kernel/$(if $(CONFIG_64BIT),head64.o,head31.o)
+head-y         += arch/s390/kernel/head64.o
 
 # See arch/s390/Kbuild for content of core part of the kernel
 core-y         += arch/s390/
        $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
 
 vdso_install:
-ifeq ($(CONFIG_64BIT),y)
        $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@
-endif
        $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso32 $@
 
 archclean:
 
 # create a compressed vmlinux image from the original vmlinux
 #
 
-BITS := $(if $(CONFIG_64BIT),64,31)
-
 targets        := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2
 targets += vmlinux.bin.xz vmlinux.bin.lzma vmlinux.bin.lzo vmlinux.bin.lz4
-targets += misc.o piggy.o sizes.h head$(BITS).o
+targets += misc.o piggy.o sizes.h head64.o
 
-KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2
+KBUILD_CFLAGS := -m64 -D__KERNEL__ $(LINUX_INCLUDE) -O2
 KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
 KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks
 KBUILD_CFLAGS += $(call cc-option,-mpacked-stack)
 GCOV_PROFILE := n
 
 OBJECTS := $(addprefix $(objtree)/arch/s390/kernel/, head.o sclp.o ebcdic.o)
-OBJECTS += $(obj)/head$(BITS).o $(obj)/misc.o $(obj)/piggy.o
+OBJECTS += $(obj)/head64.o $(obj)/misc.o $(obj)/piggy.o
 
 LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup -T
 $(obj)/vmlinux: $(obj)/vmlinux.lds $(OBJECTS)
 $(obj)/sizes.h: vmlinux
        $(call if_changed,sizes)
 
-AFLAGS_head$(BITS).o += -I$(obj)
-$(obj)/head$(BITS).o: $(obj)/sizes.h
+AFLAGS_head64.o += -I$(obj)
+$(obj)/head64.o: $(obj)/sizes.h
 
 CFLAGS_misc.o += -I$(obj)
 $(obj)/misc.o: $(obj)/sizes.h
 
+++ /dev/null
-/*
- * Startup glue code to uncompress the kernel
- *
- * Copyright IBM Corp. 2010
- *
- *   Author(s):        Martin Schwidefsky <schwidefsky@de.ibm.com>
- */
-
-#include <linux/init.h>
-#include <linux/linkage.h>
-#include <asm/asm-offsets.h>
-#include <asm/thread_info.h>
-#include <asm/page.h>
-#include "sizes.h"
-
-__HEAD
-ENTRY(startup_continue)
-       basr    %r13,0                  # get base
-.LPG1:
-       # setup stack
-       l       %r15,.Lstack-.LPG1(%r13)
-       ahi     %r15,-96
-       l       %r1,.Ldecompress-.LPG1(%r13)
-       basr    %r14,%r1
-       # setup registers for memory mover & branch to target
-       lr      %r4,%r2
-       l       %r2,.Loffset-.LPG1(%r13)
-       la      %r4,0(%r2,%r4)
-       l       %r3,.Lmvsize-.LPG1(%r13)
-       lr      %r5,%r3
-       # move the memory mover someplace safe
-       la      %r1,0x200
-       mvc     0(mover_end-mover,%r1),mover-.LPG1(%r13)
-       # decompress image is started at 0x11000
-       lr      %r6,%r2
-       br      %r1
-mover:
-       mvcle   %r2,%r4,0
-       jo      mover
-       br      %r6
-mover_end:
-
-       .align  8
-.Lstack:
-       .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
-.Ldecompress:
-       .long   decompress_kernel
-.Loffset:
-       .long   0x11000
-.Lmvsize:
-       .long   SZ__bss_start
 
 #include <asm-generic/vmlinux.lds.h>
 
-#ifdef CONFIG_64BIT
 OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
 OUTPUT_ARCH(s390:64-bit)
-#else
-OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
-OUTPUT_ARCH(s390:31-bit)
-#endif
 
 ENTRY(startup)
 
 
 static void diag0c(struct hypfs_diag0c_entry *entry)
 {
        asm volatile (
-#ifdef CONFIG_64BIT
                "       sam31\n"
                "       diag    %0,%0,0x0c\n"
                "       sam64\n"
-#else
-               "       diag %0,%0,0x0c\n"
-#endif
                : /* no output register */
                : "a" (entry)
                : "memory");
 
 
 #include <asm/io.h>
 
-#ifndef CONFIG_64BIT
-
-#define APPLDATA_START_INTERVAL_REC    0x00    /* Function codes for */
-#define APPLDATA_STOP_REC              0x01    /* DIAG 0xDC          */
-#define APPLDATA_GEN_EVENT_REC         0x02
-#define APPLDATA_START_CONFIG_REC      0x03
-
-/*
- * Parameter list for DIAGNOSE X'DC'
- */
-struct appldata_parameter_list {
-       u16 diag;               /* The DIAGNOSE code X'00DC'          */
-       u8  function;           /* The function code for the DIAGNOSE */
-       u8  parlist_length;     /* Length of the parameter list       */
-       u32 product_id_addr;    /* Address of the 16-byte product ID  */
-       u16 reserved;
-       u16 buffer_length;      /* Length of the application data buffer  */
-       u32 buffer_addr;        /* Address of the application data buffer */
-} __attribute__ ((packed));
-
-#else /* CONFIG_64BIT */
-
 #define APPLDATA_START_INTERVAL_REC    0x80
 #define APPLDATA_STOP_REC              0x81
 #define APPLDATA_GEN_EVENT_REC         0x82
        u64 buffer_addr;
 } __attribute__ ((packed));
 
-#endif /* CONFIG_64BIT */
-
 struct appldata_product_id {
        char prod_nr[7];        /* product number */
        u16  prod_fn;           /* product function */
 
 
 #define ATOMIC64_INIT(i)  { (i) }
 
-#ifdef CONFIG_64BIT
-
 #define __ATOMIC64_NO_BARRIER  "\n"
 
 #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
 
 #undef __ATOMIC64_LOOP
 
-#else /* CONFIG_64BIT */
-
-typedef struct {
-       long long counter;
-} atomic64_t;
-
-static inline long long atomic64_read(const atomic64_t *v)
-{
-       register_pair rp;
-
-       asm volatile(
-               "       lm      %0,%N0,%1"
-               : "=&d" (rp) : "Q" (v->counter) );
-       return rp.pair;
-}
-
-static inline void atomic64_set(atomic64_t *v, long long i)
-{
-       register_pair rp = {.pair = i};
-
-       asm volatile(
-               "       stm     %1,%N1,%0"
-               : "=Q" (v->counter) : "d" (rp) );
-}
-
-static inline long long atomic64_xchg(atomic64_t *v, long long new)
-{
-       register_pair rp_new = {.pair = new};
-       register_pair rp_old;
-
-       asm volatile(
-               "       lm      %0,%N0,%1\n"
-               "0:     cds     %0,%2,%1\n"
-               "       jl      0b\n"
-               : "=&d" (rp_old), "+Q" (v->counter)
-               : "d" (rp_new)
-               : "cc");
-       return rp_old.pair;
-}
-
-static inline long long atomic64_cmpxchg(atomic64_t *v,
-                                        long long old, long long new)
-{
-       register_pair rp_old = {.pair = old};
-       register_pair rp_new = {.pair = new};
-
-       asm volatile(
-               "       cds     %0,%2,%1"
-               : "+&d" (rp_old), "+Q" (v->counter)
-               : "d" (rp_new)
-               : "cc");
-       return rp_old.pair;
-}
-
-
-static inline long long atomic64_add_return(long long i, atomic64_t *v)
-{
-       long long old, new;
-
-       do {
-               old = atomic64_read(v);
-               new = old + i;
-       } while (atomic64_cmpxchg(v, old, new) != old);
-       return new;
-}
-
-static inline void atomic64_set_mask(unsigned long long mask, atomic64_t *v)
-{
-       long long old, new;
-
-       do {
-               old = atomic64_read(v);
-               new = old | mask;
-       } while (atomic64_cmpxchg(v, old, new) != old);
-}
-
-static inline void atomic64_clear_mask(unsigned long long mask, atomic64_t *v)
-{
-       long long old, new;
-
-       do {
-               old = atomic64_read(v);
-               new = old & mask;
-       } while (atomic64_cmpxchg(v, old, new) != old);
-}
-
-static inline void atomic64_add(long long i, atomic64_t *v)
-{
-       atomic64_add_return(i, v);
-}
-
-#endif /* CONFIG_64BIT */
-
 static inline int atomic64_add_unless(atomic64_t *v, long long i, long long u)
 {
        long long c, old;
 
 
 #define __BITOPS_NO_BARRIER    "\n"
 
-#ifndef CONFIG_64BIT
-
-#define __BITOPS_OR            "or"
-#define __BITOPS_AND           "nr"
-#define __BITOPS_XOR           "xr"
-#define __BITOPS_BARRIER       "\n"
-
-#define __BITOPS_LOOP(__addr, __val, __op_string, __barrier)   \
-({                                                             \
-       unsigned long __old, __new;                             \
-                                                               \
-       typecheck(unsigned long *, (__addr));                   \
-       asm volatile(                                           \
-               "       l       %0,%2\n"                        \
-               "0:     lr      %1,%0\n"                        \
-               __op_string "   %1,%3\n"                        \
-               "       cs      %0,%1,%2\n"                     \
-               "       jl      0b"                             \
-               : "=&d" (__old), "=&d" (__new), "+Q" (*(__addr))\
-               : "d" (__val)                                   \
-               : "cc", "memory");                              \
-       __old;                                                  \
-})
-
-#else /* CONFIG_64BIT */
-
 #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
 
 #define __BITOPS_OR            "laog"
 
 #endif /* CONFIG_HAVE_MARCH_Z196_FEATURES */
 
-#endif /* CONFIG_64BIT */
-
 #define __BITOPS_WORDS(bits) (((bits) + BITS_PER_LONG - 1) / BITS_PER_LONG)
 
 static inline unsigned long *
 
 
 static inline unsigned long __div(unsigned long long n, unsigned long base)
 {
-#ifndef CONFIG_64BIT
-       register_pair rp;
-
-       rp.pair = n >> 1;
-       asm ("dr %0,%1" : "+d" (rp) : "d" (base >> 1));
-       return rp.subreg.odd;
-#else /* CONFIG_64BIT */
        return n / base;
-#endif /* CONFIG_64BIT */
 }
 
 #define cputime_one_jiffy              jiffies_to_cputime(1)
                                       struct timespec *value)
 {
        unsigned long long __cputime = (__force unsigned long long) cputime;
-#ifndef CONFIG_64BIT
-       register_pair rp;
-
-       rp.pair = __cputime >> 1;
-       asm ("dr %0,%1" : "+d" (rp) : "d" (CPUTIME_PER_SEC / 2));
-       value->tv_nsec = rp.subreg.even * NSEC_PER_USEC / CPUTIME_PER_USEC;
-       value->tv_sec = rp.subreg.odd;
-#else
        value->tv_nsec = (__cputime % CPUTIME_PER_SEC) * NSEC_PER_USEC / CPUTIME_PER_USEC;
        value->tv_sec = __cputime / CPUTIME_PER_SEC;
-#endif
 }
 
 /*
                                      struct timeval *value)
 {
        unsigned long long __cputime = (__force unsigned long long) cputime;
-#ifndef CONFIG_64BIT
-       register_pair rp;
-
-       rp.pair = __cputime >> 1;
-       asm ("dr %0,%1" : "+d" (rp) : "d" (CPUTIME_PER_USEC / 2));
-       value->tv_usec = rp.subreg.even / CPUTIME_PER_USEC;
-       value->tv_sec = rp.subreg.odd;
-#else
        value->tv_usec = (__cputime % CPUTIME_PER_SEC) / CPUTIME_PER_USEC;
        value->tv_sec = __cputime / CPUTIME_PER_SEC;
-#endif
 }
 
 /*
 
 
 #include <linux/bug.h>
 
-#ifdef CONFIG_64BIT
-# define __CTL_LOAD    "lctlg"
-# define __CTL_STORE   "stctg"
-#else
-# define __CTL_LOAD    "lctl"
-# define __CTL_STORE   "stctl"
-#endif
-
 #define __ctl_load(array, low, high) {                                 \
        typedef struct { char _[sizeof(array)]; } addrtype;             \
                                                                        \
        BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\
        asm volatile(                                                   \
-               __CTL_LOAD " %1,%2,%0\n"                                \
+               "       lctlg   %1,%2,%0\n"                             \
                : : "Q" (*(addrtype *)(&array)), "i" (low), "i" (high));\
 }
 
                                                                        \
        BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\
        asm volatile(                                                   \
-               __CTL_STORE " %1,%2,%0\n"                               \
+               "       stctg   %1,%2,%0\n"                             \
                : "=Q" (*(addrtype *)(&array))                          \
                : "i" (low), "i" (high));                               \
 }
 union ctlreg0 {
        unsigned long val;
        struct {
-#ifdef CONFIG_64BIT
                unsigned long      : 32;
-#endif
                unsigned long      : 3;
                unsigned long lap  : 1; /* Low-address-protection control */
                unsigned long      : 4;
 
 /*
  * These are used to set parameters in the core dumps.
  */
-#ifndef CONFIG_64BIT
-#define ELF_CLASS      ELFCLASS32
-#else /* CONFIG_64BIT */
 #define ELF_CLASS      ELFCLASS64
-#endif /* CONFIG_64BIT */
 #define ELF_DATA       ELFDATA2MSB
 #define ELF_ARCH       EM_S390
 
 
 #include <asm/cio.h>
 #include <asm/uaccess.h>
 
-#ifdef CONFIG_64BIT
 #define IDA_SIZE_LOG 12 /* 11 for 2k , 12 for 4k */
-#else
-#define IDA_SIZE_LOG 11 /* 11 for 2k , 12 for 4k */
-#endif
 #define IDA_BLOCK_SIZE (1L<<IDA_SIZE_LOG)
 
 /*
 static inline int
 idal_is_needed(void *vaddr, unsigned int length)
 {
-#ifdef CONFIG_64BIT
        return ((__pa(vaddr) + length - 1) >> 31) != 0;
-#else
-       return 0;
-#endif
 }
 
 
 static inline int
 set_normalized_cda(struct ccw1 * ccw, void *vaddr)
 {
-#ifdef CONFIG_64BIT
        unsigned int nridaws;
        unsigned long *idal;
 
                ccw->flags |= CCW_FLAG_IDA;
                vaddr = idal;
        }
-#endif
        ccw->cda = (__u32)(unsigned long) vaddr;
        return 0;
 }
 static inline void
 clear_normalized_cda(struct ccw1 * ccw)
 {
-#ifdef CONFIG_64BIT
        if (ccw->flags & CCW_FLAG_IDA) {
                kfree((void *)(unsigned long) ccw->cda);
                ccw->flags &= ~CCW_FLAG_IDA;
        }
-#endif
        ccw->cda = 0;
 }
 
 static inline int
 __idal_buffer_is_needed(struct idal_buffer *ib)
 {
-#ifdef CONFIG_64BIT
        return ib->size > (4096ul << ib->page_order) ||
                idal_is_needed(ib->data[0], ib->size);
-#else
-       return ib->size > (4096ul << ib->page_order);
-#endif
 }
 
 /*
 
 #define JUMP_LABEL_NOP_SIZE 6
 #define JUMP_LABEL_NOP_OFFSET 2
 
-#ifdef CONFIG_64BIT
-#define ASM_PTR ".quad"
-#define ASM_ALIGN ".balign 8"
-#else
-#define ASM_PTR ".long"
-#define ASM_ALIGN ".balign 4"
-#endif
-
 /*
  * We use a brcl 0,2 instruction for jump labels at compile time so it
  * can be easily distinguished from a hotpatch generated instruction.
 {
        asm_volatile_goto("0:   brcl 0,"__stringify(JUMP_LABEL_NOP_OFFSET)"\n"
                ".pushsection __jump_table, \"aw\"\n"
-               ASM_ALIGN "\n"
-               ASM_PTR " 0b, %l[label], %0\n"
+               ".balign 8\n"
+               ".quad 0b, %l[label], %0\n"
                ".popsection\n"
                : : "X" (key) : : label);
        return false;
 
 #include <asm/cpu.h>
 #include <asm/types.h>
 
-#ifdef CONFIG_32BIT
-
-#define LC_ORDER 0
-#define LC_PAGES 1
-
-struct save_area {
-       u32     ext_save;
-       u64     timer;
-       u64     clk_cmp;
-       u8      pad1[24];
-       u8      psw[8];
-       u32     pref_reg;
-       u8      pad2[20];
-       u32     acc_regs[16];
-       u64     fp_regs[4];
-       u32     gp_regs[16];
-       u32     ctrl_regs[16];
-} __packed;
-
-struct save_area_ext {
-       struct save_area        sa;
-       __vector128             vx_regs[32];
-};
-
-struct _lowcore {
-       psw_t   restart_psw;                    /* 0x0000 */
-       psw_t   restart_old_psw;                /* 0x0008 */
-       __u8    pad_0x0010[0x0014-0x0010];      /* 0x0010 */
-       __u32   ipl_parmblock_ptr;              /* 0x0014 */
-       psw_t   external_old_psw;               /* 0x0018 */
-       psw_t   svc_old_psw;                    /* 0x0020 */
-       psw_t   program_old_psw;                /* 0x0028 */
-       psw_t   mcck_old_psw;                   /* 0x0030 */
-       psw_t   io_old_psw;                     /* 0x0038 */
-       __u8    pad_0x0040[0x0058-0x0040];      /* 0x0040 */
-       psw_t   external_new_psw;               /* 0x0058 */
-       psw_t   svc_new_psw;                    /* 0x0060 */
-       psw_t   program_new_psw;                /* 0x0068 */
-       psw_t   mcck_new_psw;                   /* 0x0070 */
-       psw_t   io_new_psw;                     /* 0x0078 */
-       __u32   ext_params;                     /* 0x0080 */
-       __u16   ext_cpu_addr;                   /* 0x0084 */
-       __u16   ext_int_code;                   /* 0x0086 */
-       __u16   svc_ilc;                        /* 0x0088 */
-       __u16   svc_code;                       /* 0x008a */
-       __u16   pgm_ilc;                        /* 0x008c */
-       __u16   pgm_code;                       /* 0x008e */
-       __u32   trans_exc_code;                 /* 0x0090 */
-       __u16   mon_class_num;                  /* 0x0094 */
-       __u8    per_code;                       /* 0x0096 */
-       __u8    per_atmid;                      /* 0x0097 */
-       __u32   per_address;                    /* 0x0098 */
-       __u32   monitor_code;                   /* 0x009c */
-       __u8    exc_access_id;                  /* 0x00a0 */
-       __u8    per_access_id;                  /* 0x00a1 */
-       __u8    op_access_id;                   /* 0x00a2 */
-       __u8    ar_mode_id;                     /* 0x00a3 */
-       __u8    pad_0x00a4[0x00b8-0x00a4];      /* 0x00a4 */
-       __u16   subchannel_id;                  /* 0x00b8 */
-       __u16   subchannel_nr;                  /* 0x00ba */
-       __u32   io_int_parm;                    /* 0x00bc */
-       __u32   io_int_word;                    /* 0x00c0 */
-       __u8    pad_0x00c4[0x00c8-0x00c4];      /* 0x00c4 */
-       __u32   stfl_fac_list;                  /* 0x00c8 */
-       __u8    pad_0x00cc[0x00d4-0x00cc];      /* 0x00cc */
-       __u32   extended_save_area_addr;        /* 0x00d4 */
-       __u32   cpu_timer_save_area[2];         /* 0x00d8 */
-       __u32   clock_comp_save_area[2];        /* 0x00e0 */
-       __u32   mcck_interruption_code[2];      /* 0x00e8 */
-       __u8    pad_0x00f0[0x00f4-0x00f0];      /* 0x00f0 */
-       __u32   external_damage_code;           /* 0x00f4 */
-       __u32   failing_storage_address;        /* 0x00f8 */
-       __u8    pad_0x00fc[0x0100-0x00fc];      /* 0x00fc */
-       psw_t   psw_save_area;                  /* 0x0100 */
-       __u32   prefixreg_save_area;            /* 0x0108 */
-       __u8    pad_0x010c[0x0120-0x010c];      /* 0x010c */
-
-       /* CPU register save area: defined by architecture */
-       __u32   access_regs_save_area[16];      /* 0x0120 */
-       __u32   floating_pt_save_area[8];       /* 0x0160 */
-       __u32   gpregs_save_area[16];           /* 0x0180 */
-       __u32   cregs_save_area[16];            /* 0x01c0 */
-
-       /* Save areas. */
-       __u32   save_area_sync[8];              /* 0x0200 */
-       __u32   save_area_async[8];             /* 0x0220 */
-       __u32   save_area_restart[1];           /* 0x0240 */
-
-       /* CPU flags. */
-       __u32   cpu_flags;                      /* 0x0244 */
-
-       /* Return psws. */
-       psw_t   return_psw;                     /* 0x0248 */
-       psw_t   return_mcck_psw;                /* 0x0250 */
-
-       /* CPU time accounting values */
-       __u64   sync_enter_timer;               /* 0x0258 */
-       __u64   async_enter_timer;              /* 0x0260 */
-       __u64   mcck_enter_timer;               /* 0x0268 */
-       __u64   exit_timer;                     /* 0x0270 */
-       __u64   user_timer;                     /* 0x0278 */
-       __u64   system_timer;                   /* 0x0280 */
-       __u64   steal_timer;                    /* 0x0288 */
-       __u64   last_update_timer;              /* 0x0290 */
-       __u64   last_update_clock;              /* 0x0298 */
-       __u64   int_clock;                      /* 0x02a0 */
-       __u64   mcck_clock;                     /* 0x02a8 */
-       __u64   clock_comparator;               /* 0x02b0 */
-
-       /* Current process. */
-       __u32   current_task;                   /* 0x02b8 */
-       __u32   thread_info;                    /* 0x02bc */
-       __u32   kernel_stack;                   /* 0x02c0 */
-
-       /* Interrupt, panic and restart stack. */
-       __u32   async_stack;                    /* 0x02c4 */
-       __u32   panic_stack;                    /* 0x02c8 */
-       __u32   restart_stack;                  /* 0x02cc */
-
-       /* Restart function and parameter. */
-       __u32   restart_fn;                     /* 0x02d0 */
-       __u32   restart_data;                   /* 0x02d4 */
-       __u32   restart_source;                 /* 0x02d8 */
-
-       /* Address space pointer. */
-       __u32   kernel_asce;                    /* 0x02dc */
-       __u32   user_asce;                      /* 0x02e0 */
-       __u32   current_pid;                    /* 0x02e4 */
-
-       /* SMP info area */
-       __u32   cpu_nr;                         /* 0x02e8 */
-       __u32   softirq_pending;                /* 0x02ec */
-       __u32   percpu_offset;                  /* 0x02f0 */
-       __u32   machine_flags;                  /* 0x02f4 */
-       __u8    pad_0x02f8[0x02fc-0x02f8];      /* 0x02f8 */
-       __u32   spinlock_lockval;               /* 0x02fc */
-
-       __u8    pad_0x0300[0x0e00-0x0300];      /* 0x0300 */
-
-       /*
-        * 0xe00 contains the address of the IPL Parameter Information
-        * block. Dump tools need IPIB for IPL after dump.
-        * Note: do not change the position of any fields in 0x0e00-0x0f00
-        */
-       __u32   ipib;                           /* 0x0e00 */
-       __u32   ipib_checksum;                  /* 0x0e04 */
-       __u32   vmcore_info;                    /* 0x0e08 */
-       __u8    pad_0x0e0c[0x0e18-0x0e0c];      /* 0x0e0c */
-       __u32   os_info;                        /* 0x0e18 */
-       __u8    pad_0x0e1c[0x0f00-0x0e1c];      /* 0x0e1c */
-
-       /* Extended facility list */
-       __u64   stfle_fac_list[32];             /* 0x0f00 */
-} __packed;
-
-#else /* CONFIG_32BIT */
-
 #define LC_ORDER 1
 #define LC_PAGES 2
 
        __u8    vector_save_area[1024];         /* 0x1c00 */
 } __packed;
 
-#endif /* CONFIG_32BIT */
-
 #define S390_lowcore (*((struct _lowcore *) 0))
 
 extern struct _lowcore *lowcore_ptr[];
 
 
 #include <uapi/asm/mman.h>
 
-#if !defined(__ASSEMBLY__) && defined(CONFIG_64BIT)
+#ifndef __ASSEMBLY__
 int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags);
 #define arch_mmap_check(addr, len, flags) s390_mmap_check(addr, len, flags)
 #endif
 
        atomic_set(&mm->context.attach_count, 0);
        mm->context.flush_mm = 0;
        mm->context.asce_bits = _ASCE_TABLE_LENGTH | _ASCE_USER_BITS;
-#ifdef CONFIG_64BIT
        mm->context.asce_bits |= _ASCE_TYPE_REGION3;
-#endif
        mm->context.has_pgste = 0;
        mm->context.use_skey = 0;
        mm->context.asce_limit = STACK_TOP_MAX;
 static inline void arch_dup_mmap(struct mm_struct *oldmm,
                                 struct mm_struct *mm)
 {
-#ifdef CONFIG_64BIT
        if (oldmm->context.asce_limit < mm->context.asce_limit)
                crst_table_downgrade(mm, oldmm->context.asce_limit);
-#endif
 }
 
 static inline void arch_exit_mmap(struct mm_struct *mm)
 
  */
 #define __my_cpu_offset S390_lowcore.percpu_offset
 
-#ifdef CONFIG_64BIT
-
 /*
  * For 64 bit module code, the module may be more than 4G above the
  * per cpu area, use weak definitions to force the compiler to
 #define this_cpu_cmpxchg_double_4 arch_this_cpu_cmpxchg_double
 #define this_cpu_cmpxchg_double_8 arch_this_cpu_cmpxchg_double
 
-#endif /* CONFIG_64BIT */
-
 #include <asm-generic/percpu.h>
 
 #endif /* __ARCH_S390_PERCPU__ */
 
 #ifndef _ASM_S390_PERF_EVENT_H
 #define _ASM_S390_PERF_EVENT_H
 
-#ifdef CONFIG_64BIT
-
 #include <linux/perf_event.h>
 #include <linux/device.h>
 #include <asm/cpu_mf.h>
 int perf_reserve_sampling(void);
 void perf_release_sampling(void);
 
-#endif /* CONFIG_64BIT */
 #endif /* _ASM_S390_PERF_EVENT_H */
 
        *s = val;
        n = (n / 256) - 1;
        asm volatile(
-#ifdef CONFIG_64BIT
                "       mvc     8(248,%0),0(%0)\n"
-#else
-               "       mvc     4(252,%0),0(%0)\n"
-#endif
                "0:     mvc     256(256,%0),0(%0)\n"
                "       la      %0,256(%0)\n"
                "       brct    %1,0b\n"
        clear_table(crst, entry, sizeof(unsigned long)*2048);
 }
 
-#ifndef CONFIG_64BIT
-
-static inline unsigned long pgd_entry_type(struct mm_struct *mm)
-{
-       return _SEGMENT_ENTRY_EMPTY;
-}
-
-#define pud_alloc_one(mm,address)              ({ BUG(); ((pud_t *)2); })
-#define pud_free(mm, x)                                do { } while (0)
-
-#define pmd_alloc_one(mm,address)              ({ BUG(); ((pmd_t *)2); })
-#define pmd_free(mm, x)                                do { } while (0)
-
-#define pgd_populate(mm, pgd, pud)             BUG()
-#define pud_populate(mm, pud, pmd)             BUG()
-
-#else /* CONFIG_64BIT */
-
 static inline unsigned long pgd_entry_type(struct mm_struct *mm)
 {
        if (mm->context.asce_limit <= (1UL << 31))
        pud_val(*pud) = _REGION3_ENTRY | __pa(pmd);
 }
 
-#endif /* CONFIG_64BIT */
-
 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
 {
        spin_lock_init(&mm->context.list_lock);
 
  * table can map
  * PGDIR_SHIFT determines what a third-level page table entry can map
  */
-#ifndef CONFIG_64BIT
-# define PMD_SHIFT     20
-# define PUD_SHIFT     20
-# define PGDIR_SHIFT   20
-#else /* CONFIG_64BIT */
-# define PMD_SHIFT     20
-# define PUD_SHIFT     31
-# define PGDIR_SHIFT   42
-#endif /* CONFIG_64BIT */
+#define PMD_SHIFT      20
+#define PUD_SHIFT      31
+#define PGDIR_SHIFT    42
 
 #define PMD_SIZE        (1UL << PMD_SHIFT)
 #define PMD_MASK        (~(PMD_SIZE-1))
  * that leads to 1024 pte per pgd
  */
 #define PTRS_PER_PTE   256
-#ifndef CONFIG_64BIT
-#define __PAGETABLE_PUD_FOLDED
-#define PTRS_PER_PMD   1
-#define __PAGETABLE_PMD_FOLDED
-#define PTRS_PER_PUD   1
-#else /* CONFIG_64BIT */
 #define PTRS_PER_PMD   2048
 #define PTRS_PER_PUD   2048
-#endif /* CONFIG_64BIT */
 #define PTRS_PER_PGD   2048
 
 #define FIRST_USER_ADDRESS  0UL
 
 #define VMEM_MAX_PHYS ((unsigned long) vmemmap)
 
-#ifdef CONFIG_64BIT
 extern unsigned long MODULES_VADDR;
 extern unsigned long MODULES_END;
 #define MODULES_VADDR  MODULES_VADDR
 #define MODULES_END    MODULES_END
 #define MODULES_LEN    (1UL << 31)
-#endif
 
 static inline int is_module_addr(void *addr)
 {
-#ifdef CONFIG_64BIT
        BUILD_BUG_ON(MODULES_LEN > (1UL << 31));
        if (addr < (void *)MODULES_VADDR)
                return 0;
        if (addr > (void *)MODULES_END)
                return 0;
-#endif
        return 1;
 }
 
  * pte_swap    is true for the bit pattern .10...xxxx10, (pte & 0x603) == 0x402
  */
 
-#ifndef CONFIG_64BIT
-
-/* Bits in the segment table address-space-control-element */
-#define _ASCE_SPACE_SWITCH     0x80000000UL    /* space switch event       */
-#define _ASCE_ORIGIN_MASK      0x7ffff000UL    /* segment table origin     */
-#define _ASCE_PRIVATE_SPACE    0x100   /* private space control            */
-#define _ASCE_ALT_EVENT                0x80    /* storage alteration event control */
-#define _ASCE_TABLE_LENGTH     0x7f    /* 128 x 64 entries = 8k            */
-
-/* Bits in the segment table entry */
-#define _SEGMENT_ENTRY_BITS    0x7fffffffUL    /* Valid segment table bits */
-#define _SEGMENT_ENTRY_ORIGIN  0x7fffffc0UL    /* page table origin        */
-#define _SEGMENT_ENTRY_PROTECT 0x200   /* page protection bit              */
-#define _SEGMENT_ENTRY_INVALID 0x20    /* invalid segment table entry      */
-#define _SEGMENT_ENTRY_COMMON  0x10    /* common segment bit               */
-#define _SEGMENT_ENTRY_PTL     0x0f    /* page table length                */
-
-#define _SEGMENT_ENTRY_DIRTY   0       /* No sw dirty bit for 31-bit */
-#define _SEGMENT_ENTRY_YOUNG   0       /* No sw young bit for 31-bit */
-#define _SEGMENT_ENTRY_READ    0       /* No sw read bit for 31-bit */
-#define _SEGMENT_ENTRY_WRITE   0       /* No sw write bit for 31-bit */
-#define _SEGMENT_ENTRY_LARGE   0       /* No large pages for 31-bit */
-#define _SEGMENT_ENTRY_BITS_LARGE 0
-#define _SEGMENT_ENTRY_ORIGIN_LARGE 0
-
-#define _SEGMENT_ENTRY         (_SEGMENT_ENTRY_PTL)
-#define _SEGMENT_ENTRY_EMPTY   (_SEGMENT_ENTRY_INVALID)
-
-/*
- * Segment table entry encoding (I = invalid, R = read-only bit):
- *             ..R...I.....
- * prot-none   ..1...1.....
- * read-only   ..1...0.....
- * read-write  ..0...0.....
- * empty       ..0...1.....
- */
-
-/* Page status table bits for virtualization */
-#define PGSTE_ACC_BITS 0xf0000000UL
-#define PGSTE_FP_BIT   0x08000000UL
-#define PGSTE_PCL_BIT  0x00800000UL
-#define PGSTE_HR_BIT   0x00400000UL
-#define PGSTE_HC_BIT   0x00200000UL
-#define PGSTE_GR_BIT   0x00040000UL
-#define PGSTE_GC_BIT   0x00020000UL
-#define PGSTE_UC_BIT   0x00008000UL    /* user dirty (migration) */
-#define PGSTE_IN_BIT   0x00004000UL    /* IPTE notify bit */
-
-#else /* CONFIG_64BIT */
-
 /* Bits in the segment/region table address-space-control-element */
 #define _ASCE_ORIGIN           ~0xfffUL/* segment table origin             */
 #define _ASCE_PRIVATE_SPACE    0x100   /* private space control            */
 #define PGSTE_UC_BIT   0x0000800000000000UL    /* user dirty (migration) */
 #define PGSTE_IN_BIT   0x0000400000000000UL    /* IPTE notify bit */
 
-#endif /* CONFIG_64BIT */
-
 /* Guest Page State used for virtualization */
 #define _PGSTE_GPS_ZERO                0x0000000080000000UL
 #define _PGSTE_GPS_USAGE_MASK  0x0000000003000000UL
 /*
  * pgd/pmd/pte query functions
  */
-#ifndef CONFIG_64BIT
-
-static inline int pgd_present(pgd_t pgd) { return 1; }
-static inline int pgd_none(pgd_t pgd)    { return 0; }
-static inline int pgd_bad(pgd_t pgd)     { return 0; }
-
-static inline int pud_present(pud_t pud) { return 1; }
-static inline int pud_none(pud_t pud)   { return 0; }
-static inline int pud_large(pud_t pud)  { return 0; }
-static inline int pud_bad(pud_t pud)    { return 0; }
-
-#else /* CONFIG_64BIT */
-
 static inline int pgd_present(pgd_t pgd)
 {
        if ((pgd_val(pgd) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R2)
        return (pud_val(pud) & mask) != 0;
 }
 
-#endif /* CONFIG_64BIT */
-
 static inline int pmd_present(pmd_t pmd)
 {
        return pmd_val(pmd) != _SEGMENT_ENTRY_INVALID;
 
 static inline void pgd_clear(pgd_t *pgd)
 {
-#ifdef CONFIG_64BIT
        if ((pgd_val(*pgd) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R2)
                pgd_val(*pgd) = _REGION2_ENTRY_EMPTY;
-#endif
 }
 
 static inline void pud_clear(pud_t *pud)
 {
-#ifdef CONFIG_64BIT
        if ((pud_val(*pud) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
                pud_val(*pud) = _REGION3_ENTRY_EMPTY;
-#endif
 }
 
 static inline void pmd_clear(pmd_t *pmdp)
 {
        unsigned long pto = (unsigned long) ptep;
 
-#ifndef CONFIG_64BIT
-       /* pto in ESA mode must point to the start of the segment table */
-       pto &= 0x7ffffc00;
-#endif
        /* Invalidation + global TLB flush for the pte */
        asm volatile(
                "       ipte    %2,%3"
 {
        unsigned long pto = (unsigned long) ptep;
 
-#ifndef CONFIG_64BIT
-       /* pto in ESA mode must point to the start of the segment table */
-       pto &= 0x7ffffc00;
-#endif
        /* Invalidation + local TLB flush for the pte */
        asm volatile(
                "       .insn rrf,0xb2210000,%2,%3,0,1"
 {
        unsigned long pto = (unsigned long) ptep;
 
-#ifndef CONFIG_64BIT
-       /* pto in ESA mode must point to the start of the segment table */
-       pto &= 0x7ffffc00;
-#endif
        /* Invalidate a range of ptes + global TLB flush of the ptes */
        do {
                asm volatile(
 #define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
 #define pgd_offset_k(address) pgd_offset(&init_mm, address)
 
-#ifndef CONFIG_64BIT
-
-#define pmd_deref(pmd) (pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN)
-#define pud_deref(pmd) ({ BUG(); 0UL; })
-#define pgd_deref(pmd) ({ BUG(); 0UL; })
-
-#define pud_offset(pgd, address) ((pud_t *) pgd)
-#define pmd_offset(pud, address) ((pmd_t *) pud + pmd_index(address))
-
-#else /* CONFIG_64BIT */
-
 #define pmd_deref(pmd) (pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN)
 #define pud_deref(pud) (pud_val(pud) & _REGION_ENTRY_ORIGIN)
 #define pgd_deref(pgd) (pgd_val(pgd) & _REGION_ENTRY_ORIGIN)
        return pmd + pmd_index(address);
 }
 
-#endif /* CONFIG_64BIT */
-
 #define pfn_pte(pfn,pgprot) mk_pte_phys(__pa((pfn) << PAGE_SHIFT),(pgprot))
 #define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT)
 #define pte_page(x) pfn_to_page(pte_pfn(x))
  *  0000000000111111111122222222223333333333444444444455 5555 5 55566 66
  *  0123456789012345678901234567890123456789012345678901 2345 6 78901 23
  */
-#ifndef CONFIG_64BIT
-#define __SWP_OFFSET_MASK (~0UL >> 12)
-#else
+
 #define __SWP_OFFSET_MASK (~0UL >> 11)
-#endif
+
 static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
 {
        pte_t pte;
 
 #define _CIF_ASCE              (1<<CIF_ASCE)
 #define _CIF_NOHZ_DELAY                (1<<CIF_NOHZ_DELAY)
 
-
 #ifndef __ASSEMBLY__
 
 #include <linux/linkage.h>
 /*
  * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
  */
-#ifndef CONFIG_64BIT
-
-#define TASK_SIZE              (1UL << 31)
-#define TASK_MAX_SIZE          (1UL << 31)
-#define TASK_UNMAPPED_BASE     (1UL << 30)
-
-#else /* CONFIG_64BIT */
 
 #define TASK_SIZE_OF(tsk)      ((tsk)->mm->context.asce_limit)
 #define TASK_UNMAPPED_BASE     (test_thread_flag(TIF_31BIT) ? \
 #define TASK_SIZE              TASK_SIZE_OF(current)
 #define TASK_MAX_SIZE          (1UL << 53)
 
-#endif /* CONFIG_64BIT */
-
-#ifndef CONFIG_64BIT
-#define STACK_TOP              (1UL << 31)
-#define STACK_TOP_MAX          (1UL << 31)
-#else /* CONFIG_64BIT */
 #define STACK_TOP              (1UL << (test_thread_flag(TIF_31BIT) ? 31:42))
 #define STACK_TOP_MAX          (1UL << 42)
-#endif /* CONFIG_64BIT */
 
 #define HAVE_ARCH_PICK_MMAP_LAYOUT
 
        /* cpu runtime instrumentation */
        struct runtime_instr_cb *ri_cb;
        int ri_signum;
-#ifdef CONFIG_64BIT
        unsigned char trap_tdb[256];    /* Transaction abort diagnose block */
        __vector128 *vxrs;              /* Vector register save area */
-#endif
 };
 
 /* Flag to disable transactions. */
 struct mm_struct;
 struct seq_file;
 
-#ifdef CONFIG_64BIT
-extern void show_cacheinfo(struct seq_file *m);
-#else
-static inline void show_cacheinfo(struct seq_file *m) { }
-#endif
+void show_cacheinfo(struct seq_file *m);
 
 /* Free all resources held by a thread. */
 extern void release_thread(struct task_struct *);
  */
 static inline void __load_psw(psw_t psw)
 {
-#ifndef CONFIG_64BIT
-       asm volatile("lpsw  %0" : : "Q" (psw) : "cc");
-#else
        asm volatile("lpswe %0" : : "Q" (psw) : "cc");
-#endif
 }
 
 /*
 
        psw.mask = mask;
 
-#ifndef CONFIG_64BIT
-       asm volatile(
-               "       basr    %0,0\n"
-               "0:     ahi     %0,1f-0b\n"
-               "       st      %0,%O1+4(%R1)\n"
-               "       lpsw    %1\n"
-               "1:"
-               : "=&d" (addr), "=Q" (psw) : "Q" (psw) : "memory", "cc");
-#else /* CONFIG_64BIT */
        asm volatile(
                "       larl    %0,1f\n"
                "       stg     %0,%O1+8(%R1)\n"
                "       lpswe   %1\n"
                "1:"
                : "=&d" (addr), "=Q" (psw) : "Q" (psw) : "memory", "cc");
-#endif /* CONFIG_64BIT */
 }
 
 /*
  */
 static inline unsigned long __rewind_psw(psw_t psw, unsigned long ilc)
 {
-#ifndef CONFIG_64BIT
-       if (psw.addr & PSW_ADDR_AMODE)
-               /* 31 bit mode */
-               return (psw.addr - ilc) | PSW_ADDR_AMODE;
-       /* 24 bit mode */
-       return (psw.addr - ilc) & ((1UL << 24) - 1);
-#else
        unsigned long mask;
 
        mask = (psw.mask & PSW_MASK_EA) ? -1UL :
               (psw.mask & PSW_MASK_BA) ? (1UL << 31) - 1 :
                                          (1UL << 24) - 1;
        return (psw.addr - ilc) & mask;
-#endif
 }
 
 /*
          * Store status and then load disabled wait psw,
          * the processor is dead afterwards
          */
-#ifndef CONFIG_64BIT
-       asm volatile(
-               "       stctl   0,0,0(%2)\n"
-               "       ni      0(%2),0xef\n"   /* switch off protection */
-               "       lctl    0,0,0(%2)\n"
-               "       stpt    0xd8\n"         /* store timer */
-               "       stckc   0xe0\n"         /* store clock comparator */
-               "       stpx    0x108\n"        /* store prefix register */
-               "       stam    0,15,0x120\n"   /* store access registers */
-               "       std     0,0x160\n"      /* store f0 */
-               "       std     2,0x168\n"      /* store f2 */
-               "       std     4,0x170\n"      /* store f4 */
-               "       std     6,0x178\n"      /* store f6 */
-               "       stm     0,15,0x180\n"   /* store general registers */
-               "       stctl   0,15,0x1c0\n"   /* store control registers */
-               "       oi      0x1c0,0x10\n"   /* fake protection bit */
-               "       lpsw    0(%1)"
-               : "=m" (ctl_buf)
-               : "a" (&dw_psw), "a" (&ctl_buf), "m" (dw_psw) : "cc");
-#else /* CONFIG_64BIT */
        asm volatile(
                "       stctg   0,0,0(%2)\n"
                "       ni      4(%2),0xef\n"   /* switch off protection */
                "       lpswe   0(%1)"
                : "=m" (ctl_buf)
                : "a" (&dw_psw), "a" (&ctl_buf), "m" (dw_psw) : "cc", "0", "1");
-#endif /* CONFIG_64BIT */
        while (1);
 }
 
 
        unsigned long long ri   : 1; /* Runtime Instrumentation */
        unsigned long long      : 6;
        unsigned long long eaba : 2; /* Addressing Mode */
-#ifdef CONFIG_64BIT
        unsigned long long      : 31;
        unsigned long long ia   : 64;/* Instruction Address */
-#else
-       unsigned long long ia   : 31;/* Instruction Address */
-#endif
 };
 
 enum {
 
        u8 scount;
        u8 sflags;
        u32 length;
-#ifdef CONFIG_32BIT
-       /* private: */
-       void *res2;
-       /* public: */
-#endif
        void *addr;
 } __attribute__ ((packed, aligned(16)));
 
  * @sbal: absolute SBAL address
  */
 struct sl_element {
-#ifdef CONFIG_32BIT
-       /* private: */
-       unsigned long reserved;
-       /* public: */
-#endif
        unsigned long sbal;
 } __attribute__ ((packed));
 
 
 
 static inline void save_ri_cb(struct runtime_instr_cb *cb_prev)
 {
-#ifdef CONFIG_64BIT
        if (cb_prev)
                store_runtime_instr_cb(cb_prev);
-#endif
 }
 
 static inline void restore_ri_cb(struct runtime_instr_cb *cb_next,
                                 struct runtime_instr_cb *cb_prev)
 {
-#ifdef CONFIG_64BIT
        if (cb_next)
                load_runtime_instr_cb(cb_next);
        else if (cb_prev)
                load_runtime_instr_cb(&runtime_instr_empty_cb);
-#endif
 }
 
-#ifdef CONFIG_64BIT
-extern void exit_thread_runtime_instr(void);
-#else
-static inline void exit_thread_runtime_instr(void) { }
-#endif
+void exit_thread_runtime_instr(void);
 
 #endif /* _RUNTIME_INSTR_H */
 
 #error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
 #endif
 
-#ifndef CONFIG_64BIT
-#define RWSEM_UNLOCKED_VALUE   0x00000000
-#define RWSEM_ACTIVE_BIAS      0x00000001
-#define RWSEM_ACTIVE_MASK      0x0000ffff
-#define RWSEM_WAITING_BIAS     (-0x00010000)
-#else /* CONFIG_64BIT */
 #define RWSEM_UNLOCKED_VALUE   0x0000000000000000L
 #define RWSEM_ACTIVE_BIAS      0x0000000000000001L
 #define RWSEM_ACTIVE_MASK      0x00000000ffffffffL
 #define RWSEM_WAITING_BIAS     (-0x0000000100000000L)
-#endif /* CONFIG_64BIT */
 #define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
 #define RWSEM_ACTIVE_WRITE_BIAS        (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 
        signed long old, new;
 
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%2\n"
-               "0:     lr      %1,%0\n"
-               "       ahi     %1,%4\n"
-               "       cs      %0,%1,%2\n"
-               "       jl      0b"
-#else /* CONFIG_64BIT */
                "       lg      %0,%2\n"
                "0:     lgr     %1,%0\n"
                "       aghi    %1,%4\n"
                "       csg     %0,%1,%2\n"
                "       jl      0b"
-#endif /* CONFIG_64BIT */
                : "=&d" (old), "=&d" (new), "=Q" (sem->count)
                : "Q" (sem->count), "i" (RWSEM_ACTIVE_READ_BIAS)
                : "cc", "memory");
        signed long old, new;
 
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%2\n"
-               "0:     ltr     %1,%0\n"
-               "       jm      1f\n"
-               "       ahi     %1,%4\n"
-               "       cs      %0,%1,%2\n"
-               "       jl      0b\n"
-               "1:"
-#else /* CONFIG_64BIT */
                "       lg      %0,%2\n"
                "0:     ltgr    %1,%0\n"
                "       jm      1f\n"
                "       csg     %0,%1,%2\n"
                "       jl      0b\n"
                "1:"
-#endif /* CONFIG_64BIT */
                : "=&d" (old), "=&d" (new), "=Q" (sem->count)
                : "Q" (sem->count), "i" (RWSEM_ACTIVE_READ_BIAS)
                : "cc", "memory");
 
        tmp = RWSEM_ACTIVE_WRITE_BIAS;
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%2\n"
-               "0:     lr      %1,%0\n"
-               "       a       %1,%4\n"
-               "       cs      %0,%1,%2\n"
-               "       jl      0b"
-#else /* CONFIG_64BIT */
                "       lg      %0,%2\n"
                "0:     lgr     %1,%0\n"
                "       ag      %1,%4\n"
                "       csg     %0,%1,%2\n"
                "       jl      0b"
-#endif /* CONFIG_64BIT */
                : "=&d" (old), "=&d" (new), "=Q" (sem->count)
                : "Q" (sem->count), "m" (tmp)
                : "cc", "memory");
        signed long old;
 
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%1\n"
-               "0:     ltr     %0,%0\n"
-               "       jnz     1f\n"
-               "       cs      %0,%3,%1\n"
-               "       jl      0b\n"
-#else /* CONFIG_64BIT */
                "       lg      %0,%1\n"
                "0:     ltgr    %0,%0\n"
                "       jnz     1f\n"
                "       csg     %0,%3,%1\n"
                "       jl      0b\n"
-#endif /* CONFIG_64BIT */
                "1:"
                : "=&d" (old), "=Q" (sem->count)
                : "Q" (sem->count), "d" (RWSEM_ACTIVE_WRITE_BIAS)
        signed long old, new;
 
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%2\n"
-               "0:     lr      %1,%0\n"
-               "       ahi     %1,%4\n"
-               "       cs      %0,%1,%2\n"
-               "       jl      0b"
-#else /* CONFIG_64BIT */
                "       lg      %0,%2\n"
                "0:     lgr     %1,%0\n"
                "       aghi    %1,%4\n"
                "       csg     %0,%1,%2\n"
                "       jl      0b"
-#endif /* CONFIG_64BIT */
                : "=&d" (old), "=&d" (new), "=Q" (sem->count)
                : "Q" (sem->count), "i" (-RWSEM_ACTIVE_READ_BIAS)
                : "cc", "memory");
 
        tmp = -RWSEM_ACTIVE_WRITE_BIAS;
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%2\n"
-               "0:     lr      %1,%0\n"
-               "       a       %1,%4\n"
-               "       cs      %0,%1,%2\n"
-               "       jl      0b"
-#else /* CONFIG_64BIT */
                "       lg      %0,%2\n"
                "0:     lgr     %1,%0\n"
                "       ag      %1,%4\n"
                "       csg     %0,%1,%2\n"
                "       jl      0b"
-#endif /* CONFIG_64BIT */
                : "=&d" (old), "=&d" (new), "=Q" (sem->count)
                : "Q" (sem->count), "m" (tmp)
                : "cc", "memory");
 
        tmp = -RWSEM_WAITING_BIAS;
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%2\n"
-               "0:     lr      %1,%0\n"
-               "       a       %1,%4\n"
-               "       cs      %0,%1,%2\n"
-               "       jl      0b"
-#else /* CONFIG_64BIT */
                "       lg      %0,%2\n"
                "0:     lgr     %1,%0\n"
                "       ag      %1,%4\n"
                "       csg     %0,%1,%2\n"
                "       jl      0b"
-#endif /* CONFIG_64BIT */
                : "=&d" (old), "=&d" (new), "=Q" (sem->count)
                : "Q" (sem->count), "m" (tmp)
                : "cc", "memory");
        signed long old, new;
 
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%2\n"
-               "0:     lr      %1,%0\n"
-               "       ar      %1,%4\n"
-               "       cs      %0,%1,%2\n"
-               "       jl      0b"
-#else /* CONFIG_64BIT */
                "       lg      %0,%2\n"
                "0:     lgr     %1,%0\n"
                "       agr     %1,%4\n"
                "       csg     %0,%1,%2\n"
                "       jl      0b"
-#endif /* CONFIG_64BIT */
                : "=&d" (old), "=&d" (new), "=Q" (sem->count)
                : "Q" (sem->count), "d" (delta)
                : "cc", "memory");
        signed long old, new;
 
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       l       %0,%2\n"
-               "0:     lr      %1,%0\n"
-               "       ar      %1,%4\n"
-               "       cs      %0,%1,%2\n"
-               "       jl      0b"
-#else /* CONFIG_64BIT */
                "       lg      %0,%2\n"
                "0:     lgr     %1,%0\n"
                "       agr     %1,%4\n"
                "       csg     %0,%1,%2\n"
                "       jl      0b"
-#endif /* CONFIG_64BIT */
                : "=&d" (old), "=&d" (new), "=Q" (sem->count)
                : "Q" (sem->count), "d" (delta)
                : "cc", "memory");
 
 #include <asm/lowcore.h>
 #include <asm/types.h>
 
-#ifndef CONFIG_64BIT
-#define IPL_DEVICE        (*(unsigned long *)  (0x10404))
-#define INITRD_START      (*(unsigned long *)  (0x1040C))
-#define INITRD_SIZE       (*(unsigned long *)  (0x10414))
-#define OLDMEM_BASE      (*(unsigned long *)  (0x1041C))
-#define OLDMEM_SIZE      (*(unsigned long *)  (0x10424))
-#else /* CONFIG_64BIT */
 #define IPL_DEVICE        (*(unsigned long *)  (0x10400))
 #define INITRD_START      (*(unsigned long *)  (0x10408))
 #define INITRD_SIZE       (*(unsigned long *)  (0x10410))
 #define OLDMEM_BASE      (*(unsigned long *)  (0x10418))
 #define OLDMEM_SIZE      (*(unsigned long *)  (0x10420))
-#endif /* CONFIG_64BIT */
 #define COMMAND_LINE      ((char *)            (0x10480))
 
 extern int memory_end_set;
 #define MACHINE_HAS_PFMF       MACHINE_HAS_EDAT1
 #define MACHINE_HAS_HPAGE      MACHINE_HAS_EDAT1
 
-#ifndef CONFIG_64BIT
-#define MACHINE_HAS_IEEE       (S390_lowcore.machine_flags & MACHINE_FLAG_IEEE)
-#define MACHINE_HAS_CSP                (S390_lowcore.machine_flags & MACHINE_FLAG_CSP)
-#define MACHINE_HAS_IDTE       (0)
-#define MACHINE_HAS_DIAG44     (1)
-#define MACHINE_HAS_MVPG       (S390_lowcore.machine_flags & MACHINE_FLAG_MVPG)
-#define MACHINE_HAS_EDAT1      (0)
-#define MACHINE_HAS_EDAT2      (0)
-#define MACHINE_HAS_LPP                (0)
-#define MACHINE_HAS_TOPOLOGY   (0)
-#define MACHINE_HAS_TE         (0)
-#define MACHINE_HAS_TLB_LC     (0)
-#define MACHINE_HAS_VX         (0)
-#define MACHINE_HAS_CAD                (0)
-#else /* CONFIG_64BIT */
-#define MACHINE_HAS_IEEE       (1)
-#define MACHINE_HAS_CSP                (1)
 #define MACHINE_HAS_IDTE       (S390_lowcore.machine_flags & MACHINE_FLAG_IDTE)
 #define MACHINE_HAS_DIAG44     (S390_lowcore.machine_flags & MACHINE_FLAG_DIAG44)
-#define MACHINE_HAS_MVPG       (1)
 #define MACHINE_HAS_EDAT1      (S390_lowcore.machine_flags & MACHINE_FLAG_EDAT1)
 #define MACHINE_HAS_EDAT2      (S390_lowcore.machine_flags & MACHINE_FLAG_EDAT2)
 #define MACHINE_HAS_LPP                (S390_lowcore.machine_flags & MACHINE_FLAG_LPP)
 #define MACHINE_HAS_TLB_LC     (S390_lowcore.machine_flags & MACHINE_FLAG_TLB_LC)
 #define MACHINE_HAS_VX         (S390_lowcore.machine_flags & MACHINE_FLAG_VX)
 #define MACHINE_HAS_CAD                (S390_lowcore.machine_flags & MACHINE_FLAG_CAD)
-#endif /* CONFIG_64BIT */
 
 /*
  * Console mode. Override with conmode=
 
 #else /* __ASSEMBLY__ */
 
-#ifndef CONFIG_64BIT
-#define IPL_DEVICE        0x10404
-#define INITRD_START      0x1040C
-#define INITRD_SIZE       0x10414
-#define OLDMEM_BASE      0x1041C
-#define OLDMEM_SIZE      0x10424
-#else /* CONFIG_64BIT */
 #define IPL_DEVICE        0x10400
 #define INITRD_START      0x10408
 #define INITRD_SIZE       0x10410
 #define OLDMEM_BASE      0x10418
 #define OLDMEM_SIZE      0x10420
-#endif /* CONFIG_64BIT */
 #define COMMAND_LINE      0x10480
 
 #endif /* __ASSEMBLY__ */
 
        wl = __wl;                                      \
 })
 
-#ifdef CONFIG_64BIT
 #define udiv_qrnnd(q, r, n1, n0, d)                    \
   do { unsigned long __n;                              \
        unsigned int __r, __d;                          \
     (q) = __n / __d;                                   \
     (r) = __n % __d;                                   \
   } while (0)
-#else
-#define udiv_qrnnd(q, r, n1, n0, d)                    \
-  do { unsigned int __r;                               \
-    (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));                \
-    (r) = __r;                                         \
-  } while (0)
-extern unsigned long __udiv_qrnnd (unsigned int *, unsigned int,
-                                  unsigned int , unsigned int);
-#endif
 
 #define UDIV_NEEDS_NORMALIZATION 0
 
 
 #ifndef _ASM_S390_SPARSEMEM_H
 #define _ASM_S390_SPARSEMEM_H
 
-#ifdef CONFIG_64BIT
-
 #define SECTION_SIZE_BITS      28
 #define MAX_PHYSMEM_BITS       46
 
-#else
-
-#define SECTION_SIZE_BITS      25
-#define MAX_PHYSMEM_BITS       31
-
-#endif /* CONFIG_64BIT */
-
 #endif /* _ASM_S390_SPARSEMEM_H */
 
        u32 orig_fpc;
        int rc;
 
-       if (!MACHINE_HAS_IEEE)
-               return 0;
-
        asm volatile(
                "       efpc    %1\n"
                "       sfpc    %2\n"
 
 static inline void save_fp_ctl(u32 *fpc)
 {
-       if (!MACHINE_HAS_IEEE)
-               return;
-
        asm volatile(
                "       stfpc   %0\n"
                : "+Q" (*fpc));
 {
        int rc;
 
-       if (!MACHINE_HAS_IEEE)
-               return 0;
-
        asm volatile(
                "       lfpc    %1\n"
                "0:     la      %0,0\n"
        asm volatile("std 2,%0" : "=Q" (fprs[2]));
        asm volatile("std 4,%0" : "=Q" (fprs[4]));
        asm volatile("std 6,%0" : "=Q" (fprs[6]));
-       if (!MACHINE_HAS_IEEE)
-               return;
        asm volatile("std 1,%0" : "=Q" (fprs[1]));
        asm volatile("std 3,%0" : "=Q" (fprs[3]));
        asm volatile("std 5,%0" : "=Q" (fprs[5]));
        asm volatile("ld 2,%0" : : "Q" (fprs[2]));
        asm volatile("ld 4,%0" : : "Q" (fprs[4]));
        asm volatile("ld 6,%0" : : "Q" (fprs[6]));
-       if (!MACHINE_HAS_IEEE)
-               return;
        asm volatile("ld 1,%0" : : "Q" (fprs[1]));
        asm volatile("ld 3,%0" : : "Q" (fprs[3]));
        asm volatile("ld 5,%0" : : "Q" (fprs[5]));
 
 static inline void save_fp_vx_regs(struct task_struct *task)
 {
-#ifdef CONFIG_64BIT
        if (task->thread.vxrs)
                save_vx_regs(task->thread.vxrs);
        else
-#endif
-       save_fp_regs(task->thread.fp_regs.fprs);
+               save_fp_regs(task->thread.fp_regs.fprs);
 }
 
 static inline void restore_fp_vx_regs(struct task_struct *task)
 {
-#ifdef CONFIG_64BIT
        if (task->thread.vxrs)
                restore_vx_regs(task->thread.vxrs);
        else
-#endif
-       restore_fp_regs(task->thread.fp_regs.fprs);
+               restore_fp_regs(task->thread.fp_regs.fprs);
 }
 
 static inline void save_access_regs(unsigned int *acrs)
 
 /*
  * Size of kernel stack for each process
  */
-#ifndef CONFIG_64BIT
-#define THREAD_ORDER 1
-#define ASYNC_ORDER  1
-#else /* CONFIG_64BIT */
 #define THREAD_ORDER 2
 #define ASYNC_ORDER  2
-#endif /* CONFIG_64BIT */
 
 #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
 #define ASYNC_SIZE  (PAGE_SIZE << ASYNC_ORDER)
 #define _TIF_31BIT             (1<<TIF_31BIT)
 #define _TIF_SINGLE_STEP       (1<<TIF_SINGLE_STEP)
 
-#ifdef CONFIG_64BIT
 #define is_32bit_task()                (test_thread_flag(TIF_31BIT))
-#else
-#define is_32bit_task()                (1)
-#endif
 
 #endif /* _ASM_THREAD_INFO_H */
 
 static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
                                unsigned long address)
 {
-#ifdef CONFIG_64BIT
        if (tlb->mm->context.asce_limit <= (1UL << 31))
                return;
        pgtable_pmd_page_dtor(virt_to_page(pmd));
        tlb_remove_table(tlb, pmd);
-#endif
 }
 
 /*
 static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
                                unsigned long address)
 {
-#ifdef CONFIG_64BIT
        if (tlb->mm->context.asce_limit <= (1UL << 42))
                return;
        tlb_remove_table(tlb, pud);
-#endif
 }
 
 #define tlb_start_vma(tlb, vma)                        do { } while (0)
 
        register unsigned long reg4 asm("4");
        long dummy;
 
-#ifndef CONFIG_64BIT
-       if (!MACHINE_HAS_CSP) {
-               smp_ptlb_all();
-               return;
-       }
-#endif /* CONFIG_64BIT */
-
        dummy = 0;
        reg2 = reg3 = 0;
        reg4 = ((unsigned long) &dummy) + 1;
 
 
 #include <uapi/asm/types.h>
 
-/*
- * These aren't exported outside the kernel to avoid name space clashes
- */
-
-#ifndef __ASSEMBLY__
-
-#ifndef CONFIG_64BIT
-typedef union {
-       unsigned long long pair;
-       struct {
-               unsigned long even;
-               unsigned long odd;
-       } subreg;
-} register_pair;
-
-#endif /* ! CONFIG_64BIT   */
-#endif /* __ASSEMBLY__  */
 #endif /* _S390_TYPES_H */
 
 #include <uapi/asm/unistd.h>
 
 
-#ifndef CONFIG_64BIT
-#define __IGNORE_select
-#else
 #define __IGNORE_time
-#endif
 
 /* Ignore NUMA system calls. Not wired up on s390. */
 #define __IGNORE_mbind
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-# ifndef CONFIG_64BIT
-#   define __ARCH_WANT_STAT64
-#   define __ARCH_WANT_SYS_TIME
-# endif
 # ifdef CONFIG_COMPAT
 #   define __ARCH_WANT_COMPAT_SYS_TIME
 # endif
 
 
 extern struct vdso_data *vdso_data;
 
-#ifdef CONFIG_64BIT
 int vdso_alloc_per_cpu(struct _lowcore *lowcore);
 void vdso_free_per_cpu(struct _lowcore *lowcore);
-#endif
 
 #endif /* __ASSEMBLY__ */
 #endif /* __S390_VDSO_H__ */
 
 #
 CFLAGS_ptrace.o                += -DUTS_MACHINE='"$(UTS_MACHINE)"'
 
-CFLAGS_sysinfo.o += -Iinclude/math-emu -Iarch/s390/math-emu -w
+CFLAGS_sysinfo.o += -w
 
 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 sclp.o vdso.o
 obj-y  += sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o
-obj-y  += dumpstack.o
+obj-y  += runtime_instr.o cache.o dumpstack.o
+obj-y  += entry64.o reipl64.o relocate_kernel64.o
 
-obj-y  += $(if $(CONFIG_64BIT),entry64.o,entry.o)
-obj-y  += $(if $(CONFIG_64BIT),reipl64.o,reipl.o)
-obj-y  += $(if $(CONFIG_64BIT),relocate_kernel64.o,relocate_kernel.o)
-
-extra-y                                += head.o vmlinux.lds
-extra-y                                += $(if $(CONFIG_64BIT),head64.o,head31.o)
+extra-y                                += head.o head64.o vmlinux.lds
 
 obj-$(CONFIG_MODULES)          += s390_ksyms.o module.o
 obj-$(CONFIG_SMP)              += smp.o
 obj-$(CONFIG_CRASH_DUMP)       += crash_dump.o
 obj-$(CONFIG_UPROBES)          += uprobes.o
 
-ifdef CONFIG_64BIT
-obj-$(CONFIG_PERF_EVENTS)      += perf_event.o perf_cpum_cf.o perf_cpum_sf.o \
-                                               perf_cpum_cf_events.o
-obj-y                          += runtime_instr.o cache.o
-endif
+obj-$(CONFIG_PERF_EVENTS)      += perf_event.o perf_cpum_cf.o perf_cpum_sf.o
+obj-$(CONFIG_PERF_EVENTS)      += perf_cpum_cf_events.o
 
 # vdso
-obj-$(CONFIG_64BIT)            += vdso64/
-obj-$(CONFIG_32BIT)            += vdso32/
+obj-y                          += vdso64/
 obj-$(CONFIG_COMPAT)           += vdso32/
 
        DEFINE(__LC_FPREGS_SAVE_AREA, offsetof(struct _lowcore, floating_pt_save_area));
        DEFINE(__LC_GPREGS_SAVE_AREA, offsetof(struct _lowcore, gpregs_save_area));
        DEFINE(__LC_CREGS_SAVE_AREA, offsetof(struct _lowcore, cregs_save_area));
-#ifdef CONFIG_32BIT
-       DEFINE(SAVE_AREA_BASE, offsetof(struct _lowcore, extended_save_area_addr));
-#else /* CONFIG_32BIT */
        DEFINE(__LC_DATA_EXC_CODE, offsetof(struct _lowcore, data_exc_code));
        DEFINE(__LC_MCCK_FAIL_STOR_ADDR, offsetof(struct _lowcore, failing_storage_address));
        DEFINE(__LC_EXT_PARAMS2, offsetof(struct _lowcore, ext_params2));
        DEFINE(__GMAP_ASCE, offsetof(struct gmap, asce));
        DEFINE(__SIE_PROG0C, offsetof(struct kvm_s390_sie_block, prog0c));
        DEFINE(__SIE_PROG20, offsetof(struct kvm_s390_sie_block, prog20));
-#endif /* CONFIG_32BIT */
        return 0;
 }
 
 #include <asm/ptrace.h>
 #include <asm/sigp.h>
 
-#ifdef CONFIG_64BIT
-
 ENTRY(s390_base_mcck_handler)
        basr    %r13,0
 0:     lg      %r15,__LC_PANIC_STACK   # load panic stack
 .Lfpctl:
        .long   0
        .previous
-
-#else /* CONFIG_64BIT */
-
-ENTRY(s390_base_mcck_handler)
-       basr    %r13,0
-0:     l       %r15,__LC_PANIC_STACK   # load panic stack
-       ahi     %r15,-STACK_FRAME_OVERHEAD
-       l       %r1,2f-0b(%r13)
-       l       %r1,0(%r1)
-       ltr     %r1,%r1
-       jz      1f
-       basr    %r14,%r1
-1:     lm      %r0,%r15,__LC_GPREGS_SAVE_AREA
-       lpsw    __LC_MCK_OLD_PSW
-
-2:     .long   s390_base_mcck_handler_fn
-
-       .section .bss
-       .align 4
-       .globl  s390_base_mcck_handler_fn
-s390_base_mcck_handler_fn:
-       .long   0
-       .previous
-
-ENTRY(s390_base_ext_handler)
-       stm     %r0,%r15,__LC_SAVE_AREA_ASYNC
-       basr    %r13,0
-0:     ahi     %r15,-STACK_FRAME_OVERHEAD
-       l       %r1,2f-0b(%r13)
-       l       %r1,0(%r1)
-       ltr     %r1,%r1
-       jz      1f
-       basr    %r14,%r1
-1:     lm      %r0,%r15,__LC_SAVE_AREA_ASYNC
-       ni      __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
-       lpsw    __LC_EXT_OLD_PSW
-
-2:     .long   s390_base_ext_handler_fn
-
-       .section .bss
-       .align 4
-       .globl  s390_base_ext_handler_fn
-s390_base_ext_handler_fn:
-       .long   0
-       .previous
-
-ENTRY(s390_base_pgm_handler)
-       stm     %r0,%r15,__LC_SAVE_AREA_SYNC
-       basr    %r13,0
-0:     ahi     %r15,-STACK_FRAME_OVERHEAD
-       l       %r1,2f-0b(%r13)
-       l       %r1,0(%r1)
-       ltr     %r1,%r1
-       jz      1f
-       basr    %r14,%r1
-       lm      %r0,%r15,__LC_SAVE_AREA_SYNC
-       lpsw    __LC_PGM_OLD_PSW
-
-1:     lpsw    disabled_wait_psw-0b(%r13)
-
-2:     .long   s390_base_pgm_handler_fn
-
-disabled_wait_psw:
-       .align  8
-       .long   0x000a0000,0x00000000 + s390_base_pgm_handler
-
-       .section .bss
-       .align 4
-       .globl  s390_base_pgm_handler_fn
-s390_base_pgm_handler_fn:
-       .long   0
-       .previous
-
-#endif /* CONFIG_64BIT */
 
        register unsigned long reg3 asm ("3") = cmdlen;
 
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       diag    %1,%0,0x8\n"
-#else /* CONFIG_64BIT */
                "       sam31\n"
                "       diag    %1,%0,0x8\n"
                "       sam64\n"
-#endif /* CONFIG_64BIT */
                : "+d" (reg3) : "d" (reg2) : "cc");
        return reg3;
 }
        register unsigned long reg5 asm ("5") = *rlen;
 
        asm volatile(
-#ifndef CONFIG_64BIT
-               "       diag    %2,%0,0x8\n"
-               "       brc     8,1f\n"
-               "       ar      %1,%4\n"
-#else /* CONFIG_64BIT */
                "       sam31\n"
                "       diag    %2,%0,0x8\n"
                "       sam64\n"
                "       brc     8,1f\n"
                "       agr     %1,%4\n"
-#endif /* CONFIG_64BIT */
                "1:\n"
                : "+d" (reg4), "+d" (reg5)
                : "d" (reg2), "d" (reg3), "d" (*rlen) : "cc");
 
        int rc = 0;
 
        asm volatile(
-#ifdef CONFIG_64BIT
                "   sam31\n"
                "   diag    %2,2,0x14\n"
                "   sam64\n"
-#else
-               "   diag    %2,2,0x14\n"
-#endif
                "   ipm     %0\n"
                "   srl     %0,28\n"
                : "=d" (rc), "+d" (_ry2)
        spin_lock_irqsave(&diag210_lock, flags);
        diag210_tmp = *addr;
 
-#ifdef CONFIG_64BIT
        asm volatile(
                "       lhi     %0,-1\n"
                "       sam31\n"
                "1:     sam64\n"
                EX_TABLE(0b, 1b)
                : "=&d" (ccode) : "a" (&diag210_tmp) : "cc", "memory");
-#else
-       asm volatile(
-               "       lhi     %0,-1\n"
-               "       diag    %1,0,0x210\n"
-               "0:     ipm     %0\n"
-               "       srl     %0,28\n"
-               "1:\n"
-               EX_TABLE(0b, 1b)
-               : "=&d" (ccode) : "a" (&diag210_tmp) : "cc", "memory");
-#endif
 
        *addr = diag210_tmp;
        spin_unlock_irqrestore(&diag210_lock, flags);
 
 #include <asm/debug.h>
 #include <asm/irq.h>
 
-#ifndef CONFIG_64BIT
-#define ONELONG "%08lx: "
-#else /* CONFIG_64BIT */
-#define ONELONG "%016lx: "
-#endif /* CONFIG_64BIT */
-
 enum {
        UNUSED, /* Indicates the end of the operand list */
        R_8,    /* GPR starting at position 8 */
 };
 
 static struct s390_insn opcode[] = {
-#ifdef CONFIG_64BIT
        { "bprp", 0xc5, INSTR_MII_UPI },
        { "bpp", 0xc7, INSTR_SMI_U0RDP },
        { "trtr", 0xd0, INSTR_SS_L0RDRD },
        { "lmd", 0xef, INSTR_SS_RRRDRD3 },
-#endif
        { "spm", 0x04, INSTR_RR_R0 },
        { "balr", 0x05, INSTR_RR_RR },
        { "bctr", 0x06, INSTR_RR_RR },
 };
 
 static struct s390_insn opcode_01[] = {
-#ifdef CONFIG_64BIT
        { "ptff", 0x04, INSTR_E },
        { "pfpo", 0x0a, INSTR_E },
        { "sam64", 0x0e, INSTR_E },
-#endif
        { "pr", 0x01, INSTR_E },
        { "upt", 0x02, INSTR_E },
        { "sckpf", 0x07, INSTR_E },
 };
 
 static struct s390_insn opcode_a5[] = {
-#ifdef CONFIG_64BIT
        { "iihh", 0x00, INSTR_RI_RU },
        { "iihl", 0x01, INSTR_RI_RU },
        { "iilh", 0x02, INSTR_RI_RU },
        { "llihl", 0x0d, INSTR_RI_RU },
        { "llilh", 0x0e, INSTR_RI_RU },
        { "llill", 0x0f, INSTR_RI_RU },
-#endif
        { "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_a7[] = {
-#ifdef CONFIG_64BIT
        { "tmhh", 0x02, INSTR_RI_RU },
        { "tmhl", 0x03, INSTR_RI_RU },
        { "brctg", 0x07, INSTR_RI_RP },
        { "aghi", 0x0b, INSTR_RI_RI },
        { "mghi", 0x0d, INSTR_RI_RI },
        { "cghi", 0x0f, INSTR_RI_RI },
-#endif
        { "tmlh", 0x00, INSTR_RI_RU },
        { "tmll", 0x01, INSTR_RI_RU },
        { "brc", 0x04, INSTR_RI_UP },
 };
 
 static struct s390_insn opcode_aa[] = {
-#ifdef CONFIG_64BIT
        { { 0, LONG_INSN_RINEXT }, 0x00, INSTR_RI_RI },
        { "rion", 0x01, INSTR_RI_RI },
        { "tric", 0x02, INSTR_RI_RI },
        { "rioff", 0x03, INSTR_RI_RI },
        { { 0, LONG_INSN_RIEMIT }, 0x04, INSTR_RI_RI },
-#endif
        { "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_b2[] = {
-#ifdef CONFIG_64BIT
        { "stckf", 0x7c, INSTR_S_RD },
        { "lpp", 0x80, INSTR_S_RD },
        { "lcctl", 0x84, INSTR_S_RD },
        { "tend", 0xf8, INSTR_S_00 },
        { "niai", 0xfa, INSTR_IE_UU },
        { { 0, LONG_INSN_TABORT }, 0xfc, INSTR_S_RD },
-#endif
        { "stidp", 0x02, INSTR_S_RD },
        { "sck", 0x04, INSTR_S_RD },
        { "stck", 0x05, INSTR_S_RD },
 };
 
 static struct s390_insn opcode_b3[] = {
-#ifdef CONFIG_64BIT
        { "maylr", 0x38, INSTR_RRF_F0FF },
        { "mylr", 0x39, INSTR_RRF_F0FF },
        { "mayr", 0x3a, INSTR_RRF_F0FF },
        { "qaxtr", 0xfd, INSTR_RRF_FUFF },
        { "iextr", 0xfe, INSTR_RRF_F0FR },
        { "rrxtr", 0xff, INSTR_RRF_FFRU },
-#endif
        { "lpebr", 0x00, INSTR_RRE_FF },
        { "lnebr", 0x01, INSTR_RRE_FF },
        { "ltebr", 0x02, INSTR_RRE_FF },
 };
 
 static struct s390_insn opcode_b9[] = {
-#ifdef CONFIG_64BIT
        { "lpgr", 0x00, INSTR_RRE_RR },
        { "lngr", 0x01, INSTR_RRE_RR },
        { "ltgr", 0x02, INSTR_RRE_RR },
        { "srk", 0xf9, INSTR_RRF_R0RR2 },
        { "alrk", 0xfa, INSTR_RRF_R0RR2 },
        { "slrk", 0xfb, INSTR_RRF_R0RR2 },
-#endif
        { "kmac", 0x1e, INSTR_RRE_RR },
        { "lrvr", 0x1f, INSTR_RRE_RR },
        { "km", 0x2e, INSTR_RRE_RR },
 };
 
 static struct s390_insn opcode_c0[] = {
-#ifdef CONFIG_64BIT
        { "lgfi", 0x01, INSTR_RIL_RI },
        { "xihf", 0x06, INSTR_RIL_RU },
        { "xilf", 0x07, INSTR_RIL_RU },
        { "oilf", 0x0d, INSTR_RIL_RU },
        { "llihf", 0x0e, INSTR_RIL_RU },
        { "llilf", 0x0f, INSTR_RIL_RU },
-#endif
        { "larl", 0x00, INSTR_RIL_RP },
        { "brcl", 0x04, INSTR_RIL_UP },
        { "brasl", 0x05, INSTR_RIL_RP },
 };
 
 static struct s390_insn opcode_c2[] = {
-#ifdef CONFIG_64BIT
        { "msgfi", 0x00, INSTR_RIL_RI },
        { "msfi", 0x01, INSTR_RIL_RI },
        { "slgfi", 0x04, INSTR_RIL_RU },
        { "cfi", 0x0d, INSTR_RIL_RI },
        { "clgfi", 0x0e, INSTR_RIL_RU },
        { "clfi", 0x0f, INSTR_RIL_RU },
-#endif
        { "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_c4[] = {
-#ifdef CONFIG_64BIT
        { "llhrl", 0x02, INSTR_RIL_RP },
        { "lghrl", 0x04, INSTR_RIL_RP },
        { "lhrl", 0x05, INSTR_RIL_RP },
        { "lrl", 0x0d, INSTR_RIL_RP },
        { { 0, LONG_INSN_LLGFRL }, 0x0e, INSTR_RIL_RP },
        { "strl", 0x0f, INSTR_RIL_RP },
-#endif
        { "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_c6[] = {
-#ifdef CONFIG_64BIT
        { "exrl", 0x00, INSTR_RIL_RP },
        { "pfdrl", 0x02, INSTR_RIL_UP },
        { "cghrl", 0x04, INSTR_RIL_RP },
        { "crl", 0x0d, INSTR_RIL_RP },
        { { 0, LONG_INSN_CLGFRL }, 0x0e, INSTR_RIL_RP },
        { "clrl", 0x0f, INSTR_RIL_RP },
-#endif
        { "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_c8[] = {
-#ifdef CONFIG_64BIT
        { "mvcos", 0x00, INSTR_SSF_RRDRD },
        { "ectg", 0x01, INSTR_SSF_RRDRD },
        { "csst", 0x02, INSTR_SSF_RRDRD },
        { "lpd", 0x04, INSTR_SSF_RRDRD2 },
        { "lpdg", 0x05, INSTR_SSF_RRDRD2 },
-#endif
        { "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_cc[] = {
-#ifdef CONFIG_64BIT
        { "brcth", 0x06, INSTR_RIL_RP },
        { "aih", 0x08, INSTR_RIL_RI },
        { "alsih", 0x0a, INSTR_RIL_RI },
        { { 0, LONG_INSN_ALSIHN }, 0x0b, INSTR_RIL_RI },
        { "cih", 0x0d, INSTR_RIL_RI },
        { "clih", 0x0f, INSTR_RIL_RI },
-#endif
        { "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_e3[] = {
-#ifdef CONFIG_64BIT
        { "ltg", 0x02, INSTR_RXY_RRRD },
        { "lrag", 0x03, INSTR_RXY_RRRD },
        { "lg", 0x04, INSTR_RXY_RRRD },
        { "clhf", 0xcf, INSTR_RXY_RRRD },
        { { 0, LONG_INSN_MPCIFC }, 0xd0, INSTR_RXY_RRRD },
        { { 0, LONG_INSN_STPCIFC }, 0xd4, INSTR_RXY_RRRD },
-#endif
        { "lrv", 0x1e, INSTR_RXY_RRRD },
        { "lrvh", 0x1f, INSTR_RXY_RRRD },
        { "strv", 0x3e, INSTR_RXY_RRRD },
 };
 
 static struct s390_insn opcode_e5[] = {
-#ifdef CONFIG_64BIT
        { "strag", 0x02, INSTR_SSE_RDRD },
        { "mvhhi", 0x44, INSTR_SIL_RDI },
        { "mvghi", 0x48, INSTR_SIL_RDI },
        { { 0, LONG_INSN_CLFHSI }, 0x5d, INSTR_SIL_RDU },
        { { 0, LONG_INSN_TBEGIN }, 0x60, INSTR_SIL_RDU },
        { { 0, LONG_INSN_TBEGINC }, 0x61, INSTR_SIL_RDU },
-#endif
        { "lasp", 0x00, INSTR_SSE_RDRD },
        { "tprot", 0x01, INSTR_SSE_RDRD },
        { "mvcsk", 0x0e, INSTR_SSE_RDRD },
 };
 
 static struct s390_insn opcode_e7[] = {
-#ifdef CONFIG_64BIT
        { "lcbb", 0x27, INSTR_RXE_RRRDM },
        { "vgef", 0x13, INSTR_VRV_VVRDM },
        { "vgeg", 0x12, INSTR_VRV_VVRDM },
        { "vfsq", 0xce, INSTR_VRR_VV000MM },
        { "vfs", 0xe2, INSTR_VRR_VVV00MM },
        { "vftci", 0x4a, INSTR_VRI_VVIMM },
-#endif
 };
 
 static struct s390_insn opcode_eb[] = {
-#ifdef CONFIG_64BIT
        { "lmg", 0x04, INSTR_RSY_RRRD },
        { "srag", 0x0a, INSTR_RSY_RRRD },
        { "slag", 0x0b, INSTR_RSY_RRRD },
        { "stric", 0x61, INSTR_RSY_RDRM },
        { "mric", 0x62, INSTR_RSY_RDRM },
        { { 0, LONG_INSN_STCCTM }, 0x17, INSTR_RSY_RMRD },
-#endif
        { "rll", 0x1d, INSTR_RSY_RRRD },
        { "mvclu", 0x8e, INSTR_RSY_RRRD },
        { "tp", 0xc0, INSTR_RSL_R0RD },
 };
 
 static struct s390_insn opcode_ec[] = {
-#ifdef CONFIG_64BIT
        { "brxhg", 0x44, INSTR_RIE_RRP },
        { "brxlg", 0x45, INSTR_RIE_RRP },
        { { 0, LONG_INSN_RISBLG }, 0x51, INSTR_RIE_RRUUU },
        { "clgib", 0xfd, INSTR_RIS_RURDU },
        { "cib", 0xfe, INSTR_RIS_RURDI },
        { "clib", 0xff, INSTR_RIS_RURDU },
-#endif
        { "", 0, INSTR_INVALID }
 };
 
 static struct s390_insn opcode_ed[] = {
-#ifdef CONFIG_64BIT
        { "mayl", 0x38, INSTR_RXF_FRRDF },
        { "myl", 0x39, INSTR_RXF_FRRDF },
        { "may", 0x3a, INSTR_RXF_FRRDF },
        { "czxt", 0xa9, INSTR_RSL_LRDFU },
        { "cdzt", 0xaa, INSTR_RSL_LRDFU },
        { "cxzt", 0xab, INSTR_RSL_LRDFU },
-#endif
        { "ldeb", 0x04, INSTR_RXE_FRRD },
        { "lxdb", 0x05, INSTR_RXE_FRRD },
        { "lxeb", 0x06, INSTR_RXE_FRRD },
                else
                        *ptr++ = ' ';
                addr = regs->psw.addr + start - 32;
-               ptr += sprintf(ptr, ONELONG, addr);
+               ptr += sprintf(ptr, "%016lx: ", addr);
                if (start + opsize >= end)
                        break;
                for (i = 0; i < opsize; i++)
 
 #include <asm/dis.h>
 #include <asm/ipl.h>
 
-#ifndef CONFIG_64BIT
-#define LONG "%08lx "
-#define FOURLONG "%08lx %08lx %08lx %08lx\n"
-static int kstack_depth_to_print = 12;
-#else /* CONFIG_64BIT */
-#define LONG "%016lx "
-#define FOURLONG "%016lx %016lx %016lx %016lx\n"
-static int kstack_depth_to_print = 20;
-#endif /* CONFIG_64BIT */
-
 /*
  * For show_trace we have tree different stack to consider:
  *   - the panic stack which is used if the kernel stack has overflown
        else
                stack = sp;
 
-       for (i = 0; i < kstack_depth_to_print; i++) {
+       for (i = 0; i < 20; i++) {
                if (((addr_t) stack & (THREAD_SIZE-1)) == 0)
                        break;
                if ((i * sizeof(long) % 32) == 0)
                        printk("%s       ", i == 0 ? "" : "\n");
-               printk(LONG, *stack++);
+               printk("%016lx ", *stack++);
        }
        printk("\n");
        show_trace(task, sp);
 
 static void show_last_breaking_event(struct pt_regs *regs)
 {
-#ifdef CONFIG_64BIT
        printk("Last Breaking-Event-Address:\n");
        printk(" [<%016lx>] %pSR\n", regs->args[0], (void *)regs->args[0]);
-#endif
 }
 
 static inline int mask_bits(struct pt_regs *regs, unsigned long bits)
               mask_bits(regs, PSW_MASK_MCHECK), mask_bits(regs, PSW_MASK_WAIT),
               mask_bits(regs, PSW_MASK_PSTATE), mask_bits(regs, PSW_MASK_ASC),
               mask_bits(regs, PSW_MASK_CC), mask_bits(regs, PSW_MASK_PM));
-#ifdef CONFIG_64BIT
        printk(" EA:%x", mask_bits(regs, PSW_MASK_EA | PSW_MASK_BA));
-#endif
-       printk("\n%s GPRS: " FOURLONG, mode,
+       printk("\n%s GPRS: %016lx %016lx %016lx %016lx\n", mode,
               regs->gprs[0], regs->gprs[1], regs->gprs[2], regs->gprs[3]);
-       printk("           " FOURLONG,
+       printk("           %016lx %016lx %016lx %016lx\n",
               regs->gprs[4], regs->gprs[5], regs->gprs[6], regs->gprs[7]);
-       printk("           " FOURLONG,
+       printk("           %016lx %016lx %016lx %016lx\n",
               regs->gprs[8], regs->gprs[9], regs->gprs[10], regs->gprs[11]);
-       printk("           " FOURLONG,
+       printk("           %016lx %016lx %016lx %016lx\n",
               regs->gprs[12], regs->gprs[13], regs->gprs[14], regs->gprs[15]);
        show_code(regs);
 }
 
        "       .align  4\n"
        "       .type   savesys_ipl_nss, @function\n"
        "savesys_ipl_nss:\n"
-#ifdef CONFIG_64BIT
        "       stmg    6,15,48(15)\n"
        "       lgr     14,3\n"
        "       sam31\n"
        "       sam64\n"
        "       lgr     2,14\n"
        "       lmg     6,15,48(15)\n"
-#else
-       "       stm     6,15,24(15)\n"
-       "       lr      14,3\n"
-       "       diag    2,14,0x8\n"
-       "       lr      2,14\n"
-       "       lm      6,15,24(15)\n"
-#endif
        "       br      14\n"
        "       .size   savesys_ipl_nss, .-savesys_ipl_nss\n"
        "       .previous\n");
 
 static __init void setup_topology(void)
 {
-#ifdef CONFIG_64BIT
        int max_mnest;
 
        if (!test_facility(11))
                        break;
        }
        topology_max_mnest = max_mnest;
-#endif
 }
 
 static void early_pgm_check_handler(void)
              ARRAY_SIZE(S390_lowcore.stfle_fac_list));
 }
 
-static __init void detect_mvpg(void)
-{
-#ifndef CONFIG_64BIT
-       int rc;
-
-       asm volatile(
-               "       la      0,0\n"
-               "       mvpg    %2,%2\n"
-               "0:     la      %0,0\n"
-               "1:\n"
-               EX_TABLE(0b,1b)
-               : "=d" (rc) : "0" (-EOPNOTSUPP), "a" (0) : "memory", "cc", "0");
-       if (!rc)
-               S390_lowcore.machine_flags |= MACHINE_FLAG_MVPG;
-#endif
-}
-
-static __init void detect_ieee(void)
-{
-#ifndef CONFIG_64BIT
-       int rc, tmp;
-
-       asm volatile(
-               "       efpc    %1,0\n"
-               "0:     la      %0,0\n"
-               "1:\n"
-               EX_TABLE(0b,1b)
-               : "=d" (rc), "=d" (tmp): "0" (-EOPNOTSUPP) : "cc");
-       if (!rc)
-               S390_lowcore.machine_flags |= MACHINE_FLAG_IEEE;
-#endif
-}
-
-static __init void detect_csp(void)
-{
-#ifndef CONFIG_64BIT
-       int rc;
-
-       asm volatile(
-               "       la      0,0\n"
-               "       la      1,0\n"
-               "       la      2,4\n"
-               "       csp     0,2\n"
-               "0:     la      %0,0\n"
-               "1:\n"
-               EX_TABLE(0b,1b)
-               : "=d" (rc) : "0" (-EOPNOTSUPP) : "cc", "0", "1", "2");
-       if (!rc)
-               S390_lowcore.machine_flags |= MACHINE_FLAG_CSP;
-#endif
-}
-
 static __init void detect_diag9c(void)
 {
        unsigned int cpu_address;
 
 static __init void detect_diag44(void)
 {
-#ifdef CONFIG_64BIT
        int rc;
 
        asm volatile(
                : "=d" (rc) : "0" (-EOPNOTSUPP) : "cc");
        if (!rc)
                S390_lowcore.machine_flags |= MACHINE_FLAG_DIAG44;
-#endif
 }
 
 static __init void detect_machine_facilities(void)
 {
-#ifdef CONFIG_64BIT
        if (test_facility(8)) {
                S390_lowcore.machine_flags |= MACHINE_FLAG_EDAT1;
                __ctl_set_bit(0, 23);
                S390_lowcore.machine_flags |= MACHINE_FLAG_TLB_LC;
        if (test_facility(129))
                S390_lowcore.machine_flags |= MACHINE_FLAG_VX;
-#endif
 }
 
 static int __init cad_setup(char *str)
        ipl_update_parameters();
        setup_boot_command_line();
        create_kernel_nss();
-       detect_mvpg();
-       detect_ieee();
-       detect_csp();
        detect_diag9c();
        detect_diag44();
        detect_machine_facilities();
 
+++ /dev/null
-/*
- *    S390 low-level entry points.
- *
- *    Copyright IBM Corp. 1999, 2012
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *              Hartmut Penner (hp@de.ibm.com),
- *              Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *              Heiko Carstens <heiko.carstens@de.ibm.com>
- */
-
-#include <linux/init.h>
-#include <linux/linkage.h>
-#include <asm/processor.h>
-#include <asm/cache.h>
-#include <asm/errno.h>
-#include <asm/ptrace.h>
-#include <asm/thread_info.h>
-#include <asm/asm-offsets.h>
-#include <asm/unistd.h>
-#include <asm/page.h>
-#include <asm/sigp.h>
-#include <asm/irq.h>
-
-__PT_R0      = __PT_GPRS
-__PT_R1      = __PT_GPRS + 4
-__PT_R2      = __PT_GPRS + 8
-__PT_R3      = __PT_GPRS + 12
-__PT_R4      = __PT_GPRS + 16
-__PT_R5      = __PT_GPRS + 20
-__PT_R6      = __PT_GPRS + 24
-__PT_R7      = __PT_GPRS + 28
-__PT_R8      = __PT_GPRS + 32
-__PT_R9      = __PT_GPRS + 36
-__PT_R10     = __PT_GPRS + 40
-__PT_R11     = __PT_GPRS + 44
-__PT_R12     = __PT_GPRS + 48
-__PT_R13     = __PT_GPRS + 524
-__PT_R14     = __PT_GPRS + 56
-__PT_R15     = __PT_GPRS + 60
-
-STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
-STACK_SIZE  = 1 << STACK_SHIFT
-STACK_INIT  = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE
-
-_TIF_WORK      = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED)
-_TIF_TRACE     = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \
-                  _TIF_SYSCALL_TRACEPOINT)
-_CIF_WORK      = (_CIF_MCCK_PENDING | _CIF_ASCE)
-_PIF_WORK      = (_PIF_PER_TRAP)
-
-#define BASED(name) name-system_call(%r13)
-
-       .macro  TRACE_IRQS_ON
-#ifdef CONFIG_TRACE_IRQFLAGS
-       basr    %r2,%r0
-       l       %r1,BASED(.Lc_hardirqs_on)
-       basr    %r14,%r1                # call trace_hardirqs_on_caller
-#endif
-       .endm
-
-       .macro  TRACE_IRQS_OFF
-#ifdef CONFIG_TRACE_IRQFLAGS
-       basr    %r2,%r0
-       l       %r1,BASED(.Lc_hardirqs_off)
-       basr    %r14,%r1                # call trace_hardirqs_off_caller
-#endif
-       .endm
-
-       .macro  LOCKDEP_SYS_EXIT
-#ifdef CONFIG_LOCKDEP
-       tm      __PT_PSW+1(%r11),0x01   # returning to user ?
-       jz      .+10
-       l       %r1,BASED(.Lc_lockdep_sys_exit)
-       basr    %r14,%r1                # call lockdep_sys_exit
-#endif
-       .endm
-
-       .macro  CHECK_STACK stacksize,savearea
-#ifdef CONFIG_CHECK_STACK
-       tml     %r15,\stacksize - CONFIG_STACK_GUARD
-       la      %r14,\savearea
-       jz      stack_overflow
-#endif
-       .endm
-
-       .macro  SWITCH_ASYNC savearea,stack,shift
-       tmh     %r8,0x0001              # interrupting from user ?
-       jnz     1f
-       lr      %r14,%r9
-       sl      %r14,BASED(.Lc_critical_start)
-       cl      %r14,BASED(.Lc_critical_length)
-       jhe     0f
-       la      %r11,\savearea          # inside critical section, do cleanup
-       bras    %r14,cleanup_critical
-       tmh     %r8,0x0001              # retest problem state after cleanup
-       jnz     1f
-0:     l       %r14,\stack             # are we already on the target stack?
-       slr     %r14,%r15
-       sra     %r14,\shift
-       jnz     1f
-       CHECK_STACK 1<<\shift,\savearea
-       ahi     %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
-       j       2f
-1:     l       %r15,\stack             # load target stack
-2:     la      %r11,STACK_FRAME_OVERHEAD(%r15)
-       .endm
-
-       .macro  ADD64 high,low,timer
-       al      \high,\timer
-       al      \low,4+\timer
-       brc     12,.+8
-       ahi     \high,1
-       .endm
-
-       .macro  SUB64 high,low,timer
-       sl      \high,\timer
-       sl      \low,4+\timer
-       brc     3,.+8
-       ahi     \high,-1
-       .endm
-
-       .macro  UPDATE_VTIME high,low,enter_timer
-       lm      \high,\low,__LC_EXIT_TIMER
-       SUB64   \high,\low,\enter_timer
-       ADD64   \high,\low,__LC_USER_TIMER
-       stm     \high,\low,__LC_USER_TIMER
-       lm      \high,\low,__LC_LAST_UPDATE_TIMER
-       SUB64   \high,\low,__LC_EXIT_TIMER
-       ADD64   \high,\low,__LC_SYSTEM_TIMER
-       stm     \high,\low,__LC_SYSTEM_TIMER
-       mvc     __LC_LAST_UPDATE_TIMER(8),\enter_timer
-       .endm
-
-       .macro REENABLE_IRQS
-       st      %r8,__LC_RETURN_PSW
-       ni      __LC_RETURN_PSW,0xbf
-       ssm     __LC_RETURN_PSW
-       .endm
-
-       .section .kprobes.text, "ax"
-
-/*
- * Scheduler resume function, called by switch_to
- *  gpr2 = (task_struct *) prev
- *  gpr3 = (task_struct *) next
- * Returns:
- *  gpr2 = prev
- */
-ENTRY(__switch_to)
-       stm     %r6,%r15,__SF_GPRS(%r15)        # store gprs of prev task
-       st      %r15,__THREAD_ksp(%r2)          # store kernel stack of prev
-       l       %r4,__THREAD_info(%r2)          # get thread_info of prev
-       l       %r5,__THREAD_info(%r3)          # get thread_info of next
-       lr      %r15,%r5
-       ahi     %r15,STACK_INIT                 # end of kernel stack of next
-       st      %r3,__LC_CURRENT                # store task struct of next
-       st      %r5,__LC_THREAD_INFO            # store thread info of next
-       st      %r15,__LC_KERNEL_STACK          # store end of kernel stack
-       lctl    %c4,%c4,__TASK_pid(%r3)         # load pid to control reg. 4
-       mvc     __LC_CURRENT_PID(4,%r0),__TASK_pid(%r3) # store pid of next
-       l       %r15,__THREAD_ksp(%r3)          # load kernel stack of next
-       lm      %r6,%r15,__SF_GPRS(%r15)        # load gprs of next task
-       br      %r14
-
-.L__critical_start:
-/*
- * SVC interrupt handler routine. System calls are synchronous events and
- * are executed with interrupts enabled.
- */
-
-ENTRY(system_call)
-       stpt    __LC_SYNC_ENTER_TIMER
-.Lsysc_stm:
-       stm     %r8,%r15,__LC_SAVE_AREA_SYNC
-       l       %r12,__LC_THREAD_INFO
-       l       %r13,__LC_SVC_NEW_PSW+4
-       lhi     %r14,_PIF_SYSCALL
-.Lsysc_per:
-       l       %r15,__LC_KERNEL_STACK
-       la      %r11,STACK_FRAME_OVERHEAD(%r15) # pointer to pt_regs
-.Lsysc_vtime:
-       UPDATE_VTIME %r8,%r9,__LC_SYNC_ENTER_TIMER
-       stm     %r0,%r7,__PT_R0(%r11)
-       mvc     __PT_R8(32,%r11),__LC_SAVE_AREA_SYNC
-       mvc     __PT_PSW(8,%r11),__LC_SVC_OLD_PSW
-       mvc     __PT_INT_CODE(4,%r11),__LC_SVC_ILC
-       st      %r14,__PT_FLAGS(%r11)
-.Lsysc_do_svc:
-       l       %r10,__TI_sysc_table(%r12)      # 31 bit system call table
-       lh      %r8,__PT_INT_CODE+2(%r11)
-       sla     %r8,2                           # shift and test for svc0
-       jnz     .Lsysc_nr_ok
-       # svc 0: system call number in %r1
-       cl      %r1,BASED(.Lnr_syscalls)
-       jnl     .Lsysc_nr_ok
-       sth     %r1,__PT_INT_CODE+2(%r11)
-       lr      %r8,%r1
-       sla     %r8,2
-.Lsysc_nr_ok:
-       xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
-       st      %r2,__PT_ORIG_GPR2(%r11)
-       st      %r7,STACK_FRAME_OVERHEAD(%r15)
-       l       %r9,0(%r8,%r10)                 # get system call addr.
-       tm      __TI_flags+3(%r12),_TIF_TRACE
-       jnz     .Lsysc_tracesys
-       basr    %r14,%r9                        # call sys_xxxx
-       st      %r2,__PT_R2(%r11)               # store return value
-
-.Lsysc_return:
-       LOCKDEP_SYS_EXIT
-.Lsysc_tif:
-       tm      __PT_PSW+1(%r11),0x01           # returning to user ?
-       jno     .Lsysc_restore
-       tm      __PT_FLAGS+3(%r11),_PIF_WORK
-       jnz     .Lsysc_work
-       tm      __TI_flags+3(%r12),_TIF_WORK
-       jnz     .Lsysc_work                     # check for thread work
-       tm      __LC_CPU_FLAGS+3,_CIF_WORK
-       jnz     .Lsysc_work
-.Lsysc_restore:
-       mvc     __LC_RETURN_PSW(8),__PT_PSW(%r11)
-       stpt    __LC_EXIT_TIMER
-       lm      %r0,%r15,__PT_R0(%r11)
-       lpsw    __LC_RETURN_PSW
-.Lsysc_done:
-
-#
-# One of the work bits is on. Find out which one.
-#
-.Lsysc_work:
-       tm      __LC_CPU_FLAGS+3,_CIF_MCCK_PENDING
-       jo      .Lsysc_mcck_pending
-       tm      __TI_flags+3(%r12),_TIF_NEED_RESCHED
-       jo      .Lsysc_reschedule
-       tm      __PT_FLAGS+3(%r11),_PIF_PER_TRAP
-       jo      .Lsysc_singlestep
-       tm      __TI_flags+3(%r12),_TIF_SIGPENDING
-       jo      .Lsysc_sigpending
-       tm      __TI_flags+3(%r12),_TIF_NOTIFY_RESUME
-       jo      .Lsysc_notify_resume
-       tm      __LC_CPU_FLAGS+3,_CIF_ASCE
-       jo      .Lsysc_uaccess
-       j       .Lsysc_return           # beware of critical section cleanup
-
-#
-# _TIF_NEED_RESCHED is set, call schedule
-#
-.Lsysc_reschedule:
-       l       %r1,BASED(.Lc_schedule)
-       la      %r14,BASED(.Lsysc_return)
-       br      %r1                     # call schedule
-
-#
-# _CIF_MCCK_PENDING is set, call handler
-#
-.Lsysc_mcck_pending:
-       l       %r1,BASED(.Lc_handle_mcck)
-       la      %r14,BASED(.Lsysc_return)
-       br      %r1                     # TIF bit will be cleared by handler
-
-#
-# _CIF_ASCE is set, load user space asce
-#
-.Lsysc_uaccess:
-       ni      __LC_CPU_FLAGS+3,255-_CIF_ASCE
-       lctl    %c1,%c1,__LC_USER_ASCE  # load primary asce
-       j       .Lsysc_return
-
-#
-# _TIF_SIGPENDING is set, call do_signal
-#
-.Lsysc_sigpending:
-       lr      %r2,%r11                # pass pointer to pt_regs
-       l       %r1,BASED(.Lc_do_signal)
-       basr    %r14,%r1                # call do_signal
-       tm      __PT_FLAGS+3(%r11),_PIF_SYSCALL
-       jno     .Lsysc_return
-       lm      %r2,%r7,__PT_R2(%r11)   # load svc arguments
-       l       %r10,__TI_sysc_table(%r12)      # 31 bit system call table
-       xr      %r8,%r8                 # svc 0 returns -ENOSYS
-       clc     __PT_INT_CODE+2(2,%r11),BASED(.Lnr_syscalls+2)
-       jnl     .Lsysc_nr_ok            # invalid svc number -> do svc 0
-       lh      %r8,__PT_INT_CODE+2(%r11)       # load new svc number
-       sla     %r8,2
-       j       .Lsysc_nr_ok            # restart svc
-
-#
-# _TIF_NOTIFY_RESUME is set, call do_notify_resume
-#
-.Lsysc_notify_resume:
-       lr      %r2,%r11                # pass pointer to pt_regs
-       l       %r1,BASED(.Lc_do_notify_resume)
-       la      %r14,BASED(.Lsysc_return)
-       br      %r1                     # call do_notify_resume
-
-#
-# _PIF_PER_TRAP is set, call do_per_trap
-#
-.Lsysc_singlestep:
-       ni      __PT_FLAGS+3(%r11),255-_PIF_PER_TRAP
-       lr      %r2,%r11                # pass pointer to pt_regs
-       l       %r1,BASED(.Lc_do_per_trap)
-       la      %r14,BASED(.Lsysc_return)
-       br      %r1                     # call do_per_trap
-
-#
-# call tracehook_report_syscall_entry/tracehook_report_syscall_exit before
-# and after the system call
-#
-.Lsysc_tracesys:
-       l       %r1,BASED(.Lc_trace_enter)
-       lr      %r2,%r11                # pass pointer to pt_regs
-       la      %r3,0
-       xr      %r0,%r0
-       icm     %r0,3,__PT_INT_CODE+2(%r11)
-       st      %r0,__PT_R2(%r11)
-       basr    %r14,%r1                # call do_syscall_trace_enter
-       cl      %r2,BASED(.Lnr_syscalls)
-       jnl     .Lsysc_tracenogo
-       lr      %r8,%r2
-       sll     %r8,2
-       l       %r9,0(%r8,%r10)
-.Lsysc_tracego:
-       lm      %r3,%r7,__PT_R3(%r11)
-       st      %r7,STACK_FRAME_OVERHEAD(%r15)
-       l       %r2,__PT_ORIG_GPR2(%r11)
-       basr    %r14,%r9                # call sys_xxx
-       st      %r2,__PT_R2(%r11)       # store return value
-.Lsysc_tracenogo:
-       tm      __TI_flags+3(%r12),_TIF_TRACE
-       jz      .Lsysc_return
-       l       %r1,BASED(.Lc_trace_exit)
-       lr      %r2,%r11                # pass pointer to pt_regs
-       la      %r14,BASED(.Lsysc_return)
-       br      %r1                     # call do_syscall_trace_exit
-
-#
-# a new process exits the kernel with ret_from_fork
-#
-ENTRY(ret_from_fork)
-       la      %r11,STACK_FRAME_OVERHEAD(%r15)
-       l       %r12,__LC_THREAD_INFO
-       l       %r13,__LC_SVC_NEW_PSW+4
-       l       %r1,BASED(.Lc_schedule_tail)
-       basr    %r14,%r1                # call schedule_tail
-       TRACE_IRQS_ON
-       ssm     __LC_SVC_NEW_PSW        # reenable interrupts
-       tm      __PT_PSW+1(%r11),0x01   # forking a kernel thread ?
-       jne     .Lsysc_tracenogo
-       # it's a kernel thread
-       lm      %r9,%r10,__PT_R9(%r11)  # load gprs
-ENTRY(kernel_thread_starter)
-       la      %r2,0(%r10)
-       basr    %r14,%r9
-       j       .Lsysc_tracenogo
-
-/*
- * Program check handler routine
- */
-
-ENTRY(pgm_check_handler)
-       stpt    __LC_SYNC_ENTER_TIMER
-       stm     %r8,%r15,__LC_SAVE_AREA_SYNC
-       l       %r12,__LC_THREAD_INFO
-       l       %r13,__LC_SVC_NEW_PSW+4
-       lm      %r8,%r9,__LC_PGM_OLD_PSW
-       tmh     %r8,0x0001              # test problem state bit
-       jnz     1f                      # -> fault in user space
-       tmh     %r8,0x4000              # PER bit set in old PSW ?
-       jnz     0f                      # -> enabled, can't be a double fault
-       tm      __LC_PGM_ILC+3,0x80     # check for per exception
-       jnz     .Lpgm_svcper            # -> single stepped svc
-0:     CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC
-       ahi     %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
-       j       2f
-1:     UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER
-       l       %r15,__LC_KERNEL_STACK
-2:     la      %r11,STACK_FRAME_OVERHEAD(%r15)
-       stm     %r0,%r7,__PT_R0(%r11)
-       mvc     __PT_R8(32,%r11),__LC_SAVE_AREA_SYNC
-       stm     %r8,%r9,__PT_PSW(%r11)
-       mvc     __PT_INT_CODE(4,%r11),__LC_PGM_ILC
-       mvc     __PT_INT_PARM_LONG(4,%r11),__LC_TRANS_EXC_CODE
-       xc      __PT_FLAGS(4,%r11),__PT_FLAGS(%r11)
-       tm      __LC_PGM_ILC+3,0x80     # check for per exception
-       jz      0f
-       l       %r1,__TI_task(%r12)
-       tmh     %r8,0x0001              # kernel per event ?
-       jz      .Lpgm_kprobe
-       oi      __PT_FLAGS+3(%r11),_PIF_PER_TRAP
-       mvc     __THREAD_per_address(4,%r1),__LC_PER_ADDRESS
-       mvc     __THREAD_per_cause(2,%r1),__LC_PER_CODE
-       mvc     __THREAD_per_paid(1,%r1),__LC_PER_ACCESS_ID
-0:     REENABLE_IRQS
-       xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
-       l       %r1,BASED(.Lc_jump_table)
-       la      %r10,0x7f
-       n       %r10,__PT_INT_CODE(%r11)
-       je      .Lsysc_return
-       sll     %r10,2
-       l       %r1,0(%r10,%r1)         # load address of handler routine
-       lr      %r2,%r11                # pass pointer to pt_regs
-       basr    %r14,%r1                # branch to interrupt-handler
-       j       .Lsysc_return
-
-#
-# PER event in supervisor state, must be kprobes
-#
-.Lpgm_kprobe:
-       REENABLE_IRQS
-       xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
-       l       %r1,BASED(.Lc_do_per_trap)
-       lr      %r2,%r11                # pass pointer to pt_regs
-       basr    %r14,%r1                # call do_per_trap
-       j       .Lsysc_return
-
-#
-# single stepped system call
-#
-.Lpgm_svcper:
-       mvc     __LC_RETURN_PSW(4),__LC_SVC_NEW_PSW
-       mvc     __LC_RETURN_PSW+4(4),BASED(.Lc_sysc_per)
-       lhi     %r14,_PIF_SYSCALL | _PIF_PER_TRAP
-       lpsw    __LC_RETURN_PSW         # branch to .Lsysc_per and enable irqs
-
-/*
- * IO interrupt handler routine
- */
-
-ENTRY(io_int_handler)
-       stck    __LC_INT_CLOCK
-       stpt    __LC_ASYNC_ENTER_TIMER
-       stm     %r8,%r15,__LC_SAVE_AREA_ASYNC
-       l       %r12,__LC_THREAD_INFO
-       l       %r13,__LC_SVC_NEW_PSW+4
-       lm      %r8,%r9,__LC_IO_OLD_PSW
-       tmh     %r8,0x0001              # interrupting from user ?
-       jz      .Lio_skip
-       UPDATE_VTIME %r14,%r15,__LC_ASYNC_ENTER_TIMER
-.Lio_skip:
-       SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_STACK,STACK_SHIFT
-       stm     %r0,%r7,__PT_R0(%r11)
-       mvc     __PT_R8(32,%r11),__LC_SAVE_AREA_ASYNC
-       stm     %r8,%r9,__PT_PSW(%r11)
-       mvc     __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID
-       xc      __PT_FLAGS(4,%r11),__PT_FLAGS(%r11)
-       TRACE_IRQS_OFF
-       xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
-.Lio_loop:
-       l       %r1,BASED(.Lc_do_IRQ)
-       lr      %r2,%r11                # pass pointer to pt_regs
-       lhi     %r3,IO_INTERRUPT
-       tm      __PT_INT_CODE+8(%r11),0x80      # adapter interrupt ?
-       jz      .Lio_call
-       lhi     %r3,THIN_INTERRUPT
-.Lio_call:
-       basr    %r14,%r1                # call do_IRQ
-       tm      __LC_MACHINE_FLAGS+2,0x10       # MACHINE_FLAG_LPAR
-       jz      .Lio_return
-       tpi     0
-       jz      .Lio_return
-       mvc     __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID
-       j       .Lio_loop
-.Lio_return:
-       LOCKDEP_SYS_EXIT
-       TRACE_IRQS_ON
-.Lio_tif:
-       tm      __TI_flags+3(%r12),_TIF_WORK
-       jnz     .Lio_work               # there is work to do (signals etc.)
-       tm      __LC_CPU_FLAGS+3,_CIF_WORK
-       jnz     .Lio_work
-.Lio_restore:
-       mvc     __LC_RETURN_PSW(8),__PT_PSW(%r11)
-       stpt    __LC_EXIT_TIMER
-       lm      %r0,%r15,__PT_R0(%r11)
-       lpsw    __LC_RETURN_PSW
-.Lio_done:
-
-#
-# There is work todo, find out in which context we have been interrupted:
-# 1) if we return to user space we can do all _TIF_WORK work
-# 2) if we return to kernel code and preemptive scheduling is enabled check
-#    the preemption counter and if it is zero call preempt_schedule_irq
-# Before any work can be done, a switch to the kernel stack is required.
-#
-.Lio_work:
-       tm      __PT_PSW+1(%r11),0x01   # returning to user ?
-       jo      .Lio_work_user          # yes -> do resched & signal
-#ifdef CONFIG_PREEMPT
-       # check for preemptive scheduling
-       icm     %r0,15,__TI_precount(%r12)
-       jnz     .Lio_restore            # preemption disabled
-       tm      __TI_flags+3(%r12),_TIF_NEED_RESCHED
-       jno     .Lio_restore
-       # switch to kernel stack
-       l       %r1,__PT_R15(%r11)
-       ahi     %r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
-       mvc     STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)
-       xc      __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1)
-       la      %r11,STACK_FRAME_OVERHEAD(%r1)
-       lr      %r15,%r1
-       # TRACE_IRQS_ON already done at .Lio_return, call
-       # TRACE_IRQS_OFF to keep things symmetrical
-       TRACE_IRQS_OFF
-       l       %r1,BASED(.Lc_preempt_irq)
-       basr    %r14,%r1                # call preempt_schedule_irq
-       j       .Lio_return
-#else
-       j       .Lio_restore
-#endif
-
-#
-# Need to do work before returning to userspace, switch to kernel stack
-#
-.Lio_work_user:
-       l       %r1,__LC_KERNEL_STACK
-       mvc     STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)
-       xc      __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1)
-       la      %r11,STACK_FRAME_OVERHEAD(%r1)
-       lr      %r15,%r1
-
-#
-# One of the work bits is on. Find out which one.
-#
-.Lio_work_tif:
-       tm      __LC_CPU_FLAGS+3(%r12),_CIF_MCCK_PENDING
-       jo      .Lio_mcck_pending
-       tm      __TI_flags+3(%r12),_TIF_NEED_RESCHED
-       jo      .Lio_reschedule
-       tm      __TI_flags+3(%r12),_TIF_SIGPENDING
-       jo      .Lio_sigpending
-       tm      __TI_flags+3(%r12),_TIF_NOTIFY_RESUME
-       jo      .Lio_notify_resume
-       tm      __LC_CPU_FLAGS+3,_CIF_ASCE
-       jo      .Lio_uaccess
-       j       .Lio_return             # beware of critical section cleanup
-
-#
-# _CIF_MCCK_PENDING is set, call handler
-#
-.Lio_mcck_pending:
-       # TRACE_IRQS_ON already done at .Lio_return
-       l       %r1,BASED(.Lc_handle_mcck)
-       basr    %r14,%r1                # TIF bit will be cleared by handler
-       TRACE_IRQS_OFF
-       j       .Lio_return
-
-#
-# _CIF_ASCE is set, load user space asce
-#
-.Lio_uaccess:
-       ni      __LC_CPU_FLAGS+3,255-_CIF_ASCE
-       lctl    %c1,%c1,__LC_USER_ASCE  # load primary asce
-       j       .Lio_return
-
-#
-# _TIF_NEED_RESCHED is set, call schedule
-#
-.Lio_reschedule:
-       # TRACE_IRQS_ON already done at .Lio_return
-       l       %r1,BASED(.Lc_schedule)
-       ssm     __LC_SVC_NEW_PSW        # reenable interrupts
-       basr    %r14,%r1                # call scheduler
-       ssm     __LC_PGM_NEW_PSW        # disable I/O and ext. interrupts
-       TRACE_IRQS_OFF
-       j       .Lio_return
-
-#
-# _TIF_SIGPENDING is set, call do_signal
-#
-.Lio_sigpending:
-       # TRACE_IRQS_ON already done at .Lio_return
-       l       %r1,BASED(.Lc_do_signal)
-       ssm     __LC_SVC_NEW_PSW        # reenable interrupts
-       lr      %r2,%r11                # pass pointer to pt_regs
-       basr    %r14,%r1                # call do_signal
-       ssm     __LC_PGM_NEW_PSW        # disable I/O and ext. interrupts
-       TRACE_IRQS_OFF
-       j       .Lio_return
-
-#
-# _TIF_SIGPENDING is set, call do_signal
-#
-.Lio_notify_resume:
-       # TRACE_IRQS_ON already done at .Lio_return
-       l       %r1,BASED(.Lc_do_notify_resume)
-       ssm     __LC_SVC_NEW_PSW        # reenable interrupts
-       lr      %r2,%r11                # pass pointer to pt_regs
-       basr    %r14,%r1                # call do_notify_resume
-       ssm     __LC_PGM_NEW_PSW        # disable I/O and ext. interrupts
-       TRACE_IRQS_OFF
-       j       .Lio_return
-
-/*
- * External interrupt handler routine
- */
-
-ENTRY(ext_int_handler)
-       stck    __LC_INT_CLOCK
-       stpt    __LC_ASYNC_ENTER_TIMER
-       stm     %r8,%r15,__LC_SAVE_AREA_ASYNC
-       l       %r12,__LC_THREAD_INFO
-       l       %r13,__LC_SVC_NEW_PSW+4
-       lm      %r8,%r9,__LC_EXT_OLD_PSW
-       tmh     %r8,0x0001              # interrupting from user ?
-       jz      .Lext_skip
-       UPDATE_VTIME %r14,%r15,__LC_ASYNC_ENTER_TIMER
-.Lext_skip:
-       SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_STACK,STACK_SHIFT
-       stm     %r0,%r7,__PT_R0(%r11)
-       mvc     __PT_R8(32,%r11),__LC_SAVE_AREA_ASYNC
-       stm     %r8,%r9,__PT_PSW(%r11)
-       mvc     __PT_INT_CODE(4,%r11),__LC_EXT_CPU_ADDR
-       mvc     __PT_INT_PARM(4,%r11),__LC_EXT_PARAMS
-       xc      __PT_FLAGS(4,%r11),__PT_FLAGS(%r11)
-       TRACE_IRQS_OFF
-       l       %r1,BASED(.Lc_do_IRQ)
-       lr      %r2,%r11                # pass pointer to pt_regs
-       lhi     %r3,EXT_INTERRUPT
-       basr    %r14,%r1                # call do_IRQ
-       j       .Lio_return
-
-/*
- * Load idle PSW. The second "half" of this function is in .Lcleanup_idle.
- */
-ENTRY(psw_idle)
-       st      %r3,__SF_EMPTY(%r15)
-       basr    %r1,0
-       la      %r1,.Lpsw_idle_lpsw+4-.(%r1)
-       st      %r1,__SF_EMPTY+4(%r15)
-       oi      __SF_EMPTY+4(%r15),0x80
-       stck    __CLOCK_IDLE_ENTER(%r2)
-       stpt    __TIMER_IDLE_ENTER(%r2)
-.Lpsw_idle_lpsw:
-       lpsw    __SF_EMPTY(%r15)
-       br      %r14
-.Lpsw_idle_end:
-
-.L__critical_end:
-
-/*
- * Machine check handler routines
- */
-
-ENTRY(mcck_int_handler)
-       stck    __LC_MCCK_CLOCK
-       spt     __LC_CPU_TIMER_SAVE_AREA        # revalidate cpu timer
-       lm      %r0,%r15,__LC_GPREGS_SAVE_AREA  # revalidate gprs
-       l       %r12,__LC_THREAD_INFO
-       l       %r13,__LC_SVC_NEW_PSW+4
-       lm      %r8,%r9,__LC_MCK_OLD_PSW
-       tm      __LC_MCCK_CODE,0x80     # system damage?
-       jo      .Lmcck_panic            # yes -> rest of mcck code invalid
-       la      %r14,__LC_CPU_TIMER_SAVE_AREA
-       mvc     __LC_MCCK_ENTER_TIMER(8),0(%r14)
-       tm      __LC_MCCK_CODE+5,0x02   # stored cpu timer value valid?
-       jo      3f
-       la      %r14,__LC_SYNC_ENTER_TIMER
-       clc     0(8,%r14),__LC_ASYNC_ENTER_TIMER
-       jl      0f
-       la      %r14,__LC_ASYNC_ENTER_TIMER
-0:     clc     0(8,%r14),__LC_EXIT_TIMER
-       jl      1f
-       la      %r14,__LC_EXIT_TIMER
-1:     clc     0(8,%r14),__LC_LAST_UPDATE_TIMER
-       jl      2f
-       la      %r14,__LC_LAST_UPDATE_TIMER
-2:     spt     0(%r14)
-       mvc     __LC_MCCK_ENTER_TIMER(8),0(%r14)
-3:     tm      __LC_MCCK_CODE+2,0x09   # mwp + ia of old psw valid?
-       jno     .Lmcck_panic            # no -> skip cleanup critical
-       tm      %r8,0x0001              # interrupting from user ?
-       jz      .Lmcck_skip
-       UPDATE_VTIME %r14,%r15,__LC_MCCK_ENTER_TIMER
-.Lmcck_skip:
-       SWITCH_ASYNC __LC_GPREGS_SAVE_AREA+32,__LC_PANIC_STACK,PAGE_SHIFT
-       stm     %r0,%r7,__PT_R0(%r11)
-       mvc     __PT_R8(32,%r11),__LC_GPREGS_SAVE_AREA+32
-       stm     %r8,%r9,__PT_PSW(%r11)
-       xc      __PT_FLAGS(4,%r11),__PT_FLAGS(%r11)
-       xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
-       l       %r1,BASED(.Lc_do_machine_check)
-       lr      %r2,%r11                # pass pointer to pt_regs
-       basr    %r14,%r1                # call s390_do_machine_check
-       tm      __PT_PSW+1(%r11),0x01   # returning to user ?
-       jno     .Lmcck_return
-       l       %r1,__LC_KERNEL_STACK   # switch to kernel stack
-       mvc     STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11)
-       xc      __SF_BACKCHAIN(4,%r1),__SF_BACKCHAIN(%r1)
-       la      %r11,STACK_FRAME_OVERHEAD(%r15)
-       lr      %r15,%r1
-       ssm     __LC_PGM_NEW_PSW        # turn dat on, keep irqs off
-       tm      __LC_CPU_FLAGS+3,_CIF_MCCK_PENDING
-       jno     .Lmcck_return
-       TRACE_IRQS_OFF
-       l       %r1,BASED(.Lc_handle_mcck)
-       basr    %r14,%r1                # call s390_handle_mcck
-       TRACE_IRQS_ON
-.Lmcck_return:
-       mvc     __LC_RETURN_MCCK_PSW(8),__PT_PSW(%r11) # move return PSW
-       tm      __LC_RETURN_MCCK_PSW+1,0x01 # returning to user ?
-       jno     0f
-       lm      %r0,%r15,__PT_R0(%r11)
-       stpt    __LC_EXIT_TIMER
-       lpsw    __LC_RETURN_MCCK_PSW
-0:     lm      %r0,%r15,__PT_R0(%r11)
-       lpsw    __LC_RETURN_MCCK_PSW
-
-.Lmcck_panic:
-       l       %r14,__LC_PANIC_STACK
-       slr     %r14,%r15
-       sra     %r14,PAGE_SHIFT
-       jz      0f
-       l       %r15,__LC_PANIC_STACK
-       j       .Lmcck_skip
-0:     ahi     %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
-       j       .Lmcck_skip
-
-#
-# PSW restart interrupt handler
-#
-ENTRY(restart_int_handler)
-       st      %r15,__LC_SAVE_AREA_RESTART
-       l       %r15,__LC_RESTART_STACK
-       ahi     %r15,-__PT_SIZE                 # create pt_regs on stack
-       xc      0(__PT_SIZE,%r15),0(%r15)
-       stm     %r0,%r14,__PT_R0(%r15)
-       mvc     __PT_R15(4,%r15),__LC_SAVE_AREA_RESTART
-       mvc     __PT_PSW(8,%r15),__LC_RST_OLD_PSW # store restart old psw
-       ahi     %r15,-STACK_FRAME_OVERHEAD      # create stack frame on stack
-       xc      0(STACK_FRAME_OVERHEAD,%r15),0(%r15)
-       l       %r1,__LC_RESTART_FN             # load fn, parm & source cpu
-       l       %r2,__LC_RESTART_DATA
-       l       %r3,__LC_RESTART_SOURCE
-       ltr     %r3,%r3                         # test source cpu address
-       jm      1f                              # negative -> skip source stop
-0:     sigp    %r4,%r3,SIGP_SENSE              # sigp sense to source cpu
-       brc     10,0b                           # wait for status stored
-1:     basr    %r14,%r1                        # call function
-       stap    __SF_EMPTY(%r15)                # store cpu address
-       lh      %r3,__SF_EMPTY(%r15)
-2:     sigp    %r4,%r3,SIGP_STOP               # sigp stop to current cpu
-       brc     2,2b
-3:     j       3b
-
-       .section .kprobes.text, "ax"
-
-#ifdef CONFIG_CHECK_STACK
-/*
- * The synchronous or the asynchronous stack overflowed. We are dead.
- * No need to properly save the registers, we are going to panic anyway.
- * Setup a pt_regs so that show_trace can provide a good call trace.
- */
-stack_overflow:
-       l       %r15,__LC_PANIC_STACK   # change to panic stack
-       la      %r11,STACK_FRAME_OVERHEAD(%r15)
-       stm     %r0,%r7,__PT_R0(%r11)
-       stm     %r8,%r9,__PT_PSW(%r11)
-       mvc     __PT_R8(32,%r11),0(%r14)
-       l       %r1,BASED(1f)
-       xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
-       lr      %r2,%r11                # pass pointer to pt_regs
-       br      %r1                     # branch to kernel_stack_overflow
-1:     .long   kernel_stack_overflow
-#endif
-
-.Lcleanup_table:
-       .long   system_call + 0x80000000
-       .long   .Lsysc_do_svc + 0x80000000
-       .long   .Lsysc_tif + 0x80000000
-       .long   .Lsysc_restore + 0x80000000
-       .long   .Lsysc_done + 0x80000000
-       .long   .Lio_tif + 0x80000000
-       .long   .Lio_restore + 0x80000000
-       .long   .Lio_done + 0x80000000
-       .long   psw_idle + 0x80000000
-       .long   .Lpsw_idle_end + 0x80000000
-
-cleanup_critical:
-       cl      %r9,BASED(.Lcleanup_table)      # system_call
-       jl      0f
-       cl      %r9,BASED(.Lcleanup_table+4)    # .Lsysc_do_svc
-       jl      .Lcleanup_system_call
-       cl      %r9,BASED(.Lcleanup_table+8)    # .Lsysc_tif
-       jl      0f
-       cl      %r9,BASED(.Lcleanup_table+12)   # .Lsysc_restore
-       jl      .Lcleanup_sysc_tif
-       cl      %r9,BASED(.Lcleanup_table+16)   # .Lsysc_done
-       jl      .Lcleanup_sysc_restore
-       cl      %r9,BASED(.Lcleanup_table+20)   # .Lio_tif
-       jl      0f
-       cl      %r9,BASED(.Lcleanup_table+24)   # .Lio_restore
-       jl      .Lcleanup_io_tif
-       cl      %r9,BASED(.Lcleanup_table+28)   # .Lio_done
-       jl      .Lcleanup_io_restore
-       cl      %r9,BASED(.Lcleanup_table+32)   # psw_idle
-       jl      0f
-       cl      %r9,BASED(.Lcleanup_table+36)   # .Lpsw_idle_end
-       jl      .Lcleanup_idle
-0:     br      %r14
-
-.Lcleanup_system_call:
-       # check if stpt has been executed
-       cl      %r9,BASED(.Lcleanup_system_call_insn)
-       jh      0f
-       mvc     __LC_SYNC_ENTER_TIMER(8),__LC_ASYNC_ENTER_TIMER
-       chi     %r11,__LC_SAVE_AREA_ASYNC
-       je      0f
-       mvc     __LC_SYNC_ENTER_TIMER(8),__LC_MCCK_ENTER_TIMER
-0:     # check if stm has been executed
-       cl      %r9,BASED(.Lcleanup_system_call_insn+4)
-       jh      0f
-       mvc     __LC_SAVE_AREA_SYNC(32),0(%r11)
-0:     # set up saved registers r12, and r13
-       st      %r12,16(%r11)           # r12 thread-info pointer
-       st      %r13,20(%r11)           # r13 literal-pool pointer
-       # check if the user time calculation has been done
-       cl      %r9,BASED(.Lcleanup_system_call_insn+8)
-       jh      0f
-       l       %r10,__LC_EXIT_TIMER
-       l       %r15,__LC_EXIT_TIMER+4
-       SUB64   %r10,%r15,__LC_SYNC_ENTER_TIMER
-       ADD64   %r10,%r15,__LC_USER_TIMER
-       st      %r10,__LC_USER_TIMER
-       st      %r15,__LC_USER_TIMER+4
-0:     # check if the system time calculation has been done
-       cl      %r9,BASED(.Lcleanup_system_call_insn+12)
-       jh      0f
-       l       %r10,__LC_LAST_UPDATE_TIMER
-       l       %r15,__LC_LAST_UPDATE_TIMER+4
-       SUB64   %r10,%r15,__LC_EXIT_TIMER
-       ADD64   %r10,%r15,__LC_SYSTEM_TIMER
-       st      %r10,__LC_SYSTEM_TIMER
-       st      %r15,__LC_SYSTEM_TIMER+4
-0:     # update accounting time stamp
-       mvc     __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER
-       # set up saved register 11
-       l       %r15,__LC_KERNEL_STACK
-       la      %r9,STACK_FRAME_OVERHEAD(%r15)
-       st      %r9,12(%r11)            # r11 pt_regs pointer
-       # fill pt_regs
-       mvc     __PT_R8(32,%r9),__LC_SAVE_AREA_SYNC
-       stm     %r0,%r7,__PT_R0(%r9)
-       mvc     __PT_PSW(8,%r9),__LC_SVC_OLD_PSW
-       mvc     __PT_INT_CODE(4,%r9),__LC_SVC_ILC
-       xc      __PT_FLAGS(4,%r9),__PT_FLAGS(%r9)
-       mvi     __PT_FLAGS+3(%r9),_PIF_SYSCALL
-       # setup saved register 15
-       st      %r15,28(%r11)           # r15 stack pointer
-       # set new psw address and exit
-       l       %r9,BASED(.Lcleanup_table+4)    # .Lsysc_do_svc + 0x80000000
-       br      %r14
-.Lcleanup_system_call_insn:
-       .long   system_call + 0x80000000
-       .long   .Lsysc_stm + 0x80000000
-       .long   .Lsysc_vtime + 0x80000000 + 36
-       .long   .Lsysc_vtime + 0x80000000 + 76
-
-.Lcleanup_sysc_tif:
-       l       %r9,BASED(.Lcleanup_table+8)    # .Lsysc_tif + 0x80000000
-       br      %r14
-
-.Lcleanup_sysc_restore:
-       cl      %r9,BASED(.Lcleanup_sysc_restore_insn)
-       jhe     0f
-       l       %r9,12(%r11)            # get saved pointer to pt_regs
-       mvc     __LC_RETURN_PSW(8),__PT_PSW(%r9)
-       mvc     0(32,%r11),__PT_R8(%r9)
-       lm      %r0,%r7,__PT_R0(%r9)
-0:     lm      %r8,%r9,__LC_RETURN_PSW
-       br      %r14
-.Lcleanup_sysc_restore_insn:
-       .long   .Lsysc_done - 4 + 0x80000000
-
-.Lcleanup_io_tif:
-       l       %r9,BASED(.Lcleanup_table+20)   # .Lio_tif + 0x80000000
-       br      %r14
-
-.Lcleanup_io_restore:
-       cl      %r9,BASED(.Lcleanup_io_restore_insn)
-       jhe     0f
-       l       %r9,12(%r11)            # get saved r11 pointer to pt_regs
-       mvc     __LC_RETURN_PSW(8),__PT_PSW(%r9)
-       mvc     0(32,%r11),__PT_R8(%r9)
-       lm      %r0,%r7,__PT_R0(%r9)
-0:     lm      %r8,%r9,__LC_RETURN_PSW
-       br      %r14
-.Lcleanup_io_restore_insn:
-       .long   .Lio_done - 4 + 0x80000000
-
-.Lcleanup_idle:
-       # copy interrupt clock & cpu timer
-       mvc     __CLOCK_IDLE_EXIT(8,%r2),__LC_INT_CLOCK
-       mvc     __TIMER_IDLE_EXIT(8,%r2),__LC_ASYNC_ENTER_TIMER
-       chi     %r11,__LC_SAVE_AREA_ASYNC
-       je      0f
-       mvc     __CLOCK_IDLE_EXIT(8,%r2),__LC_MCCK_CLOCK
-       mvc     __TIMER_IDLE_EXIT(8,%r2),__LC_MCCK_ENTER_TIMER
-0:     # check if stck has been executed
-       cl      %r9,BASED(.Lcleanup_idle_insn)
-       jhe     1f
-       mvc     __CLOCK_IDLE_ENTER(8,%r2),__CLOCK_IDLE_EXIT(%r2)
-       mvc     __TIMER_IDLE_ENTER(8,%r2),__TIMER_IDLE_EXIT(%r3)
-1:     # account system time going idle
-       lm      %r9,%r10,__LC_STEAL_TIMER
-       ADD64   %r9,%r10,__CLOCK_IDLE_ENTER(%r2)
-       SUB64   %r9,%r10,__LC_LAST_UPDATE_CLOCK
-       stm     %r9,%r10,__LC_STEAL_TIMER
-       mvc     __LC_LAST_UPDATE_CLOCK(8),__CLOCK_IDLE_EXIT(%r2)
-       lm      %r9,%r10,__LC_SYSTEM_TIMER
-       ADD64   %r9,%r10,__LC_LAST_UPDATE_TIMER
-       SUB64   %r9,%r10,__TIMER_IDLE_ENTER(%r2)
-       stm     %r9,%r10,__LC_SYSTEM_TIMER
-       mvc     __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2)
-       # prepare return psw
-       n       %r8,BASED(.Lcleanup_idle_wait)  # clear irq & wait state bits
-       l       %r9,24(%r11)                    # return from psw_idle
-       br      %r14
-.Lcleanup_idle_insn:
-       .long   .Lpsw_idle_lpsw + 0x80000000
-.Lcleanup_idle_wait:
-       .long   0xfcfdffff
-
-/*
- * Integer constants
- */
-       .align  4
-.Lnr_syscalls:
-       .long   NR_syscalls
-.Lvtimer_max:
-       .quad   0x7fffffffffffffff
-
-/*
- * Symbol constants
- */
-.Lc_do_machine_check:  .long   s390_do_machine_check
-.Lc_handle_mcck:       .long   s390_handle_mcck
-.Lc_do_IRQ:            .long   do_IRQ
-.Lc_do_signal:         .long   do_signal
-.Lc_do_notify_resume:  .long   do_notify_resume
-.Lc_do_per_trap:       .long   do_per_trap
-.Lc_jump_table:                .long   pgm_check_table
-.Lc_schedule:          .long   schedule
-#ifdef CONFIG_PREEMPT
-.Lc_preempt_irq:       .long   preempt_schedule_irq
-#endif
-.Lc_trace_enter:       .long   do_syscall_trace_enter
-.Lc_trace_exit:                .long   do_syscall_trace_exit
-.Lc_schedule_tail:     .long   schedule_tail
-.Lc_sysc_per:          .long   .Lsysc_per + 0x80000000
-#ifdef CONFIG_TRACE_IRQFLAGS
-.Lc_hardirqs_on:       .long   trace_hardirqs_on_caller
-.Lc_hardirqs_off:      .long   trace_hardirqs_off_caller
-#endif
-#ifdef CONFIG_LOCKDEP
-.Lc_lockdep_sys_exit:  .long   lockdep_sys_exit
-#endif
-.Lc_critical_start:    .long   .L__critical_start + 0x80000000
-.Lc_critical_length:   .long   .L__critical_end - .L__critical_start
-
-               .section .rodata, "a"
-#define SYSCALL(esa,esame,emu) .long esa
-       .globl  sys_call_table
-sys_call_table:
-#include "syscalls.S"
-#undef SYSCALL
 
 #include <asm/thread_info.h>
 #include <asm/page.h>
 
-#ifdef CONFIG_64BIT
 #define ARCH_OFFSET    4
-#else
-#define ARCH_OFFSET    0
-#endif
 
 __HEAD
 
 # subroutine to set architecture mode
 #
 .Lsetmode:
-#ifdef CONFIG_64BIT
        mvi     __LC_AR_MODE_ID,1       # set esame flag
        slr     %r0,%r0                 # set cpuid to zero
        lhi     %r1,2                   # mode 2 = esame (dump)
        .fill   16,4,0x0
 0:     lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
        sam31                           # switch to 31 bit addressing mode
-#else
-       mvi     __LC_AR_MODE_ID,0       # set ESA flag (mode 0)
-#endif
        br      %r14
 
 #
 # subroutine to wait for end I/O
 #
 .Lirqwait:
-#ifdef CONFIG_64BIT
        mvc     0x1f0(16),.Lnewpsw      # set up IO interrupt psw
        lpsw    .Lwaitpsw
 .Lioint:
        .align  8
 .Lnewpsw:
        .quad   0x0000000080000000,.Lioint
-#else
-       mvc     0x78(8),.Lnewpsw        # set up IO interrupt psw
-       lpsw    .Lwaitpsw
-.Lioint:
-       br      %r14
-       .align  8
-.Lnewpsw:
-       .long   0x00080000,0x80000000+.Lioint
-#endif
 .Lwaitpsw:
        .long   0x020a0000,0x80000000+.Lioint
 
 ENTRY(startup_kdump)
        j       .Lep_startup_kdump
 .Lep_startup_normal:
-#ifdef CONFIG_64BIT
        mvi     __LC_AR_MODE_ID,1       # set esame flag
        slr     %r0,%r0                 # set cpuid to zero
        lhi     %r1,2                   # mode 2 = esame (dump)
        .fill   16,4,0x0
 0:     lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
        sam31                           # switch to 31 bit addressing mode
-#else
-       mvi     __LC_AR_MODE_ID,0       # set ESA flag (mode 0)
-#endif
        basr    %r13,0                  # get base
 .LPG0:
        xc      0x200(256),0x200        # partially clear lowcore
        spt     6f-.LPG0(%r13)
        mvc     __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
        xc      __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
-#ifndef CONFIG_MARCH_G5
        # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
        .insn   s,0xb2b10000,0          # store facilities @ __LC_STFL_FAC_LIST
        tm      __LC_STFL_FAC_LIST,0x01 # stfle available ?
 # the kernel will crash. Format is number of facility words with bits set,
 # followed by the facility words.
 
-#if defined(CONFIG_64BIT)
 #if defined(CONFIG_MARCH_Z13)
        .long 3, 0xc100eff2, 0xf46ce800, 0x00400000
 #elif defined(CONFIG_MARCH_ZEC12)
 #elif defined(CONFIG_MARCH_Z900)
        .long 1, 0xc0000000
 #endif
-#else
-#if defined(CONFIG_MARCH_ZEC12)
-       .long 1, 0x8100c880
-#elif defined(CONFIG_MARCH_Z196)
-       .long 1, 0x8100c880
-#elif defined(CONFIG_MARCH_Z10)
-       .long 1, 0x8100c880
-#elif defined(CONFIG_MARCH_Z9_109)
-       .long 1, 0x8100c880
-#elif defined(CONFIG_MARCH_Z990)
-       .long 1, 0x80002000
-#elif defined(CONFIG_MARCH_Z900)
-       .long 1, 0x80000000
-#endif
-#endif
 4:
-#endif
-
-#ifdef CONFIG_64BIT
        /* Continue with 64bit startup code in head64.S */
        sam64                           # switch to 64 bit mode
        jg      startup_continue
-#else
-       /* Continue with 31bit startup code in head31.S */
-       l       %r13,5f-.LPG0(%r13)
-       b       0(%r13)
-       .align  8
-5:     .long   startup_continue
-#endif
 
        .align  8
 6:     .long   0x7fffffff,0xffffffff
 
+++ /dev/null
-/*
- * Copyright IBM Corp. 2005, 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>
- *
- */
-
-#include <linux/init.h>
-#include <linux/linkage.h>
-#include <asm/asm-offsets.h>
-#include <asm/thread_info.h>
-#include <asm/page.h>
-
-__HEAD
-ENTRY(startup_continue)
-       basr    %r13,0                  # get base
-.LPG1:
-
-       l       %r1,.Lbase_cc-.LPG1(%r13)
-       mvc     0(8,%r1),__LC_LAST_UPDATE_CLOCK
-       lctl    %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
-       l       %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area
-                                       # move IPL device to lowcore
-#
-# Setup stack
-#
-       l       %r15,.Linittu-.LPG1(%r13)
-       st      %r15,__LC_THREAD_INFO   # cache thread info in lowcore
-       mvc     __LC_CURRENT(4),__TI_task(%r15)
-       ahi     %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union+THREAD_SIZE
-       st      %r15,__LC_KERNEL_STACK  # set end of kernel stack
-       ahi     %r15,-96
-#
-# Save ipl parameters, clear bss memory, initialize storage key for kernel pages,
-# and create a kernel NSS if the SAVESYS= parm is defined
-#
-       l       %r14,.Lstartup_init-.LPG1(%r13)
-       basr    %r14,%r14
-       lpsw  .Lentry-.LPG1(13)         # jump to _stext in primary-space,
-                                       # virtual and never return ...
-       .align  8
-.Lentry:.long  0x00080000,0x80000000 + _stext
-.Lctl: .long   0x04b50000              # cr0: various things
-       .long   0                       # cr1: primary space segment table
-       .long   .Lduct                  # cr2: dispatchable unit control table
-       .long   0                       # cr3: instruction authorization
-       .long   0                       # cr4: instruction authorization
-       .long   .Lduct                  # cr5: primary-aste origin
-       .long   0                       # cr6:  I/O interrupts
-       .long   0                       # cr7:  secondary space segment table
-       .long   0                       # cr8:  access registers translation
-       .long   0                       # cr9:  tracing off
-       .long   0                       # cr10: tracing off
-       .long   0                       # cr11: tracing off
-       .long   0                       # cr12: tracing off
-       .long   0                       # cr13: home space segment table
-       .long   0xc0000000              # cr14: machine check handling off
-       .long   0                       # cr15: linkage stack operations
-.Lbss_bgn:  .long __bss_start
-.Lbss_end:  .long _end
-.Lparmaddr: .long PARMAREA
-.Linittu:   .long init_thread_union
-.Lstartup_init:
-           .long startup_init
-       .align  64
-.Lduct:        .long   0,0,0,0,.Lduald,0,0,0
-       .long   0,0,0,0,0,0,0,0
-       .align  128
-.Lduald:.rept  8
-       .long   0x80000000,0,0,0        # invalid access-list entries
-       .endr
-.Lbase_cc:
-       .long   sched_clock_base_cc
-
-ENTRY(_ehead)
-
-       .org    0x100000 - 0x11000      # head.o ends at 0x11000
-#
-# startup-code, running in absolute addressing mode
-#
-ENTRY(_stext)
-       basr    %r13,0                  # get base
-.LPG3:
-# check control registers
-       stctl   %c0,%c15,0(%r15)
-       oi      2(%r15),0x60            # enable sigp emergency & external call
-       oi      0(%r15),0x10            # switch on low address protection
-       lctl    %c0,%c15,0(%r15)
-
-#
-       lam     0,15,.Laregs-.LPG3(%r13) # load access regs needed by uaccess
-       l       %r14,.Lstart-.LPG3(%r13)
-       basr    %r14,%r14               # call start_kernel
-#
-# We returned from start_kernel ?!? PANIK
-#
-       basr    %r13,0
-       lpsw    .Ldw-.(%r13)            # load disabled wait psw
-#
-       .align  8
-.Ldw:  .long   0x000a0000,0x00000000
-.Lstart:.long  start_kernel
-.Laregs:.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 
 #else
 .align 2
 .Lep_startup_kdump:
-#ifdef CONFIG_64BIT
        larl    %r13,startup_kdump_crash
        lpswe   0(%r13)
 .align 8
 startup_kdump_crash:
        .quad   0x0002000080000000,0x0000000000000000 + startup_kdump_crash
-#else
-       basr    %r13,0
-0:     lpsw    startup_kdump_crash-0b(%r13)
-.align 8
-startup_kdump_crash:
-       .long   0x000a0000,0x00000000 + startup_kdump_crash
-#endif /* CONFIG_64BIT */
 #endif /* CONFIG_CRASH_DUMP */
 
 {
        struct reset_call *reset;
 
-#ifdef CONFIG_64BIT
        if (diag308_set_works) {
                diag308_reset();
                return;
        }
-#endif
        list_for_each_entry(reset, &rcall, list)
                reset->fn();
 }
 
 #define DEBUGP(fmt , ...)
 #endif
 
-#ifndef CONFIG_64BIT
-#define PLT_ENTRY_SIZE 12
-#else /* CONFIG_64BIT */
 #define PLT_ENTRY_SIZE 20
-#endif /* CONFIG_64BIT */
 
-#ifdef CONFIG_64BIT
 void *module_alloc(unsigned long size)
 {
        if (PAGE_ALIGN(size) > MODULES_LEN)
                                    GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE,
                                    __builtin_return_address(0));
 }
-#endif
 
 void module_arch_freeing_init(struct module *mod)
 {
                        unsigned int *ip;
                        ip = me->module_core + me->arch.plt_offset +
                                info->plt_offset;
-#ifndef CONFIG_64BIT
-                       ip[0] = 0x0d105810; /* basr 1,0; l 1,6(1); br 1 */
-                       ip[1] = 0x100607f1;
-                       ip[2] = val;
-#else /* CONFIG_64BIT */
                        ip[0] = 0x0d10e310; /* basr 1,0; lg 1,10(1); br 1 */
                        ip[1] = 0x100a0004;
                        ip[2] = 0x07f10000;
                        ip[3] = (unsigned int) (val >> 32);
                        ip[4] = (unsigned int) val;
-#endif /* CONFIG_64BIT */
                        info->plt_initialized = 1;
                }
                if (r_type == R_390_PLTOFF16 ||
 
                 */
                kill_task = 1;
        }
-#ifndef CONFIG_64BIT
+       fpt_save_area = &S390_lowcore.floating_pt_save_area;
+       fpt_creg_save_area = &S390_lowcore.fpt_creg_save_area;
+       if (!mci->fc) {
+               /*
+                * Floating point control register can't be restored.
+                * Task will be terminated.
+                */
+               asm volatile("lfpc 0(%0)" : : "a" (&zero), "m" (zero));
+               kill_task = 1;
+       } else
+               asm volatile("lfpc 0(%0)" : : "a" (fpt_creg_save_area));
+
        asm volatile(
                "       ld      0,0(%0)\n"
-               "       ld      2,8(%0)\n"
-               "       ld      4,16(%0)\n"
-               "       ld      6,24(%0)"
-               : : "a" (&S390_lowcore.floating_pt_save_area));
-#endif
-
-       if (MACHINE_HAS_IEEE) {
-#ifdef CONFIG_64BIT
-               fpt_save_area = &S390_lowcore.floating_pt_save_area;
-               fpt_creg_save_area = &S390_lowcore.fpt_creg_save_area;
-#else
-               fpt_save_area = (void *) S390_lowcore.extended_save_area_addr;
-               fpt_creg_save_area = fpt_save_area + 128;
-#endif
-               if (!mci->fc) {
-                       /*
-                        * Floating point control register can't be restored.
-                        * Task will be terminated.
-                        */
-                       asm volatile("lfpc 0(%0)" : : "a" (&zero), "m" (zero));
-                       kill_task = 1;
-
-               } else
-                       asm volatile("lfpc 0(%0)" : : "a" (fpt_creg_save_area));
-
-               asm volatile(
-                       "       ld      0,0(%0)\n"
-                       "       ld      1,8(%0)\n"
-                       "       ld      2,16(%0)\n"
-                       "       ld      3,24(%0)\n"
-                       "       ld      4,32(%0)\n"
-                       "       ld      5,40(%0)\n"
-                       "       ld      6,48(%0)\n"
-                       "       ld      7,56(%0)\n"
-                       "       ld      8,64(%0)\n"
-                       "       ld      9,72(%0)\n"
-                       "       ld      10,80(%0)\n"
-                       "       ld      11,88(%0)\n"
-                       "       ld      12,96(%0)\n"
-                       "       ld      13,104(%0)\n"
-                       "       ld      14,112(%0)\n"
-                       "       ld      15,120(%0)\n"
-                       : : "a" (fpt_save_area));
-       }
-
-#ifdef CONFIG_64BIT
+               "       ld      1,8(%0)\n"
+               "       ld      2,16(%0)\n"
+               "       ld      3,24(%0)\n"
+               "       ld      4,32(%0)\n"
+               "       ld      5,40(%0)\n"
+               "       ld      6,48(%0)\n"
+               "       ld      7,56(%0)\n"
+               "       ld      8,64(%0)\n"
+               "       ld      9,72(%0)\n"
+               "       ld      10,80(%0)\n"
+               "       ld      11,88(%0)\n"
+               "       ld      12,96(%0)\n"
+               "       ld      13,104(%0)\n"
+               "       ld      14,112(%0)\n"
+               "       ld      15,120(%0)\n"
+               : : "a" (fpt_save_area));
        /* Revalidate vector registers */
        if (MACHINE_HAS_VX && current->thread.vxrs) {
                if (!mci->vr) {
                restore_vx_regs((__vector128 *)
                                S390_lowcore.vector_save_area_addr);
        }
-#endif
        /* Revalidate access registers */
        asm volatile(
                "       lam     0,15,0(%0)"
                 */
                s390_handle_damage("invalid control registers.");
        } else {
-#ifdef CONFIG_64BIT
                asm volatile(
                        "       lctlg   0,15,0(%0)"
                        : : "a" (&S390_lowcore.cregs_save_area));
-#else
-               asm volatile(
-                       "       lctl    0,15,0(%0)"
-                       : : "a" (&S390_lowcore.cregs_save_area));
-#endif
        }
        /*
         * We don't even try to revalidate the TOD register, since we simply
         * can't write something sensible into that register.
         */
-#ifdef CONFIG_64BIT
        /*
         * See if we can revalidate the TOD programmable register with its
         * old contents (should be zero) otherwise set it to zero.
                        "       sckpf"
                        : : "a" (&S390_lowcore.tod_progreg_save_area)
                        : "0", "cc");
-#endif
        /* Revalidate clock comparator register */
        set_clock_comparator(S390_lowcore.clock_comparator);
        /* Check if old PSW is valid */
                if (mci->b) {
                        /* Processing backup -> verify if we can survive this */
                        u64 z_mcic, o_mcic, t_mcic;
-#ifdef CONFIG_64BIT
                        z_mcic = (1ULL<<63 | 1ULL<<59 | 1ULL<<29);
                        o_mcic = (1ULL<<43 | 1ULL<<42 | 1ULL<<41 | 1ULL<<40 |
                                  1ULL<<36 | 1ULL<<35 | 1ULL<<34 | 1ULL<<32 |
                                  1ULL<<30 | 1ULL<<21 | 1ULL<<20 | 1ULL<<17 |
                                  1ULL<<16);
-#else
-                       z_mcic = (1ULL<<63 | 1ULL<<59 | 1ULL<<57 | 1ULL<<50 |
-                                 1ULL<<29);
-                       o_mcic = (1ULL<<43 | 1ULL<<42 | 1ULL<<41 | 1ULL<<40 |
-                                 1ULL<<36 | 1ULL<<35 | 1ULL<<34 | 1ULL<<32 |
-                                 1ULL<<30 | 1ULL<<20 | 1ULL<<17 | 1ULL<<16);
-#endif
                        t_mcic = *(u64 *)mci;
 
                        if (((t_mcic & z_mcic) != 0) ||
 
 
 #include <linux/linkage.h>
 
-#ifdef CONFIG_32BIT
-#define PGM_CHECK_64BIT(handler) .long default_trap_handler
-#else
-#define PGM_CHECK_64BIT(handler) .long handler
-#endif
-
 #define PGM_CHECK(handler)     .long handler
 #define PGM_CHECK_DEFAULT      PGM_CHECK(default_trap_handler)
 
 /*
  * The program check table contains exactly 128 (0x00-0x7f) entries. Each
- * line defines the 31 and/or 64 bit function to be called corresponding
- * to the program check interruption code.
+ * line defines the function to be called corresponding to the program check
+ * interruption code.
  */
 .section .rodata, "a"
 ENTRY(pgm_check_table)
 PGM_CHECK(operand_exception)           /* 15 */
 PGM_CHECK_DEFAULT                      /* 16 */
 PGM_CHECK_DEFAULT                      /* 17 */
-PGM_CHECK_64BIT(transaction_exception) /* 18 */
+PGM_CHECK(transaction_exception)       /* 18 */
 PGM_CHECK_DEFAULT                      /* 19 */
 PGM_CHECK_DEFAULT                      /* 1a */
-PGM_CHECK_64BIT(vector_exception)      /* 1b */
+PGM_CHECK(vector_exception)            /* 1b */
 PGM_CHECK(space_switch_exception)      /* 1c */
 PGM_CHECK(hfp_sqrt_exception)          /* 1d */
 PGM_CHECK_DEFAULT                      /* 1e */
 PGM_CHECK_DEFAULT                      /* 35 */
 PGM_CHECK_DEFAULT                      /* 36 */
 PGM_CHECK_DEFAULT                      /* 37 */
-PGM_CHECK_64BIT(do_dat_exception)      /* 38 */
-PGM_CHECK_64BIT(do_dat_exception)      /* 39 */
-PGM_CHECK_64BIT(do_dat_exception)      /* 3a */
-PGM_CHECK_64BIT(do_dat_exception)      /* 3b */
+PGM_CHECK(do_dat_exception)            /* 38 */
+PGM_CHECK(do_dat_exception)            /* 39 */
+PGM_CHECK(do_dat_exception)            /* 3a */
+PGM_CHECK(do_dat_exception)            /* 3b */
 PGM_CHECK_DEFAULT                      /* 3c */
 PGM_CHECK_DEFAULT                      /* 3d */
 PGM_CHECK_DEFAULT                      /* 3e */
 
 {
 }
 
-#ifdef CONFIG_64BIT
 void arch_release_task_struct(struct task_struct *tsk)
 {
        if (tsk->thread.vxrs)
                kfree(tsk->thread.vxrs);
 }
-#endif
 
 int copy_thread(unsigned long clone_flags, unsigned long new_stackp,
                unsigned long arg, struct task_struct *p)
        p->thread.ri_signum = 0;
        frame->childregs.psw.mask &= ~PSW_MASK_RI;
 
-#ifndef CONFIG_64BIT
-       /*
-        * save fprs to current->thread.fp_regs to merge them with
-        * the emulated registers and then copy the result to the child.
-        */
-       save_fp_ctl(¤t->thread.fp_regs.fpc);
-       save_fp_regs(current->thread.fp_regs.fprs);
-       memcpy(&p->thread.fp_regs, ¤t->thread.fp_regs,
-              sizeof(s390_fp_regs));
-       /* Set a new TLS ?  */
-       if (clone_flags & CLONE_SETTLS)
-               p->thread.acrs[0] = frame->childregs.gprs[6];
-#else /* CONFIG_64BIT */
        /* Save the fpu registers to new thread structure. */
        save_fp_ctl(&p->thread.fp_regs.fpc);
        save_fp_regs(p->thread.fp_regs.fprs);
                        p->thread.acrs[1] = (unsigned int)tls;
                }
        }
-#endif /* CONFIG_64BIT */
        return 0;
 }
 
 asmlinkage void execve_tail(void)
 {
        current->thread.fp_regs.fpc = 0;
-       if (MACHINE_HAS_IEEE)
-               asm volatile("sfpc %0,%0" : : "d" (0));
+       asm volatile("sfpc %0,%0" : : "d" (0));
 }
 
 /*
  */
 int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs)
 {
-#ifndef CONFIG_64BIT
-       /*
-        * save fprs to current->thread.fp_regs to merge them with
-        * the emulated registers and then copy the result to the dump.
-        */
-       save_fp_ctl(¤t->thread.fp_regs.fpc);
-       save_fp_regs(current->thread.fp_regs.fprs);
-       memcpy(fpregs, ¤t->thread.fp_regs, sizeof(s390_fp_regs));
-#else /* CONFIG_64BIT */
        save_fp_ctl(&fpregs->fpc);
        save_fp_regs(fpregs->fprs);
-#endif /* CONFIG_64BIT */
        return 1;
 }
 EXPORT_SYMBOL(dump_fpu);
 
        struct thread_struct *thread = &task->thread;
        struct per_regs old, new;
 
-#ifdef CONFIG_64BIT
        /* Take care of the enable/disable of transactional execution. */
        if (MACHINE_HAS_TE || MACHINE_HAS_VX) {
                unsigned long cr, cr_new;
                                __ctl_load(cr_new, 2, 2);
                }
        }
-#endif
        /* Copy user specified PER registers */
        new.control = thread->per_user.control;
        new.start = thread->per_user.start;
                        new.control |= PER_EVENT_BRANCH;
                else
                        new.control |= PER_EVENT_IFETCH;
-#ifdef CONFIG_64BIT
                new.control |= PER_CONTROL_SUSPENSION;
                new.control |= PER_EVENT_TRANSACTION_END;
-#endif
                if (test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP))
                        new.control |= PER_EVENT_IFETCH;
                new.start = 0;
        task->thread.per_flags = 0;
 }
 
-#ifndef CONFIG_64BIT
-# define __ADDR_MASK 3
-#else
-# define __ADDR_MASK 7
-#endif
+#define __ADDR_MASK 7
 
 static inline unsigned long __peek_user_per(struct task_struct *child,
                                            addr_t addr)
                 * access registers are stored in the thread structure
                 */
                offset = addr - (addr_t) &dummy->regs.acrs;
-#ifdef CONFIG_64BIT
                /*
                 * Very special case: old & broken 64 bit gdb reading
                 * from acrs[15]. Result is a 64 bit value. Read the
                if (addr == (addr_t) &dummy->regs.acrs[15])
                        tmp = ((unsigned long) child->thread.acrs[15]) << 32;
                else
-#endif
-               tmp = *(addr_t *)((addr_t) &child->thread.acrs + offset);
+                       tmp = *(addr_t *)((addr_t) &child->thread.acrs + offset);
 
        } else if (addr == (addr_t) &dummy->regs.orig_gpr2) {
                /*
                 * or the child->thread.vxrs array
                 */
                offset = addr - (addr_t) &dummy->regs.fp_regs.fprs;
-#ifdef CONFIG_64BIT
                if (child->thread.vxrs)
                        tmp = *(addr_t *)
                               ((addr_t) child->thread.vxrs + 2*offset);
                else
-#endif
                        tmp = *(addr_t *)
                               ((addr_t) &child->thread.fp_regs.fprs + offset);
 
         * an alignment of 4. Programmers from hell...
         */
        mask = __ADDR_MASK;
-#ifdef CONFIG_64BIT
        if (addr >= (addr_t) &((struct user *) NULL)->regs.acrs &&
            addr < (addr_t) &((struct user *) NULL)->regs.orig_gpr2)
                mask = 3;
-#endif
        if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK)
                return -EIO;
 
                 * access registers are stored in the thread structure
                 */
                offset = addr - (addr_t) &dummy->regs.acrs;
-#ifdef CONFIG_64BIT
                /*
                 * Very special case: old & broken 64 bit gdb writing
                 * to acrs[15] with a 64 bit value. Ignore the lower
                if (addr == (addr_t) &dummy->regs.acrs[15])
                        child->thread.acrs[15] = (unsigned int) (data >> 32);
                else
-#endif
-               *(addr_t *)((addr_t) &child->thread.acrs + offset) = data;
+                       *(addr_t *)((addr_t) &child->thread.acrs + offset) = data;
 
        } else if (addr == (addr_t) &dummy->regs.orig_gpr2) {
                /*
                 * or the child->thread.vxrs array
                 */
                offset = addr - (addr_t) &dummy->regs.fp_regs.fprs;
-#ifdef CONFIG_64BIT
                if (child->thread.vxrs)
                        *(addr_t *)((addr_t)
                                child->thread.vxrs + 2*offset) = data;
                else
-#endif
                        *(addr_t *)((addr_t)
                                &child->thread.fp_regs.fprs + offset) = data;
 
         * an alignment of 4. Programmers from hell indeed...
         */
        mask = __ADDR_MASK;
-#ifdef CONFIG_64BIT
        if (addr >= (addr_t) &((struct user *) NULL)->regs.acrs &&
            addr < (addr_t) &((struct user *) NULL)->regs.orig_gpr2)
                mask = 3;
-#endif
        if ((addr & mask) || addr > sizeof(struct user) - __ADDR_MASK)
                return -EIO;
 
                 * or the child->thread.vxrs array
                 */
                offset = addr - (addr_t) &dummy32->regs.fp_regs.fprs;
-#ifdef CONFIG_64BIT
                if (child->thread.vxrs)
                        tmp = *(__u32 *)
                               ((addr_t) child->thread.vxrs + 2*offset);
                else
-#endif
                        tmp = *(__u32 *)
                               ((addr_t) &child->thread.fp_regs.fprs + offset);
 
                 * or the child->thread.vxrs array
                 */
                offset = addr - (addr_t) &dummy32->regs.fp_regs.fprs;
-#ifdef CONFIG_64BIT
                if (child->thread.vxrs)
                        *(__u32 *)((addr_t)
                                child->thread.vxrs + 2*offset) = tmp;
                else
-#endif
                        *(__u32 *)((addr_t)
                                &child->thread.fp_regs.fprs + offset) = tmp;
 
        if (target == current) {
                save_fp_ctl(&target->thread.fp_regs.fpc);
                save_fp_regs(target->thread.fp_regs.fprs);
-       }
-#ifdef CONFIG_64BIT
-       else if (target->thread.vxrs) {
+       } else if (target->thread.vxrs) {
                int i;
 
                for (i = 0; i < __NUM_VXRS_LOW; i++)
                        target->thread.fp_regs.fprs[i] =
                                *(freg_t *)(target->thread.vxrs + i);
        }
-#endif
        return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
                                   &target->thread.fp_regs, 0, -1);
 }
                if (target == current) {
                        restore_fp_ctl(&target->thread.fp_regs.fpc);
                        restore_fp_regs(target->thread.fp_regs.fprs);
-               }
-#ifdef CONFIG_64BIT
-               else if (target->thread.vxrs) {
+               } else if (target->thread.vxrs) {
                        int i;
 
                        for (i = 0; i < __NUM_VXRS_LOW; i++)
                                *(freg_t *)(target->thread.vxrs + i) =
                                        target->thread.fp_regs.fprs[i];
                }
-#endif
        }
 
        return rc;
 }
 
-#ifdef CONFIG_64BIT
-
 static int s390_last_break_get(struct task_struct *target,
                               const struct user_regset *regset,
                               unsigned int pos, unsigned int count,
        return rc;
 }
 
-#endif
-
 static int s390_system_call_get(struct task_struct *target,
                                const struct user_regset *regset,
                                unsigned int pos, unsigned int count,
                .get = s390_system_call_get,
                .set = s390_system_call_set,
        },
-#ifdef CONFIG_64BIT
        {
                .core_note_type = NT_S390_LAST_BREAK,
                .n = 1,
                .get = s390_vxrs_high_get,
                .set = s390_vxrs_high_set,
        },
-#endif
 };
 
 static const struct user_regset_view user_s390_view = {
 
+++ /dev/null
-/*
- *  S390 version
- *    Copyright IBM Corp. 2000
- *    Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com)
- */
-
-#include <linux/linkage.h>
-#include <asm/asm-offsets.h>
-#include <asm/sigp.h>
-
-#
-# store_status: Empty implementation until kdump is supported on 31 bit
-#
-ENTRY(store_status)
-               br      %r14
-
-#
-# do_reipl_asm
-# Parameter: r2 = schid of reipl device
-#
-ENTRY(do_reipl_asm)
-               basr    %r13,0
-.Lpg0:         lpsw    .Lnewpsw-.Lpg0(%r13)
-.Lpg1:         # do store status of all registers
-
-               stm     %r0,%r15,__LC_GPREGS_SAVE_AREA
-               stctl   %c0,%c15,__LC_CREGS_SAVE_AREA
-               stam    %a0,%a15,__LC_AREGS_SAVE_AREA
-               l       %r10,.Ldump_pfx-.Lpg0(%r13)
-               mvc     __LC_PREFIX_SAVE_AREA(4),0(%r10)
-               stckc   .Lclkcmp-.Lpg0(%r13)
-               mvc     __LC_CLOCK_COMP_SAVE_AREA(8),.Lclkcmp-.Lpg0(%r13)
-               stpt    __LC_CPU_TIMER_SAVE_AREA
-               st      %r13, __LC_PSW_SAVE_AREA+4
-               lctl    %c6,%c6,.Lall-.Lpg0(%r13)
-               lr      %r1,%r2
-               mvc     __LC_PGM_NEW_PSW(8),.Lpcnew-.Lpg0(%r13)
-               stsch   .Lschib-.Lpg0(%r13)
-               oi      .Lschib+5-.Lpg0(%r13),0x84
-.Lecs:         xi      .Lschib+27-.Lpg0(%r13),0x01
-               msch    .Lschib-.Lpg0(%r13)
-               lhi     %r0,5
-.Lssch:                ssch    .Liplorb-.Lpg0(%r13)
-               jz      .L001
-               brct    %r0,.Lssch
-               bas     %r14,.Ldisab-.Lpg0(%r13)
-.L001:         mvc     __LC_IO_NEW_PSW(8),.Lionew-.Lpg0(%r13)
-.Ltpi:         lpsw    .Lwaitpsw-.Lpg0(%r13)
-.Lcont:                c       %r1,__LC_SUBCHANNEL_ID
-               jnz     .Ltpi
-               clc     __LC_IO_INT_PARM(4),.Liplorb-.Lpg0(%r13)
-               jnz     .Ltpi
-               tsch    .Liplirb-.Lpg0(%r13)
-               tm      .Liplirb+9-.Lpg0(%r13),0xbf
-               jz      .L002
-               bas     %r14,.Ldisab-.Lpg0(%r13)
-.L002:         tm      .Liplirb+8-.Lpg0(%r13),0xf3
-               jz      .L003
-               bas     %r14,.Ldisab-.Lpg0(%r13)
-.L003:         st      %r1,__LC_SUBCHANNEL_ID
-               lpsw    0
-               sigp    0,0,SIGP_RESTART
-.Ldisab:       st      %r14,.Ldispsw+4-.Lpg0(%r13)
-               lpsw    .Ldispsw-.Lpg0(%r13)
-               .align  8
-.Lclkcmp:      .quad   0x0000000000000000
-.Lall:         .long   0xff000000
-.Ldump_pfx:    .long   dump_prefix_page
-               .align  8
-.Lnewpsw:      .long   0x00080000,0x80000000+.Lpg1
-.Lpcnew:       .long   0x00080000,0x80000000+.Lecs
-.Lionew:       .long   0x00080000,0x80000000+.Lcont
-.Lwaitpsw:     .long   0x020a0000,0x00000000+.Ltpi
-.Ldispsw:      .long   0x000a0000,0x00000000
-.Liplccws:     .long   0x02000000,0x60000018
-               .long   0x08000008,0x20000001
-.Liplorb:      .long   0x0049504c,0x0040ff80
-               .long   0x00000000+.Liplccws
-.Lschib:       .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-.Liplirb:      .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
-               .long   0x00000000,0x00000000
 
+++ /dev/null
-/*
- * Copyright IBM Corp. 2005
- *
- * Author(s): Rolf Adelsberger,
- *           Heiko Carstens <heiko.carstens@de.ibm.com>
- *
- */
-
-#include <linux/linkage.h>
-#include <asm/sigp.h>
-
-/*
- * moves the new kernel to its destination...
- * %r2 = pointer to first kimage_entry_t
- * %r3 = start address - where to jump to after the job is done...
- *
- * %r5 will be used as temp. storage
- * %r6 holds the destination address
- * %r7 = PAGE_SIZE
- * %r8 holds the source address
- * %r9 = PAGE_SIZE
- * %r10 is a page mask
- */
-
-       .text
-ENTRY(relocate_kernel)
-               basr    %r13,0          # base address
-       .base:
-               stnsm   sys_msk-.base(%r13),0xfb        # disable DAT
-               stctl   %c0,%c15,ctlregs-.base(%r13)
-               stm     %r0,%r15,gprregs-.base(%r13)
-               la      %r1,load_psw-.base(%r13)
-               mvc     0(8,%r0),0(%r1)
-               la      %r0,.back-.base(%r13)
-               st      %r0,4(%r0)
-               oi      4(%r0),0x80
-               mvc     0x68(8,%r0),0(%r1)
-               la      %r0,.back_pgm-.base(%r13)
-               st      %r0,0x6c(%r0)
-               oi      0x6c(%r0),0x80
-               lhi     %r0,0
-               diag    %r0,%r0,0x308
-       .back:
-               basr    %r13,0
-       .back_base:
-               oi      have_diag308-.back_base(%r13),0x01
-               lctl    %c0,%c15,ctlregs-.back_base(%r13)
-               lm      %r0,%r15,gprregs-.back_base(%r13)
-               j       .start_reloc
-       .back_pgm:
-               lm      %r0,%r15,gprregs-.base(%r13)
-       .start_reloc:
-               lhi     %r10,-1         # preparing the mask
-               sll     %r10,12         # shift it such that it becomes 0xf000
-       .top:
-               lhi     %r7,4096        # load PAGE_SIZE in r7
-               lhi     %r9,4096        # load PAGE_SIZE in r9
-               l       %r5,0(%r2)      # read another word for indirection page
-               ahi     %r2,4           # increment pointer
-               tml     %r5,0x1         # is it a destination page?
-               je      .indir_check    # NO, goto "indir_check"
-               lr      %r6,%r5         # r6 = r5
-               nr      %r6,%r10        # mask it out and...
-               j       .top            # ...next iteration
-       .indir_check:
-               tml     %r5,0x2         # is it a indirection page?
-               je      .done_test      # NO, goto "done_test"
-               nr      %r5,%r10        # YES, mask out,
-               lr      %r2,%r5         # move it into the right register,
-               j       .top            # and read next...
-       .done_test:
-               tml     %r5,0x4         # is it the done indicator?
-               je      .source_test    # NO! Well, then it should be the source indicator...
-               j       .done           # ok, lets finish it here...
-       .source_test:
-               tml     %r5,0x8         # it should be a source indicator...
-               je      .top            # NO, ignore it...
-               lr      %r8,%r5         # r8 = r5
-               nr      %r8,%r10        # masking
-       0:      mvcle   %r6,%r8,0x0     # copy PAGE_SIZE bytes from r8 to r6 - pad with 0
-               jo      0b
-               j       .top
-       .done:
-               sr      %r0,%r0         # clear register r0
-               la      %r4,load_psw-.base(%r13)        # load psw-address into the register
-               o       %r3,4(%r4)      # or load address into psw
-               st      %r3,4(%r4)
-               mvc     0(8,%r0),0(%r4) # copy psw to absolute address 0
-               tm      have_diag308-.base(%r13),0x01
-               jno     .no_diag308
-               diag    %r0,%r0,0x308
-       .no_diag308:
-               sr      %r1,%r1         # clear %r1
-               sr      %r2,%r2         # clear %r2
-               sigp    %r1,%r2,SIGP_SET_ARCHITECTURE # set cpuid to zero
-               lpsw    0               # hopefully start new kernel...
-
-               .align  8
-       load_psw:
-               .long   0x00080000,0x80000000
-       sys_msk:
-               .quad   0
-       ctlregs:
-               .rept   16
-               .long   0
-               .endr
-       gprregs:
-               .rept   16
-               .long   0
-               .endr
-       have_diag308:
-               .byte   0
-               .align  8
-       relocate_kernel_end:
-       .align 8
-       .globl  relocate_kernel_len
-       relocate_kernel_len:
-               .quad   relocate_kernel_end - relocate_kernel
 
        ahi     %r15,-96                        # create stack frame
        la      %r8,LC_EXT_NEW_PSW              # register int handler
        la      %r9,.LextpswS1-.LbaseS1(%r13)
-#ifdef CONFIG_64BIT
        tm      LC_AR_MODE_ID,1
        jno     .Lesa1
        la      %r8,LC_EXT_NEW_PSW_64           # register int handler 64 bit
        la      %r9,.LextpswS1_64-.LbaseS1(%r13)
 .Lesa1:
-#endif
        mvc     .LoldpswS1-.LbaseS1(16,%r13),0(%r8)
        mvc     0(16,%r8),0(%r9)
-#ifdef CONFIG_64BIT
        epsw    %r6,%r7                         # set current addressing mode
        nill    %r6,0x1                         # in new psw (31 or 64 bit mode)
        nilh    %r7,0x8000
        stm     %r6,%r7,0(%r8)
-#endif
        lhi     %r6,0x0200                      # cr mask for ext int (cr0.54)
        ltr     %r2,%r2
        jz      .LsetctS1
        .long   0, 0, 0, 0                      # old ext int PSW
 .LextpswS1:
        .long   0x00080000, 0x80000000+.LwaitS1 # PSW to handle ext int
-#ifdef CONFIG_64BIT
 .LextpswS1_64:
        .quad   0, .LwaitS1                     # PSW to handle ext int, 64 bit
-#endif
 .LwaitpswS1:
        .long   0x010a0000, 0x00000000+.LloopS1 # PSW to wait for ext int
 .LtimeS1:
 ENTRY(_sclp_print_early)
        stm     %r6,%r15,24(%r15)               # save registers
        ahi     %r15,-96                        # create stack frame
-#ifdef CONFIG_64BIT
        tm      LC_AR_MODE_ID,1
        jno     .Lesa2
        ahi     %r15,-80
        stmh    %r6,%r15,96(%r15)               # store upper register halves
 .Lesa2:
-#endif
        lr      %r10,%r2                        # save string pointer
        lhi     %r2,0
        bras    %r14,_sclp_setup                # enable console
        lhi     %r2,1
        bras    %r14,_sclp_setup                # disable console
 .LendS5:
-#ifdef CONFIG_64BIT
        tm      LC_AR_MODE_ID,1
        jno     .Lesa3
        lgfr    %r2,%r2                         # sign extend return value
        lmh     %r6,%r15,96(%r15)               # restore upper register halves
        ahi     %r15,80
 .Lesa3:
-#endif
        lm      %r6,%r15,120(%r15)              # restore registers
        br      %r14
 
 
 struct page *vmemmap;
 EXPORT_SYMBOL(vmemmap);
 
-#ifdef CONFIG_64BIT
 unsigned long MODULES_VADDR;
 unsigned long MODULES_END;
-#endif
 
 /* An array with a pointer to the lowcore of every CPU. */
 struct _lowcore *lowcore_ptr[NR_CPUS];
        lc->stfl_fac_list = S390_lowcore.stfl_fac_list;
        memcpy(lc->stfle_fac_list, S390_lowcore.stfle_fac_list,
               MAX_FACILITY_BIT/8);
-#ifndef CONFIG_64BIT
-       if (MACHINE_HAS_IEEE) {
-               lc->extended_save_area_addr = (__u32)
-                       __alloc_bootmem_low(PAGE_SIZE, PAGE_SIZE, 0);
-               /* enable extended save area */
-               __ctl_set_bit(14, 29);
-       }
-#else
        if (MACHINE_HAS_VX)
                lc->vector_save_area_addr =
                        (unsigned long) &lc->vector_save_area;
        lc->vdso_per_cpu_data = (unsigned long) &lc->paste[0];
-#endif
        lc->sync_enter_timer = S390_lowcore.sync_enter_timer;
        lc->async_enter_timer = S390_lowcore.async_enter_timer;
        lc->exit_timer = S390_lowcore.exit_timer;
        unsigned long vmax, vmalloc_size, tmp;
 
        /* Choose kernel address space layout: 2, 3, or 4 levels. */
-#ifdef CONFIG_64BIT
        vmalloc_size = VMALLOC_END ?: (128UL << 30) - MODULES_LEN;
        tmp = (memory_end ?: max_physmem_end) / PAGE_SIZE;
        tmp = tmp * (sizeof(struct page) + PAGE_SIZE);
        MODULES_END = vmax;
        MODULES_VADDR = MODULES_END - MODULES_LEN;
        VMALLOC_END = MODULES_VADDR;
-#else
-       vmalloc_size = VMALLOC_END ?: 96UL << 20;
-       vmax = 1UL << 31;               /* 2-level kernel page table */
-       /* vmalloc area is at the end of the kernel address space. */
-       VMALLOC_END = vmax;
-#endif
        VMALLOC_START = vmax - vmalloc_size;
 
        /* Split remaining virtual space between 1:1 mapping & vmemmap array */
        if (MACHINE_HAS_HPAGE)
                elf_hwcap |= HWCAP_S390_HPAGE;
 
-#if defined(CONFIG_64BIT)
        /*
         * 64-bit register support for 31-bit processes
         * HWCAP_S390_HIGH_GPRS is bit 9.
         */
        if (test_facility(129))
                elf_hwcap |= HWCAP_S390_VXRS;
-#endif
-
        get_cpu_id(&cpu_id);
        add_device_randomness(&cpu_id, sizeof(cpu_id));
        switch (cpu_id.machine) {
        case 0x9672:
-#if !defined(CONFIG_64BIT)
-       default:        /* Use "g5" as default for 31 bit kernels. */
-#endif
                strcpy(elf_platform, "g5");
                break;
        case 0x2064:
        case 0x2066:
-#if defined(CONFIG_64BIT)
        default:        /* Use "z900" as default for 64 bit kernels. */
-#endif
                strcpy(elf_platform, "z900");
                break;
        case 0x2084:
         /*
          * print what head.S has found out about the machine
          */
-#ifndef CONFIG_64BIT
-       if (MACHINE_IS_VM)
-               pr_info("Linux is running as a z/VM "
-                       "guest operating system in 31-bit mode\n");
-       else if (MACHINE_IS_LPAR)
-               pr_info("Linux is running natively in 31-bit mode\n");
-       if (MACHINE_HAS_IEEE)
-               pr_info("The hardware system has IEEE compatible "
-                       "floating point units\n");
-       else
-               pr_info("The hardware system has no IEEE compatible "
-                       "floating point units\n");
-#else /* CONFIG_64BIT */
        if (MACHINE_IS_VM)
                pr_info("Linux is running as a z/VM "
                        "guest operating system in 64-bit mode\n");
                pr_info("Linux is running under KVM in 64-bit mode\n");
        else if (MACHINE_IS_LPAR)
                pr_info("Linux is running natively in 64-bit mode\n");
-#endif /* CONFIG_64BIT */
 
        /* Have one command line that is parsed and saved in /proc/cmdline */
        /* boot_command_line has been already set up in early.c */
        /* Add system specific data to the random pool */
        setup_randomness();
 }
-
-#ifdef CONFIG_32BIT
-static int no_removal_warning __initdata;
-
-static int __init parse_no_removal_warning(char *str)
-{
-       no_removal_warning = 1;
-       return 0;
-}
-__setup("no_removal_warning", parse_no_removal_warning);
-
-static int __init removal_warning(void)
-{
-       if (no_removal_warning)
-               return 0;
-       printk(KERN_ALERT "\n\n");
-       printk(KERN_CONT "Warning - you are using a 31 bit kernel!\n\n");
-       printk(KERN_CONT "We plan to remove 31 bit kernel support from the kernel sources in March 2015.\n");
-       printk(KERN_CONT "Currently we assume that nobody is using the 31 bit kernel on old 31 bit\n");
-       printk(KERN_CONT "hardware anymore. If you think that the code should not be removed and also\n");
-       printk(KERN_CONT "future versions of the Linux kernel should be able to run in 31 bit mode\n");
-       printk(KERN_CONT "please let us know. Please write to:\n");
-       printk(KERN_CONT "linux390@de.ibm.com (mail address) and/or\n");
-       printk(KERN_CONT "linux-s390@vger.kernel.org (mailing list).\n\n");
-       printk(KERN_CONT "Thank you!\n\n");
-       printk(KERN_CONT "If this kernel runs on a 64 bit machine you may consider using a 64 bit kernel.\n");
-       printk(KERN_CONT "This message can be disabled with the \"no_removal_warning\" kernel parameter.\n");
-       schedule_timeout_uninterruptible(300 * HZ);
-       return 0;
-}
-early_initcall(removal_warning);
-#endif
 
 {
        save_access_regs(current->thread.acrs);
        save_fp_ctl(¤t->thread.fp_regs.fpc);
-#ifdef CONFIG_64BIT
        if (current->thread.vxrs) {
                int i;
 
                        current->thread.fp_regs.fprs[i] =
                                *(freg_t *)(current->thread.vxrs + i);
        } else
-#endif
                save_fp_regs(current->thread.fp_regs.fprs);
 }
 
 {
        restore_access_regs(current->thread.acrs);
        /* restore_fp_ctl is done in restore_sigregs */
-#ifdef CONFIG_64BIT
        if (current->thread.vxrs) {
                int i;
 
                                current->thread.fp_regs.fprs[i];
                restore_vx_regs(current->thread.vxrs);
        } else
-#endif
                restore_fp_regs(current->thread.fp_regs.fprs);
 }
 
 static int save_sigregs_ext(struct pt_regs *regs,
                            _sigregs_ext __user *sregs_ext)
 {
-#ifdef CONFIG_64BIT
        __u64 vxrs[__NUM_VXRS_LOW];
        int i;
 
                                   sizeof(sregs_ext->vxrs_high)))
                        return -EFAULT;
        }
-#endif
        return 0;
 }
 
 static int restore_sigregs_ext(struct pt_regs *regs,
                               _sigregs_ext __user *sregs_ext)
 {
-#ifdef CONFIG_64BIT
        __u64 vxrs[__NUM_VXRS_LOW];
        int i;
 
                for (i = 0; i < __NUM_VXRS_LOW; i++)
                        *((__u64 *)(current->thread.vxrs + i) + 1) = vxrs[i];
        }
-#endif
        return 0;
 }
 
         * included in the signal frame on a 31-bit system.
         */
        uc_flags = 0;
-#ifdef CONFIG_64BIT
        if (MACHINE_HAS_VX) {
                frame_size += sizeof(_sigregs_ext);
                if (current->thread.vxrs)
                        uc_flags |= UC_VXRS;
        }
-#endif
        frame = get_sigframe(&ksig->ka, regs, frame_size);
        if (frame == (void __user *) -1UL)
                return -EFAULT;
 
        lc->panic_stack = panic_stack + PANIC_FRAME_OFFSET;
        lc->cpu_nr = cpu;
        lc->spinlock_lockval = arch_spin_lockval(cpu);
-#ifndef CONFIG_64BIT
-       if (MACHINE_HAS_IEEE) {
-               lc->extended_save_area_addr = get_zeroed_page(GFP_KERNEL);
-               if (!lc->extended_save_area_addr)
-                       goto out;
-       }
-#else
        if (MACHINE_HAS_VX)
                lc->vector_save_area_addr =
                        (unsigned long) &lc->vector_save_area;
        if (vdso_alloc_per_cpu(lc))
                goto out;
-#endif
        lowcore_ptr[cpu] = lc;
        pcpu_sigp_retry(pcpu, SIGP_SET_PREFIX, (u32)(unsigned long) lc);
        return 0;
 {
        pcpu_sigp_retry(pcpu, SIGP_SET_PREFIX, 0);
        lowcore_ptr[pcpu - pcpu_devices] = NULL;
-#ifndef CONFIG_64BIT
-       if (MACHINE_HAS_IEEE) {
-               struct _lowcore *lc = pcpu->lowcore;
-
-               free_page((unsigned long) lc->extended_save_area_addr);
-               lc->extended_save_area_addr = 0;
-       }
-#else
        vdso_free_per_cpu(pcpu->lowcore);
-#endif
        if (pcpu == &pcpu_devices[0])
                return;
        free_page(pcpu->lowcore->panic_stack-PANIC_FRAME_OFFSET);
        pcpu_ec_call(pcpu_devices + cpu, ec_call_function_single);
 }
 
-#ifndef CONFIG_64BIT
-/*
- * this function sends a 'purge tlb' signal to another CPU.
- */
-static void smp_ptlb_callback(void *info)
-{
-       __tlb_flush_local();
-}
-
-void smp_ptlb_all(void)
-{
-       on_each_cpu(smp_ptlb_callback, NULL, 1);
-}
-EXPORT_SYMBOL(smp_ptlb_all);
-#endif /* ! CONFIG_64BIT */
-
 /*
  * this function sends a 'reschedule' IPI to another CPU.
  * it goes straight through and wastes no time serializing
 
        return sys_ipc(call, first, second, third, ptr, third);
 }
 
-#ifdef CONFIG_64BIT
 SYSCALL_DEFINE1(s390_personality, unsigned int, personality)
 {
        unsigned int ret;
 
        return ret;
 }
-#endif /* CONFIG_64BIT */
-
-/*
- * Wrapper function for sys_fadvise64/fadvise64_64
- */
-#ifndef CONFIG_64BIT
-
-SYSCALL_DEFINE5(s390_fadvise64, int, fd, u32, offset_high, u32, offset_low,
-               size_t, len, int, advice)
-{
-       return sys_fadvise64(fd, (u64) offset_high << 32 | offset_low,
-                       len, advice);
-}
-
-struct fadvise64_64_args {
-       int fd;
-       long long offset;
-       long long len;
-       int advice;
-};
-
-SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, args)
-{
-       struct fadvise64_64_args a;
-
-       if ( copy_from_user(&a, args, sizeof(a)) )
-               return -EFAULT;
-       return sys_fadvise64_64(a.fd, a.offset, a.len, a.advice);
-}
-
-/*
- * This is a wrapper to call sys_fallocate(). For 31 bit s390 the last
- * 64 bit argument "len" is split into the upper and lower 32 bits. The
- * system call wrapper in the user space loads the value to %r6/%r7.
- * The code in entry.S keeps the values in %r2 - %r6 where they are and
- * stores %r7 to 96(%r15). But the standard C linkage requires that
- * the whole 64 bit value for len is stored on the stack and doesn't
- * use %r6 at all. So s390_fallocate has to convert the arguments from
- *   %r2: fd, %r3: mode, %r4/%r5: offset, %r6/96(%r15)-99(%r15): len
- * to
- *   %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len
- */
-SYSCALL_DEFINE5(s390_fallocate, int, fd, int, mode, loff_t, offset,
-                              u32, len_high, u32, len_low)
-{
-       return sys_fallocate(fd, mode, offset, ((u64)len_high << 32) | len_low);
-}
-#endif
 
 
 static inline void __user *get_trap_ip(struct pt_regs *regs)
 {
-#ifdef CONFIG_64BIT
        unsigned long address;
 
        if (regs->int_code & 0x200)
                address = regs->psw.addr;
        return (void __user *)
                ((address - (regs->int_code >> 16)) & PSW_ADDR_INSN);
-#else
-       return (void __user *)
-               ((regs->psw.addr - (regs->int_code >> 16)) & PSW_ADDR_INSN);
-#endif
 }
 
 static inline void report_user_fault(struct pt_regs *regs, int signr)
              "privileged operation")
 DO_ERROR_INFO(special_op_exception, SIGILL, ILL_ILLOPN,
              "special operation exception")
-
-#ifdef CONFIG_64BIT
 DO_ERROR_INFO(transaction_exception, SIGILL, ILL_ILLOPN,
              "transaction constraint exception")
-#endif
 
 static inline void do_fp_trap(struct pt_regs *regs, int fpc)
 {
 #ifdef CONFIG_UPROBES
                } else if (*((__u16 *) opcode) == UPROBE_SWBP_INSN) {
                        is_uprobe_insn = 1;
-#endif
-#ifdef CONFIG_MATHEMU
-               } else if (opcode[0] == 0xb3) {
-                       if (get_user(*((__u16 *) (opcode+2)), location+1))
-                               return;
-                       signal = math_emu_b3(opcode, regs);
-                } else if (opcode[0] == 0xed) {
-                       if (get_user(*((__u32 *) (opcode+2)),
-                                    (__u32 __user *)(location+1)))
-                               return;
-                       signal = math_emu_ed(opcode, regs);
-               } else if (*((__u16 *) opcode) == 0xb299) {
-                       if (get_user(*((__u16 *) (opcode+2)), location+1))
-                               return;
-                       signal = math_emu_srnm(opcode, regs);
-               } else if (*((__u16 *) opcode) == 0xb29c) {
-                       if (get_user(*((__u16 *) (opcode+2)), location+1))
-                               return;
-                       signal = math_emu_stfpc(opcode, regs);
-               } else if (*((__u16 *) opcode) == 0xb29d) {
-                       if (get_user(*((__u16 *) (opcode+2)), location+1))
-                               return;
-                       signal = math_emu_lfpc(opcode, regs);
 #endif
                } else
                        signal = SIGILL;
                               3, SIGTRAP) != NOTIFY_STOP)
                        signal = SIGILL;
        }
-
-#ifdef CONFIG_MATHEMU
-        if (signal == SIGFPE)
-               do_fp_trap(regs, current->thread.fp_regs.fpc);
-       else if (signal == SIGSEGV)
-               do_trap(regs, signal, SEGV_MAPERR, "user address fault");
-       else
-#endif
        if (signal)
                do_trap(regs, signal, ILL_ILLOPC, "illegal operation");
 }
 NOKPROBE_SYMBOL(illegal_op);
 
-#ifdef CONFIG_MATHEMU
-void specification_exception(struct pt_regs *regs)
-{
-        __u8 opcode[6];
-       __u16 __user *location = NULL;
-       int signal = 0;
-
-       location = (__u16 __user *) get_trap_ip(regs);
-
-       if (user_mode(regs)) {
-               get_user(*((__u16 *) opcode), location);
-               switch (opcode[0]) {
-               case 0x28: /* LDR Rx,Ry   */
-                       signal = math_emu_ldr(opcode);
-                       break;
-               case 0x38: /* LER Rx,Ry   */
-                       signal = math_emu_ler(opcode);
-                       break;
-               case 0x60: /* STD R,D(X,B) */
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_std(opcode, regs);
-                       break;
-               case 0x68: /* LD R,D(X,B) */
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_ld(opcode, regs);
-                       break;
-               case 0x70: /* STE R,D(X,B) */
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_ste(opcode, regs);
-                       break;
-               case 0x78: /* LE R,D(X,B) */
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_le(opcode, regs);
-                       break;
-               default:
-                       signal = SIGILL;
-                       break;
-                }
-        } else
-               signal = SIGILL;
-
-        if (signal == SIGFPE)
-               do_fp_trap(regs, current->thread.fp_regs.fpc);
-       else if (signal)
-               do_trap(regs, signal, ILL_ILLOPN, "specification exception");
-}
-#else
 DO_ERROR_INFO(specification_exception, SIGILL, ILL_ILLOPN,
              "specification exception");
-#endif
 
-#ifdef CONFIG_64BIT
 int alloc_vector_registers(struct task_struct *tsk)
 {
        __vector128 *vxrs;
        return 1;
 }
 __setup("novx", disable_vector_extension);
-#endif
 
 void data_exception(struct pt_regs *regs)
 {
 
        location = get_trap_ip(regs);
 
-       if (MACHINE_HAS_IEEE)
-               asm volatile("stfpc %0" : "=m" (current->thread.fp_regs.fpc));
-
-#ifdef CONFIG_MATHEMU
-       else if (user_mode(regs)) {
-               __u8 opcode[6];
-               get_user(*((__u16 *) opcode), location);
-               switch (opcode[0]) {
-               case 0x28: /* LDR Rx,Ry   */
-                       signal = math_emu_ldr(opcode);
-                       break;
-               case 0x38: /* LER Rx,Ry   */
-                       signal = math_emu_ler(opcode);
-                       break;
-               case 0x60: /* STD R,D(X,B) */
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_std(opcode, regs);
-                       break;
-               case 0x68: /* LD R,D(X,B) */
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_ld(opcode, regs);
-                       break;
-               case 0x70: /* STE R,D(X,B) */
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_ste(opcode, regs);
-                       break;
-               case 0x78: /* LE R,D(X,B) */
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_le(opcode, regs);
-                       break;
-               case 0xb3:
-                       get_user(*((__u16 *) (opcode+2)), location+1);
-                       signal = math_emu_b3(opcode, regs);
-                       break;
-                case 0xed:
-                       get_user(*((__u32 *) (opcode+2)),
-                                (__u32 __user *)(location+1));
-                       signal = math_emu_ed(opcode, regs);
-                       break;
-               case 0xb2:
-                       if (opcode[1] == 0x99) {
-                               get_user(*((__u16 *) (opcode+2)), location+1);
-                               signal = math_emu_srnm(opcode, regs);
-                       } else if (opcode[1] == 0x9c) {
-                               get_user(*((__u16 *) (opcode+2)), location+1);
-                               signal = math_emu_stfpc(opcode, regs);
-                       } else if (opcode[1] == 0x9d) {
-                               get_user(*((__u16 *) (opcode+2)), location+1);
-                               signal = math_emu_lfpc(opcode, regs);
-                       } else
-                               signal = SIGILL;
-                       break;
-               default:
-                       signal = SIGILL;
-                       break;
-                }
-        }
-#endif 
-#ifdef CONFIG_64BIT
+       asm volatile("stfpc %0" : "=m" (current->thread.fp_regs.fpc));
        /* Check for vector register enablement */
        if (MACHINE_HAS_VX && !current->thread.vxrs &&
            (current->thread.fp_regs.fpc & FPC_DXC_MASK) == 0xfe00) {
                clear_pt_regs_flag(regs, PIF_PER_TRAP);
                return;
        }
-#endif
-
        if (current->thread.fp_regs.fpc & FPC_DXC_MASK)
                signal = SIGFPE;
        else
                signal = SIGILL;
-        if (signal == SIGFPE)
+       if (signal == SIGFPE)
                do_fp_trap(regs, current->thread.fp_regs.fpc);
        else if (signal)
                do_trap(regs, signal, ILL_ILLOPN, "data exception");
 
 #include <asm/vdso.h>
 #include <asm/facility.h>
 
-#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
+#ifdef CONFIG_COMPAT
 extern char vdso32_start, vdso32_end;
 static void *vdso32_kbase = &vdso32_start;
 static unsigned int vdso32_pages;
 static struct page **vdso32_pagelist;
 #endif
 
-#ifdef CONFIG_64BIT
 extern char vdso64_start, vdso64_end;
 static void *vdso64_kbase = &vdso64_start;
 static unsigned int vdso64_pages;
 static struct page **vdso64_pagelist;
-#endif /* CONFIG_64BIT */
 
 /*
  * Should the kernel map a VDSO page into processes and pass its
        vd->ectg_available = test_facility(31);
 }
 
-#ifdef CONFIG_64BIT
 /*
  * Allocate/free per cpu vdso data.
  */
        cr5 = offsetof(struct _lowcore, paste);
        __ctl_load(cr5, 5, 5);
 }
-#endif /* CONFIG_64BIT */
 
 /*
  * This is called from binfmt_elf, we create the special vma for the
        if (!uses_interp)
                return 0;
 
-#ifdef CONFIG_64BIT
        vdso_pagelist = vdso64_pagelist;
        vdso_pages = vdso64_pages;
 #ifdef CONFIG_COMPAT
                vdso_pages = vdso32_pages;
        }
 #endif
-#else
-       vdso_pagelist = vdso32_pagelist;
-       vdso_pages = vdso32_pages;
-#endif
-
        /*
         * vDSO has a problem and was disabled, just don't "enable" it for
         * the process
        if (!vdso_enabled)
                return 0;
        vdso_init_data(vdso_data);
-#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
+#ifdef CONFIG_COMPAT
        /* Calculate the size of the 32 bit vDSO */
        vdso32_pages = ((&vdso32_end - &vdso32_start
                         + PAGE_SIZE - 1) >> PAGE_SHIFT) + 1;
        vdso32_pagelist[vdso32_pages] = NULL;
 #endif
 
-#ifdef CONFIG_64BIT
        /* Calculate the size of the 64 bit vDSO */
        vdso64_pages = ((&vdso64_end - &vdso64_start
                         + PAGE_SIZE - 1) >> PAGE_SHIFT) + 1;
        if (vdso_alloc_per_cpu(&S390_lowcore))
                BUG();
        vdso_init_cr5();
-#endif /* CONFIG_64BIT */
 
        get_page(virt_to_page(vdso_data));
 
 
 #include <asm/page.h>
 #include <asm-generic/vmlinux.lds.h>
 
-#ifndef CONFIG_64BIT
-OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
-OUTPUT_ARCH(s390:31-bit)
-ENTRY(startup)
-jiffies = jiffies_64 + 4;
-#else
 OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
 OUTPUT_ARCH(s390:64-bit)
 ENTRY(startup)
 jiffies = jiffies_64;
-#endif
 
 PHDRS {
        text PT_LOAD FLAGS(5);  /* R_E */
 
 #
 
 lib-y += delay.o string.o uaccess.o find.o
-obj-$(CONFIG_32BIT) += div64.o qrnnd.o ucmpdi2.o mem32.o
-obj-$(CONFIG_64BIT) += mem64.o
+obj-y += mem64.o
 lib-$(CONFIG_SMP) += spinlock.o
 lib-$(CONFIG_KPROBES) += probes.o
 lib-$(CONFIG_UPROBES) += probes.o
 
+++ /dev/null
-/*
- *  __div64_32 implementation for 31 bit.
- *
- *    Copyright IBM Corp. 2006
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-#include <linux/types.h>
-#include <linux/module.h>
-
-#ifdef CONFIG_MARCH_G5
-
-/*
- * Function to divide an unsigned 64 bit integer by an unsigned
- * 31 bit integer using signed 64/32 bit division.
- */
-static uint32_t __div64_31(uint64_t *n, uint32_t base)
-{
-       register uint32_t reg2 asm("2");
-       register uint32_t reg3 asm("3");
-       uint32_t *words = (uint32_t *) n;
-       uint32_t tmp;
-
-       /* Special case base==1, remainder = 0, quotient = n */
-       if (base == 1)
-               return 0;
-       /*
-        * Special case base==0 will cause a fixed point divide exception
-        * on the dr instruction and may not happen anyway. For the
-        * following calculation we can assume base > 1. The first
-        * signed 64 / 32 bit division with an upper half of 0 will
-        * give the correct upper half of the 64 bit quotient.
-        */
-       reg2 = 0UL;
-       reg3 = words[0];
-       asm volatile(
-               "       dr      %0,%2\n"
-               : "+d" (reg2), "+d" (reg3) : "d" (base) : "cc" );
-       words[0] = reg3;
-       reg3 = words[1];
-       /*
-        * To get the lower half of the 64 bit quotient and the 32 bit
-        * remainder we have to use a little trick. Since we only have
-        * a signed division the quotient can get too big. To avoid this
-        * the 64 bit dividend is halved, then the signed division will
-        * work. Afterwards the quotient and the remainder are doubled.
-        * If the last bit of the dividend has been one the remainder
-        * is increased by one then checked against the base. If the
-        * remainder has overflown subtract base and increase the
-        * quotient. Simple, no ?
-        */
-       asm volatile(
-               "       nr      %2,%1\n"
-               "       srdl    %0,1\n"
-               "       dr      %0,%3\n"
-               "       alr     %0,%0\n"
-               "       alr     %1,%1\n"
-               "       alr     %0,%2\n"
-               "       clr     %0,%3\n"
-               "       jl      0f\n"
-               "       slr     %0,%3\n"
-               "       ahi     %1,1\n"
-               "0:\n"
-               : "+d" (reg2), "+d" (reg3), "=d" (tmp)
-               : "d" (base), "2" (1UL) : "cc" );
-       words[1] = reg3;
-       return reg2;
-}
-
-/*
- * Function to divide an unsigned 64 bit integer by an unsigned
- * 32 bit integer using the unsigned 64/31 bit division.
- */
-uint32_t __div64_32(uint64_t *n, uint32_t base)
-{
-       uint32_t r;
-
-       /*
-        * If the most significant bit of base is set, divide n by
-        * (base/2). That allows to use 64/31 bit division and gives a
-        * good approximation of the result: n = (base/2)*q + r. The
-        * result needs to be corrected with two simple transformations.
-        * If base is already < 2^31-1 __div64_31 can be used directly.
-        */
-       r = __div64_31(n, ((signed) base < 0) ? (base/2) : base);
-       if ((signed) base < 0) {
-               uint64_t q = *n;
-               /*
-                * First transformation:
-                * n = (base/2)*q + r
-                *   = ((base/2)*2)*(q/2) + ((q&1) ? (base/2) : 0) + r
-                * Since r < (base/2), r + (base/2) < base.
-                * With q1 = (q/2) and r1 = r + ((q&1) ? (base/2) : 0)
-                * n = ((base/2)*2)*q1 + r1 with r1 < base.
-                */
-               if (q & 1)
-                       r += base/2;
-               q >>= 1;
-               /*
-                * Second transformation. ((base/2)*2) could have lost the
-                * last bit.
-                * n = ((base/2)*2)*q1 + r1
-                *   = base*q1 - ((base&1) ? q1 : 0) + r1
-                */
-               if (base & 1) {
-                       int64_t rx = r - q;
-                       /*
-                        * base is >= 2^31. The worst case for the while
-                        * loop is n=2^64-1 base=2^31+1. That gives a
-                        * maximum for q=(2^64-1)/2^31 = 0x1ffffffff. Since
-                        * base >= 2^31 the loop is finished after a maximum
-                        * of three iterations.
-                        */
-                       while (rx < 0) {
-                               rx += base;
-                               q--;
-                       }
-                       r = rx;
-               }
-               *n = q;
-       }
-       return r;
-}
-
-#else /* MARCH_G5 */
-
-uint32_t __div64_32(uint64_t *n, uint32_t base)
-{
-       register uint32_t reg2 asm("2");
-       register uint32_t reg3 asm("3");
-       uint32_t *words = (uint32_t *) n;
-
-       reg2 = 0UL;
-       reg3 = words[0];
-       asm volatile(
-               "       dlr     %0,%2\n"
-               : "+d" (reg2), "+d" (reg3) : "d" (base) : "cc" );
-       words[0] = reg3;
-       reg3 = words[1];
-       asm volatile(
-               "       dlr     %0,%2\n"
-               : "+d" (reg2), "+d" (reg3) : "d" (base) : "cc" );
-       words[1] = reg3;
-       return reg2;
-}
-
-#endif /* MARCH_G5 */
 
+++ /dev/null
-/*
- * String handling functions.
- *
- * Copyright IBM Corp. 2012
- */
-
-#include <linux/linkage.h>
-
-/*
- * memset implementation
- *
- * This code corresponds to the C construct below. We do distinguish
- * between clearing (c == 0) and setting a memory array (c != 0) simply
- * because nearly all memset invocations in the kernel clear memory and
- * the xc instruction is preferred in such cases.
- *
- * void *memset(void *s, int c, size_t n)
- * {
- *     if (likely(c == 0))
- *             return __builtin_memset(s, 0, n);
- *     return __builtin_memset(s, c, n);
- * }
- */
-ENTRY(memset)
-       basr    %r5,%r0
-.Lmemset_base:
-       ltr     %r4,%r4
-       bzr     %r14
-       ltr     %r3,%r3
-       jnz     .Lmemset_fill
-       ahi     %r4,-1
-       lr      %r3,%r4
-       srl     %r3,8
-       ltr     %r3,%r3
-       lr      %r1,%r2
-       je      .Lmemset_clear_rest
-.Lmemset_clear_loop:
-       xc      0(256,%r1),0(%r1)
-       la      %r1,256(%r1)
-       brct    %r3,.Lmemset_clear_loop
-.Lmemset_clear_rest:
-       ex      %r4,.Lmemset_xc-.Lmemset_base(%r5)
-       br      %r14
-.Lmemset_fill:
-       stc     %r3,0(%r2)
-       chi     %r4,1
-       lr      %r1,%r2
-       ber     %r14
-       ahi     %r4,-2
-       lr      %r3,%r4
-       srl     %r3,8
-       ltr     %r3,%r3
-       je      .Lmemset_fill_rest
-.Lmemset_fill_loop:
-       mvc     1(256,%r1),0(%r1)
-       la      %r1,256(%r1)
-       brct    %r3,.Lmemset_fill_loop
-.Lmemset_fill_rest:
-       ex      %r4,.Lmemset_mvc-.Lmemset_base(%r5)
-       br      %r14
-.Lmemset_xc:
-       xc      0(1,%r1),0(%r1)
-.Lmemset_mvc:
-       mvc     1(1,%r1),0(%r1)
-
-/*
- * memcpy implementation
- *
- * void *memcpy(void *dest, const void *src, size_t n)
- */
-ENTRY(memcpy)
-       basr    %r5,%r0
-.Lmemcpy_base:
-       ltr     %r4,%r4
-       bzr     %r14
-       ahi     %r4,-1
-       lr      %r0,%r4
-       srl     %r0,8
-       ltr     %r0,%r0
-       lr      %r1,%r2
-       jnz     .Lmemcpy_loop
-.Lmemcpy_rest:
-       ex      %r4,.Lmemcpy_mvc-.Lmemcpy_base(%r5)
-       br      %r14
-.Lmemcpy_loop:
-       mvc     0(256,%r1),0(%r3)
-       la      %r1,256(%r1)
-       la      %r3,256(%r3)
-       brct    %r0,.Lmemcpy_loop
-       j       .Lmemcpy_rest
-.Lmemcpy_mvc:
-       mvc     0(1,%r1),0(%r3)
 
+++ /dev/null
-# S/390 __udiv_qrnnd
-
-#include <linux/linkage.h>
-
-# r2 : &__r
-# r3 : upper half of 64 bit word n
-# r4 : lower half of 64 bit word n
-# r5 : divisor d
-# the reminder r of the division is to be stored to &__r and
-# the quotient q is to be returned
-
-       .text
-ENTRY(__udiv_qrnnd)
-       st    %r2,24(%r15)        # store pointer to reminder for later
-       lr    %r0,%r3             # reload n
-       lr    %r1,%r4
-       ltr   %r2,%r5             # reload and test divisor
-       jp    5f
-       # divisor >= 0x80000000
-       srdl  %r0,2               # n/4
-       srl   %r2,1               # d/2
-       slr   %r1,%r2             # special case if last bit of d is set
-       brc   3,0f                #  (n/4) div (n/2) can overflow by 1
-       ahi   %r0,-1              #  trick: subtract n/2, then divide
-0:     dr    %r0,%r2             # signed division
-       ahi   %r1,1               #  trick part 2: add 1 to the quotient
-       # now (n >> 2) = (d >> 1) * %r1 + %r0
-       lhi   %r3,1
-       nr    %r3,%r1             # test last bit of q
-       jz    1f
-       alr   %r0,%r2             # add (d>>1) to r
-1:     srl   %r1,1               # q >>= 1
-       # now (n >> 2) = (d&-2) * %r1 + %r0
-       lhi   %r3,1
-       nr    %r3,%r5             # test last bit of d
-       jz    2f
-       slr   %r0,%r1             # r -= q
-       brc   3,2f                # borrow ?
-       alr   %r0,%r5             # r += d
-       ahi   %r1,-1
-2:     # now (n >> 2) = d * %r1 + %r0
-       alr   %r1,%r1             # q <<= 1
-       alr   %r0,%r0             # r <<= 1
-       brc   12,3f               # overflow on r ?
-       slr   %r0,%r5             # r -= d
-       ahi   %r1,1               # q += 1
-3:     lhi   %r3,2
-       nr    %r3,%r4             # test next to last bit of n
-       jz    4f
-       ahi   %r0,1               # r += 1
-4:     clr   %r0,%r5             # r >= d ?
-       jl    6f
-       slr   %r0,%r5             # r -= d
-       ahi   %r1,1               # q += 1
-       # now (n >> 1) = d * %r1 + %r0
-       j     6f
-5:     # divisor < 0x80000000
-       srdl  %r0,1
-       dr    %r0,%r2             # signed division
-       # now (n >> 1) = d * %r1 + %r0
-6:     alr   %r1,%r1             # q <<= 1
-       alr   %r0,%r0             # r <<= 1
-       brc   12,7f               # overflow on r ?
-       slr   %r0,%r5             # r -= d
-       ahi   %r1,1               # q += 1
-7:     lhi   %r3,1
-       nr    %r3,%r4             # isolate last bit of n
-       alr   %r0,%r3             # r += (n & 1)
-       clr   %r0,%r5             # r >= d ?
-       jl    8f
-       slr   %r0,%r5             # r -= d
-       ahi   %r1,1               # q += 1
-8:     # now n = d * %r1 + %r0
-       l     %r2,24(%r15)
-       st    %r0,0(%r2)
-       lr    %r2,%r1
-       br    %r14
-       .end    __udiv_qrnnd
 
 #include <asm/mmu_context.h>
 #include <asm/facility.h>
 
-#ifndef CONFIG_64BIT
-#define AHI    "ahi"
-#define ALR    "alr"
-#define CLR    "clr"
-#define LHI    "lhi"
-#define SLR    "slr"
-#else
-#define AHI    "aghi"
-#define ALR    "algr"
-#define CLR    "clgr"
-#define LHI    "lghi"
-#define SLR    "slgr"
-#endif
-
 static struct static_key have_mvcos = STATIC_KEY_INIT_FALSE;
 
 static inline unsigned long copy_from_user_mvcos(void *x, const void __user *ptr,
        asm volatile(
                "0: .insn ss,0xc80000000000,0(%0,%2),0(%1),0\n"
                "9: jz    7f\n"
-               "1:"ALR"  %0,%3\n"
-               "  "SLR"  %1,%3\n"
-               "  "SLR"  %2,%3\n"
+               "1: algr  %0,%3\n"
+               "   slgr  %1,%3\n"
+               "   slgr  %2,%3\n"
                "   j     0b\n"
                "2: la    %4,4095(%1)\n"/* %4 = ptr + 4095 */
                "   nr    %4,%3\n"      /* %4 = (ptr + 4095) & -4096 */
-               "  "SLR"  %4,%1\n"
-               "  "CLR"  %0,%4\n"      /* copy crosses next page boundary? */
+               "   slgr  %4,%1\n"
+               "   clgr  %0,%4\n"      /* copy crosses next page boundary? */
                "   jnh   4f\n"
                "3: .insn ss,0xc80000000000,0(%4,%2),0(%1),0\n"
-               "10:"SLR"  %0,%4\n"
-               "  "ALR"  %2,%4\n"
-               "4:"LHI"  %4,-1\n"
-               "  "ALR"  %4,%0\n"      /* copy remaining size, subtract 1 */
+               "10:slgr  %0,%4\n"
+               "   algr  %2,%4\n"
+               "4: lghi  %4,-1\n"
+               "   algr  %4,%0\n"      /* copy remaining size, subtract 1 */
                "   bras  %3,6f\n"      /* memset loop */
                "   xc    0(1,%2),0(%2)\n"
                "5: xc    0(256,%2),0(%2)\n"
                "   la    %2,256(%2)\n"
-               "6:"AHI"  %4,-256\n"
+               "6: aghi  %4,-256\n"
                "   jnm   5b\n"
                "   ex    %4,0(%3)\n"
                "   j     8f\n"
-               "7:"SLR"  %0,%0\n"
+               "7:slgr  %0,%0\n"
                "8:\n"
                EX_TABLE(0b,2b) EX_TABLE(3b,4b) EX_TABLE(9b,2b) EX_TABLE(10b,4b)
                : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2)
                "   sacf  0\n"
                "0: mvcp  0(%0,%2),0(%1),%3\n"
                "10:jz    8f\n"
-               "1:"ALR"  %0,%3\n"
+               "1: algr  %0,%3\n"
                "   la    %1,256(%1)\n"
                "   la    %2,256(%2)\n"
                "2: mvcp  0(%0,%2),0(%1),%3\n"
                "11:jnz   1b\n"
                "   j     8f\n"
                "3: la    %4,255(%1)\n" /* %4 = ptr + 255 */
-               "  "LHI"  %3,-4096\n"
+               "   lghi  %3,-4096\n"
                "   nr    %4,%3\n"      /* %4 = (ptr + 255) & -4096 */
-               "  "SLR"  %4,%1\n"
-               "  "CLR"  %0,%4\n"      /* copy crosses next page boundary? */
+               "   slgr  %4,%1\n"
+               "   clgr  %0,%4\n"      /* copy crosses next page boundary? */
                "   jnh   5f\n"
                "4: mvcp  0(%4,%2),0(%1),%3\n"
-               "12:"SLR"  %0,%4\n"
-               "  "ALR"  %2,%4\n"
-               "5:"LHI"  %4,-1\n"
-               "  "ALR"  %4,%0\n"      /* copy remaining size, subtract 1 */
+               "12:slgr  %0,%4\n"
+               "   algr  %2,%4\n"
+               "5: lghi  %4,-1\n"
+               "   algr  %4,%0\n"      /* copy remaining size, subtract 1 */
                "   bras  %3,7f\n"      /* memset loop */
                "   xc    0(1,%2),0(%2)\n"
                "6: xc    0(256,%2),0(%2)\n"
                "   la    %2,256(%2)\n"
-               "7:"AHI"  %4,-256\n"
+               "7: aghi  %4,-256\n"
                "   jnm   6b\n"
                "   ex    %4,0(%3)\n"
                "   j     9f\n"
-               "8:"SLR"  %0,%0\n"
+               "8:slgr  %0,%0\n"
                "9: sacf  768\n"
                EX_TABLE(0b,3b) EX_TABLE(2b,3b) EX_TABLE(4b,5b)
                EX_TABLE(10b,3b) EX_TABLE(11b,3b) EX_TABLE(12b,5b)
        asm volatile(
                "0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n"
                "6: jz    4f\n"
-               "1:"ALR"  %0,%3\n"
-               "  "SLR"  %1,%3\n"
-               "  "SLR"  %2,%3\n"
+               "1: algr  %0,%3\n"
+               "   slgr  %1,%3\n"
+               "   slgr  %2,%3\n"
                "   j     0b\n"
                "2: la    %4,4095(%1)\n"/* %4 = ptr + 4095 */
                "   nr    %4,%3\n"      /* %4 = (ptr + 4095) & -4096 */
-               "  "SLR"  %4,%1\n"
-               "  "CLR"  %0,%4\n"      /* copy crosses next page boundary? */
+               "   slgr  %4,%1\n"
+               "   clgr  %0,%4\n"      /* copy crosses next page boundary? */
                "   jnh   5f\n"
                "3: .insn ss,0xc80000000000,0(%4,%1),0(%2),0\n"
-               "7:"SLR"  %0,%4\n"
+               "7: slgr  %0,%4\n"
                "   j     5f\n"
-               "4:"SLR"  %0,%0\n"
+               "4: slgr  %0,%0\n"
                "5:\n"
                EX_TABLE(0b,2b) EX_TABLE(3b,5b) EX_TABLE(6b,2b) EX_TABLE(7b,5b)
                : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2)
                "   sacf  0\n"
                "0: mvcs  0(%0,%1),0(%2),%3\n"
                "7: jz    5f\n"
-               "1:"ALR"  %0,%3\n"
+               "1: algr  %0,%3\n"
                "   la    %1,256(%1)\n"
                "   la    %2,256(%2)\n"
                "2: mvcs  0(%0,%1),0(%2),%3\n"
                "8: jnz   1b\n"
                "   j     5f\n"
                "3: la    %4,255(%1)\n" /* %4 = ptr + 255 */
-               "  "LHI"  %3,-4096\n"
+               "   lghi  %3,-4096\n"
                "   nr    %4,%3\n"      /* %4 = (ptr + 255) & -4096 */
-               "  "SLR"  %4,%1\n"
-               "  "CLR"  %0,%4\n"      /* copy crosses next page boundary? */
+               "   slgr  %4,%1\n"
+               "   clgr  %0,%4\n"      /* copy crosses next page boundary? */
                "   jnh   6f\n"
                "4: mvcs  0(%4,%1),0(%2),%3\n"
-               "9:"SLR"  %0,%4\n"
+               "9: slgr  %0,%4\n"
                "   j     6f\n"
-               "5:"SLR"  %0,%0\n"
+               "5: slgr  %0,%0\n"
                "6: sacf  768\n"
                EX_TABLE(0b,3b) EX_TABLE(2b,3b) EX_TABLE(4b,6b)
                EX_TABLE(7b,3b) EX_TABLE(8b,3b) EX_TABLE(9b,6b)
        asm volatile(
                "0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n"
                "   jz    2f\n"
-               "1:"ALR"  %0,%3\n"
-               "  "SLR"  %1,%3\n"
-               "  "SLR"  %2,%3\n"
+               "1: algr  %0,%3\n"
+               "   slgr  %1,%3\n"
+               "   slgr  %2,%3\n"
                "   j     0b\n"
-               "2:"SLR"  %0,%0\n"
+               "2:slgr  %0,%0\n"
                "3: \n"
                EX_TABLE(0b,3b)
                : "+a" (size), "+a" (to), "+a" (from), "+a" (tmp1), "=a" (tmp2)
        load_kernel_asce();
        asm volatile(
                "   sacf  256\n"
-               "  "AHI"  %0,-1\n"
+               "   aghi  %0,-1\n"
                "   jo    5f\n"
                "   bras  %3,3f\n"
-               "0:"AHI"  %0,257\n"
+               "0: aghi  %0,257\n"
                "1: mvc   0(1,%1),0(%2)\n"
                "   la    %1,1(%1)\n"
                "   la    %2,1(%2)\n"
-               "  "AHI"  %0,-1\n"
+               "   aghi  %0,-1\n"
                "   jnz   1b\n"
                "   j     5f\n"
                "2: mvc   0(256,%1),0(%2)\n"
                "   la    %1,256(%1)\n"
                "   la    %2,256(%2)\n"
-               "3:"AHI"  %0,-256\n"
+               "3: aghi  %0,-256\n"
                "   jnm   2b\n"
                "4: ex    %0,1b-0b(%3)\n"
-               "5: "SLR"  %0,%0\n"
+               "5: slgr  %0,%0\n"
                "6: sacf  768\n"
                EX_TABLE(1b,6b) EX_TABLE(2b,0b) EX_TABLE(4b,0b)
                : "+a" (size), "+a" (to), "+a" (from), "=a" (tmp1)
        asm volatile(
                "0: .insn ss,0xc80000000000,0(%0,%1),0(%4),0\n"
                "   jz    4f\n"
-               "1:"ALR"  %0,%2\n"
-               "  "SLR"  %1,%2\n"
+               "1: algr  %0,%2\n"
+               "   slgr  %1,%2\n"
                "   j     0b\n"
                "2: la    %3,4095(%1)\n"/* %4 = to + 4095 */
                "   nr    %3,%2\n"      /* %4 = (to + 4095) & -4096 */
-               "  "SLR"  %3,%1\n"
-               "  "CLR"  %0,%3\n"      /* copy crosses next page boundary? */
+               "   slgr  %3,%1\n"
+               "   clgr  %0,%3\n"      /* copy crosses next page boundary? */
                "   jnh   5f\n"
                "3: .insn ss,0xc80000000000,0(%3,%1),0(%4),0\n"
-               "  "SLR"  %0,%3\n"
+               "   slgr  %0,%3\n"
                "   j     5f\n"
-               "4:"SLR"  %0,%0\n"
+               "4:slgr  %0,%0\n"
                "5:\n"
                EX_TABLE(0b,2b) EX_TABLE(3b,5b)
                : "+a" (size), "+a" (to), "+a" (tmp1), "=a" (tmp2)
        load_kernel_asce();
        asm volatile(
                "   sacf  256\n"
-               "  "AHI"  %0,-1\n"
+               "   aghi  %0,-1\n"
                "   jo    5f\n"
                "   bras  %3,3f\n"
                "   xc    0(1,%1),0(%1)\n"
-               "0:"AHI"  %0,257\n"
+               "0: aghi  %0,257\n"
                "   la    %2,255(%1)\n" /* %2 = ptr + 255 */
                "   srl   %2,12\n"
                "   sll   %2,12\n"      /* %2 = (ptr + 255) & -4096 */
-               "  "SLR"  %2,%1\n"
-               "  "CLR"  %0,%2\n"      /* clear crosses next page boundary? */
+               "   slgr  %2,%1\n"
+               "   clgr  %0,%2\n"      /* clear crosses next page boundary? */
                "   jnh   5f\n"
-               "  "AHI"  %2,-1\n"
+               "   aghi  %2,-1\n"
                "1: ex    %2,0(%3)\n"
-               "  "AHI"  %2,1\n"
-               "  "SLR"  %0,%2\n"
+               "   aghi  %2,1\n"
+               "   slgr  %0,%2\n"
                "   j     5f\n"
                "2: xc    0(256,%1),0(%1)\n"
                "   la    %1,256(%1)\n"
-               "3:"AHI"  %0,-256\n"
+               "3: aghi  %0,-256\n"
                "   jnm   2b\n"
                "4: ex    %0,0(%3)\n"
-               "5: "SLR"  %0,%0\n"
+               "5: slgr  %0,%0\n"
                "6: sacf  768\n"
                EX_TABLE(1b,6b) EX_TABLE(2b,0b) EX_TABLE(4b,0b)
                : "+a" (size), "+a" (to), "=a" (tmp1), "=a" (tmp2)
        asm volatile(
                "   la    %2,0(%1)\n"
                "   la    %3,0(%0,%1)\n"
-               "  "SLR"  %0,%0\n"
+               "   slgr  %0,%0\n"
                "   sacf  256\n"
                "0: srst  %3,%2\n"
                "   jo    0b\n"
                "   la    %0,1(%3)\n"   /* strnlen_user results includes \0 */
-               "  "SLR"  %0,%1\n"
+               "   slgr  %0,%1\n"
                "1: sacf  768\n"
                EX_TABLE(0b,1b)
                : "+a" (size), "+a" (src), "=a" (tmp1), "=a" (tmp2)
 
 static int __init uaccess_init(void)
 {
-       if (IS_ENABLED(CONFIG_64BIT) && !uaccess_primary && test_facility(27))
+       if (!uaccess_primary && test_facility(27))
                static_key_slow_inc(&have_mvcos);
        return 0;
 }
 
+++ /dev/null
-#include <linux/module.h>
-
-union ull_union {
-       unsigned long long ull;
-       struct {
-               unsigned int high;
-               unsigned int low;
-       } ui;
-};
-
-int __ucmpdi2(unsigned long long a, unsigned long long b)
-{
-       union ull_union au = {.ull = a};
-       union ull_union bu = {.ull = b};
-
-       if (au.ui.high < bu.ui.high)
-               return 0;
-       else if (au.ui.high > bu.ui.high)
-               return 2;
-       if (au.ui.low < bu.ui.low)
-               return 0;
-       else if (au.ui.low > bu.ui.low)
-               return 2;
-       return 1;
-}
-EXPORT_SYMBOL(__ucmpdi2);
 
+++ /dev/null
-#
-# Makefile for the FPU instruction emulation.
-#
-
-obj-$(CONFIG_MATHEMU) := math.o
-
-ccflags-y := -I$(src) -Iinclude/math-emu -w
 
+++ /dev/null
-/*
- *  S390 version
- *    Copyright IBM Corp. 1999, 2001
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *
- * 'math.c' emulates IEEE instructions on a S390 processor
- *          that does not have the IEEE fpu (all processors before G5).
- */
-
-#include <linux/types.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <asm/uaccess.h>
-#include <asm/lowcore.h>
-
-#include <asm/sfp-util.h>
-#include <math-emu/soft-fp.h>
-#include <math-emu/single.h>
-#include <math-emu/double.h>
-#include <math-emu/quad.h>
-
-#define FPC_VALID_MASK         0xF8F8FF03
-
-/*
- * I miss a macro to round a floating point number to the
- * nearest integer in the same floating point format.
- */
-#define _FP_TO_FPINT_ROUND(fs, wc, X)                                  \
-  do {                                                                 \
-    switch (X##_c)                                                     \
-      {                                                                        \
-      case FP_CLS_NORMAL:                                              \
-        if (X##_e > _FP_FRACBITS_##fs + _FP_EXPBIAS_##fs)              \
-          { /* floating point number has no bits after the dot. */     \
-          }                                                            \
-        else if (X##_e <= _FP_FRACBITS_##fs + _FP_EXPBIAS_##fs &&      \
-                 X##_e > _FP_EXPBIAS_##fs)                             \
-         { /* some bits before the dot, some after it. */              \
-            _FP_FRAC_SRS_##wc(X, _FP_WFRACBITS_##fs,                   \
-                              X##_e - _FP_EXPBIAS_##fs                 \
-                              + _FP_FRACBITS_##fs);                    \
-           _FP_ROUND(wc, X);                                           \
-           _FP_FRAC_SLL_##wc(X, X##_e - _FP_EXPBIAS_##fs               \
-                              + _FP_FRACBITS_##fs);                    \
-          }                                                            \
-        else                                                           \
-          { /* all bits after the dot. */                              \
-           FP_SET_EXCEPTION(FP_EX_INEXACT);                            \
-            X##_c = FP_CLS_ZERO;                                       \
-         }                                                             \
-        break;                                                         \
-      case FP_CLS_NAN:                                                 \
-      case FP_CLS_INF:                                                 \
-      case FP_CLS_ZERO:                                                        \
-        break;                                                         \
-      }                                                                        \
-  } while (0)
-
-#define FP_TO_FPINT_ROUND_S(X) _FP_TO_FPINT_ROUND(S,1,X)
-#define FP_TO_FPINT_ROUND_D(X) _FP_TO_FPINT_ROUND(D,2,X)
-#define FP_TO_FPINT_ROUND_Q(X) _FP_TO_FPINT_ROUND(Q,4,X)
-
-typedef union {
-        long double ld;
-        struct {
-                __u64 high;
-                __u64 low;
-        } w;
-} mathemu_ldcv;
-
-#ifdef CONFIG_SYSCTL
-int sysctl_ieee_emulation_warnings=1;
-#endif
-
-#define mathemu_put_user(x, p) \
-        do { \
-                if (put_user((x),(p))) \
-                        return SIGSEGV; \
-        } while (0)
-
-#define mathemu_get_user(x, p) \
-        do { \
-                if (get_user((x),(p))) \
-                        return SIGSEGV; \
-        } while (0)
-
-#define mathemu_copy_from_user(d, s, n)\
-        do { \
-                if (copy_from_user((d),(s),(n)) != 0) \
-                        return SIGSEGV; \
-        } while (0)
-
-#define mathemu_copy_to_user(d, s, n) \
-        do { \
-                if (copy_to_user((d),(s),(n)) != 0) \
-                        return SIGSEGV; \
-        } while (0)
-
-static void display_emulation_not_implemented(struct pt_regs *regs, char *instr)
-{
-        __u16 *location;
-        
-#ifdef CONFIG_SYSCTL
-        if(sysctl_ieee_emulation_warnings)
-#endif
-        {
-                location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
-                printk("%s ieee fpu instruction not emulated "
-                       "process name: %s pid: %d \n",
-                       instr, current->comm, current->pid);
-                printk("%s's PSW:    %08lx %08lx\n", instr,
-                       (unsigned long) regs->psw.mask,
-                       (unsigned long) location);
-        }
-}
-
-static inline void emu_set_CC (struct pt_regs *regs, int cc)
-{
-        regs->psw.mask = (regs->psw.mask & 0xFFFFCFFF) | ((cc&3) << 12);
-}
-
-/*
- * Set the condition code in the user psw.
- *  0 : Result is zero
- *  1 : Result is less than zero
- *  2 : Result is greater than zero
- *  3 : Result is NaN or INF
- */
-static inline void emu_set_CC_cs(struct pt_regs *regs, int class, int sign)
-{
-        switch (class) {
-        case FP_CLS_NORMAL:
-        case FP_CLS_INF:
-                emu_set_CC(regs, sign ? 1 : 2);
-                break;
-        case FP_CLS_ZERO:
-                emu_set_CC(regs, 0);
-                break;
-        case FP_CLS_NAN:
-                emu_set_CC(regs, 3);
-                break;
-        }
-}
-
-/* Add long double */
-static int emu_axbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[rx].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QB, &cvt.ld);
-        FP_ADD_Q(QR, QA, QB);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        emu_set_CC_cs(regs, QR_c, QR_s);
-        return _fex;
-}
-
-/* Add double */
-static int emu_adbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_ADD_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Add double */
-static int emu_adb (struct pt_regs *regs, int rx, double *val) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, val);
-        FP_ADD_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Add float */
-static int emu_aebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_ADD_S(SR, SA, SB);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Add float */
-static int emu_aeb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, val);
-        FP_ADD_S(SR, SA, SB);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Compare long double */
-static int emu_cxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QB);
-       mathemu_ldcv cvt;
-        int IR;
-
-        cvt.w.high = current->thread.fp_regs.fprs[rx].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui;
-        FP_UNPACK_RAW_QP(QA, &cvt.ld);
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_RAW_QP(QB, &cvt.ld);
-        FP_CMP_Q(IR, QA, QB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        return 0;
-}
-
-/* Compare double */
-static int emu_cdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DB);
-        int IR;
-
-        FP_UNPACK_RAW_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_RAW_DP(DB, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_CMP_D(IR, DA, DB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        return 0;
-}
-
-/* Compare double */
-static int emu_cdb (struct pt_regs *regs, int rx, double *val) {
-        FP_DECL_D(DA); FP_DECL_D(DB);
-        int IR;
-
-        FP_UNPACK_RAW_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_RAW_DP(DB, val);
-        FP_CMP_D(IR, DA, DB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        return 0;
-}
-
-/* Compare float */
-static int emu_cebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SB);
-        int IR;
-
-        FP_UNPACK_RAW_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_RAW_SP(SB, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_CMP_S(IR, SA, SB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        return 0;
-}
-
-/* Compare float */
-static int emu_ceb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_S(SB);
-        int IR;
-
-        FP_UNPACK_RAW_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_RAW_SP(SB, val);
-        FP_CMP_S(IR, SA, SB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        return 0;
-}
-
-/* Compare and signal long double */
-static int emu_kxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QB);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int IR;
-
-        cvt.w.high = current->thread.fp_regs.fprs[rx].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui;
-        FP_UNPACK_RAW_QP(QA, &cvt.ld);
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QB, &cvt.ld);
-        FP_CMP_Q(IR, QA, QB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        if (IR == 3)
-                FP_SET_EXCEPTION (FP_EX_INVALID);
-        return _fex;
-}
-
-/* Compare and signal double */
-static int emu_kdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DB);
-        FP_DECL_EX;
-        int IR;
-
-        FP_UNPACK_RAW_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_RAW_DP(DB, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_CMP_D(IR, DA, DB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        if (IR == 3)
-                FP_SET_EXCEPTION (FP_EX_INVALID);
-        return _fex;
-}
-
-/* Compare and signal double */
-static int emu_kdb (struct pt_regs *regs, int rx, double *val) {
-        FP_DECL_D(DA); FP_DECL_D(DB);
-        FP_DECL_EX;
-        int IR;
-
-        FP_UNPACK_RAW_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_RAW_DP(DB, val);
-        FP_CMP_D(IR, DA, DB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        if (IR == 3)
-                FP_SET_EXCEPTION (FP_EX_INVALID);
-        return _fex;
-}
-
-/* Compare and signal float */
-static int emu_kebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SB);
-        FP_DECL_EX;
-        int IR;
-
-        FP_UNPACK_RAW_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_RAW_SP(SB, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_CMP_S(IR, SA, SB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        if (IR == 3)
-                FP_SET_EXCEPTION (FP_EX_INVALID);
-        return _fex;
-}
-
-/* Compare and signal float */
-static int emu_keb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_S(SB);
-        FP_DECL_EX;
-        int IR;
-
-        FP_UNPACK_RAW_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_RAW_SP(SB, val);
-        FP_CMP_S(IR, SA, SB, 3);
-        /*
-         * IR == -1 if DA < DB, IR == 0 if DA == DB,
-         * IR == 1 if DA > DB and IR == 3 if unorderded
-         */
-        emu_set_CC(regs, (IR == -1) ? 1 : (IR == 1) ? 2 : IR);
-        if (IR == 3)
-                FP_SET_EXCEPTION (FP_EX_INVALID);
-        return _fex;
-}
-
-/* Convert from fixed long double */
-static int emu_cxfbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QR);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        __s32 si;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        si = regs->gprs[ry];
-        FP_FROM_INT_Q(QR, si, 32, int);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Convert from fixed double */
-static int emu_cdfbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DR);
-        FP_DECL_EX;
-        __s32 si;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        si = regs->gprs[ry];
-        FP_FROM_INT_D(DR, si, 32, int);
-        FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Convert from fixed float */
-static int emu_cefbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SR);
-        FP_DECL_EX;
-        __s32 si;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        si = regs->gprs[ry];
-        FP_FROM_INT_S(SR, si, 32, int);
-        FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        return _fex;
-}
-
-/* Convert to fixed long double */
-static int emu_cfxbr (struct pt_regs *regs, int rx, int ry, int mask) {
-        FP_DECL_Q(QA);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        __s32 si;
-        int mode;
-
-       if (mask == 0)
-               mode = current->thread.fp_regs.fpc & 3;
-       else if (mask == 1)
-               mode = FP_RND_NEAREST;
-       else
-               mode = mask - 4;
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        FP_TO_INT_ROUND_Q(si, QA, 32, 1);
-        regs->gprs[rx] = si;
-        emu_set_CC_cs(regs, QA_c, QA_s);
-        return _fex;
-}
-
-/* Convert to fixed double */
-static int emu_cfdbr (struct pt_regs *regs, int rx, int ry, int mask) {
-        FP_DECL_D(DA);
-        FP_DECL_EX;
-        __s32 si;
-        int mode;
-
-       if (mask == 0)
-               mode = current->thread.fp_regs.fpc & 3;
-       else if (mask == 1)
-               mode = FP_RND_NEAREST;
-       else
-               mode = mask - 4;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_TO_INT_ROUND_D(si, DA, 32, 1);
-        regs->gprs[rx] = si;
-        emu_set_CC_cs(regs, DA_c, DA_s);
-        return _fex;
-}
-
-/* Convert to fixed float */
-static int emu_cfebr (struct pt_regs *regs, int rx, int ry, int mask) {
-        FP_DECL_S(SA);
-        FP_DECL_EX;
-        __s32 si;
-        int mode;
-
-       if (mask == 0)
-               mode = current->thread.fp_regs.fpc & 3;
-       else if (mask == 1)
-               mode = FP_RND_NEAREST;
-       else
-               mode = mask - 4;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_TO_INT_ROUND_S(si, SA, 32, 1);
-        regs->gprs[rx] = si;
-        emu_set_CC_cs(regs, SA_c, SA_s);
-        return _fex;
-}
-
-/* Divide long double */
-static int emu_dxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[rx].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QB, &cvt.ld);
-        FP_DIV_Q(QR, QA, QB);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Divide double */
-static int emu_ddbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_DIV_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Divide double */
-static int emu_ddb (struct pt_regs *regs, int rx, double *val) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, val);
-        FP_DIV_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Divide float */
-static int emu_debr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_DIV_S(SR, SA, SB);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        return _fex;
-}
-
-/* Divide float */
-static int emu_deb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, val);
-        FP_DIV_S(SR, SA, SB);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        return _fex;
-}
-
-/* Divide to integer double */
-static int emu_didbr (struct pt_regs *regs, int rx, int ry, int mask) {
-        display_emulation_not_implemented(regs, "didbr");
-        return 0;
-}
-
-/* Divide to integer float */
-static int emu_diebr (struct pt_regs *regs, int rx, int ry, int mask) {
-        display_emulation_not_implemented(regs, "diebr");
-        return 0;
-}
-
-/* Extract fpc */
-static int emu_efpc (struct pt_regs *regs, int rx, int ry) {
-        regs->gprs[rx] = current->thread.fp_regs.fpc;
-        return 0;
-}
-
-/* Load and test long double */
-static int emu_ltxbr (struct pt_regs *regs, int rx, int ry) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-       mathemu_ldcv cvt;
-        FP_DECL_Q(QA);
-        FP_DECL_EX;
-
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        fp_regs->fprs[rx].ui = fp_regs->fprs[ry].ui;
-        fp_regs->fprs[rx+2].ui = fp_regs->fprs[ry+2].ui;
-        emu_set_CC_cs(regs, QA_c, QA_s);
-        return _fex;
-}
-
-/* Load and test double */
-static int emu_ltdbr (struct pt_regs *regs, int rx, int ry) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        FP_DECL_D(DA);
-        FP_DECL_EX;
-
-        FP_UNPACK_DP(DA, &fp_regs->fprs[ry].d);
-        fp_regs->fprs[rx].ui = fp_regs->fprs[ry].ui;
-        emu_set_CC_cs(regs, DA_c, DA_s);
-        return _fex;
-}
-
-/* Load and test double */
-static int emu_ltebr (struct pt_regs *regs, int rx, int ry) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        FP_DECL_S(SA);
-        FP_DECL_EX;
-
-        FP_UNPACK_SP(SA, &fp_regs->fprs[ry].f);
-        fp_regs->fprs[rx].ui = fp_regs->fprs[ry].ui;
-        emu_set_CC_cs(regs, SA_c, SA_s);
-        return _fex;
-}
-
-/* Load complement long double */
-static int emu_lcxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QR);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-       FP_NEG_Q(QR, QA);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        emu_set_CC_cs(regs, QR_c, QR_s);
-        return _fex;
-}
-
-/* Load complement double */
-static int emu_lcdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d);
-       FP_NEG_D(DR, DA);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Load complement float */
-static int emu_lcebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f);
-       FP_NEG_S(SR, SA);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Load floating point integer long double */
-static int emu_fixbr (struct pt_regs *regs, int rx, int ry, int mask) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        FP_DECL_Q(QA);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        __s32 si;
-        int mode;
-
-       if (mask == 0)
-               mode = fp_regs->fpc & 3;
-       else if (mask == 1)
-               mode = FP_RND_NEAREST;
-       else
-               mode = mask - 4;
-        cvt.w.high = fp_regs->fprs[ry].ui;
-        cvt.w.low = fp_regs->fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-       FP_TO_FPINT_ROUND_Q(QA);
-       FP_PACK_QP(&cvt.ld, QA);
-       fp_regs->fprs[rx].ui = cvt.w.high;
-       fp_regs->fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Load floating point integer double */
-static int emu_fidbr (struct pt_regs *regs, int rx, int ry, int mask) {
-       /* FIXME: rounding mode !! */
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        FP_DECL_D(DA);
-        FP_DECL_EX;
-        __s32 si;
-        int mode;
-
-       if (mask == 0)
-               mode = fp_regs->fpc & 3;
-       else if (mask == 1)
-               mode = FP_RND_NEAREST;
-       else
-               mode = mask - 4;
-        FP_UNPACK_DP(DA, &fp_regs->fprs[ry].d);
-       FP_TO_FPINT_ROUND_D(DA);
-       FP_PACK_DP(&fp_regs->fprs[rx].d, DA);
-        return _fex;
-}
-
-/* Load floating point integer float */
-static int emu_fiebr (struct pt_regs *regs, int rx, int ry, int mask) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        FP_DECL_S(SA);
-        FP_DECL_EX;
-        __s32 si;
-        int mode;
-
-       if (mask == 0)
-               mode = fp_regs->fpc & 3;
-       else if (mask == 1)
-               mode = FP_RND_NEAREST;
-       else
-               mode = mask - 4;
-        FP_UNPACK_SP(SA, &fp_regs->fprs[ry].f);
-       FP_TO_FPINT_ROUND_S(SA);
-       FP_PACK_SP(&fp_regs->fprs[rx].f, SA);
-        return _fex;
-}
-
-/* Load lengthened double to long double */
-static int emu_lxdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_Q(QR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d);
-       FP_CONV (Q, D, 4, 2, QR, DA);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Load lengthened double to long double */
-static int emu_lxdb (struct pt_regs *regs, int rx, double *val) {
-        FP_DECL_D(DA); FP_DECL_Q(QR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, val);
-       FP_CONV (Q, D, 4, 2, QR, DA);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Load lengthened float to long double */
-static int emu_lxebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_Q(QR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f);
-       FP_CONV (Q, S, 4, 1, QR, SA);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Load lengthened float to long double */
-static int emu_lxeb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_Q(QR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, val);
-       FP_CONV (Q, S, 4, 1, QR, SA);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Load lengthened float to double */
-static int emu_ldebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_D(DR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f);
-       FP_CONV (D, S, 2, 1, DR, SA);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Load lengthened float to double */
-static int emu_ldeb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_D(DR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, val);
-       FP_CONV (D, S, 2, 1, DR, SA);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Load negative long double */
-static int emu_lnxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        if (QA_s == 0) {
-               FP_NEG_Q(QR, QA);
-               FP_PACK_QP(&cvt.ld, QR);
-               current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-               current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-       } else {
-               current->thread.fp_regs.fprs[rx].ui =
-                       current->thread.fp_regs.fprs[ry].ui;
-               current->thread.fp_regs.fprs[rx+2].ui =
-                       current->thread.fp_regs.fprs[ry+2].ui;
-       }
-       emu_set_CC_cs(regs, QR_c, QR_s);
-        return _fex;
-}
-
-/* Load negative double */
-static int emu_lndbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d);
-        if (DA_s == 0) {
-               FP_NEG_D(DR, DA);
-               FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-       } else
-               current->thread.fp_regs.fprs[rx].ui =
-                       current->thread.fp_regs.fprs[ry].ui;
-       emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Load negative float */
-static int emu_lnebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f);
-        if (SA_s == 0) {
-               FP_NEG_S(SR, SA);
-               FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-       } else
-               current->thread.fp_regs.fprs[rx].ui =
-                       current->thread.fp_regs.fprs[ry].ui;
-       emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Load positive long double */
-static int emu_lpxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        if (QA_s != 0) {
-               FP_NEG_Q(QR, QA);
-               FP_PACK_QP(&cvt.ld, QR);
-               current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-               current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-       } else{
-               current->thread.fp_regs.fprs[rx].ui =
-                       current->thread.fp_regs.fprs[ry].ui;
-               current->thread.fp_regs.fprs[rx+2].ui =
-                       current->thread.fp_regs.fprs[ry+2].ui;
-       }
-       emu_set_CC_cs(regs, QR_c, QR_s);
-        return _fex;
-}
-
-/* Load positive double */
-static int emu_lpdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d);
-        if (DA_s != 0) {
-               FP_NEG_D(DR, DA);
-               FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-       } else
-               current->thread.fp_regs.fprs[rx].ui =
-                       current->thread.fp_regs.fprs[ry].ui;
-       emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Load positive float */
-static int emu_lpebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f);
-        if (SA_s != 0) {
-               FP_NEG_S(SR, SA);
-               FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-       } else
-               current->thread.fp_regs.fprs[rx].ui =
-                       current->thread.fp_regs.fprs[ry].ui;
-       emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Load rounded long double to double */
-static int emu_ldxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_D(DR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-       FP_CONV (D, Q, 2, 4, DR, QA);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].f, DR);
-        return _fex;
-}
-
-/* Load rounded long double to float */
-static int emu_lexbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_S(SR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-       FP_CONV (S, Q, 1, 4, SR, QA);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        return _fex;
-}
-
-/* Load rounded double to float */
-static int emu_ledbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_S(SR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d);
-       FP_CONV (S, D, 1, 2, SR, DA);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        return _fex;
-}
-
-/* Multiply long double */
-static int emu_mxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[rx].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QB, &cvt.ld);
-        FP_MUL_Q(QR, QA, QB);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Multiply double */
-static int emu_mdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_MUL_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Multiply double */
-static int emu_mdb (struct pt_regs *regs, int rx, double *val) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, val);
-        FP_MUL_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Multiply double to long double */
-static int emu_mxdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR);
-       FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-       FP_CONV (Q, D, 4, 2, QA, DA);
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d);
-       FP_CONV (Q, D, 4, 2, QB, DA);
-        FP_MUL_Q(QR, QA, QB);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Multiply double to long double */
-static int emu_mxdb (struct pt_regs *regs, int rx, long double *val) {
-        FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[rx].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        FP_UNPACK_QP(QB, val);
-        FP_MUL_Q(QR, QA, QB);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        return _fex;
-}
-
-/* Multiply float */
-static int emu_meebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_MUL_S(SR, SA, SB);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        return _fex;
-}
-
-/* Multiply float */
-static int emu_meeb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, val);
-        FP_MUL_S(SR, SA, SB);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        return _fex;
-}
-
-/* Multiply float to double */
-static int emu_mdebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-       FP_CONV (D, S, 2, 1, DA, SA);
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f);
-       FP_CONV (D, S, 2, 1, DB, SA);
-        FP_MUL_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Multiply float to double */
-static int emu_mdeb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-       FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-       FP_CONV (D, S, 2, 1, DA, SA);
-        FP_UNPACK_SP(SA, val);
-       FP_CONV (D, S, 2, 1, DB, SA);
-        FP_MUL_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        return _fex;
-}
-
-/* Multiply and add double */
-static int emu_madbr (struct pt_regs *regs, int rx, int ry, int rz) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DC); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_UNPACK_DP(DC, ¤t->thread.fp_regs.fprs[rz].d);
-        FP_MUL_D(DR, DA, DB);
-        FP_ADD_D(DR, DR, DC);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rz].d, DR);
-        return _fex;
-}
-
-/* Multiply and add double */
-static int emu_madb (struct pt_regs *regs, int rx, double *val, int rz) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DC); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, val);
-        FP_UNPACK_DP(DC, ¤t->thread.fp_regs.fprs[rz].d);
-        FP_MUL_D(DR, DA, DB);
-        FP_ADD_D(DR, DR, DC);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rz].d, DR);
-        return _fex;
-}
-
-/* Multiply and add float */
-static int emu_maebr (struct pt_regs *regs, int rx, int ry, int rz) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SC); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_UNPACK_SP(SC, ¤t->thread.fp_regs.fprs[rz].f);
-        FP_MUL_S(SR, SA, SB);
-        FP_ADD_S(SR, SR, SC);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rz].f, SR);
-        return _fex;
-}
-
-/* Multiply and add float */
-static int emu_maeb (struct pt_regs *regs, int rx, float *val, int rz) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SC); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, val);
-        FP_UNPACK_SP(SC, ¤t->thread.fp_regs.fprs[rz].f);
-        FP_MUL_S(SR, SA, SB);
-        FP_ADD_S(SR, SR, SC);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rz].f, SR);
-        return _fex;
-}
-
-/* Multiply and subtract double */
-static int emu_msdbr (struct pt_regs *regs, int rx, int ry, int rz) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DC); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_UNPACK_DP(DC, ¤t->thread.fp_regs.fprs[rz].d);
-        FP_MUL_D(DR, DA, DB);
-        FP_SUB_D(DR, DR, DC);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rz].d, DR);
-        return _fex;
-}
-
-/* Multiply and subtract double */
-static int emu_msdb (struct pt_regs *regs, int rx, double *val, int rz) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DC); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, val);
-        FP_UNPACK_DP(DC, ¤t->thread.fp_regs.fprs[rz].d);
-        FP_MUL_D(DR, DA, DB);
-        FP_SUB_D(DR, DR, DC);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rz].d, DR);
-        return _fex;
-}
-
-/* Multiply and subtract float */
-static int emu_msebr (struct pt_regs *regs, int rx, int ry, int rz) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SC); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_UNPACK_SP(SC, ¤t->thread.fp_regs.fprs[rz].f);
-        FP_MUL_S(SR, SA, SB);
-        FP_SUB_S(SR, SR, SC);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rz].f, SR);
-        return _fex;
-}
-
-/* Multiply and subtract float */
-static int emu_mseb (struct pt_regs *regs, int rx, float *val, int rz) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SC); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, val);
-        FP_UNPACK_SP(SC, ¤t->thread.fp_regs.fprs[rz].f);
-        FP_MUL_S(SR, SA, SB);
-        FP_SUB_S(SR, SR, SC);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rz].f, SR);
-        return _fex;
-}
-
-/* Set floating point control word */
-static int emu_sfpc (struct pt_regs *regs, int rx, int ry) {
-        __u32 temp;
-
-        temp = regs->gprs[rx];
-        if ((temp & ~FPC_VALID_MASK) != 0)
-               return SIGILL;
-       current->thread.fp_regs.fpc = temp;
-        return 0;
-}
-
-/* Square root long double */
-static int emu_sqxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QR);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-       FP_SQRT_Q(QR, QA);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        emu_set_CC_cs(regs, QR_c, QR_s);
-        return _fex;
-}
-
-/* Square root double */
-static int emu_sqdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d);
-       FP_SQRT_D(DR, DA);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Square root double */
-static int emu_sqdb (struct pt_regs *regs, int rx, double *val) {
-        FP_DECL_D(DA); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, val);
-       FP_SQRT_D(DR, DA);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Square root float */
-static int emu_sqebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f);
-       FP_SQRT_S(SR, SA);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Square root float */
-static int emu_sqeb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, val);
-       FP_SQRT_S(SR, SA);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Subtract long double */
-static int emu_sxbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR);
-        FP_DECL_EX;
-       mathemu_ldcv cvt;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        cvt.w.high = current->thread.fp_regs.fprs[rx].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui;
-        FP_UNPACK_QP(QA, &cvt.ld);
-        cvt.w.high = current->thread.fp_regs.fprs[ry].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui;
-        FP_UNPACK_QP(QB, &cvt.ld);
-        FP_SUB_Q(QR, QA, QB);
-        FP_PACK_QP(&cvt.ld, QR);
-        current->thread.fp_regs.fprs[rx].ui = cvt.w.high;
-        current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low;
-        emu_set_CC_cs(regs, QR_c, QR_s);
-        return _fex;
-}
-
-/* Subtract double */
-static int emu_sdbr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, ¤t->thread.fp_regs.fprs[ry].d);
-        FP_SUB_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Subtract double */
-static int emu_sdb (struct pt_regs *regs, int rx, double *val) {
-        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-        FP_UNPACK_DP(DB, val);
-        FP_SUB_D(DR, DA, DB);
-       FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR);
-        emu_set_CC_cs(regs, DR_c, DR_s);
-        return _fex;
-}
-
-/* Subtract float */
-static int emu_sebr (struct pt_regs *regs, int rx, int ry) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, ¤t->thread.fp_regs.fprs[ry].f);
-        FP_SUB_S(SR, SA, SB);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Subtract float */
-static int emu_seb (struct pt_regs *regs, int rx, float *val) {
-        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
-        FP_DECL_EX;
-        int mode;
-
-       mode = current->thread.fp_regs.fpc & 3;
-        FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-        FP_UNPACK_SP(SB, val);
-        FP_SUB_S(SR, SA, SB);
-       FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR);
-        emu_set_CC_cs(regs, SR_c, SR_s);
-        return _fex;
-}
-
-/* Test data class long double */
-static int emu_tcxb (struct pt_regs *regs, int rx, long val) {
-        FP_DECL_Q(QA);
-       mathemu_ldcv cvt;
-       int bit;
-
-        cvt.w.high = current->thread.fp_regs.fprs[rx].ui;
-        cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui;
-        FP_UNPACK_RAW_QP(QA, &cvt.ld);
-       switch (QA_e) {
-       default:
-               bit = 8;                /* normalized number */
-               break;
-       case 0:
-               if (_FP_FRAC_ZEROP_4(QA))
-                       bit = 10;       /* zero */
-               else
-                       bit = 6;        /* denormalized number */
-               break;
-       case _FP_EXPMAX_Q:
-               if (_FP_FRAC_ZEROP_4(QA))
-                       bit = 4;        /* infinity */
-               else if (_FP_FRAC_HIGH_RAW_Q(QA) & _FP_QNANBIT_Q)
-                       bit = 2;        /* quiet NAN */
-               else
-                       bit = 0;        /* signaling NAN */
-               break;
-       }
-       if (!QA_s)
-               bit++;
-       emu_set_CC(regs, ((__u32) val >> bit) & 1);
-        return 0;
-}
-
-/* Test data class double */
-static int emu_tcdb (struct pt_regs *regs, int rx, long val) {
-        FP_DECL_D(DA);
-       int bit;
-
-        FP_UNPACK_RAW_DP(DA, ¤t->thread.fp_regs.fprs[rx].d);
-       switch (DA_e) {
-       default:
-               bit = 8;                /* normalized number */
-               break;
-       case 0:
-               if (_FP_FRAC_ZEROP_2(DA))
-                       bit = 10;       /* zero */
-               else
-                       bit = 6;        /* denormalized number */
-               break;
-       case _FP_EXPMAX_D:
-               if (_FP_FRAC_ZEROP_2(DA))
-                       bit = 4;        /* infinity */
-               else if (_FP_FRAC_HIGH_RAW_D(DA) & _FP_QNANBIT_D)
-                       bit = 2;        /* quiet NAN */
-               else
-                       bit = 0;        /* signaling NAN */
-               break;
-       }
-       if (!DA_s)
-               bit++;
-       emu_set_CC(regs, ((__u32) val >> bit) & 1);
-        return 0;
-}
-
-/* Test data class float */
-static int emu_tceb (struct pt_regs *regs, int rx, long val) {
-        FP_DECL_S(SA);
-       int bit;
-
-        FP_UNPACK_RAW_SP(SA, ¤t->thread.fp_regs.fprs[rx].f);
-       switch (SA_e) {
-       default:
-               bit = 8;                /* normalized number */
-               break;
-       case 0:
-               if (_FP_FRAC_ZEROP_1(SA))
-                       bit = 10;       /* zero */
-               else
-                       bit = 6;        /* denormalized number */
-               break;
-       case _FP_EXPMAX_S:
-               if (_FP_FRAC_ZEROP_1(SA))
-                       bit = 4;        /* infinity */
-               else if (_FP_FRAC_HIGH_RAW_S(SA) & _FP_QNANBIT_S)
-                       bit = 2;        /* quiet NAN */
-               else
-                       bit = 0;        /* signaling NAN */
-               break;
-       }
-       if (!SA_s)
-               bit++;
-       emu_set_CC(regs, ((__u32) val >> bit) & 1);
-        return 0;
-}
-
-static inline void emu_load_regd(int reg) {
-       if ((reg&9) != 0)       /* test if reg in {0,2,4,6} */
-                return;
-       asm volatile(           /* load reg from fp_regs.fprs[reg] */
-               "       bras    1,0f\n"
-               "       ld      0,0(%1)\n"
-               "0:     ex      %0,0(1)"
-               : /* no output */
-               : "a" (reg<<4),"a" (¤t->thread.fp_regs.fprs[reg].d)
-               : "1");
-}
-
-static inline void emu_load_rege(int reg) {
-       if ((reg&9) != 0)       /* test if reg in {0,2,4,6} */
-                return;
-       asm volatile(           /* load reg from fp_regs.fprs[reg] */
-               "       bras    1,0f\n"
-               "       le      0,0(%1)\n"
-               "0:     ex      %0,0(1)"
-               : /* no output */
-               : "a" (reg<<4), "a" (¤t->thread.fp_regs.fprs[reg].f)
-               : "1");
-}
-
-static inline void emu_store_regd(int reg) {
-       if ((reg&9) != 0)       /* test if reg in {0,2,4,6} */
-                return;
-       asm volatile(           /* store reg to fp_regs.fprs[reg] */
-               "       bras    1,0f\n"
-               "       std     0,0(%1)\n"
-               "0:     ex      %0,0(1)"
-               : /* no output */
-               : "a" (reg<<4), "a" (¤t->thread.fp_regs.fprs[reg].d)
-               : "1");
-}
-
-
-static inline void emu_store_rege(int reg) {
-       if ((reg&9) != 0)       /* test if reg in {0,2,4,6} */
-                return;
-       asm volatile(           /* store reg to fp_regs.fprs[reg] */
-               "       bras    1,0f\n"
-               "       ste     0,0(%1)\n"
-               "0:     ex      %0,0(1)"
-               : /* no output */
-               : "a" (reg<<4), "a" (¤t->thread.fp_regs.fprs[reg].f)
-               : "1");
-}
-
-int math_emu_b3(__u8 *opcode, struct pt_regs * regs) {
-        int _fex = 0;
-        static const __u8 format_table[256] = {
-                [0x00] = 0x03,[0x01] = 0x03,[0x02] = 0x03,[0x03] = 0x03,
-               [0x04] = 0x0f,[0x05] = 0x0d,[0x06] = 0x0e,[0x07] = 0x0d,
-               [0x08] = 0x03,[0x09] = 0x03,[0x0a] = 0x03,[0x0b] = 0x03,
-                [0x0c] = 0x0f,[0x0d] = 0x03,[0x0e] = 0x06,[0x0f] = 0x06,
-               [0x10] = 0x02,[0x11] = 0x02,[0x12] = 0x02,[0x13] = 0x02,
-               [0x14] = 0x03,[0x15] = 0x02,[0x16] = 0x01,[0x17] = 0x03,
-                [0x18] = 0x02,[0x19] = 0x02,[0x1a] = 0x02,[0x1b] = 0x02,
-               [0x1c] = 0x02,[0x1d] = 0x02,[0x1e] = 0x05,[0x1f] = 0x05,
-               [0x40] = 0x01,[0x41] = 0x01,[0x42] = 0x01,[0x43] = 0x01,
-                [0x44] = 0x12,[0x45] = 0x0d,[0x46] = 0x11,[0x47] = 0x04,
-               [0x48] = 0x01,[0x49] = 0x01,[0x4a] = 0x01,[0x4b] = 0x01,
-               [0x4c] = 0x01,[0x4d] = 0x01,[0x53] = 0x06,[0x57] = 0x06,
-                [0x5b] = 0x05,[0x5f] = 0x05,[0x84] = 0x13,[0x8c] = 0x13,
-               [0x94] = 0x09,[0x95] = 0x08,[0x96] = 0x07,[0x98] = 0x0c,
-               [0x99] = 0x0b,[0x9a] = 0x0a
-        };
-        static const void *jump_table[256]= {
-                [0x00] = emu_lpebr,[0x01] = emu_lnebr,[0x02] = emu_ltebr,
-                [0x03] = emu_lcebr,[0x04] = emu_ldebr,[0x05] = emu_lxdbr,
-                [0x06] = emu_lxebr,[0x07] = emu_mxdbr,[0x08] = emu_kebr,
-                [0x09] = emu_cebr, [0x0a] = emu_aebr, [0x0b] = emu_sebr,
-                [0x0c] = emu_mdebr,[0x0d] = emu_debr, [0x0e] = emu_maebr,
-                [0x0f] = emu_msebr,[0x10] = emu_lpdbr,[0x11] = emu_lndbr, 
-                [0x12] = emu_ltdbr,[0x13] = emu_lcdbr,[0x14] = emu_sqebr,
-                [0x15] = emu_sqdbr,[0x16] = emu_sqxbr,[0x17] = emu_meebr,
-                [0x18] = emu_kdbr, [0x19] = emu_cdbr, [0x1a] = emu_adbr,
-                [0x1b] = emu_sdbr, [0x1c] = emu_mdbr, [0x1d] = emu_ddbr,  
-                [0x1e] = emu_madbr,[0x1f] = emu_msdbr,[0x40] = emu_lpxbr,
-                [0x41] = emu_lnxbr,[0x42] = emu_ltxbr,[0x43] = emu_lcxbr,
-                [0x44] = emu_ledbr,[0x45] = emu_ldxbr,[0x46] = emu_lexbr,
-                [0x47] = emu_fixbr,[0x48] = emu_kxbr, [0x49] = emu_cxbr,  
-                [0x4a] = emu_axbr, [0x4b] = emu_sxbr, [0x4c] = emu_mxbr,
-                [0x4d] = emu_dxbr, [0x53] = emu_diebr,[0x57] = emu_fiebr,
-                [0x5b] = emu_didbr,[0x5f] = emu_fidbr,[0x84] = emu_sfpc,
-                [0x8c] = emu_efpc, [0x94] = emu_cefbr,[0x95] = emu_cdfbr, 
-                [0x96] = emu_cxfbr,[0x98] = emu_cfebr,[0x99] = emu_cfdbr,
-                [0x9a] = emu_cfxbr
-        };
-
-        switch (format_table[opcode[1]]) {
-        case 1: /* RRE format, long double operation */
-                if (opcode[3] & 0x22)
-                       return SIGILL;
-                emu_store_regd((opcode[3] >> 4) & 15);
-                emu_store_regd(((opcode[3] >> 4) & 15) + 2);
-                emu_store_regd(opcode[3] & 15);
-                emu_store_regd((opcode[3] & 15) + 2);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *,int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-                emu_load_regd(((opcode[3] >> 4) & 15) + 2);
-                emu_load_regd(opcode[3] & 15);
-                emu_load_regd((opcode[3] & 15) + 2);
-               break;
-        case 2: /* RRE format, double operation */
-                emu_store_regd((opcode[3] >> 4) & 15);
-                emu_store_regd(opcode[3] & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-                emu_load_regd(opcode[3] & 15);
-               break;
-        case 3: /* RRE format, float operation */
-                emu_store_rege((opcode[3] >> 4) & 15);
-                emu_store_rege(opcode[3] & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_rege((opcode[3] >> 4) & 15);
-                emu_load_rege(opcode[3] & 15);
-               break;
-        case 4: /* RRF format, long double operation */
-                if (opcode[3] & 0x22)
-                       return SIGILL;
-                emu_store_regd((opcode[3] >> 4) & 15);
-                emu_store_regd(((opcode[3] >> 4) & 15) + 2);
-                emu_store_regd(opcode[3] & 15);
-                emu_store_regd((opcode[3] & 15) + 2);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15, opcode[2] >> 4);
-                emu_load_regd((opcode[3] >> 4) & 15);
-                emu_load_regd(((opcode[3] >> 4) & 15) + 2);
-                emu_load_regd(opcode[3] & 15);
-                emu_load_regd((opcode[3] & 15) + 2);
-               break;
-        case 5: /* RRF format, double operation */
-                emu_store_regd((opcode[2] >> 4) & 15);
-                emu_store_regd((opcode[3] >> 4) & 15);
-                emu_store_regd(opcode[3] & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15, opcode[2] >> 4);
-                emu_load_regd((opcode[2] >> 4) & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-                emu_load_regd(opcode[3] & 15);
-               break;
-        case 6: /* RRF format, float operation */
-                emu_store_rege((opcode[2] >> 4) & 15);
-                emu_store_rege((opcode[3] >> 4) & 15);
-                emu_store_rege(opcode[3] & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15, opcode[2] >> 4);
-                emu_load_rege((opcode[2] >> 4) & 15);
-                emu_load_rege((opcode[3] >> 4) & 15);
-                emu_load_rege(opcode[3] & 15);
-               break;
-        case 7: /* RRE format, cxfbr instruction */
-                /* call the emulation function */
-                if (opcode[3] & 0x20)
-                       return SIGILL;
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-                emu_load_regd(((opcode[3] >> 4) & 15) + 2);
-               break;
-        case 8: /* RRE format, cdfbr instruction */
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-               break;
-        case 9: /* RRE format, cefbr instruction */
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_rege((opcode[3] >> 4) & 15);
-               break;
-        case 10: /* RRF format, cfxbr instruction */
-                if ((opcode[2] & 128) == 128 || (opcode[2] & 96) == 32)
-                       /* mask of { 2,3,8-15 } is invalid */
-                       return SIGILL;
-                if (opcode[3] & 2)
-                       return SIGILL;
-                emu_store_regd(opcode[3] & 15);
-                emu_store_regd((opcode[3] & 15) + 2);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15, opcode[2] >> 4);
-               break;
-        case 11: /* RRF format, cfdbr instruction */
-                if ((opcode[2] & 128) == 128 || (opcode[2] & 96) == 32)
-                       /* mask of { 2,3,8-15 } is invalid */
-                       return SIGILL;
-                emu_store_regd(opcode[3] & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15, opcode[2] >> 4);
-               break;
-        case 12: /* RRF format, cfebr instruction */
-                if ((opcode[2] & 128) == 128 || (opcode[2] & 96) == 32)
-                       /* mask of { 2,3,8-15 } is invalid */
-                       return SIGILL;
-                emu_store_rege(opcode[3] & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15, opcode[2] >> 4);
-               break;
-        case 13: /* RRE format, ldxbr & mdxbr instruction */
-                /* double store but long double load */
-                if (opcode[3] & 0x20)
-                       return SIGILL;
-                emu_store_regd((opcode[3] >> 4) & 15);
-                emu_store_regd(opcode[3]  & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-                emu_load_regd(((opcode[3] >> 4) & 15) + 2);
-               break;
-        case 14: /* RRE format, ldxbr & mdxbr instruction */
-                /* float store but long double load */
-                if (opcode[3] & 0x20)
-                       return SIGILL;
-                emu_store_rege((opcode[3] >> 4) & 15);
-                emu_store_rege(opcode[3]  & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-                emu_load_regd(((opcode[3] >> 4) & 15) + 2);
-               break;
-        case 15: /* RRE format, ldebr & mdebr instruction */
-                /* float store but double load */
-                emu_store_rege((opcode[3] >> 4) & 15);
-                emu_store_rege(opcode[3]  & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-               break;
-        case 16: /* RRE format, ldxbr instruction */
-                /* long double store but double load */
-                if (opcode[3] & 2)
-                       return SIGILL;
-                emu_store_regd(opcode[3] & 15);
-                emu_store_regd((opcode[3] & 15) + 2);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_regd((opcode[3] >> 4) & 15);
-                break;
-        case 17: /* RRE format, ldxbr instruction */
-                /* long double store but float load */
-                if (opcode[3] & 2)
-                       return SIGILL;
-                emu_store_regd(opcode[3] & 15);
-                emu_store_regd((opcode[3] & 15) + 2);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_rege((opcode[3] >> 4) & 15);
-                break;
-        case 18: /* RRE format, ledbr instruction */
-                /* double store but float load */
-                emu_store_regd(opcode[3] & 15);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                emu_load_rege((opcode[3] >> 4) & 15);
-                break;
-        case 19: /* RRE format, efpc & sfpc instruction */
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, int))
-                       jump_table[opcode[1]])
-                        (regs, opcode[3] >> 4, opcode[3] & 15);
-                break;
-        default: /* invalid operation */
-                return SIGILL;
-        }
-       if (_fex != 0) {
-               current->thread.fp_regs.fpc |= _fex;
-               if (current->thread.fp_regs.fpc & (_fex << 8))
-                       return SIGFPE;
-       }
-       return 0;
-}
-
-static void* calc_addr(struct pt_regs *regs, int rx, int rb, int disp)
-{
-        addr_t addr;
-
-        rx &= 15;
-        rb &= 15;
-        addr = disp & 0xfff;
-        addr += (rx != 0) ? regs->gprs[rx] : 0;  /* + index */
-        addr += (rb != 0) ? regs->gprs[rb] : 0;  /* + base  */
-        return (void*) addr;
-}
-    
-int math_emu_ed(__u8 *opcode, struct pt_regs * regs) {
-        int _fex = 0;
-
-        static const __u8 format_table[256] = {
-                [0x04] = 0x06,[0x05] = 0x05,[0x06] = 0x07,[0x07] = 0x05,
-               [0x08] = 0x02,[0x09] = 0x02,[0x0a] = 0x02,[0x0b] = 0x02,
-               [0x0c] = 0x06,[0x0d] = 0x02,[0x0e] = 0x04,[0x0f] = 0x04,
-                [0x10] = 0x08,[0x11] = 0x09,[0x12] = 0x0a,[0x14] = 0x02,
-               [0x15] = 0x01,[0x17] = 0x02,[0x18] = 0x01,[0x19] = 0x01,
-               [0x1a] = 0x01,[0x1b] = 0x01,[0x1c] = 0x01,[0x1d] = 0x01,
-                [0x1e] = 0x03,[0x1f] = 0x03,
-        };
-        static const void *jump_table[]= {
-                [0x04] = emu_ldeb,[0x05] = emu_lxdb,[0x06] = emu_lxeb,
-                [0x07] = emu_mxdb,[0x08] = emu_keb, [0x09] = emu_ceb,
-                [0x0a] = emu_aeb, [0x0b] = emu_seb, [0x0c] = emu_mdeb,
-                [0x0d] = emu_deb, [0x0e] = emu_maeb,[0x0f] = emu_mseb,
-                [0x10] = emu_tceb,[0x11] = emu_tcdb,[0x12] = emu_tcxb,
-                [0x14] = emu_sqeb,[0x15] = emu_sqdb,[0x17] = emu_meeb,
-                [0x18] = emu_kdb, [0x19] = emu_cdb, [0x1a] = emu_adb,
-                [0x1b] = emu_sdb, [0x1c] = emu_mdb, [0x1d] = emu_ddb,
-                [0x1e] = emu_madb,[0x1f] = emu_msdb
-        };
-
-        switch (format_table[opcode[5]]) {
-        case 1: /* RXE format, double constant */ {
-                __u64 *dxb, temp;
-                __u32 opc;
-
-                emu_store_regd((opcode[1] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u64 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                mathemu_copy_from_user(&temp, dxb, 8);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, double *))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, (double *) &temp);
-                emu_load_regd((opcode[1] >> 4) & 15);
-                break;
-        }
-        case 2: /* RXE format, float constant */ {
-                __u32 *dxb, temp;
-                __u32 opc;
-
-                emu_store_rege((opcode[1] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u32 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                mathemu_get_user(temp, dxb);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, float *))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, (float *) &temp);
-                emu_load_rege((opcode[1] >> 4) & 15);
-                break;
-        }
-        case 3: /* RXF format, double constant */ {
-                __u64 *dxb, temp;
-                __u32 opc;
-
-                emu_store_regd((opcode[1] >> 4) & 15);
-                emu_store_regd((opcode[4] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u64 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                mathemu_copy_from_user(&temp, dxb, 8);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, double *, int))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, (double *) &temp, opcode[4] >> 4);
-                emu_load_regd((opcode[1] >> 4) & 15);
-                break;
-        }
-        case 4: /* RXF format, float constant */ {
-                __u32 *dxb, temp;
-                __u32 opc;
-
-                emu_store_rege((opcode[1] >> 4) & 15);
-                emu_store_rege((opcode[4] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u32 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                mathemu_get_user(temp, dxb);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, float *, int))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, (float *) &temp, opcode[4] >> 4);
-                emu_load_rege((opcode[4] >> 4) & 15);
-                break;
-        }
-        case 5: /* RXE format, double constant */
-                /* store double and load long double */ 
-        {
-                __u64 *dxb, temp;
-                __u32 opc;
-                if ((opcode[1] >> 4) & 0x20)
-                       return SIGILL;
-                emu_store_regd((opcode[1] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u64 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                mathemu_copy_from_user(&temp, dxb, 8);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, double *))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, (double *) &temp);
-                emu_load_regd((opcode[1] >> 4) & 15);
-                emu_load_regd(((opcode[1] >> 4) & 15) + 2);
-                break;
-        }
-        case 6: /* RXE format, float constant */
-                /* store float and load double */ 
-        {
-                __u32 *dxb, temp;
-                __u32 opc;
-                emu_store_rege((opcode[1] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u32 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                mathemu_get_user(temp, dxb);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, float *))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, (float *) &temp);
-                emu_load_regd((opcode[1] >> 4) & 15);
-                break;
-        }
-        case 7: /* RXE format, float constant */
-                /* store float and load long double */ 
-        {
-                __u32 *dxb, temp;
-                __u32 opc;
-                if ((opcode[1] >> 4) & 0x20)
-                       return SIGILL;
-                emu_store_rege((opcode[1] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u32 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                mathemu_get_user(temp, dxb);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, float *))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, (float *) &temp);
-                emu_load_regd((opcode[1] >> 4) & 15);
-                emu_load_regd(((opcode[1] >> 4) & 15) + 2);
-                break;
-        }
-        case 8: /* RXE format, RX address used as int value */ {
-                __u64 dxb;
-                __u32 opc;
-
-                emu_store_rege((opcode[1] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u64) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, long))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, dxb);
-                break;
-        }
-        case 9: /* RXE format, RX address used as int value */ {
-                __u64 dxb;
-                __u32 opc;
-
-                emu_store_regd((opcode[1] >> 4) & 15);
-                opc = *((__u32 *) opcode);
-                dxb = (__u64) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, long))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, dxb);
-                break;
-        }
-        case 10: /* RXE format, RX address used as int value */ {
-                __u64 dxb;
-                __u32 opc;
-
-                if ((opcode[1] >> 4) & 2)
-                       return SIGILL;
-                emu_store_regd((opcode[1] >> 4) & 15);
-                emu_store_regd(((opcode[1] >> 4) & 15) + 2);
-                opc = *((__u32 *) opcode);
-                dxb = (__u64) calc_addr(regs, opc >> 16, opc >> 12, opc);
-                /* call the emulation function */
-                _fex = ((int (*)(struct pt_regs *, int, long))
-                       jump_table[opcode[5]])
-                        (regs, opcode[1] >> 4, dxb);
-                break;
-        }
-        default: /* invalid operation */
-                return SIGILL;
-        }
-       if (_fex != 0) {
-               current->thread.fp_regs.fpc |= _fex;
-               if (current->thread.fp_regs.fpc & (_fex << 8))
-                       return SIGFPE;
-       }
-       return 0;
-}
-
-/*
- * Emulate LDR Rx,Ry with Rx or Ry not in {0, 2, 4, 6}
- */
-int math_emu_ldr(__u8 *opcode) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        __u16 opc = *((__u16 *) opcode);
-
-        if ((opc & 0x90) == 0) {           /* test if rx in {0,2,4,6} */
-                /* we got an exception therefore ry can't be in {0,2,4,6} */
-               asm volatile(           /* load rx from fp_regs.fprs[ry] */
-                       "       bras    1,0f\n"
-                       "       ld      0,0(%1)\n"
-                       "0:     ex      %0,0(1)"
-                       : /* no output */
-                       : "a" (opc & 0xf0), "a" (&fp_regs->fprs[opc & 0xf].d)
-                       : "1");
-        } else if ((opc & 0x9) == 0) {     /* test if ry in {0,2,4,6} */
-               asm volatile (          /* store ry to fp_regs.fprs[rx] */
-                       "       bras    1,0f\n"
-                       "       std     0,0(%1)\n"
-                       "0:     ex      %0,0(1)"
-                       : /* no output */
-                       : "a" ((opc & 0xf) << 4),
-                         "a" (&fp_regs->fprs[(opc & 0xf0)>>4].d)
-                       : "1");
-        } else  /* move fp_regs.fprs[ry] to fp_regs.fprs[rx] */
-                fp_regs->fprs[(opc & 0xf0) >> 4] = fp_regs->fprs[opc & 0xf];
-       return 0;
-}
-
-/*
- * Emulate LER Rx,Ry with Rx or Ry not in {0, 2, 4, 6}
- */
-int math_emu_ler(__u8 *opcode) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        __u16 opc = *((__u16 *) opcode);
-
-        if ((opc & 0x90) == 0) {           /* test if rx in {0,2,4,6} */
-                /* we got an exception therefore ry can't be in {0,2,4,6} */
-               asm volatile(           /* load rx from fp_regs.fprs[ry] */
-                       "       bras    1,0f\n"
-                       "       le      0,0(%1)\n"
-                       "0:     ex      %0,0(1)"
-                       : /* no output */
-                       : "a" (opc & 0xf0), "a" (&fp_regs->fprs[opc & 0xf].f)
-                       : "1");
-        } else if ((opc & 0x9) == 0) {     /* test if ry in {0,2,4,6} */
-               asm volatile(           /* store ry to fp_regs.fprs[rx] */
-                       "       bras    1,0f\n"
-                       "       ste     0,0(%1)\n"
-                       "0:     ex      %0,0(1)"
-                       : /* no output */
-                       : "a" ((opc & 0xf) << 4),
-                         "a" (&fp_regs->fprs[(opc & 0xf0) >> 4].f)
-                       : "1");
-        } else  /* move fp_regs.fprs[ry] to fp_regs.fprs[rx] */
-                fp_regs->fprs[(opc & 0xf0) >> 4] = fp_regs->fprs[opc & 0xf];
-       return 0;
-}
-
-/*
- * Emulate LD R,D(X,B) with R not in {0, 2, 4, 6}
- */
-int math_emu_ld(__u8 *opcode, struct pt_regs * regs) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        __u32 opc = *((__u32 *) opcode);
-        __u64 *dxb;
-
-        dxb = (__u64 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-        mathemu_copy_from_user(&fp_regs->fprs[(opc >> 20) & 0xf].d, dxb, 8);
-       return 0;
-}
-
-/*
- * Emulate LE R,D(X,B) with R not in {0, 2, 4, 6}
- */
-int math_emu_le(__u8 *opcode, struct pt_regs * regs) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        __u32 opc = *((__u32 *) opcode);
-        __u32 *mem, *dxb;
-
-        dxb = (__u32 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-        mem = (__u32 *) (&fp_regs->fprs[(opc >> 20) & 0xf].f);
-        mathemu_get_user(mem[0], dxb);
-       return 0;
-}
-
-/*
- * Emulate STD R,D(X,B) with R not in {0, 2, 4, 6}
- */
-int math_emu_std(__u8 *opcode, struct pt_regs * regs) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        __u32 opc = *((__u32 *) opcode);
-        __u64 *dxb;
-
-        dxb = (__u64 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-        mathemu_copy_to_user(dxb, &fp_regs->fprs[(opc >> 20) & 0xf].d, 8);
-       return 0;
-}
-
-/*
- * Emulate STE R,D(X,B) with R not in {0, 2, 4, 6}
- */
-int math_emu_ste(__u8 *opcode, struct pt_regs * regs) {
-        s390_fp_regs *fp_regs = ¤t->thread.fp_regs;
-        __u32 opc = *((__u32 *) opcode);
-        __u32 *mem, *dxb;
-
-        dxb = (__u32 *) calc_addr(regs, opc >> 16, opc >> 12, opc);
-        mem = (__u32 *) (&fp_regs->fprs[(opc >> 20) & 0xf].f);
-        mathemu_put_user(mem[0], dxb);
-       return 0;
-}
-
-/*
- * Emulate LFPC D(B)
- */
-int math_emu_lfpc(__u8 *opcode, struct pt_regs *regs) {
-        __u32 opc = *((__u32 *) opcode);
-        __u32 *dxb, temp;
-
-        dxb= (__u32 *) calc_addr(regs, 0, opc>>12, opc);
-        mathemu_get_user(temp, dxb);
-        if ((temp & ~FPC_VALID_MASK) != 0)
-               return SIGILL;
-       current->thread.fp_regs.fpc = temp;
-        return 0;
-}
-
-/*
- * Emulate STFPC D(B)
- */
-int math_emu_stfpc(__u8 *opcode, struct pt_regs *regs) {
-        __u32 opc = *((__u32 *) opcode);
-        __u32 *dxb;
-
-        dxb= (__u32 *) calc_addr(regs, 0, opc>>12, opc);
-        mathemu_put_user(current->thread.fp_regs.fpc, dxb);
-        return 0;
-}
-
-/*
- * Emulate SRNM D(B)
- */
-int math_emu_srnm(__u8 *opcode, struct pt_regs *regs) {
-        __u32 opc = *((__u32 *) opcode);
-        __u32 temp;
-
-        temp = calc_addr(regs, 0, opc>>12, opc);
-       current->thread.fp_regs.fpc &= ~3;
-        current->thread.fp_regs.fpc |= (temp & 3);
-        return 0;
-}
-
-/* broken compiler ... */
-long long
-__negdi2 (long long u)
-{
-
-  union lll {
-    long long ll;
-    long s[2];
-  };
-
-  union lll w,uu;
-
-  uu.ll = u;
-
-  w.s[1] = -uu.s[1];
-  w.s[0] = -uu.s[0] - ((int) w.s[1] != 0);
-
-  return w.ll;
-}
 
        KERNEL_END_NR,
        VMEMMAP_NR,
        VMALLOC_NR,
-#ifdef CONFIG_64BIT
        MODULES_NR,
-#endif
 };
 
 static struct addr_marker address_markers[] = {
        [KERNEL_END_NR]   = {(unsigned long)&_end, "Kernel Image End"},
        [VMEMMAP_NR]      = {0, "vmemmap Area"},
        [VMALLOC_NR]      = {0, "vmalloc Area"},
-#ifdef CONFIG_64BIT
        [MODULES_NR]      = {0, "Modules Area"},
-#endif
        { -1, NULL }
 };
 
        }
 }
 
-#ifdef CONFIG_64BIT
-#define _PMD_PROT_MASK _SEGMENT_ENTRY_PROTECT
-#else
-#define _PMD_PROT_MASK 0
-#endif
-
 static void walk_pmd_level(struct seq_file *m, struct pg_state *st,
                           pud_t *pud, unsigned long addr)
 {
                pmd = pmd_offset(pud, addr);
                if (!pmd_none(*pmd)) {
                        if (pmd_large(*pmd)) {
-                               prot = pmd_val(*pmd) & _PMD_PROT_MASK;
+                               prot = pmd_val(*pmd) & _SEGMENT_ENTRY_PROTECT;
                                note_page(m, st, prot, 3);
                        } else
                                walk_pte_level(m, st, pmd, addr);
        }
 }
 
-#ifdef CONFIG_64BIT
-#define _PUD_PROT_MASK _REGION3_ENTRY_RO
-#else
-#define _PUD_PROT_MASK 0
-#endif
-
 static void walk_pud_level(struct seq_file *m, struct pg_state *st,
                           pgd_t *pgd, unsigned long addr)
 {
                pud = pud_offset(pgd, addr);
                if (!pud_none(*pud))
                        if (pud_large(*pud)) {
-                               prot = pud_val(*pud) & _PUD_PROT_MASK;
+                               prot = pud_val(*pud) & _REGION3_ENTRY_RO;
                                note_page(m, st, prot, 2);
                        } else
                                walk_pmd_level(m, st, pud, addr);
         * kernel ASCE. We need this to keep the page table walker functions
         * from accessing non-existent entries.
         */
-#ifdef CONFIG_32BIT
-       max_addr = 1UL << 31;
-#else
        max_addr = (S390_lowcore.kernel_asce & _REGION_ENTRY_TYPE_MASK) >> 2;
        max_addr = 1UL << (max_addr * 11 + 31);
        address_markers[MODULES_NR].start_address = MODULES_VADDR;
-#endif
        address_markers[VMEMMAP_NR].start_address = (unsigned long) vmemmap;
        address_markers[VMALLOC_NR].start_address = VMALLOC_START;
        debugfs_create_file("kernel_page_tables", 0400, NULL, NULL, &ptdump_fops);
 
        struct qrange range[6];
 };
 
-#ifdef CONFIG_64BIT
 struct qrange_old {
        unsigned int start; /* last byte type */
        unsigned int end;   /* last byte reserved */
        int segrcnt;
        struct qrange_old range[6];
 };
-#endif
 
 struct qin64 {
        char qopcode;
 static int
 dcss_set_subcodes(void)
 {
-#ifdef CONFIG_64BIT
        char *name = kmalloc(8 * sizeof(char), GFP_KERNEL | GFP_DMA);
        unsigned long rx, ry;
        int rc;
                segext_scode = DCSS_SEGEXTX;
                return 0;
        }
-#endif
        /* Diag x'64' new subcodes are not supported, set to old subcodes */
        loadshr_scode = DCSS_LOADNOLY;
        loadnsr_scode = DCSS_LOADNSR;
        rx = (unsigned long) parameter;
        ry = (unsigned long) *func;
 
-#ifdef CONFIG_64BIT
        /* 64-bit Diag x'64' new subcode, keep in 64-bit addressing mode */
        if (*func > DCSS_SEGEXT)
                asm volatile(
                        "       ipm     %2\n"
                        "       srl     %2,28\n"
                        : "+d" (rx), "+d" (ry), "=d" (rc) : : "cc");
-#else
-       asm volatile(
-               "       diag    %0,%1,0x64\n"
-               "       ipm     %2\n"
-               "       srl     %2,28\n"
-               : "+d" (rx), "+d" (ry), "=d" (rc) : : "cc");
-#endif
        *ret1 = rx;
        *ret2 = ry;
        return rc;
                goto out_free;
        }
 
-#ifdef CONFIG_64BIT
        /* Only old format of output area of Diagnose x'64' is supported,
           copy data for the new format. */
        if (segext_scode == DCSS_SEGEXT) {
                }
                kfree(qout_old);
        }
-#endif
        if (qout->segcnt > 6) {
                rc = -EOPNOTSUPP;
                goto out_free;
 
 #include <asm/facility.h>
 #include "../kernel/entry.h"
 
-#ifndef CONFIG_64BIT
-#define __FAIL_ADDR_MASK 0x7ffff000
-#define __SUBCODE_MASK 0x0200
-#define __PF_RES_FIELD 0ULL
-#else /* CONFIG_64BIT */
 #define __FAIL_ADDR_MASK -4096L
 #define __SUBCODE_MASK 0x0600
 #define __PF_RES_FIELD 0x8000000000000000ULL
-#endif /* CONFIG_64BIT */
 
 #define VM_FAULT_BADCONTEXT    0x010000
 #define VM_FAULT_BADMAP                0x020000
 
 static unsigned long store_indication __read_mostly;
 
-#ifdef CONFIG_64BIT
 static int __init fault_init(void)
 {
        if (test_facility(75))
        return 0;
 }
 early_initcall(fault_init);
-#endif
 
 static inline int notify_page_fault(struct pt_regs *regs)
 {
        return probe_kernel_address((unsigned long *)p, dummy);
 }
 
-#ifdef CONFIG_64BIT
 static void dump_pagetable(unsigned long asce, unsigned long address)
 {
        unsigned long *table = __va(asce & PAGE_MASK);
        pr_cont("BAD\n");
 }
 
-#else /* CONFIG_64BIT */
-
-static void dump_pagetable(unsigned long asce, unsigned long address)
-{
-       unsigned long *table = __va(asce & PAGE_MASK);
-
-       pr_alert("AS:%08lx ", asce);
-       table = table + ((address >> 20) & 0x7ff);
-       if (bad_address(table))
-               goto bad;
-       pr_cont("S:%08lx ", *table);
-       if (*table & _SEGMENT_ENTRY_INVALID)
-               goto out;
-       table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN);
-       table = table + ((address >> 12) & 0xff);
-       if (bad_address(table))
-               goto bad;
-       pr_cont("P:%08lx ", *table);
-out:
-       pr_cont("\n");
-       return;
-bad:
-       pr_cont("BAD\n");
-}
-
-#endif /* CONFIG_64BIT */
-
 static void dump_fault_info(struct pt_regs *regs)
 {
        unsigned long asce;
 
        pmd_t *pmdp, pmd;
 
        pmdp = (pmd_t *) pudp;
-#ifdef CONFIG_64BIT
        if ((pud_val(pud) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
                pmdp = (pmd_t *) pud_deref(pud);
        pmdp += pmd_index(addr);
-#endif
        do {
                pmd = *pmdp;
                barrier();
        pud_t *pudp, pud;
 
        pudp = (pud_t *) pgdp;
-#ifdef CONFIG_64BIT
        if ((pgd_val(pgd) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R2)
                pudp = (pud_t *) pgd_deref(pgd);
        pudp += pud_index(addr);
-#endif
        do {
                pud = *pudp;
                barrier();
 
        unsigned long pgd_type, asce_bits;
 
        init_mm.pgd = swapper_pg_dir;
-#ifdef CONFIG_64BIT
        if (VMALLOC_END > (1UL << 42)) {
                asce_bits = _ASCE_TYPE_REGION2 | _ASCE_TABLE_LENGTH;
                pgd_type = _REGION2_ENTRY_EMPTY;
                asce_bits = _ASCE_TYPE_REGION3 | _ASCE_TABLE_LENGTH;
                pgd_type = _REGION3_ENTRY_EMPTY;
        }
-#else
-       asce_bits = _ASCE_TABLE_LENGTH;
-       pgd_type = _SEGMENT_ENTRY_EMPTY;
-#endif
        S390_lowcore.kernel_asce = (__pa(init_mm.pgd) & PAGE_MASK) | asce_bits;
        clear_table((unsigned long *) init_mm.pgd, pgd_type,
                    sizeof(unsigned long)*2048);
 
        memsize = rzm * rnmax;
        if (!rzm)
                rzm = 1ULL << 17;
-       if (IS_ENABLED(CONFIG_32BIT)) {
-               rzm = min(ADDR2G, rzm);
-               memsize = min(ADDR2G, memsize);
-       }
        max_physmem_end = memsize;
        addr = 0;
        /* keep memblock lists close to the kernel */
 
        return base + mmap_rnd();
 }
 
-#ifndef CONFIG_64BIT
-
-/*
- * This function, called very early during the creation of a new
- * process VM image, sets up which VM layout function to use:
- */
-void arch_pick_mmap_layout(struct mm_struct *mm)
-{
-       /*
-        * Fall back to the standard layout if the personality
-        * bit is set, or if the expected stack growth is unlimited:
-        */
-       if (mmap_is_legacy()) {
-               mm->mmap_base = mmap_base_legacy();
-               mm->get_unmapped_area = arch_get_unmapped_area;
-       } else {
-               mm->mmap_base = mmap_base();
-               mm->get_unmapped_area = arch_get_unmapped_area_topdown;
-       }
-}
-
-#else
-
 int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags)
 {
        if (is_compat_task() || (TASK_SIZE >= (1UL << 53)))
        return 0;
 }
 early_initcall(setup_mmap_rnd);
-
-#endif
 
 {
        int i;
 
-       if (test_facility(13) && IS_ENABLED(CONFIG_64BIT)) {
+       if (test_facility(13)) {
                __ptep_ipte_range(address, nr - 1, pte);
                return;
        }
 
 #include <asm/tlbflush.h>
 #include <asm/mmu_context.h>
 
-#ifndef CONFIG_64BIT
-#define ALLOC_ORDER    1
-#define FRAG_MASK      0x0f
-#else
 #define ALLOC_ORDER    2
 #define FRAG_MASK      0x03
-#endif
-
 
 unsigned long *crst_table_alloc(struct mm_struct *mm)
 {
        free_pages((unsigned long) table, ALLOC_ORDER);
 }
 
-#ifdef CONFIG_64BIT
 static void __crst_table_upgrade(void *arg)
 {
        struct mm_struct *mm = arg;
        if (current->active_mm == mm)
                set_user_asce(mm);
 }
-#endif
 
 #ifdef CONFIG_PGSTE
 
 
 {
        pud_t *pud = NULL;
 
-#ifdef CONFIG_64BIT
        pud = vmem_alloc_pages(2);
        if (!pud)
                return NULL;
        clear_table((unsigned long *) pud, _REGION3_ENTRY_EMPTY, PAGE_SIZE * 4);
-#endif
        return pud;
 }
 
 {
        pmd_t *pmd = NULL;
 
-#ifdef CONFIG_64BIT
        pmd = vmem_alloc_pages(2);
        if (!pmd)
                return NULL;
        clear_table((unsigned long *) pmd, _SEGMENT_ENTRY_EMPTY, PAGE_SIZE * 4);
-#endif
        return pmd;
 }
 
                        pgd_populate(&init_mm, pg_dir, pu_dir);
                }
                pu_dir = pud_offset(pg_dir, address);
-#if defined(CONFIG_64BIT) && !defined(CONFIG_DEBUG_PAGEALLOC)
+#ifndef CONFIG_DEBUG_PAGEALLOC
                if (MACHINE_HAS_EDAT2 && pud_none(*pu_dir) && address &&
                    !(address & ~PUD_MASK) && (address + PUD_SIZE <= end)) {
                        pud_val(*pu_dir) = __pa(address) |
                        pud_populate(&init_mm, pu_dir, pm_dir);
                }
                pm_dir = pmd_offset(pu_dir, address);
-#if defined(CONFIG_64BIT) && !defined(CONFIG_DEBUG_PAGEALLOC)
+#ifndef CONFIG_DEBUG_PAGEALLOC
                if (MACHINE_HAS_EDAT1 && pmd_none(*pm_dir) && address &&
                    !(address & ~PMD_MASK) && (address + PMD_SIZE <= end)) {
                        pmd_val(*pm_dir) = __pa(address) |
 
                pm_dir = pmd_offset(pu_dir, address);
                if (pmd_none(*pm_dir)) {
-#ifdef CONFIG_64BIT
                        /* Use 1MB frames for vmemmap if available. We always
                         * use large frames even if they are only partially
                         * used.
                                address = (address + PMD_SIZE) & PMD_MASK;
                                continue;
                        }
-#endif
                        pt_dir = vmem_pte_alloc(address);
                        if (!pt_dir)
                                goto out;
 
                timer_int.o )
 
 oprofile-y :=  $(DRIVER_OBJS) init.o backtrace.o
-oprofile-$(CONFIG_64BIT)       += hwsampler.o
+oprofile-y +=  hwsampler.o
 
 
 extern void s390_backtrace(struct pt_regs * const regs, unsigned int depth);
 
-#ifdef CONFIG_64BIT
-
 #include "hwsampler.h"
 #include "op_counter.h"
 
        hwsampler_shutdown();
 }
 
-#endif /* CONFIG_64BIT */
-
 int __init oprofile_arch_init(struct oprofile_operations *ops)
 {
        ops->backtrace = s390_backtrace;
 
-#ifdef CONFIG_64BIT
-
        /*
         * -ENODEV is not reported to the caller.  The module itself
          * will use the timer mode sampling as fallback and this is
        hwsampler_available = oprofile_hwsampler_init(ops) == 0;
 
        return 0;
-#else
-       return -ENODEV;
-#endif
 }
 
 void oprofile_arch_exit(void)
 {
-#ifdef CONFIG_64BIT
        oprofile_hwsampler_exit();
-#endif
 }
 
  */
 void dasd_kfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device)
 {
-#ifdef CONFIG_64BIT
        struct ccw1 *ccw;
 
        /* Clear any idals used for the request. */
        do {
                clear_normalized_cda(ccw);
        } while (ccw++->flags & (CCW_FLAG_CC | CCW_FLAG_DC));
-#endif
        kfree(cqr->cpaddr);
        kfree(cqr->data);
        kfree(cqr);
 
        u8 rdev_features;
 } __attribute__ ((packed, aligned(4)));
 
-
-#ifdef CONFIG_64BIT
 #define DASD_DIAG_FLAGA_DEFAULT                DASD_DIAG_FLAGA_FORMAT_64BIT
 
 typedef u64 blocknum_t;
        struct dasd_diag_bio *bio_list;
        u8  spare4[8];
 } __attribute__ ((packed, aligned(8)));
-#else /* CONFIG_64BIT */
-#define DASD_DIAG_FLAGA_DEFAULT                0x0
-
-typedef u32 blocknum_t;
-typedef s32 sblocknum_t;
-
-struct dasd_diag_bio {
-       u8 type;
-       u8 status;
-       u16 spare1;
-       blocknum_t block_number;
-       u32 alet;
-       void *buffer;
-} __attribute__ ((packed, aligned(8)));
-
-struct dasd_diag_init_io {
-       u16 dev_nr;
-       u8 flaga;
-       u8 spare1[21];
-       u32 block_size;
-       blocknum_t offset;
-       sblocknum_t start_block;
-       blocknum_t end_block;
-       u8 spare2[24];
-} __attribute__ ((packed, aligned(8)));
-
-struct dasd_diag_rw_io {
-       u16 dev_nr;
-       u8 flaga;
-       u8 spare1[21];
-       u8 key;
-       u8 flags;
-       u8 spare2[2];
-       u32 block_count;
-       u32 alet;
-       struct dasd_diag_bio *bio_list;
-       u32 interrupt_params;
-       u8 spare3[20];
-} __attribute__ ((packed, aligned(8)));
-#endif /* CONFIG_64BIT */
 
 
 static u32 get_fcx_max_data(struct dasd_device *device)
 {
-#if defined(CONFIG_64BIT)
        int tpm, mdc;
        int fcx_in_css, fcx_in_gneq, fcx_in_features;
        struct dasd_eckd_private *private;
                return 0;
        } else
                return mdc * FCX_MAX_DATA_FACTOR;
-#else
-       return 0;
-#endif
 }
 
 /*
                        /* Eckd can only do full blocks. */
                        return ERR_PTR(-EINVAL);
                count += bv.bv_len >> (block->s2b_shift + 9);
-#if defined(CONFIG_64BIT)
                if (idal_is_needed (page_address(bv.bv_page), bv.bv_len))
                        cidaw += bv.bv_len >> (block->s2b_shift + 9);
-#endif
        }
        /* Paranoia. */
        if (count != last_rec - first_rec + 1)
 
                        /* Fba can only do full blocks. */
                        return ERR_PTR(-EINVAL);
                count += bv.bv_len >> (block->s2b_shift + 9);
-#if defined(CONFIG_64BIT)
                if (idal_is_needed (page_address(bv.bv_page), bv.bv_len))
                        cidaw += bv.bv_len / blksize;
-#endif
        }
        /* Paranoia. */
        if (count != last_rec - first_rec + 1)
 
 config HMC_DRV
        def_tristate m
        prompt "Support for file transfers from HMC drive CD/DVD-ROM"
-       depends on S390 && 64BIT
+       depends on S390
        select CRC16
        help
          This option enables support for file transfers from a Hardware
 
        sccb.evbuf.event_qual = SDIAS_EQ_STORE_DATA;
        sccb.evbuf.data_id = SDIAS_DI_FCP_DUMP;
        sccb.evbuf.event_id = 4712;
-#ifdef CONFIG_64BIT
        sccb.evbuf.asa_size = SDIAS_ASA_SIZE_64;
-#else
-       sccb.evbuf.asa_size = SDIAS_ASA_SIZE_32;
-#endif
        sccb.evbuf.event_status = 0;
        sccb.evbuf.blk_cnt = nr_blks;
        sccb.evbuf.asa = (unsigned long)dest;
 
        .dump_level     = 0,
        .page_size      = PAGE_SIZE,
        .mem_start      = 0,
-#ifdef CONFIG_64BIT
        .build_arch     = DUMP_ARCH_S390X,
-#else
-       .build_arch     = DUMP_ARCH_S390,
-#endif
 };
 
 /*
        .llseek         = no_llseek,
 };
 
-#ifdef CONFIG_32BIT
-
-static void __init set_lc_mask(struct save_area *map)
-{
-       memset(&map->ext_save, 0xff, sizeof(map->ext_save));
-       memset(&map->timer, 0xff, sizeof(map->timer));
-       memset(&map->clk_cmp, 0xff, sizeof(map->clk_cmp));
-       memset(&map->psw, 0xff, sizeof(map->psw));
-       memset(&map->pref_reg, 0xff, sizeof(map->pref_reg));
-       memset(&map->acc_regs, 0xff, sizeof(map->acc_regs));
-       memset(&map->fp_regs, 0xff, sizeof(map->fp_regs));
-       memset(&map->gp_regs, 0xff, sizeof(map->gp_regs));
-       memset(&map->ctrl_regs, 0xff, sizeof(map->ctrl_regs));
-}
-
-#else /* CONFIG_32BIT */
-
 static void __init set_lc_mask(struct save_area *map)
 {
        memset(&map->fp_regs, 0xff, sizeof(map->fp_regs));
        memset(&map->ctrl_regs, 0xff, sizeof(map->ctrl_regs));
 }
 
-#endif /* CONFIG_32BIT */
-
 /*
  * Initialize dump globals for a given architecture
  */
        if (rc)
                goto fail;
 
-#ifdef CONFIG_64BIT
        if (arch == ARCH_S390) {
                pr_alert("The 64-bit dump tool cannot be used for a "
                         "32-bit system\n");
                rc = -EINVAL;
                goto fail;
        }
-#else /* CONFIG_64BIT */
-       if (arch == ARCH_S390X) {
-               pr_alert("The 32-bit dump tool cannot be used for a "
-                        "64-bit system\n");
-               rc = -EINVAL;
-               goto fail;
-       }
-#endif /* CONFIG_64BIT */
 
        rc = get_mem_info(&mem_size, &mem_end);
        if (rc)
 
        orb->cmd.spnd = priv->options.suspend;
        orb->cmd.ssic = priv->options.suspend && priv->options.inter;
        orb->cmd.lpm = (lpm != 0) ? lpm : sch->lpm;
-#ifdef CONFIG_64BIT
        /*
         * for 64 bit we always support 64 bit IDAWs with 4k page size only
         */
        orb->cmd.c64 = 1;
        orb->cmd.i2k = 0;
-#endif
        orb->cmd.key = key >> 4;
        /* issue "Start Subchannel" */
        orb->cmd.cpa = (__u32) __pa(cpa);
 
 #define QDIO_SIGA_WRITEQ       0x04
 #define QDIO_SIGA_QEBSM_FLAG   0x80
 
-#ifdef CONFIG_64BIT
 static inline int do_sqbs(u64 token, unsigned char state, int queue,
                          int *start, int *count)
 {
 
        return (_ccq >> 32) & 0xff;
 }
-#else
-static inline int do_sqbs(u64 token, unsigned char state, int queue,
-                         int *start, int *count) { return 0; }
-static inline int do_eqbs(u64 token, unsigned char *state, int queue,
-                         int *start, int *count, int ack) { return 0; }
-#endif /* CONFIG_64BIT */
 
 struct qdio_irq;
 
 
  */
 static inline int qebsm_possible(void)
 {
-#ifdef CONFIG_64BIT
        return css_general_characteristics.qebsm;
-#endif
-       return 0;
 }
 
 /*
 
  *
  * Returns 1 if AP configuration information is available.
  */
-#ifdef CONFIG_64BIT
 static int ap_configuration_available(void)
 {
        return test_facility(2) && test_facility(12);
 }
-#endif
 
 /**
  * ap_test_queue(): Test adjunct processor queue.
        return reg1;
 }
 
-#ifdef CONFIG_64BIT
 /**
  * ap_queue_interruption_control(): Enable interruption for a specific AP.
  * @qid: The AP queue number
                : "cc" );
        return reg1_out;
 }
-#endif
 
-#ifdef CONFIG_64BIT
 static inline struct ap_queue_status
 __ap_query_functions(ap_qid_t qid, unsigned int *functions)
 {
        *functions = (unsigned int)(reg2 >> 32);
        return reg1;
 }
-#endif
 
-#ifdef CONFIG_64BIT
 static inline int __ap_query_configuration(struct ap_config_info *config)
 {
        register unsigned long reg0 asm ("0") = 0x04000000UL;
 
        return reg1;
 }
-#endif
 
 /**
  * ap_query_functions(): Query supported functions.
  */
 static int ap_query_functions(ap_qid_t qid, unsigned int *functions)
 {
-#ifdef CONFIG_64BIT
        struct ap_queue_status status;
        int i;
        status = __ap_query_functions(qid, functions);
                }
        }
        return -EBUSY;
-#else
-       return -EINVAL;
-#endif
 }
 
 /**
  */
 static int ap_queue_enable_interruption(ap_qid_t qid, void *ind)
 {
-#ifdef CONFIG_64BIT
        struct ap_queue_status status;
        int t_depth, t_device_type, rc, i;
 
                }
        }
        return rc;
-#else
-       return -EINVAL;
-#endif
 }
 
 /**
  */
 static void ap_query_configuration(void)
 {
-#ifdef CONFIG_64BIT
        if (ap_configuration_available()) {
                if (!ap_configuration)
                        ap_configuration =
                        __ap_query_configuration(ap_configuration);
        } else
                ap_configuration = NULL;
-#else
-       ap_configuration = NULL;
-#endif
 }
 
 /**
 
        __u32   ct, sw, rm, dup;
        char    *ptr, *rptr;
        char    tbuf[82], tdup[82];
-       #ifdef CONFIG_64BIT
        char    addr[22];
-       #else
-       char    addr[12];
-       #endif
        char    boff[12];
        char    bhex[82], duphex[82];
        char    basc[40];
 
        for (ct = 0; ct < len; ct++, ptr++, rptr++) {
                if (sw == 0) {
-                       #ifdef CONFIG_64BIT
                        sprintf(addr, "%16.16llx", (__u64)rptr);
-                       #else
-                       sprintf(addr, "%8.8X", (__u32)rptr);
-                       #endif
 
                        sprintf(boff, "%4.4X", (__u32)ct);
                        bhex[0] = '\0';
                if (sw == 8)
                        strcat(bhex, "  ");
 
-               #if CONFIG_64BIT
                sprintf(tbuf, "%2.2llX", (__u64)*ptr);
-               #else
-               sprintf(tbuf, "%2.2X", (__u32)*ptr);
-               #endif
 
                tbuf[2] = '\0';
                strcat(bhex, tbuf);