Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Martin Schwidefsky: "The major change in this merge is the removal of the support for 31-bit kernels. Naturally 31-bit user space will continue to work via the compat layer. And then some cleanup, some improvements and bug fixes" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (23 commits) s390/smp: wait until secondaries are active & online s390/hibernate: fix save and restore of kernel text section s390/cacheinfo: add missing facility check s390/syscalls: simplify syscall_get_arch() s390/irq: enforce correct irqclass_sub_desc array size s390: remove "64" suffix from mem64.S and swsusp_asm64.S s390/ipl: cleanup macro usage s390/ipl: cleanup shutdown_action attributes s390/ipl: cleanup bin attr usage s390/uprobes: fix address space annotation s390: add missing arch_release_task_struct() declaration s390: make couple of functions and variables static s390/maccess: improve s390_kernel_write() s390/maccess: remove potentially broken probe_kernel_write() s390/watchdog: support for KVM hypervisors and delete pr_info messages s390/watchdog: enable KEEPALIVE for /dev/watchdog s390/dasd: remove setting of scheduler from driver s390/traps: panic() instead of die() on translation exception s390: remove test_facility(2) (== z/Architecture mode active) checks s390/cmpxchg: simplify cmpxchg_double ...
This commit is contained in:
Коммит
bdfa54dfd9
|
@ -4,6 +4,5 @@ obj-$(CONFIG_KVM) += kvm/
|
|||
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/
|
||||
|
|
|
@ -35,7 +35,7 @@ config GENERIC_BUG_RELATIVE_POINTERS
|
|||
def_bool y
|
||||
|
||||
config ARCH_DMA_ADDR_T_64BIT
|
||||
def_bool 64BIT
|
||||
def_bool y
|
||||
|
||||
config GENERIC_LOCKBREAK
|
||||
def_bool y if SMP && PREEMPT
|
||||
|
@ -59,7 +59,7 @@ config PCI_QUIRKS
|
|||
def_bool n
|
||||
|
||||
config ARCH_SUPPORTS_UPROBES
|
||||
def_bool 64BIT
|
||||
def_bool y
|
||||
|
||||
config S390
|
||||
def_bool y
|
||||
|
@ -111,19 +111,19 @@ config S390
|
|||
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
|
||||
|
@ -133,7 +133,7 @@ config S390
|
|||
select HAVE_KERNEL_XZ
|
||||
select HAVE_KPROBES
|
||||
select HAVE_KRETPROBES
|
||||
select HAVE_KVM if 64BIT
|
||||
select HAVE_KVM
|
||||
select HAVE_LIVEPATCH
|
||||
select HAVE_MEMBLOCK
|
||||
select HAVE_MEMBLOCK_NODE_MAP
|
||||
|
@ -143,7 +143,6 @@ config S390
|
|||
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
|
||||
|
@ -199,18 +198,11 @@ config HAVE_MARCH_Z13_FEATURES
|
|||
|
||||
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
|
||||
|
@ -218,7 +210,7 @@ config MARCH_Z900
|
|||
|
||||
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
|
||||
|
@ -226,7 +218,7 @@ config MARCH_Z990
|
|||
|
||||
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
|
||||
|
@ -234,7 +226,7 @@ config MARCH_Z9_109
|
|||
|
||||
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
|
||||
|
@ -242,7 +234,7 @@ config MARCH_Z10
|
|||
|
||||
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
|
||||
|
@ -250,7 +242,7 @@ config MARCH_Z196
|
|||
|
||||
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
|
||||
|
@ -258,7 +250,7 @@ config MARCH_ZEC12
|
|||
|
||||
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
|
||||
|
@ -266,9 +258,6 @@ config MARCH_Z13
|
|||
|
||||
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
|
||||
|
||||
|
@ -307,9 +296,6 @@ config 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"
|
||||
|
||||
|
@ -335,18 +321,10 @@ endchoice
|
|||
|
||||
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
|
||||
|
@ -385,8 +363,7 @@ config NR_CPUS
|
|||
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
|
||||
|
@ -427,15 +404,6 @@ config SCHED_TOPOLOGY
|
|||
|
||||
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
|
||||
|
@ -446,7 +414,6 @@ config ARCH_SPARSEMEM_ENABLE
|
|||
def_bool y
|
||||
select SPARSEMEM_VMEMMAP_ENABLE
|
||||
select SPARSEMEM_VMEMMAP
|
||||
select SPARSEMEM_STATIC if !64BIT
|
||||
|
||||
config ARCH_SPARSEMEM_DEFAULT
|
||||
def_bool y
|
||||
|
@ -462,7 +429,6 @@ config ARCH_ENABLE_MEMORY_HOTREMOVE
|
|||
|
||||
config ARCH_ENABLE_SPLIT_PMD_PTLOCK
|
||||
def_bool y
|
||||
depends on 64BIT
|
||||
|
||||
config FORCE_MAX_ZONEORDER
|
||||
int
|
||||
|
@ -537,7 +503,6 @@ config QDIO
|
|||
|
||||
menuconfig PCI
|
||||
bool "PCI support"
|
||||
depends on 64BIT
|
||||
select HAVE_DMA_ATTRS
|
||||
select PCI_MSI
|
||||
help
|
||||
|
@ -607,7 +572,6 @@ config CHSC_SCH
|
|||
|
||||
config SCM_BUS
|
||||
def_bool y
|
||||
depends on 64BIT
|
||||
prompt "SCM bus driver"
|
||||
help
|
||||
Bus driver for Storage Class Memory.
|
||||
|
@ -629,7 +593,7 @@ menu "Dump support"
|
|||
|
||||
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.
|
||||
|
@ -668,7 +632,7 @@ endmenu
|
|||
menu "Power Management"
|
||||
|
||||
config ARCH_HIBERNATION_POSSIBLE
|
||||
def_bool y if 64BIT
|
||||
def_bool y
|
||||
|
||||
source "kernel/power/Kconfig"
|
||||
|
||||
|
@ -819,7 +783,6 @@ source "arch/s390/kvm/Kconfig"
|
|||
config S390_GUEST
|
||||
def_bool y
|
||||
prompt "s390 support for virtio devices"
|
||||
depends on 64BIT
|
||||
select TTY
|
||||
select VIRTUALIZATION
|
||||
select VIRTIO
|
||||
|
|
|
@ -13,15 +13,6 @@
|
|||
# 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
|
||||
|
@ -31,11 +22,9 @@ KBUILD_AFLAGS += -m64
|
|||
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
|
||||
|
@ -47,7 +36,6 @@ mflags-$(CONFIG_MARCH_Z13) := -march=z13
|
|||
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
|
||||
|
@ -104,7 +92,7 @@ KBUILD_AFLAGS += $(aflags-y)
|
|||
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/
|
||||
|
@ -129,9 +117,7 @@ zfcpdump:
|
|||
$(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:
|
||||
|
|
|
@ -4,13 +4,11 @@
|
|||
# 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 head.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)
|
||||
|
@ -19,7 +17,7 @@ KBUILD_CFLAGS += $(call cc-option,-ffreestanding)
|
|||
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)/head.o $(obj)/misc.o $(obj)/piggy.o
|
||||
|
||||
LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup -T
|
||||
$(obj)/vmlinux: $(obj)/vmlinux.lds $(OBJECTS)
|
||||
|
@ -34,8 +32,8 @@ quiet_cmd_sizes = GEN $@
|
|||
$(obj)/sizes.h: vmlinux
|
||||
$(call if_changed,sizes)
|
||||
|
||||
AFLAGS_head$(BITS).o += -I$(obj)
|
||||
$(obj)/head$(BITS).o: $(obj)/sizes.h
|
||||
AFLAGS_head.o += -I$(obj)
|
||||
$(obj)/head.o: $(obj)/sizes.h
|
||||
|
||||
CFLAGS_misc.o += -I$(obj)
|
||||
$(obj)/misc.o: $(obj)/sizes.h
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
/*
|
||||
* 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
|
|
@ -1,12 +1,7 @@
|
|||
#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)
|
||||
|
||||
|
|
|
@ -369,14 +369,10 @@ static inline int crypt_s390_func_available(int func,
|
|||
|
||||
if (facility_mask & CRYPT_S390_MSA && !test_facility(17))
|
||||
return 0;
|
||||
|
||||
if (facility_mask & CRYPT_S390_MSA3 &&
|
||||
(!test_facility(2) || !test_facility(76)))
|
||||
if (facility_mask & CRYPT_S390_MSA3 && !test_facility(76))
|
||||
return 0;
|
||||
if (facility_mask & CRYPT_S390_MSA4 &&
|
||||
(!test_facility(2) || !test_facility(77)))
|
||||
if (facility_mask & CRYPT_S390_MSA4 && !test_facility(77))
|
||||
return 0;
|
||||
|
||||
switch (func & CRYPT_S390_OP_MASK) {
|
||||
case CRYPT_S390_KM:
|
||||
ret = crypt_s390_km(KM_QUERY, &status, NULL, NULL, 0);
|
||||
|
|
|
@ -19,13 +19,9 @@
|
|||
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");
|
||||
|
|
|
@ -9,28 +9,6 @@
|
|||
|
||||
#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
|
||||
|
@ -51,8 +29,6 @@ struct appldata_parameter_list {
|
|||
u64 buffer_addr;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
struct appldata_product_id {
|
||||
char prod_nr[7]; /* product number */
|
||||
u16 prod_fn; /* product function */
|
||||
|
|
|
@ -160,8 +160,6 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
|
|||
|
||||
#define ATOMIC64_INIT(i) { (i) }
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
|
||||
#define __ATOMIC64_NO_BARRIER "\n"
|
||||
|
||||
#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
|
||||
|
@ -274,99 +272,6 @@ static inline long long atomic64_cmpxchg(atomic64_t *v,
|
|||
|
||||
#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;
|
||||
|
|
|
@ -51,32 +51,6 @@
|
|||
|
||||
#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"
|
||||
|
@ -125,8 +99,6 @@
|
|||
|
||||
#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 *
|
||||
|
|
|
@ -80,15 +80,10 @@ extern void __cmpxchg_double_called_with_bad_pointer(void);
|
|||
({ \
|
||||
__typeof__(p1) __p1 = (p1); \
|
||||
__typeof__(p2) __p2 = (p2); \
|
||||
int __ret; \
|
||||
BUILD_BUG_ON(sizeof(*(p1)) != sizeof(long)); \
|
||||
BUILD_BUG_ON(sizeof(*(p2)) != sizeof(long)); \
|
||||
VM_BUG_ON((unsigned long)((__p1) + 1) != (unsigned long)(__p2));\
|
||||
if (sizeof(long) == 4) \
|
||||
__ret = __cmpxchg_double_4(__p1, __p2, o1, o2, n1, n2); \
|
||||
else \
|
||||
__ret = __cmpxchg_double_8(__p1, __p2, o1, o2, n1, n2); \
|
||||
__ret; \
|
||||
__cmpxchg_double_8(__p1, __p2, o1, o2, n1, n2); \
|
||||
})
|
||||
|
||||
#define system_has_cmpxchg_double() 1
|
||||
|
|
|
@ -22,15 +22,7 @@ typedef unsigned long long __nocast cputime64_t;
|
|||
|
||||
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)
|
||||
|
@ -101,17 +93,8 @@ static inline void cputime_to_timespec(const cputime_t cputime,
|
|||
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
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -129,17 +112,8 @@ static inline void cputime_to_timeval(const cputime_t cputime,
|
|||
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
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -9,20 +9,12 @@
|
|||
|
||||
#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));\
|
||||
}
|
||||
|
||||
|
@ -31,7 +23,7 @@
|
|||
\
|
||||
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)); \
|
||||
}
|
||||
|
@ -60,9 +52,7 @@ void smp_ctl_clear_bit(int cr, int bit);
|
|||
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;
|
||||
|
|
|
@ -107,11 +107,7 @@
|
|||
/*
|
||||
* 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
|
||||
|
||||
|
|
|
@ -19,11 +19,7 @@
|
|||
#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)
|
||||
|
||||
/*
|
||||
|
@ -32,11 +28,7 @@
|
|||
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
|
||||
}
|
||||
|
||||
|
||||
|
@ -77,7 +69,6 @@ static inline unsigned long *idal_create_words(unsigned long *idaws,
|
|||
static inline int
|
||||
set_normalized_cda(struct ccw1 * ccw, void *vaddr)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
unsigned int nridaws;
|
||||
unsigned long *idal;
|
||||
|
||||
|
@ -93,7 +84,6 @@ set_normalized_cda(struct ccw1 * ccw, void *vaddr)
|
|||
ccw->flags |= CCW_FLAG_IDA;
|
||||
vaddr = idal;
|
||||
}
|
||||
#endif
|
||||
ccw->cda = (__u32)(unsigned long) vaddr;
|
||||
return 0;
|
||||
}
|
||||
|
@ -104,12 +94,10 @@ set_normalized_cda(struct ccw1 * ccw, void *vaddr)
|
|||
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;
|
||||
}
|
||||
|
||||
|
@ -181,12 +169,8 @@ idal_buffer_free(struct idal_buffer *ib)
|
|||
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
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -8,14 +8,6 @@
|
|||
#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.
|
||||
|
@ -24,8 +16,8 @@ static __always_inline bool arch_static_branch(struct static_key *key)
|
|||
{
|
||||
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;
|
||||
|
|
|
@ -13,163 +13,6 @@
|
|||
#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
|
||||
|
||||
|
@ -354,8 +197,6 @@ struct _lowcore {
|
|||
__u8 vector_save_area[1024]; /* 0x1c00 */
|
||||
} __packed;
|
||||
|
||||
#endif /* CONFIG_32BIT */
|
||||
|
||||
#define S390_lowcore (*((struct _lowcore *) 0))
|
||||
|
||||
extern struct _lowcore *lowcore_ptr[];
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
#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
|
||||
|
|
|
@ -19,9 +19,7 @@ static inline int init_new_context(struct task_struct *tsk,
|
|||
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;
|
||||
|
@ -110,10 +108,8 @@ static inline void activate_mm(struct mm_struct *prev,
|
|||
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)
|
||||
|
|
|
@ -10,8 +10,6 @@
|
|||
*/
|
||||
#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
|
||||
|
@ -183,8 +181,6 @@
|
|||
#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__ */
|
||||
|
|
|
@ -9,8 +9,6 @@
|
|||
#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>
|
||||
|
@ -92,5 +90,4 @@ struct sf_raw_sample {
|
|||
int perf_reserve_sampling(void);
|
||||
void perf_release_sampling(void);
|
||||
|
||||
#endif /* CONFIG_64BIT */
|
||||
#endif /* _ASM_S390_PERF_EVENT_H */
|
||||
|
|
|
@ -33,11 +33,7 @@ static inline void clear_table(unsigned long *s, unsigned long val, size_t n)
|
|||
*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"
|
||||
|
@ -50,24 +46,6 @@ static inline void crst_table_init(unsigned long *crst, unsigned long entry)
|
|||
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))
|
||||
|
@ -119,8 +97,6 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
|
|||
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);
|
||||
|
|
|
@ -66,15 +66,9 @@ extern unsigned long zero_page_mask;
|
|||
* 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))
|
||||
|
@ -90,15 +84,8 @@ extern unsigned long zero_page_mask;
|
|||
* 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
|
||||
|
@ -127,23 +114,19 @@ extern struct page *vmemmap;
|
|||
|
||||
#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;
|
||||
}
|
||||
|
||||
|
@ -284,56 +267,6 @@ static inline int is_module_addr(void *addr)
|
|||
* 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 */
|
||||
|
@ -417,8 +350,6 @@ static inline int is_module_addr(void *addr)
|
|||
#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
|
||||
|
@ -509,19 +440,6 @@ static inline int mm_use_skey(struct mm_struct *mm)
|
|||
/*
|
||||
* 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)
|
||||
|
@ -583,8 +501,6 @@ static inline int pud_bad(pud_t pud)
|
|||
return (pud_val(pud) & mask) != 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
static inline int pmd_present(pmd_t pmd)
|
||||
{
|
||||
return pmd_val(pmd) != _SEGMENT_ENTRY_INVALID;
|
||||
|
@ -916,18 +832,14 @@ static inline int pte_unused(pte_t pte)
|
|||
|
||||
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)
|
||||
|
@ -1026,10 +938,6 @@ static inline void __ptep_ipte(unsigned long address, pte_t *ptep)
|
|||
{
|
||||
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"
|
||||
|
@ -1040,10 +948,6 @@ static inline void __ptep_ipte_local(unsigned long address, pte_t *ptep)
|
|||
{
|
||||
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"
|
||||
|
@ -1054,10 +958,6 @@ static inline void __ptep_ipte_range(unsigned long address, int nr, pte_t *ptep)
|
|||
{
|
||||
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(
|
||||
|
@ -1376,17 +1276,6 @@ static inline pte_t mk_pte(struct page *page, pgprot_t pgprot)
|
|||
#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)
|
||||
|
@ -1407,8 +1296,6 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address)
|
|||
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))
|
||||
|
@ -1729,11 +1616,9 @@ static inline int has_transparent_hugepage(void)
|
|||
* 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;
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#define _CIF_ASCE (1<<CIF_ASCE)
|
||||
#define _CIF_NOHZ_DELAY (1<<CIF_NOHZ_DELAY)
|
||||
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
@ -66,13 +65,6 @@ extern void execve_tail(void);
|
|||
/*
|
||||
* 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) ? \
|
||||
|
@ -80,15 +72,8 @@ extern void execve_tail(void);
|
|||
#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
|
||||
|
||||
|
@ -115,10 +100,8 @@ struct thread_struct {
|
|||
/* 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. */
|
||||
|
@ -181,11 +164,7 @@ struct task_struct;
|
|||
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 *);
|
||||
|
@ -229,11 +208,7 @@ static inline void psw_set_key(unsigned int key)
|
|||
*/
|
||||
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
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -247,22 +222,12 @@ static inline void __load_psw_mask (unsigned long mask)
|
|||
|
||||
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 */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -270,20 +235,12 @@ static inline void __load_psw_mask (unsigned long mask)
|
|||
*/
|
||||
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
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -305,26 +262,6 @@ static inline void __noreturn disabled_wait(unsigned long code)
|
|||
* 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 */
|
||||
|
@ -357,7 +294,6 @@ static inline void __noreturn disabled_wait(unsigned long code)
|
|||
" lpswe 0(%1)"
|
||||
: "=m" (ctl_buf)
|
||||
: "a" (&dw_psw), "a" (&ctl_buf), "m" (dw_psw) : "cc", "0", "1");
|
||||
#endif /* CONFIG_64BIT */
|
||||
while (1);
|
||||
}
|
||||
|
||||
|
|
|
@ -40,12 +40,8 @@ struct psw_bits {
|
|||
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 {
|
||||
|
|
|
@ -211,11 +211,6 @@ struct qdio_buffer_element {
|
|||
u8 scount;
|
||||
u8 sflags;
|
||||
u32 length;
|
||||
#ifdef CONFIG_32BIT
|
||||
/* private: */
|
||||
void *res2;
|
||||
/* public: */
|
||||
#endif
|
||||
void *addr;
|
||||
} __attribute__ ((packed, aligned(16)));
|
||||
|
||||
|
@ -232,11 +227,6 @@ struct qdio_buffer {
|
|||
* @sbal: absolute SBAL address
|
||||
*/
|
||||
struct sl_element {
|
||||
#ifdef CONFIG_32BIT
|
||||
/* private: */
|
||||
unsigned long reserved;
|
||||
/* public: */
|
||||
#endif
|
||||
unsigned long sbal;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
|
|
@ -72,27 +72,19 @@ static inline void store_runtime_instr_cb(struct runtime_instr_cb *cb)
|
|||
|
||||
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 */
|
||||
|
|
|
@ -39,17 +39,10 @@
|
|||
#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)
|
||||
|
||||
|
@ -61,19 +54,11 @@ static inline void __down_read(struct rw_semaphore *sem)
|
|||
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");
|
||||
|
@ -89,15 +74,6 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
|
|||
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"
|
||||
|
@ -105,7 +81,6 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
|
|||
" 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");
|
||||
|
@ -121,19 +96,11 @@ static inline void __down_write_nested(struct rw_semaphore *sem, int subclass)
|
|||
|
||||
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");
|
||||
|
@ -154,19 +121,11 @@ static inline int __down_write_trylock(struct rw_semaphore *sem)
|
|||
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)
|
||||
|
@ -182,19 +141,11 @@ static inline void __up_read(struct rw_semaphore *sem)
|
|||
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");
|
||||
|
@ -212,19 +163,11 @@ static inline void __up_write(struct rw_semaphore *sem)
|
|||
|
||||
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");
|
||||
|
@ -242,19 +185,11 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
|
|||
|
||||
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");
|
||||
|
@ -270,19 +205,11 @@ static inline void rwsem_atomic_add(long delta, struct rw_semaphore *sem)
|
|||
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");
|
||||
|
@ -296,19 +223,11 @@ static inline long rwsem_atomic_update(long delta, struct rw_semaphore *sem)
|
|||
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");
|
||||
|
|
|
@ -15,19 +15,11 @@
|
|||
#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;
|
||||
|
@ -68,26 +60,8 @@ extern void detect_memory_memblock(void);
|
|||
#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)
|
||||
|
@ -96,7 +70,6 @@ extern void detect_memory_memblock(void);
|
|||
#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=
|
||||
|
@ -135,19 +108,11 @@ extern void (*_machine_power_off)(void);
|
|||
|
||||
#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__ */
|
||||
|
|
|
@ -51,7 +51,6 @@
|
|||
wl = __wl; \
|
||||
})
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define udiv_qrnnd(q, r, n1, n0, d) \
|
||||
do { unsigned long __n; \
|
||||
unsigned int __r, __d; \
|
||||
|
@ -60,15 +59,6 @@
|
|||
(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
|
||||
|
||||
|
|
|
@ -1,16 +1,7 @@
|
|||
#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 */
|
||||
|
|
|
@ -18,9 +18,6 @@ static inline int test_fp_ctl(u32 fpc)
|
|||
u32 orig_fpc;
|
||||
int rc;
|
||||
|
||||
if (!MACHINE_HAS_IEEE)
|
||||
return 0;
|
||||
|
||||
asm volatile(
|
||||
" efpc %1\n"
|
||||
" sfpc %2\n"
|
||||
|
@ -35,9 +32,6 @@ static inline int test_fp_ctl(u32 fpc)
|
|||
|
||||
static inline void save_fp_ctl(u32 *fpc)
|
||||
{
|
||||
if (!MACHINE_HAS_IEEE)
|
||||
return;
|
||||
|
||||
asm volatile(
|
||||
" stfpc %0\n"
|
||||
: "+Q" (*fpc));
|
||||
|
@ -47,9 +41,6 @@ static inline int restore_fp_ctl(u32 *fpc)
|
|||
{
|
||||
int rc;
|
||||
|
||||
if (!MACHINE_HAS_IEEE)
|
||||
return 0;
|
||||
|
||||
asm volatile(
|
||||
" lfpc %1\n"
|
||||
"0: la %0,0\n"
|
||||
|
@ -65,8 +56,6 @@ static inline void save_fp_regs(freg_t *fprs)
|
|||
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]));
|
||||
|
@ -87,8 +76,6 @@ static inline void restore_fp_regs(freg_t *fprs)
|
|||
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]));
|
||||
|
@ -140,22 +127,18 @@ static inline void restore_vx_regs(__vector128 *vxrs)
|
|||
|
||||
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)
|
||||
|
|
|
@ -95,6 +95,6 @@ static inline int syscall_get_arch(void)
|
|||
if (test_tsk_thread_flag(current, TIF_31BIT))
|
||||
return AUDIT_ARCH_S390;
|
||||
#endif
|
||||
return sizeof(long) == 8 ? AUDIT_ARCH_S390X : AUDIT_ARCH_S390;
|
||||
return AUDIT_ARCH_S390X;
|
||||
}
|
||||
#endif /* _ASM_SYSCALL_H */
|
||||
|
|
|
@ -10,13 +10,8 @@
|
|||
/*
|
||||
* 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)
|
||||
|
@ -66,6 +61,8 @@ static inline struct thread_info *current_thread_info(void)
|
|||
return (struct thread_info *) S390_lowcore.thread_info;
|
||||
}
|
||||
|
||||
void arch_release_task_struct(struct task_struct *tsk);
|
||||
|
||||
#define THREAD_SIZE_ORDER THREAD_ORDER
|
||||
|
||||
#endif
|
||||
|
@ -99,10 +96,6 @@ static inline struct thread_info *current_thread_info(void)
|
|||
#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 */
|
||||
|
|
|
@ -118,12 +118,10 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
|
|||
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
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -136,11 +134,9 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
|||
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)
|
||||
|
|
|
@ -49,13 +49,6 @@ static inline void __tlb_flush_global(void)
|
|||
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;
|
||||
|
|
|
@ -8,21 +8,4 @@
|
|||
|
||||
#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 */
|
||||
|
|
|
@ -372,5 +372,6 @@ static inline unsigned long __must_check clear_user(void __user *to, unsigned lo
|
|||
}
|
||||
|
||||
int copy_to_user_real(void __user *dest, void *src, unsigned long count);
|
||||
void s390_kernel_write(void *dst, const void *src, size_t size);
|
||||
|
||||
#endif /* __S390_UACCESS_H */
|
||||
|
|
|
@ -9,11 +9,7 @@
|
|||
#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
|
||||
|
@ -43,10 +39,6 @@
|
|||
#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
|
||||
|
|
|
@ -42,10 +42,8 @@ struct vdso_per_cpu_data {
|
|||
|
||||
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__ */
|
||||
|
|
|
@ -26,25 +26,21 @@ CFLAGS_dumpstack.o += -fno-optimize-sibling-calls
|
|||
#
|
||||
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 += entry.o reipl.o relocate_kernel.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_SCHED_BOOK) += topology.o
|
||||
obj-$(CONFIG_HIBERNATION) += suspend.o swsusp_asm64.o
|
||||
obj-$(CONFIG_HIBERNATION) += suspend.o swsusp.o
|
||||
obj-$(CONFIG_AUDIT) += audit.o
|
||||
compat-obj-$(CONFIG_AUDIT) += compat_audit.o
|
||||
obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o
|
||||
|
@ -56,13 +52,9 @@ obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.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/
|
||||
|
|
|
@ -166,9 +166,6 @@ int main(void)
|
|||
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_VX_SAVE_AREA_ADDR, offsetof(struct _lowcore, vector_save_area_addr));
|
||||
|
@ -184,6 +181,5 @@ int main(void)
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -11,8 +11,6 @@
|
|||
#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
|
||||
|
@ -131,77 +129,3 @@ ENTRY(diag308_reset)
|
|||
.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 */
|
||||
|
|
|
@ -70,6 +70,8 @@ void show_cacheinfo(struct seq_file *m)
|
|||
struct cacheinfo *cache;
|
||||
int idx;
|
||||
|
||||
if (!test_facility(34))
|
||||
return;
|
||||
get_online_cpus();
|
||||
this_cpu_ci = get_cpu_cacheinfo(cpumask_any(cpu_online_mask));
|
||||
for (idx = 0; idx < this_cpu_ci->num_leaves; idx++) {
|
||||
|
@ -159,6 +161,8 @@ int populate_cache_leaves(unsigned int cpu)
|
|||
union cache_topology ct;
|
||||
enum cache_type ctype;
|
||||
|
||||
if (!test_facility(34))
|
||||
return -EOPNOTSUPP;
|
||||
ct.raw = ecag(EXTRACT_TOPOLOGY, 0, 0);
|
||||
for (idx = 0, level = 0; level < this_cpu_ci->num_levels &&
|
||||
idx < this_cpu_ci->num_leaves; idx++, level++) {
|
||||
|
|
|
@ -27,13 +27,9 @@ static int diag8_noresponse(int cmdlen)
|
|||
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;
|
||||
}
|
||||
|
@ -46,17 +42,11 @@ static int diag8_response(int cmdlen, char *response, int *rlen)
|
|||
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");
|
||||
|
|
|
@ -18,13 +18,9 @@ int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode)
|
|||
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)
|
||||
|
@ -52,7 +48,6 @@ int diag210(struct diag210 *addr)
|
|||
spin_lock_irqsave(&diag210_lock, flags);
|
||||
diag210_tmp = *addr;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
asm volatile(
|
||||
" lhi %0,-1\n"
|
||||
" sam31\n"
|
||||
|
@ -62,16 +57,6 @@ int diag210(struct diag210 *addr)
|
|||
"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);
|
||||
|
|
|
@ -32,12 +32,6 @@
|
|||
#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 */
|
||||
|
@ -536,12 +530,10 @@ static char *long_insn_name[] = {
|
|||
};
|
||||
|
||||
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 },
|
||||
|
@ -725,11 +717,9 @@ static struct s390_insn opcode[] = {
|
|||
};
|
||||
|
||||
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 },
|
||||
|
@ -741,7 +731,6 @@ static struct s390_insn opcode_01[] = {
|
|||
};
|
||||
|
||||
static struct s390_insn opcode_a5[] = {
|
||||
#ifdef CONFIG_64BIT
|
||||
{ "iihh", 0x00, INSTR_RI_RU },
|
||||
{ "iihl", 0x01, INSTR_RI_RU },
|
||||
{ "iilh", 0x02, INSTR_RI_RU },
|
||||
|
@ -758,12 +747,10 @@ static struct s390_insn opcode_a5[] = {
|
|||
{ "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 },
|
||||
|
@ -771,7 +758,6 @@ static struct s390_insn opcode_a7[] = {
|
|||
{ "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 },
|
||||
|
@ -785,18 +771,15 @@ static struct s390_insn opcode_a7[] = {
|
|||
};
|
||||
|
||||
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 },
|
||||
|
@ -819,7 +802,6 @@ static struct s390_insn opcode_b2[] = {
|
|||
{ "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 },
|
||||
|
@ -908,7 +890,6 @@ static struct s390_insn opcode_b2[] = {
|
|||
};
|
||||
|
||||
static struct s390_insn opcode_b3[] = {
|
||||
#ifdef CONFIG_64BIT
|
||||
{ "maylr", 0x38, INSTR_RRF_F0FF },
|
||||
{ "mylr", 0x39, INSTR_RRF_F0FF },
|
||||
{ "mayr", 0x3a, INSTR_RRF_F0FF },
|
||||
|
@ -996,7 +977,6 @@ static struct s390_insn opcode_b3[] = {
|
|||
{ "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 },
|
||||
|
@ -1091,7 +1071,6 @@ static struct s390_insn opcode_b3[] = {
|
|||
};
|
||||
|
||||
static struct s390_insn opcode_b9[] = {
|
||||
#ifdef CONFIG_64BIT
|
||||
{ "lpgr", 0x00, INSTR_RRE_RR },
|
||||
{ "lngr", 0x01, INSTR_RRE_RR },
|
||||
{ "ltgr", 0x02, INSTR_RRE_RR },
|
||||
|
@ -1204,7 +1183,6 @@ static struct s390_insn opcode_b9[] = {
|
|||
{ "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 },
|
||||
|
@ -1224,7 +1202,6 @@ static struct s390_insn opcode_b9[] = {
|
|||
};
|
||||
|
||||
static struct s390_insn opcode_c0[] = {
|
||||
#ifdef CONFIG_64BIT
|
||||
{ "lgfi", 0x01, INSTR_RIL_RI },
|
||||
{ "xihf", 0x06, INSTR_RIL_RU },
|
||||
{ "xilf", 0x07, INSTR_RIL_RU },
|
||||
|
@ -1236,7 +1213,6 @@ static struct s390_insn opcode_c0[] = {
|
|||
{ "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 },
|
||||
|
@ -1244,7 +1220,6 @@ static struct s390_insn opcode_c0[] = {
|
|||
};
|
||||
|
||||
static struct s390_insn opcode_c2[] = {
|
||||
#ifdef CONFIG_64BIT
|
||||
{ "msgfi", 0x00, INSTR_RIL_RI },
|
||||
{ "msfi", 0x01, INSTR_RIL_RI },
|
||||
{ "slgfi", 0x04, INSTR_RIL_RU },
|
||||
|
@ -1257,12 +1232,10 @@ static struct s390_insn opcode_c2[] = {
|
|||
{ "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 },
|
||||
|
@ -1274,12 +1247,10 @@ static struct s390_insn opcode_c4[] = {
|
|||
{ "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 },
|
||||
|
@ -1292,35 +1263,29 @@ static struct s390_insn opcode_c6[] = {
|
|||
{ "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 },
|
||||
|
@ -1414,7 +1379,6 @@ static struct s390_insn opcode_e3[] = {
|
|||
{ "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 },
|
||||
|
@ -1426,7 +1390,6 @@ static struct s390_insn opcode_e3[] = {
|
|||
};
|
||||
|
||||
static struct s390_insn opcode_e5[] = {
|
||||
#ifdef CONFIG_64BIT
|
||||
{ "strag", 0x02, INSTR_SSE_RDRD },
|
||||
{ "mvhhi", 0x44, INSTR_SIL_RDI },
|
||||
{ "mvghi", 0x48, INSTR_SIL_RDI },
|
||||
|
@ -1439,7 +1402,6 @@ static struct s390_insn opcode_e5[] = {
|
|||
{ { 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 },
|
||||
|
@ -1448,7 +1410,6 @@ static struct s390_insn opcode_e5[] = {
|
|||
};
|
||||
|
||||
static struct s390_insn opcode_e7[] = {
|
||||
#ifdef CONFIG_64BIT
|
||||
{ "lcbb", 0x27, INSTR_RXE_RRRDM },
|
||||
{ "vgef", 0x13, INSTR_VRV_VVRDM },
|
||||
{ "vgeg", 0x12, INSTR_VRV_VVRDM },
|
||||
|
@ -1588,11 +1549,9 @@ static struct s390_insn opcode_e7[] = {
|
|||
{ "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 },
|
||||
|
@ -1659,7 +1618,6 @@ static struct s390_insn opcode_eb[] = {
|
|||
{ "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 },
|
||||
|
@ -1667,7 +1625,6 @@ static struct s390_insn opcode_eb[] = {
|
|||
};
|
||||
|
||||
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 },
|
||||
|
@ -1701,12 +1658,10 @@ static struct s390_insn opcode_ec[] = {
|
|||
{ "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 },
|
||||
|
@ -1731,7 +1686,6 @@ static struct s390_insn opcode_ed[] = {
|
|||
{ "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 },
|
||||
|
@ -2051,7 +2005,7 @@ void show_code(struct pt_regs *regs)
|
|||
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++)
|
||||
|
|
|
@ -18,16 +18,6 @@
|
|||
#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
|
||||
|
@ -115,12 +105,12 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
|||
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);
|
||||
|
@ -128,10 +118,8 @@ void show_stack(struct task_struct *task, unsigned long *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)
|
||||
|
@ -155,16 +143,14 @@ void show_registers(struct pt_regs *regs)
|
|||
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);
|
||||
}
|
||||
|
|
|
@ -64,7 +64,6 @@ asm(
|
|||
" .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"
|
||||
|
@ -72,13 +71,6 @@ asm(
|
|||
" 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");
|
||||
|
@ -240,7 +232,6 @@ static noinline __init void detect_machine_type(void)
|
|||
|
||||
static __init void setup_topology(void)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
int max_mnest;
|
||||
|
||||
if (!test_facility(11))
|
||||
|
@ -251,7 +242,6 @@ static __init void setup_topology(void)
|
|||
break;
|
||||
}
|
||||
topology_max_mnest = max_mnest;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void early_pgm_check_handler(void)
|
||||
|
@ -290,58 +280,6 @@ static noinline __init void setup_facility_list(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;
|
||||
|
@ -360,7 +298,6 @@ static __init void detect_diag9c(void)
|
|||
|
||||
static __init void detect_diag44(void)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
int rc;
|
||||
|
||||
asm volatile(
|
||||
|
@ -371,12 +308,10 @@ static __init void detect_diag44(void)
|
|||
: "=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);
|
||||
|
@ -393,7 +328,6 @@ static __init void detect_machine_facilities(void)
|
|||
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)
|
||||
|
@ -501,9 +435,6 @@ void __init startup_init(void)
|
|||
ipl_update_parameters();
|
||||
setup_boot_command_line();
|
||||
create_kernel_nss();
|
||||
detect_mvpg();
|
||||
detect_ieee();
|
||||
detect_csp();
|
||||
detect_diag9c();
|
||||
detect_diag44();
|
||||
detect_machine_facilities();
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -130,8 +130,7 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
|
|||
/* Verify that the to be replaced code matches what we expect. */
|
||||
if (memcmp(&orig, &old, sizeof(old)))
|
||||
return -EINVAL;
|
||||
if (probe_kernel_write((void *) rec->ip, &new, sizeof(new)))
|
||||
return -EPERM;
|
||||
s390_kernel_write((void *) rec->ip, &new, sizeof(new));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -159,8 +158,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
|||
/* Verify that the to be replaced code matches what we expect. */
|
||||
if (memcmp(&orig, &old, sizeof(old)))
|
||||
return -EINVAL;
|
||||
if (probe_kernel_write((void *) rec->ip, &new, sizeof(new)))
|
||||
return -EPERM;
|
||||
s390_kernel_write((void *) rec->ip, &new, sizeof(new));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -231,14 +229,16 @@ int ftrace_enable_ftrace_graph_caller(void)
|
|||
{
|
||||
u8 op = 0x04; /* set mask field to zero */
|
||||
|
||||
return probe_kernel_write(__va(ftrace_graph_caller)+1, &op, sizeof(op));
|
||||
s390_kernel_write(__va(ftrace_graph_caller)+1, &op, sizeof(op));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ftrace_disable_ftrace_graph_caller(void)
|
||||
{
|
||||
u8 op = 0xf4; /* set mask field to all ones */
|
||||
|
||||
return probe_kernel_write(__va(ftrace_graph_caller)+1, &op, sizeof(op));
|
||||
s390_kernel_write(__va(ftrace_graph_caller)+1, &op, sizeof(op));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||
|
|
|
@ -27,11 +27,7 @@
|
|||
#include <asm/thread_info.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define ARCH_OFFSET 4
|
||||
#else
|
||||
#define ARCH_OFFSET 0
|
||||
#endif
|
||||
|
||||
__HEAD
|
||||
|
||||
|
@ -67,7 +63,6 @@ __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)
|
||||
|
@ -76,16 +71,12 @@ __HEAD
|
|||
.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:
|
||||
|
@ -93,15 +84,6 @@ __HEAD
|
|||
.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
|
||||
|
||||
|
@ -375,7 +357,6 @@ ENTRY(startup)
|
|||
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)
|
||||
|
@ -384,9 +365,6 @@ ENTRY(startup_kdump)
|
|||
.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
|
||||
|
@ -396,7 +374,6 @@ ENTRY(startup_kdump)
|
|||
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 ?
|
||||
|
@ -435,7 +412,6 @@ ENTRY(startup_kdump)
|
|||
# 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)
|
||||
|
@ -451,35 +427,10 @@ ENTRY(startup_kdump)
|
|||
#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
|
||||
|
|
|
@ -1,106 +0,0 @@
|
|||
/*
|
||||
* 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
|
|
@ -92,17 +92,9 @@ startup_kdump_relocated:
|
|||
#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 */
|
||||
|
|
|
@ -182,24 +182,21 @@ EXPORT_SYMBOL_GPL(diag308);
|
|||
|
||||
/* SYSFS */
|
||||
|
||||
#define DEFINE_IPL_ATTR_RO(_prefix, _name, _format, _value) \
|
||||
#define IPL_ATTR_SHOW_FN(_prefix, _name, _format, args...) \
|
||||
static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \
|
||||
struct kobj_attribute *attr, \
|
||||
char *page) \
|
||||
{ \
|
||||
return sprintf(page, _format, _value); \
|
||||
} \
|
||||
return snprintf(page, PAGE_SIZE, _format, ##args); \
|
||||
}
|
||||
|
||||
#define DEFINE_IPL_ATTR_RO(_prefix, _name, _format, _value) \
|
||||
IPL_ATTR_SHOW_FN(_prefix, _name, _format, _value) \
|
||||
static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
|
||||
__ATTR(_name, S_IRUGO, sys_##_prefix##_##_name##_show, NULL);
|
||||
__ATTR(_name, S_IRUGO, sys_##_prefix##_##_name##_show, NULL)
|
||||
|
||||
#define DEFINE_IPL_ATTR_RW(_prefix, _name, _fmt_out, _fmt_in, _value) \
|
||||
static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \
|
||||
struct kobj_attribute *attr, \
|
||||
char *page) \
|
||||
{ \
|
||||
return sprintf(page, _fmt_out, \
|
||||
(unsigned long long) _value); \
|
||||
} \
|
||||
IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, (unsigned long long) _value) \
|
||||
static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
|
||||
struct kobj_attribute *attr, \
|
||||
const char *buf, size_t len) \
|
||||
|
@ -213,15 +210,10 @@ static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
|
|||
static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
|
||||
__ATTR(_name,(S_IRUGO | S_IWUSR), \
|
||||
sys_##_prefix##_##_name##_show, \
|
||||
sys_##_prefix##_##_name##_store);
|
||||
sys_##_prefix##_##_name##_store)
|
||||
|
||||
#define DEFINE_IPL_ATTR_STR_RW(_prefix, _name, _fmt_out, _fmt_in, _value)\
|
||||
static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \
|
||||
struct kobj_attribute *attr, \
|
||||
char *page) \
|
||||
{ \
|
||||
return sprintf(page, _fmt_out, _value); \
|
||||
} \
|
||||
IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, _value) \
|
||||
static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
|
||||
struct kobj_attribute *attr, \
|
||||
const char *buf, size_t len) \
|
||||
|
@ -233,7 +225,7 @@ static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
|
|||
static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
|
||||
__ATTR(_name,(S_IRUGO | S_IWUSR), \
|
||||
sys_##_prefix##_##_name##_show, \
|
||||
sys_##_prefix##_##_name##_store);
|
||||
sys_##_prefix##_##_name##_store)
|
||||
|
||||
static void make_attrs_ro(struct attribute **attrs)
|
||||
{
|
||||
|
@ -415,15 +407,9 @@ static ssize_t ipl_parameter_read(struct file *filp, struct kobject *kobj,
|
|||
return memory_read_from_buffer(buf, count, &off, IPL_PARMBLOCK_START,
|
||||
IPL_PARMBLOCK_SIZE);
|
||||
}
|
||||
|
||||
static struct bin_attribute ipl_parameter_attr = {
|
||||
.attr = {
|
||||
.name = "binary_parameter",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.size = PAGE_SIZE,
|
||||
.read = &ipl_parameter_read,
|
||||
};
|
||||
static struct bin_attribute ipl_parameter_attr =
|
||||
__BIN_ATTR(binary_parameter, S_IRUGO, ipl_parameter_read, NULL,
|
||||
PAGE_SIZE);
|
||||
|
||||
static ssize_t ipl_scp_data_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr, char *buf,
|
||||
|
@ -434,14 +420,13 @@ static ssize_t ipl_scp_data_read(struct file *filp, struct kobject *kobj,
|
|||
|
||||
return memory_read_from_buffer(buf, count, &off, scp_data, size);
|
||||
}
|
||||
static struct bin_attribute ipl_scp_data_attr =
|
||||
__BIN_ATTR(scp_data, S_IRUGO, ipl_scp_data_read, NULL, PAGE_SIZE);
|
||||
|
||||
static struct bin_attribute ipl_scp_data_attr = {
|
||||
.attr = {
|
||||
.name = "scp_data",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.size = PAGE_SIZE,
|
||||
.read = ipl_scp_data_read,
|
||||
static struct bin_attribute *ipl_fcp_bin_attrs[] = {
|
||||
&ipl_parameter_attr,
|
||||
&ipl_scp_data_attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* FCP ipl device attributes */
|
||||
|
@ -484,6 +469,7 @@ static struct attribute *ipl_fcp_attrs[] = {
|
|||
|
||||
static struct attribute_group ipl_fcp_attr_group = {
|
||||
.attrs = ipl_fcp_attrs,
|
||||
.bin_attrs = ipl_fcp_bin_attrs,
|
||||
};
|
||||
|
||||
/* CCW ipl device attributes */
|
||||
|
@ -540,28 +526,6 @@ static struct attribute_group ipl_unknown_attr_group = {
|
|||
|
||||
static struct kset *ipl_kset;
|
||||
|
||||
static int __init ipl_register_fcp_files(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = sysfs_create_group(&ipl_kset->kobj, &ipl_fcp_attr_group);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = sysfs_create_bin_file(&ipl_kset->kobj, &ipl_parameter_attr);
|
||||
if (rc)
|
||||
goto out_ipl_parm;
|
||||
rc = sysfs_create_bin_file(&ipl_kset->kobj, &ipl_scp_data_attr);
|
||||
if (!rc)
|
||||
goto out;
|
||||
|
||||
sysfs_remove_bin_file(&ipl_kset->kobj, &ipl_parameter_attr);
|
||||
|
||||
out_ipl_parm:
|
||||
sysfs_remove_group(&ipl_kset->kobj, &ipl_fcp_attr_group);
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void __ipl_run(void *unused)
|
||||
{
|
||||
diag308(DIAG308_IPL, NULL);
|
||||
|
@ -596,7 +560,7 @@ static int __init ipl_init(void)
|
|||
break;
|
||||
case IPL_TYPE_FCP:
|
||||
case IPL_TYPE_FCP_DUMP:
|
||||
rc = ipl_register_fcp_files();
|
||||
rc = sysfs_create_group(&ipl_kset->kobj, &ipl_fcp_attr_group);
|
||||
break;
|
||||
case IPL_TYPE_NSS:
|
||||
rc = sysfs_create_group(&ipl_kset->kobj, &ipl_nss_attr_group);
|
||||
|
@ -744,15 +708,13 @@ static ssize_t reipl_fcp_scpdata_write(struct file *filp, struct kobject *kobj,
|
|||
|
||||
return count;
|
||||
}
|
||||
static struct bin_attribute sys_reipl_fcp_scp_data_attr =
|
||||
__BIN_ATTR(scp_data, (S_IRUGO | S_IWUSR), reipl_fcp_scpdata_read,
|
||||
reipl_fcp_scpdata_write, PAGE_SIZE);
|
||||
|
||||
static struct bin_attribute sys_reipl_fcp_scp_data_attr = {
|
||||
.attr = {
|
||||
.name = "scp_data",
|
||||
.mode = S_IRUGO | S_IWUSR,
|
||||
},
|
||||
.size = PAGE_SIZE,
|
||||
.read = reipl_fcp_scpdata_read,
|
||||
.write = reipl_fcp_scpdata_write,
|
||||
static struct bin_attribute *reipl_fcp_bin_attrs[] = {
|
||||
&sys_reipl_fcp_scp_data_attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%llx\n",
|
||||
|
@ -841,6 +803,7 @@ static struct attribute *reipl_fcp_attrs[] = {
|
|||
|
||||
static struct attribute_group reipl_fcp_attr_group = {
|
||||
.attrs = reipl_fcp_attrs,
|
||||
.bin_attrs = reipl_fcp_bin_attrs,
|
||||
};
|
||||
|
||||
/* CCW reipl device attributes */
|
||||
|
@ -1261,15 +1224,6 @@ static int __init reipl_fcp_init(void)
|
|||
return rc;
|
||||
}
|
||||
|
||||
rc = sysfs_create_bin_file(&reipl_fcp_kset->kobj,
|
||||
&sys_reipl_fcp_scp_data_attr);
|
||||
if (rc) {
|
||||
sysfs_remove_group(&reipl_fcp_kset->kobj, &reipl_fcp_attr_group);
|
||||
kset_unregister(reipl_fcp_kset);
|
||||
free_page((unsigned long) reipl_block_fcp);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (ipl_info.type == IPL_TYPE_FCP) {
|
||||
memcpy(reipl_block_fcp, IPL_PARMBLOCK_START, PAGE_SIZE);
|
||||
/*
|
||||
|
@ -1713,9 +1667,7 @@ static ssize_t on_reboot_store(struct kobject *kobj,
|
|||
{
|
||||
return set_trigger(buf, &on_reboot_trigger, len);
|
||||
}
|
||||
|
||||
static struct kobj_attribute on_reboot_attr =
|
||||
__ATTR(on_reboot, 0644, on_reboot_show, on_reboot_store);
|
||||
static struct kobj_attribute on_reboot_attr = __ATTR_RW(on_reboot);
|
||||
|
||||
static void do_machine_restart(char *__unused)
|
||||
{
|
||||
|
@ -1741,9 +1693,7 @@ static ssize_t on_panic_store(struct kobject *kobj,
|
|||
{
|
||||
return set_trigger(buf, &on_panic_trigger, len);
|
||||
}
|
||||
|
||||
static struct kobj_attribute on_panic_attr =
|
||||
__ATTR(on_panic, 0644, on_panic_show, on_panic_store);
|
||||
static struct kobj_attribute on_panic_attr = __ATTR_RW(on_panic);
|
||||
|
||||
static void do_panic(void)
|
||||
{
|
||||
|
@ -1769,9 +1719,7 @@ static ssize_t on_restart_store(struct kobject *kobj,
|
|||
{
|
||||
return set_trigger(buf, &on_restart_trigger, len);
|
||||
}
|
||||
|
||||
static struct kobj_attribute on_restart_attr =
|
||||
__ATTR(on_restart, 0644, on_restart_show, on_restart_store);
|
||||
static struct kobj_attribute on_restart_attr = __ATTR_RW(on_restart);
|
||||
|
||||
static void __do_restart(void *ignore)
|
||||
{
|
||||
|
@ -1808,10 +1756,7 @@ static ssize_t on_halt_store(struct kobject *kobj,
|
|||
{
|
||||
return set_trigger(buf, &on_halt_trigger, len);
|
||||
}
|
||||
|
||||
static struct kobj_attribute on_halt_attr =
|
||||
__ATTR(on_halt, 0644, on_halt_show, on_halt_store);
|
||||
|
||||
static struct kobj_attribute on_halt_attr = __ATTR_RW(on_halt);
|
||||
|
||||
static void do_machine_halt(void)
|
||||
{
|
||||
|
@ -1837,10 +1782,7 @@ static ssize_t on_poff_store(struct kobject *kobj,
|
|||
{
|
||||
return set_trigger(buf, &on_poff_trigger, len);
|
||||
}
|
||||
|
||||
static struct kobj_attribute on_poff_attr =
|
||||
__ATTR(on_poff, 0644, on_poff_show, on_poff_store);
|
||||
|
||||
static struct kobj_attribute on_poff_attr = __ATTR_RW(on_poff);
|
||||
|
||||
static void do_machine_power_off(void)
|
||||
{
|
||||
|
@ -1850,26 +1792,27 @@ static void do_machine_power_off(void)
|
|||
}
|
||||
void (*_machine_power_off)(void) = do_machine_power_off;
|
||||
|
||||
static struct attribute *shutdown_action_attrs[] = {
|
||||
&on_restart_attr.attr,
|
||||
&on_reboot_attr.attr,
|
||||
&on_panic_attr.attr,
|
||||
&on_halt_attr.attr,
|
||||
&on_poff_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group shutdown_action_attr_group = {
|
||||
.attrs = shutdown_action_attrs,
|
||||
};
|
||||
|
||||
static void __init shutdown_triggers_init(void)
|
||||
{
|
||||
shutdown_actions_kset = kset_create_and_add("shutdown_actions", NULL,
|
||||
firmware_kobj);
|
||||
if (!shutdown_actions_kset)
|
||||
goto fail;
|
||||
if (sysfs_create_file(&shutdown_actions_kset->kobj,
|
||||
&on_reboot_attr.attr))
|
||||
goto fail;
|
||||
if (sysfs_create_file(&shutdown_actions_kset->kobj,
|
||||
&on_panic_attr.attr))
|
||||
goto fail;
|
||||
if (sysfs_create_file(&shutdown_actions_kset->kobj,
|
||||
&on_halt_attr.attr))
|
||||
goto fail;
|
||||
if (sysfs_create_file(&shutdown_actions_kset->kobj,
|
||||
&on_poff_attr.attr))
|
||||
goto fail;
|
||||
if (sysfs_create_file(&shutdown_actions_kset->kobj,
|
||||
&on_restart_attr.attr))
|
||||
if (sysfs_create_group(&shutdown_actions_kset->kobj,
|
||||
&shutdown_action_attr_group))
|
||||
goto fail;
|
||||
return;
|
||||
fail:
|
||||
|
@ -2062,12 +2005,10 @@ static void do_reset_calls(void)
|
|||
{
|
||||
struct reset_call *reset;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
if (diag308_set_works) {
|
||||
diag308_reset();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
list_for_each_entry(reset, &rcall, list)
|
||||
reset->fn();
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ static const struct irq_class irqclass_main_desc[NR_IRQS_BASE] = {
|
|||
* /proc/interrupts.
|
||||
* In addition this list contains non external / I/O events like NMIs.
|
||||
*/
|
||||
static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = {
|
||||
static const struct irq_class irqclass_sub_desc[] = {
|
||||
{.irq = IRQEXT_CLK, .name = "CLK", .desc = "[EXT] Clock Comparator"},
|
||||
{.irq = IRQEXT_EXC, .name = "EXC", .desc = "[EXT] External Call"},
|
||||
{.irq = IRQEXT_EMS, .name = "EMS", .desc = "[EXT] Emergency Signal"},
|
||||
|
@ -94,6 +94,7 @@ static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = {
|
|||
|
||||
void __init init_IRQ(void)
|
||||
{
|
||||
BUILD_BUG_ON(ARRAY_SIZE(irqclass_sub_desc) != NR_ARCH_IRQS);
|
||||
init_cio_interrupts();
|
||||
init_airq_interrupts();
|
||||
init_ext_interrupts();
|
||||
|
|
|
@ -78,7 +78,7 @@ static void __jump_label_transform(struct jump_entry *entry,
|
|||
if (memcmp((void *)entry->code, &old, sizeof(old)))
|
||||
jump_label_bug(entry, &old, &new);
|
||||
}
|
||||
probe_kernel_write((void *)entry->code, &new, sizeof(new));
|
||||
s390_kernel_write((void *)entry->code, &new, sizeof(new));
|
||||
}
|
||||
|
||||
static int __sm_arch_jump_label_transform(void *data)
|
||||
|
|
|
@ -178,7 +178,7 @@ static int swap_instruction(void *data)
|
|||
}
|
||||
skip_ftrace:
|
||||
kcb->kprobe_status = KPROBE_SWAP_INST;
|
||||
probe_kernel_write(p->addr, &new_insn, len);
|
||||
s390_kernel_write(p->addr, &new_insn, len);
|
||||
kcb->kprobe_status = status;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -38,13 +38,8 @@
|
|||
#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)
|
||||
|
@ -53,7 +48,6 @@ void *module_alloc(unsigned long size)
|
|||
GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
#endif
|
||||
|
||||
void module_arch_freeing_init(struct module *mod)
|
||||
{
|
||||
|
@ -323,17 +317,11 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
|
|||
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 ||
|
||||
|
|
|
@ -117,55 +117,36 @@ static int notrace s390_revalidate_registers(struct mci *mci)
|
|||
*/
|
||||
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) {
|
||||
|
@ -178,7 +159,6 @@ static int notrace s390_revalidate_registers(struct mci *mci)
|
|||
restore_vx_regs((__vector128 *)
|
||||
S390_lowcore.vector_save_area_addr);
|
||||
}
|
||||
#endif
|
||||
/* Revalidate access registers */
|
||||
asm volatile(
|
||||
" lam 0,15,0(%0)"
|
||||
|
@ -198,21 +178,14 @@ static int notrace s390_revalidate_registers(struct mci *mci)
|
|||
*/
|
||||
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.
|
||||
|
@ -228,7 +201,6 @@ static int notrace s390_revalidate_registers(struct mci *mci)
|
|||
" 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 */
|
||||
|
@ -280,19 +252,11 @@ void notrace s390_do_machine_check(struct pt_regs *regs)
|
|||
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) ||
|
||||
|
|
|
@ -6,19 +6,13 @@
|
|||
|
||||
#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)
|
||||
|
@ -46,10 +40,10 @@ PGM_CHECK_DEFAULT /* 14 */
|
|||
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 */
|
||||
|
@ -78,10 +72,10 @@ PGM_CHECK_DEFAULT /* 34 */
|
|||
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 */
|
||||
|
|
|
@ -79,13 +79,11 @@ void release_thread(struct task_struct *dead_task)
|
|||
{
|
||||
}
|
||||
|
||||
#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)
|
||||
|
@ -144,19 +142,6 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,
|
|||
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);
|
||||
|
@ -172,15 +157,13 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,
|
|||
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));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -188,18 +171,8 @@ asmlinkage void execve_tail(void)
|
|||
*/
|
||||
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);
|
||||
|
|
|
@ -44,7 +44,6 @@ void update_cr_regs(struct task_struct *task)
|
|||
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;
|
||||
|
@ -80,7 +79,6 @@ void update_cr_regs(struct task_struct *task)
|
|||
__ctl_load(cr_new, 2, 2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Copy user specified PER registers */
|
||||
new.control = thread->per_user.control;
|
||||
new.start = thread->per_user.start;
|
||||
|
@ -93,10 +91,8 @@ void update_cr_regs(struct task_struct *task)
|
|||
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;
|
||||
|
@ -146,11 +142,7 @@ void ptrace_disable(struct task_struct *task)
|
|||
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)
|
||||
|
@ -223,7 +215,6 @@ static unsigned long __peek_user(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
|
||||
|
@ -232,8 +223,7 @@ static unsigned long __peek_user(struct task_struct *child, addr_t addr)
|
|||
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) {
|
||||
/*
|
||||
|
@ -261,12 +251,10 @@ static unsigned long __peek_user(struct task_struct *child, addr_t addr)
|
|||
* 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);
|
||||
|
||||
|
@ -293,11 +281,9 @@ peek_user(struct task_struct *child, addr_t addr, addr_t data)
|
|||
* 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;
|
||||
|
||||
|
@ -370,7 +356,6 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
|
|||
* 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
|
||||
|
@ -380,8 +365,7 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
|
|||
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) {
|
||||
/*
|
||||
|
@ -411,12 +395,10 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
|
|||
* 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;
|
||||
|
||||
|
@ -441,11 +423,9 @@ static int poke_user(struct task_struct *child, addr_t addr, addr_t 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;
|
||||
|
||||
|
@ -649,12 +629,10 @@ static u32 __peek_user_compat(struct task_struct *child, addr_t addr)
|
|||
* 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);
|
||||
|
||||
|
@ -776,12 +754,10 @@ static int __poke_user_compat(struct task_struct *child,
|
|||
* 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;
|
||||
|
||||
|
@ -979,16 +955,13 @@ static int s390_fpregs_get(struct task_struct *target,
|
|||
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);
|
||||
}
|
||||
|
@ -1026,23 +999,18 @@ static int s390_fpregs_set(struct task_struct *target,
|
|||
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,
|
||||
|
@ -1182,8 +1150,6 @@ static int s390_vxrs_high_set(struct task_struct *target,
|
|||
return rc;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int s390_system_call_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
|
@ -1229,7 +1195,6 @@ static const struct user_regset s390_regsets[] = {
|
|||
.get = s390_system_call_get,
|
||||
.set = s390_system_call_set,
|
||||
},
|
||||
#ifdef CONFIG_64BIT
|
||||
{
|
||||
.core_note_type = NT_S390_LAST_BREAK,
|
||||
.n = 1,
|
||||
|
@ -1262,7 +1227,6 @@ static const struct user_regset s390_regsets[] = {
|
|||
.get = s390_vxrs_high_get,
|
||||
.set = s390_vxrs_high_set,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct user_regset_view user_s390_view = {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* S390 version
|
||||
* Copyright IBM Corp. 2000
|
||||
* Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com)
|
||||
* Copyright IBM Corp 2000, 2011
|
||||
* Author(s): Holger Smolinski <Holger.Smolinski@de.ibm.com>,
|
||||
* Denis Joseph Barrow,
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
@ -9,43 +9,90 @@
|
|||
#include <asm/sigp.h>
|
||||
|
||||
#
|
||||
# store_status: Empty implementation until kdump is supported on 31 bit
|
||||
# store_status
|
||||
#
|
||||
# Prerequisites to run this function:
|
||||
# - Prefix register is set to zero
|
||||
# - Original prefix register is stored in "dump_prefix_page"
|
||||
# - Lowcore protection is off
|
||||
#
|
||||
ENTRY(store_status)
|
||||
br %r14
|
||||
/* Save register one and load save area base */
|
||||
stg %r1,__LC_SAVE_AREA_RESTART
|
||||
lghi %r1,SAVE_AREA_BASE
|
||||
/* General purpose registers */
|
||||
stmg %r0,%r15,__LC_GPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
lg %r2,__LC_SAVE_AREA_RESTART
|
||||
stg %r2,__LC_GPREGS_SAVE_AREA-SAVE_AREA_BASE+8(%r1)
|
||||
/* Control registers */
|
||||
stctg %c0,%c15,__LC_CREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* Access registers */
|
||||
stam %a0,%a15,__LC_AREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* Floating point registers */
|
||||
std %f0, 0x00 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f1, 0x08 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f2, 0x10 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f3, 0x18 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f4, 0x20 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f5, 0x28 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f6, 0x30 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f7, 0x38 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f8, 0x40 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f9, 0x48 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f10,0x50 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f11,0x58 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f12,0x60 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f13,0x68 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f14,0x70 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f15,0x78 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* Floating point control register */
|
||||
stfpc __LC_FP_CREG_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* CPU timer */
|
||||
stpt __LC_CPU_TIMER_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* Saved prefix register */
|
||||
larl %r2,dump_prefix_page
|
||||
mvc __LC_PREFIX_SAVE_AREA-SAVE_AREA_BASE(4,%r1),0(%r2)
|
||||
/* Clock comparator - seven bytes */
|
||||
larl %r2,.Lclkcmp
|
||||
stckc 0(%r2)
|
||||
mvc __LC_CLOCK_COMP_SAVE_AREA-SAVE_AREA_BASE + 1(7,%r1),1(%r2)
|
||||
/* Program status word */
|
||||
epsw %r2,%r3
|
||||
st %r2,__LC_PSW_SAVE_AREA-SAVE_AREA_BASE + 0(%r1)
|
||||
st %r3,__LC_PSW_SAVE_AREA-SAVE_AREA_BASE + 4(%r1)
|
||||
larl %r2,store_status
|
||||
stg %r2,__LC_PSW_SAVE_AREA-SAVE_AREA_BASE + 8(%r1)
|
||||
br %r14
|
||||
|
||||
.section .bss
|
||||
.align 8
|
||||
.Lclkcmp: .quad 0x0000000000000000
|
||||
.previous
|
||||
|
||||
#
|
||||
# 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
|
||||
.Lpg0: lpswe .Lnewpsw-.Lpg0(%r13)
|
||||
.Lpg1: brasl %r14,store_status
|
||||
|
||||
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)
|
||||
lctlg %c6,%c6,.Lall-.Lpg0(%r13)
|
||||
lgr %r1,%r2
|
||||
mvc __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13)
|
||||
stsch .Lschib-.Lpg0(%r13)
|
||||
oi .Lschib+5-.Lpg0(%r13),0x84
|
||||
.Lecs: xi .Lschib+27-.Lpg0(%r13),0x01
|
||||
.Lecs: xi .Lschib+27-.Lpg0(%r13),0x01
|
||||
msch .Lschib-.Lpg0(%r13)
|
||||
lhi %r0,5
|
||||
lghi %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)
|
||||
.L001: mvc __LC_IO_NEW_PSW(16),.Lionew-.Lpg0(%r13)
|
||||
.Ltpi: lpswe .Lwaitpsw-.Lpg0(%r13)
|
||||
.Lcont: c %r1,__LC_SUBCHANNEL_ID
|
||||
jnz .Ltpi
|
||||
clc __LC_IO_INT_PARM(4),.Liplorb-.Lpg0(%r13)
|
||||
|
@ -58,20 +105,36 @@ ENTRY(do_reipl_asm)
|
|||
jz .L003
|
||||
bas %r14,.Ldisab-.Lpg0(%r13)
|
||||
.L003: st %r1,__LC_SUBCHANNEL_ID
|
||||
lhi %r1,0 # mode 0 = esa
|
||||
slr %r0,%r0 # set cpuid to zero
|
||||
sigp %r1,%r0,SIGP_SET_ARCHITECTURE # switch to esa mode
|
||||
lpsw 0
|
||||
sigp 0,0,SIGP_RESTART
|
||||
.Ldisab: st %r14,.Ldispsw+4-.Lpg0(%r13)
|
||||
lpsw .Ldispsw-.Lpg0(%r13)
|
||||
.Ldisab: sll %r14,1
|
||||
srl %r14,1 # need to kill hi bit to avoid specification exceptions.
|
||||
st %r14,.Ldispsw+12-.Lpg0(%r13)
|
||||
lpswe .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
|
||||
.Lall: .quad 0x00000000ff000000
|
||||
.align 16
|
||||
/*
|
||||
* These addresses have to be 31 bit otherwise
|
||||
* the sigp will throw a specifcation exception
|
||||
* when switching to ESA mode as bit 31 be set
|
||||
* in the ESA psw.
|
||||
* Bit 31 of the addresses has to be 0 for the
|
||||
* 31bit lpswe instruction a fact they appear to have
|
||||
* omitted from the pop.
|
||||
*/
|
||||
.Lnewpsw: .quad 0x0000000080000000
|
||||
.quad .Lpg1
|
||||
.Lpcnew: .quad 0x0000000080000000
|
||||
.quad .Lecs
|
||||
.Lionew: .quad 0x0000000080000000
|
||||
.quad .Lcont
|
||||
.Lwaitpsw: .quad 0x0202000080000000
|
||||
.quad .Ltpi
|
||||
.Ldispsw: .quad 0x0002000080000000
|
||||
.quad 0x0000000000000000
|
||||
.Liplccws: .long 0x02000000,0x60000018
|
||||
.long 0x08000008,0x20000001
|
||||
.Liplorb: .long 0x0049504c,0x0040ff80
|
||||
|
|
|
@ -1,155 +0,0 @@
|
|||
/*
|
||||
* Copyright IBM Corp 2000, 2011
|
||||
* Author(s): Holger Smolinski <Holger.Smolinski@de.ibm.com>,
|
||||
* Denis Joseph Barrow,
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/sigp.h>
|
||||
|
||||
#
|
||||
# store_status
|
||||
#
|
||||
# Prerequisites to run this function:
|
||||
# - Prefix register is set to zero
|
||||
# - Original prefix register is stored in "dump_prefix_page"
|
||||
# - Lowcore protection is off
|
||||
#
|
||||
ENTRY(store_status)
|
||||
/* Save register one and load save area base */
|
||||
stg %r1,__LC_SAVE_AREA_RESTART
|
||||
lghi %r1,SAVE_AREA_BASE
|
||||
/* General purpose registers */
|
||||
stmg %r0,%r15,__LC_GPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
lg %r2,__LC_SAVE_AREA_RESTART
|
||||
stg %r2,__LC_GPREGS_SAVE_AREA-SAVE_AREA_BASE+8(%r1)
|
||||
/* Control registers */
|
||||
stctg %c0,%c15,__LC_CREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* Access registers */
|
||||
stam %a0,%a15,__LC_AREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* Floating point registers */
|
||||
std %f0, 0x00 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f1, 0x08 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f2, 0x10 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f3, 0x18 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f4, 0x20 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f5, 0x28 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f6, 0x30 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f7, 0x38 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f8, 0x40 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f9, 0x48 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f10,0x50 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f11,0x58 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f12,0x60 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f13,0x68 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f14,0x70 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
std %f15,0x78 + __LC_FPREGS_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* Floating point control register */
|
||||
stfpc __LC_FP_CREG_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* CPU timer */
|
||||
stpt __LC_CPU_TIMER_SAVE_AREA-SAVE_AREA_BASE(%r1)
|
||||
/* Saved prefix register */
|
||||
larl %r2,dump_prefix_page
|
||||
mvc __LC_PREFIX_SAVE_AREA-SAVE_AREA_BASE(4,%r1),0(%r2)
|
||||
/* Clock comparator - seven bytes */
|
||||
larl %r2,.Lclkcmp
|
||||
stckc 0(%r2)
|
||||
mvc __LC_CLOCK_COMP_SAVE_AREA-SAVE_AREA_BASE + 1(7,%r1),1(%r2)
|
||||
/* Program status word */
|
||||
epsw %r2,%r3
|
||||
st %r2,__LC_PSW_SAVE_AREA-SAVE_AREA_BASE + 0(%r1)
|
||||
st %r3,__LC_PSW_SAVE_AREA-SAVE_AREA_BASE + 4(%r1)
|
||||
larl %r2,store_status
|
||||
stg %r2,__LC_PSW_SAVE_AREA-SAVE_AREA_BASE + 8(%r1)
|
||||
br %r14
|
||||
|
||||
.section .bss
|
||||
.align 8
|
||||
.Lclkcmp: .quad 0x0000000000000000
|
||||
.previous
|
||||
|
||||
#
|
||||
# do_reipl_asm
|
||||
# Parameter: r2 = schid of reipl device
|
||||
#
|
||||
|
||||
ENTRY(do_reipl_asm)
|
||||
basr %r13,0
|
||||
.Lpg0: lpswe .Lnewpsw-.Lpg0(%r13)
|
||||
.Lpg1: brasl %r14,store_status
|
||||
|
||||
lctlg %c6,%c6,.Lall-.Lpg0(%r13)
|
||||
lgr %r1,%r2
|
||||
mvc __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13)
|
||||
stsch .Lschib-.Lpg0(%r13)
|
||||
oi .Lschib+5-.Lpg0(%r13),0x84
|
||||
.Lecs: xi .Lschib+27-.Lpg0(%r13),0x01
|
||||
msch .Lschib-.Lpg0(%r13)
|
||||
lghi %r0,5
|
||||
.Lssch: ssch .Liplorb-.Lpg0(%r13)
|
||||
jz .L001
|
||||
brct %r0,.Lssch
|
||||
bas %r14,.Ldisab-.Lpg0(%r13)
|
||||
.L001: mvc __LC_IO_NEW_PSW(16),.Lionew-.Lpg0(%r13)
|
||||
.Ltpi: lpswe .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
|
||||
lhi %r1,0 # mode 0 = esa
|
||||
slr %r0,%r0 # set cpuid to zero
|
||||
sigp %r1,%r0,SIGP_SET_ARCHITECTURE # switch to esa mode
|
||||
lpsw 0
|
||||
.Ldisab: sll %r14,1
|
||||
srl %r14,1 # need to kill hi bit to avoid specification exceptions.
|
||||
st %r14,.Ldispsw+12-.Lpg0(%r13)
|
||||
lpswe .Ldispsw-.Lpg0(%r13)
|
||||
.align 8
|
||||
.Lall: .quad 0x00000000ff000000
|
||||
.align 16
|
||||
/*
|
||||
* These addresses have to be 31 bit otherwise
|
||||
* the sigp will throw a specifcation exception
|
||||
* when switching to ESA mode as bit 31 be set
|
||||
* in the ESA psw.
|
||||
* Bit 31 of the addresses has to be 0 for the
|
||||
* 31bit lpswe instruction a fact they appear to have
|
||||
* omitted from the pop.
|
||||
*/
|
||||
.Lnewpsw: .quad 0x0000000080000000
|
||||
.quad .Lpg1
|
||||
.Lpcnew: .quad 0x0000000080000000
|
||||
.quad .Lecs
|
||||
.Lionew: .quad 0x0000000080000000
|
||||
.quad .Lcont
|
||||
.Lwaitpsw: .quad 0x0202000080000000
|
||||
.quad .Ltpi
|
||||
.Ldispsw: .quad 0x0002000080000000
|
||||
.quad 0x0000000000000000
|
||||
.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
|
|
@ -19,7 +19,8 @@
|
|||
* %r7 = PAGE_SIZE
|
||||
* %r8 holds the source address
|
||||
* %r9 = PAGE_SIZE
|
||||
* %r10 is a page mask
|
||||
*
|
||||
* 0xf000 is a page_mask
|
||||
*/
|
||||
|
||||
.text
|
||||
|
@ -27,46 +28,47 @@ 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)
|
||||
stctg %c0,%c15,ctlregs-.base(%r13)
|
||||
stmg %r0,%r15,gprregs-.base(%r13)
|
||||
lghi %r0,3
|
||||
sllg %r0,%r0,31
|
||||
stg %r0,0x1d0(%r0)
|
||||
la %r0,.back_pgm-.base(%r13)
|
||||
stg %r0,0x1d8(%r0)
|
||||
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
|
||||
lghi %r0,0
|
||||
diag %r0,%r0,0x308
|
||||
.back:
|
||||
lhi %r1,1 # mode 1 = esame
|
||||
sigp %r1,%r0,SIGP_SET_ARCHITECTURE # switch to esame mode
|
||||
sam64 # switch to 64 bit addressing mode
|
||||
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
|
||||
lctlg %c0,%c15,ctlregs-.back_base(%r13)
|
||||
lmg %r0,%r15,gprregs-.back_base(%r13)
|
||||
j .top
|
||||
.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
|
||||
lmg %r0,%r15,gprregs-.base(%r13)
|
||||
.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
|
||||
lghi %r7,4096 # load PAGE_SIZE in r7
|
||||
lghi %r9,4096 # load PAGE_SIZE in r9
|
||||
lg %r5,0(%r2) # read another word for indirection page
|
||||
aghi %r2,8 # 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...
|
||||
lgr %r6,%r5 # r6 = r5
|
||||
nill %r6,0xf000 # 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,
|
||||
nill %r5,0xf000 # YES, mask out,
|
||||
lgr %r2,%r5 # move it into the right register,
|
||||
j .top # and read next...
|
||||
.done_test:
|
||||
tml %r5,0x4 # is it the done indicator?
|
||||
|
@ -75,13 +77,13 @@ ENTRY(relocate_kernel)
|
|||
.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
|
||||
lgr %r8,%r5 # r8 = r5
|
||||
nill %r8,0xf000 # 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
|
||||
sgr %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)
|
||||
|
@ -90,8 +92,9 @@ ENTRY(relocate_kernel)
|
|||
jno .no_diag308
|
||||
diag %r0,%r0,0x308
|
||||
.no_diag308:
|
||||
sr %r1,%r1 # clear %r1
|
||||
sr %r2,%r2 # clear %r2
|
||||
sam31 # 31 bit mode
|
||||
sr %r1,%r1 # erase register r1
|
||||
sr %r2,%r2 # erase register r2
|
||||
sigp %r1,%r2,SIGP_SET_ARCHITECTURE # set cpuid to zero
|
||||
lpsw 0 # hopefully start new kernel...
|
||||
|
||||
|
@ -102,11 +105,11 @@ ENTRY(relocate_kernel)
|
|||
.quad 0
|
||||
ctlregs:
|
||||
.rept 16
|
||||
.long 0
|
||||
.quad 0
|
||||
.endr
|
||||
gprregs:
|
||||
.rept 16
|
||||
.long 0
|
||||
.quad 0
|
||||
.endr
|
||||
have_diag308:
|
||||
.byte 0
|
||||
|
|
|
@ -1,121 +0,0 @@
|
|||
/*
|
||||
* 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
|
||||
*
|
||||
* 0xf000 is a page_mask
|
||||
*/
|
||||
|
||||
.text
|
||||
ENTRY(relocate_kernel)
|
||||
basr %r13,0 # base address
|
||||
.base:
|
||||
stnsm sys_msk-.base(%r13),0xfb # disable DAT
|
||||
stctg %c0,%c15,ctlregs-.base(%r13)
|
||||
stmg %r0,%r15,gprregs-.base(%r13)
|
||||
lghi %r0,3
|
||||
sllg %r0,%r0,31
|
||||
stg %r0,0x1d0(%r0)
|
||||
la %r0,.back_pgm-.base(%r13)
|
||||
stg %r0,0x1d8(%r0)
|
||||
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
|
||||
lghi %r0,0
|
||||
diag %r0,%r0,0x308
|
||||
.back:
|
||||
lhi %r1,1 # mode 1 = esame
|
||||
sigp %r1,%r0,SIGP_SET_ARCHITECTURE # switch to esame mode
|
||||
sam64 # switch to 64 bit addressing mode
|
||||
basr %r13,0
|
||||
.back_base:
|
||||
oi have_diag308-.back_base(%r13),0x01
|
||||
lctlg %c0,%c15,ctlregs-.back_base(%r13)
|
||||
lmg %r0,%r15,gprregs-.back_base(%r13)
|
||||
j .top
|
||||
.back_pgm:
|
||||
lmg %r0,%r15,gprregs-.base(%r13)
|
||||
.top:
|
||||
lghi %r7,4096 # load PAGE_SIZE in r7
|
||||
lghi %r9,4096 # load PAGE_SIZE in r9
|
||||
lg %r5,0(%r2) # read another word for indirection page
|
||||
aghi %r2,8 # increment pointer
|
||||
tml %r5,0x1 # is it a destination page?
|
||||
je .indir_check # NO, goto "indir_check"
|
||||
lgr %r6,%r5 # r6 = r5
|
||||
nill %r6,0xf000 # 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"
|
||||
nill %r5,0xf000 # YES, mask out,
|
||||
lgr %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...
|
||||
lgr %r8,%r5 # r8 = r5
|
||||
nill %r8,0xf000 # masking
|
||||
0: mvcle %r6,%r8,0x0 # copy PAGE_SIZE bytes from r8 to r6 - pad with 0
|
||||
jo 0b
|
||||
j .top
|
||||
.done:
|
||||
sgr %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:
|
||||
sam31 # 31 bit mode
|
||||
sr %r1,%r1 # erase register r1
|
||||
sr %r2,%r2 # erase register 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
|
||||
.quad 0
|
||||
.endr
|
||||
gprregs:
|
||||
.rept 16
|
||||
.quad 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
|
|
@ -36,21 +36,17 @@ _sclp_wait_int:
|
|||
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
|
||||
|
@ -92,10 +88,8 @@ _sclp_wait_int:
|
|||
.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:
|
||||
|
@ -272,13 +266,11 @@ _sclp_print:
|
|||
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
|
||||
|
@ -291,14 +283,12 @@ ENTRY(_sclp_print_early)
|
|||
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
|
||||
|
||||
|
|
|
@ -92,10 +92,8 @@ EXPORT_SYMBOL(VMALLOC_END);
|
|||
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];
|
||||
|
@ -334,19 +332,10 @@ static void __init setup_lowcore(void)
|
|||
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;
|
||||
|
@ -450,7 +439,6 @@ static void __init setup_memory_end(void)
|
|||
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);
|
||||
|
@ -462,12 +450,6 @@ static void __init setup_memory_end(void)
|
|||
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 */
|
||||
|
@ -754,7 +736,6 @@ static void __init setup_hwcaps(void)
|
|||
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.
|
||||
|
@ -772,22 +753,15 @@ static void __init setup_hwcaps(void)
|
|||
*/
|
||||
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:
|
||||
|
@ -839,19 +813,6 @@ void __init setup_arch(char **cmdline_p)
|
|||
/*
|
||||
* 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");
|
||||
|
@ -859,7 +820,6 @@ void __init setup_arch(char **cmdline_p)
|
|||
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 */
|
||||
|
@ -930,35 +890,3 @@ void __init setup_arch(char **cmdline_p)
|
|||
/* 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
|
||||
|
|
|
@ -106,7 +106,6 @@ static void store_sigregs(void)
|
|||
{
|
||||
save_access_regs(current->thread.acrs);
|
||||
save_fp_ctl(¤t->thread.fp_regs.fpc);
|
||||
#ifdef CONFIG_64BIT
|
||||
if (current->thread.vxrs) {
|
||||
int i;
|
||||
|
||||
|
@ -115,7 +114,6 @@ static void store_sigregs(void)
|
|||
current->thread.fp_regs.fprs[i] =
|
||||
*(freg_t *)(current->thread.vxrs + i);
|
||||
} else
|
||||
#endif
|
||||
save_fp_regs(current->thread.fp_regs.fprs);
|
||||
}
|
||||
|
||||
|
@ -124,7 +122,6 @@ static void load_sigregs(void)
|
|||
{
|
||||
restore_access_regs(current->thread.acrs);
|
||||
/* restore_fp_ctl is done in restore_sigregs */
|
||||
#ifdef CONFIG_64BIT
|
||||
if (current->thread.vxrs) {
|
||||
int i;
|
||||
|
||||
|
@ -133,7 +130,6 @@ static void load_sigregs(void)
|
|||
current->thread.fp_regs.fprs[i];
|
||||
restore_vx_regs(current->thread.vxrs);
|
||||
} else
|
||||
#endif
|
||||
restore_fp_regs(current->thread.fp_regs.fprs);
|
||||
}
|
||||
|
||||
|
@ -200,7 +196,6 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
|
|||
static int save_sigregs_ext(struct pt_regs *regs,
|
||||
_sigregs_ext __user *sregs_ext)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
__u64 vxrs[__NUM_VXRS_LOW];
|
||||
int i;
|
||||
|
||||
|
@ -215,14 +210,12 @@ static int save_sigregs_ext(struct pt_regs *regs,
|
|||
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;
|
||||
|
||||
|
@ -237,7 +230,6 @@ static int restore_sigregs_ext(struct pt_regs *regs,
|
|||
for (i = 0; i < __NUM_VXRS_LOW; i++)
|
||||
*((__u64 *)(current->thread.vxrs + i) + 1) = vxrs[i];
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -416,13 +408,11 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
|
|||
* 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;
|
||||
|
|
|
@ -198,19 +198,11 @@ static int pcpu_alloc_lowcore(struct pcpu *pcpu, int cpu)
|
|||
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;
|
||||
|
@ -229,16 +221,7 @@ static void pcpu_free_lowcore(struct pcpu *pcpu)
|
|||
{
|
||||
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);
|
||||
|
@ -492,22 +475,6 @@ void arch_send_call_function_single_ipi(int cpu)
|
|||
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
|
||||
|
@ -851,7 +818,8 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)
|
|||
pcpu_prepare_secondary(pcpu, cpu);
|
||||
pcpu_attach_task(pcpu, tidle);
|
||||
pcpu_start_fn(pcpu, smp_start_secondary, NULL);
|
||||
while (!cpu_online(cpu))
|
||||
/* Wait until cpu puts itself in the online & active maps */
|
||||
while (!cpu_online(cpu) || !cpu_active(cpu))
|
||||
cpu_relax();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -138,6 +138,8 @@ int pfn_is_nosave(unsigned long pfn)
|
|||
{
|
||||
unsigned long nosave_begin_pfn = PFN_DOWN(__pa(&__nosave_begin));
|
||||
unsigned long nosave_end_pfn = PFN_DOWN(__pa(&__nosave_end));
|
||||
unsigned long eshared_pfn = PFN_DOWN(__pa(&_eshared)) - 1;
|
||||
unsigned long stext_pfn = PFN_DOWN(__pa(&_stext));
|
||||
|
||||
/* Always save lowcore pages (LC protection might be enabled). */
|
||||
if (pfn <= LC_PAGES)
|
||||
|
@ -145,6 +147,8 @@ int pfn_is_nosave(unsigned long pfn)
|
|||
if (pfn >= nosave_begin_pfn && pfn < nosave_end_pfn)
|
||||
return 1;
|
||||
/* Skip memory holes and read-only pages (NSS, DCSS, ...). */
|
||||
if (pfn >= stext_pfn && pfn <= eshared_pfn)
|
||||
return ipl_info.type == IPL_TYPE_NSS ? 1 : 0;
|
||||
if (tprot(PFN_PHYS(pfn)))
|
||||
return 1;
|
||||
return 0;
|
||||
|
|
|
@ -76,7 +76,6 @@ SYSCALL_DEFINE5(s390_ipc, uint, call, int, first, unsigned long, second,
|
|||
return sys_ipc(call, first, second, third, ptr, third);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
SYSCALL_DEFINE1(s390_personality, unsigned int, personality)
|
||||
{
|
||||
unsigned int ret;
|
||||
|
@ -90,51 +89,3 @@ SYSCALL_DEFINE1(s390_personality, unsigned int, personality)
|
|||
|
||||
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
|
||||
|
|
|
@ -1,365 +1,365 @@
|
|||
/*
|
||||
* definitions for sys_call_table, each line represents an
|
||||
* entry in the table in the form
|
||||
* SYSCALL(31 bit syscall, 64 bit syscall, 31 bit emulated syscall)
|
||||
* entry in the table in the form
|
||||
* SYSCALL(64 bit syscall, 31 bit emulated syscall)
|
||||
*
|
||||
* this file is meant to be included from entry.S and entry64.S
|
||||
* this file is meant to be included from entry.S
|
||||
*/
|
||||
|
||||
#define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall,sys_ni_syscall)
|
||||
#define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall)
|
||||
|
||||
NI_SYSCALL /* 0 */
|
||||
SYSCALL(sys_exit,sys_exit,compat_sys_exit)
|
||||
SYSCALL(sys_fork,sys_fork,sys_fork)
|
||||
SYSCALL(sys_read,sys_read,compat_sys_s390_read)
|
||||
SYSCALL(sys_write,sys_write,compat_sys_s390_write)
|
||||
SYSCALL(sys_open,sys_open,compat_sys_open) /* 5 */
|
||||
SYSCALL(sys_close,sys_close,compat_sys_close)
|
||||
SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall)
|
||||
SYSCALL(sys_creat,sys_creat,compat_sys_creat)
|
||||
SYSCALL(sys_link,sys_link,compat_sys_link)
|
||||
SYSCALL(sys_unlink,sys_unlink,compat_sys_unlink) /* 10 */
|
||||
SYSCALL(sys_execve,sys_execve,compat_sys_execve)
|
||||
SYSCALL(sys_chdir,sys_chdir,compat_sys_chdir)
|
||||
SYSCALL(sys_time,sys_ni_syscall,compat_sys_time) /* old time syscall */
|
||||
SYSCALL(sys_mknod,sys_mknod,compat_sys_mknod)
|
||||
SYSCALL(sys_chmod,sys_chmod,compat_sys_chmod) /* 15 */
|
||||
SYSCALL(sys_lchown16,sys_ni_syscall,compat_sys_s390_lchown16) /* old lchown16 syscall*/
|
||||
NI_SYSCALL /* old break syscall holder */
|
||||
NI_SYSCALL /* old stat syscall holder */
|
||||
SYSCALL(sys_lseek,sys_lseek,compat_sys_lseek)
|
||||
SYSCALL(sys_getpid,sys_getpid,sys_getpid) /* 20 */
|
||||
SYSCALL(sys_mount,sys_mount,compat_sys_mount)
|
||||
SYSCALL(sys_oldumount,sys_oldumount,compat_sys_oldumount)
|
||||
SYSCALL(sys_setuid16,sys_ni_syscall,compat_sys_s390_setuid16) /* old setuid16 syscall*/
|
||||
SYSCALL(sys_getuid16,sys_ni_syscall,compat_sys_s390_getuid16) /* old getuid16 syscall*/
|
||||
SYSCALL(sys_stime,sys_ni_syscall,compat_sys_stime) /* 25 old stime syscall */
|
||||
SYSCALL(sys_ptrace,sys_ptrace,compat_sys_ptrace)
|
||||
SYSCALL(sys_alarm,sys_alarm,compat_sys_alarm)
|
||||
NI_SYSCALL /* old fstat syscall */
|
||||
SYSCALL(sys_pause,sys_pause,sys_pause)
|
||||
SYSCALL(sys_utime,sys_utime,compat_sys_utime) /* 30 */
|
||||
NI_SYSCALL /* old stty syscall */
|
||||
NI_SYSCALL /* old gtty syscall */
|
||||
SYSCALL(sys_access,sys_access,compat_sys_access)
|
||||
SYSCALL(sys_nice,sys_nice,compat_sys_nice)
|
||||
NI_SYSCALL /* 35 old ftime syscall */
|
||||
SYSCALL(sys_sync,sys_sync,sys_sync)
|
||||
SYSCALL(sys_kill,sys_kill,compat_sys_kill)
|
||||
SYSCALL(sys_rename,sys_rename,compat_sys_rename)
|
||||
SYSCALL(sys_mkdir,sys_mkdir,compat_sys_mkdir)
|
||||
SYSCALL(sys_rmdir,sys_rmdir,compat_sys_rmdir) /* 40 */
|
||||
SYSCALL(sys_dup,sys_dup,compat_sys_dup)
|
||||
SYSCALL(sys_pipe,sys_pipe,compat_sys_pipe)
|
||||
SYSCALL(sys_times,sys_times,compat_sys_times)
|
||||
NI_SYSCALL /* old prof syscall */
|
||||
SYSCALL(sys_brk,sys_brk,compat_sys_brk) /* 45 */
|
||||
SYSCALL(sys_setgid16,sys_ni_syscall,compat_sys_s390_setgid16) /* old setgid16 syscall*/
|
||||
SYSCALL(sys_getgid16,sys_ni_syscall,compat_sys_s390_getgid16) /* old getgid16 syscall*/
|
||||
SYSCALL(sys_signal,sys_signal,compat_sys_signal)
|
||||
SYSCALL(sys_geteuid16,sys_ni_syscall,compat_sys_s390_geteuid16) /* old geteuid16 syscall */
|
||||
SYSCALL(sys_getegid16,sys_ni_syscall,compat_sys_s390_getegid16) /* 50 old getegid16 syscall */
|
||||
SYSCALL(sys_acct,sys_acct,compat_sys_acct)
|
||||
SYSCALL(sys_umount,sys_umount,compat_sys_umount)
|
||||
NI_SYSCALL /* old lock syscall */
|
||||
SYSCALL(sys_ioctl,sys_ioctl,compat_sys_ioctl)
|
||||
SYSCALL(sys_fcntl,sys_fcntl,compat_sys_fcntl) /* 55 */
|
||||
NI_SYSCALL /* intel mpx syscall */
|
||||
SYSCALL(sys_setpgid,sys_setpgid,compat_sys_setpgid)
|
||||
NI_SYSCALL /* old ulimit syscall */
|
||||
NI_SYSCALL /* old uname syscall */
|
||||
SYSCALL(sys_umask,sys_umask,compat_sys_umask) /* 60 */
|
||||
SYSCALL(sys_chroot,sys_chroot,compat_sys_chroot)
|
||||
SYSCALL(sys_ustat,sys_ustat,compat_sys_ustat)
|
||||
SYSCALL(sys_dup2,sys_dup2,compat_sys_dup2)
|
||||
SYSCALL(sys_getppid,sys_getppid,sys_getppid)
|
||||
SYSCALL(sys_getpgrp,sys_getpgrp,sys_getpgrp) /* 65 */
|
||||
SYSCALL(sys_setsid,sys_setsid,sys_setsid)
|
||||
SYSCALL(sys_sigaction,sys_sigaction,compat_sys_sigaction)
|
||||
NI_SYSCALL /* old sgetmask syscall*/
|
||||
NI_SYSCALL /* old ssetmask syscall*/
|
||||
SYSCALL(sys_setreuid16,sys_ni_syscall,compat_sys_s390_setreuid16) /* old setreuid16 syscall */
|
||||
SYSCALL(sys_setregid16,sys_ni_syscall,compat_sys_s390_setregid16) /* old setregid16 syscall */
|
||||
SYSCALL(sys_sigsuspend,sys_sigsuspend,compat_sys_sigsuspend)
|
||||
SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending)
|
||||
SYSCALL(sys_sethostname,sys_sethostname,compat_sys_sethostname)
|
||||
SYSCALL(sys_setrlimit,sys_setrlimit,compat_sys_setrlimit) /* 75 */
|
||||
SYSCALL(sys_old_getrlimit,sys_getrlimit,compat_sys_old_getrlimit)
|
||||
SYSCALL(sys_getrusage,sys_getrusage,compat_sys_getrusage)
|
||||
SYSCALL(sys_gettimeofday,sys_gettimeofday,compat_sys_gettimeofday)
|
||||
SYSCALL(sys_settimeofday,sys_settimeofday,compat_sys_settimeofday)
|
||||
SYSCALL(sys_getgroups16,sys_ni_syscall,compat_sys_s390_getgroups16) /* 80 old getgroups16 syscall */
|
||||
SYSCALL(sys_setgroups16,sys_ni_syscall,compat_sys_s390_setgroups16) /* old setgroups16 syscall */
|
||||
NI_SYSCALL /* old select syscall */
|
||||
SYSCALL(sys_symlink,sys_symlink,compat_sys_symlink)
|
||||
NI_SYSCALL /* old lstat syscall */
|
||||
SYSCALL(sys_readlink,sys_readlink,compat_sys_readlink) /* 85 */
|
||||
SYSCALL(sys_uselib,sys_uselib,compat_sys_uselib)
|
||||
SYSCALL(sys_swapon,sys_swapon,compat_sys_swapon)
|
||||
SYSCALL(sys_reboot,sys_reboot,compat_sys_reboot)
|
||||
SYSCALL(sys_ni_syscall,sys_ni_syscall,compat_sys_old_readdir) /* old readdir syscall */
|
||||
SYSCALL(sys_old_mmap,sys_old_mmap,compat_sys_s390_old_mmap) /* 90 */
|
||||
SYSCALL(sys_munmap,sys_munmap,compat_sys_munmap)
|
||||
SYSCALL(sys_truncate,sys_truncate,compat_sys_truncate)
|
||||
SYSCALL(sys_ftruncate,sys_ftruncate,compat_sys_ftruncate)
|
||||
SYSCALL(sys_fchmod,sys_fchmod,compat_sys_fchmod)
|
||||
SYSCALL(sys_fchown16,sys_ni_syscall,compat_sys_s390_fchown16) /* 95 old fchown16 syscall*/
|
||||
SYSCALL(sys_getpriority,sys_getpriority,compat_sys_getpriority)
|
||||
SYSCALL(sys_setpriority,sys_setpriority,compat_sys_setpriority)
|
||||
NI_SYSCALL /* old profil syscall */
|
||||
SYSCALL(sys_statfs,sys_statfs,compat_sys_statfs)
|
||||
SYSCALL(sys_fstatfs,sys_fstatfs,compat_sys_fstatfs) /* 100 */
|
||||
NI_SYSCALL /* ioperm for i386 */
|
||||
SYSCALL(sys_socketcall,sys_socketcall,compat_sys_socketcall)
|
||||
SYSCALL(sys_syslog,sys_syslog,compat_sys_syslog)
|
||||
SYSCALL(sys_setitimer,sys_setitimer,compat_sys_setitimer)
|
||||
SYSCALL(sys_getitimer,sys_getitimer,compat_sys_getitimer) /* 105 */
|
||||
SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat)
|
||||
SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat)
|
||||
SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat)
|
||||
NI_SYSCALL /* old uname syscall */
|
||||
SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,compat_sys_lookup_dcookie) /* 110 */
|
||||
SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup)
|
||||
NI_SYSCALL /* old "idle" system call */
|
||||
NI_SYSCALL /* vm86old for i386 */
|
||||
SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4)
|
||||
SYSCALL(sys_swapoff,sys_swapoff,compat_sys_swapoff) /* 115 */
|
||||
SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo)
|
||||
SYSCALL(sys_s390_ipc,sys_s390_ipc,compat_sys_s390_ipc)
|
||||
SYSCALL(sys_fsync,sys_fsync,compat_sys_fsync)
|
||||
SYSCALL(sys_sigreturn,sys_sigreturn,compat_sys_sigreturn)
|
||||
SYSCALL(sys_clone,sys_clone,compat_sys_clone) /* 120 */
|
||||
SYSCALL(sys_setdomainname,sys_setdomainname,compat_sys_setdomainname)
|
||||
SYSCALL(sys_newuname,sys_newuname,compat_sys_newuname)
|
||||
NI_SYSCALL /* modify_ldt for i386 */
|
||||
SYSCALL(sys_adjtimex,sys_adjtimex,compat_sys_adjtimex)
|
||||
SYSCALL(sys_mprotect,sys_mprotect,compat_sys_mprotect) /* 125 */
|
||||
SYSCALL(sys_sigprocmask,sys_sigprocmask,compat_sys_sigprocmask)
|
||||
NI_SYSCALL /* old "create module" */
|
||||
SYSCALL(sys_init_module,sys_init_module,compat_sys_init_module)
|
||||
SYSCALL(sys_delete_module,sys_delete_module,compat_sys_delete_module)
|
||||
NI_SYSCALL /* 130: old get_kernel_syms */
|
||||
SYSCALL(sys_quotactl,sys_quotactl,compat_sys_quotactl)
|
||||
SYSCALL(sys_getpgid,sys_getpgid,compat_sys_getpgid)
|
||||
SYSCALL(sys_fchdir,sys_fchdir,compat_sys_fchdir)
|
||||
SYSCALL(sys_bdflush,sys_bdflush,compat_sys_bdflush)
|
||||
SYSCALL(sys_sysfs,sys_sysfs,compat_sys_sysfs) /* 135 */
|
||||
SYSCALL(sys_personality,sys_s390_personality,compat_sys_s390_personality)
|
||||
NI_SYSCALL /* for afs_syscall */
|
||||
SYSCALL(sys_setfsuid16,sys_ni_syscall,compat_sys_s390_setfsuid16) /* old setfsuid16 syscall */
|
||||
SYSCALL(sys_setfsgid16,sys_ni_syscall,compat_sys_s390_setfsgid16) /* old setfsgid16 syscall */
|
||||
SYSCALL(sys_llseek,sys_llseek,compat_sys_llseek) /* 140 */
|
||||
SYSCALL(sys_getdents,sys_getdents,compat_sys_getdents)
|
||||
SYSCALL(sys_select,sys_select,compat_sys_select)
|
||||
SYSCALL(sys_flock,sys_flock,compat_sys_flock)
|
||||
SYSCALL(sys_msync,sys_msync,compat_sys_msync)
|
||||
SYSCALL(sys_readv,sys_readv,compat_sys_readv) /* 145 */
|
||||
SYSCALL(sys_writev,sys_writev,compat_sys_writev)
|
||||
SYSCALL(sys_getsid,sys_getsid,compat_sys_getsid)
|
||||
SYSCALL(sys_fdatasync,sys_fdatasync,compat_sys_fdatasync)
|
||||
SYSCALL(sys_sysctl,sys_sysctl,compat_sys_sysctl)
|
||||
SYSCALL(sys_mlock,sys_mlock,compat_sys_mlock) /* 150 */
|
||||
SYSCALL(sys_munlock,sys_munlock,compat_sys_munlock)
|
||||
SYSCALL(sys_mlockall,sys_mlockall,compat_sys_mlockall)
|
||||
SYSCALL(sys_munlockall,sys_munlockall,sys_munlockall)
|
||||
SYSCALL(sys_sched_setparam,sys_sched_setparam,compat_sys_sched_setparam)
|
||||
SYSCALL(sys_sched_getparam,sys_sched_getparam,compat_sys_sched_getparam) /* 155 */
|
||||
SYSCALL(sys_sched_setscheduler,sys_sched_setscheduler,compat_sys_sched_setscheduler)
|
||||
SYSCALL(sys_sched_getscheduler,sys_sched_getscheduler,compat_sys_sched_getscheduler)
|
||||
SYSCALL(sys_sched_yield,sys_sched_yield,sys_sched_yield)
|
||||
SYSCALL(sys_sched_get_priority_max,sys_sched_get_priority_max,compat_sys_sched_get_priority_max)
|
||||
SYSCALL(sys_sched_get_priority_min,sys_sched_get_priority_min,compat_sys_sched_get_priority_min) /* 160 */
|
||||
SYSCALL(sys_sched_rr_get_interval,sys_sched_rr_get_interval,compat_sys_sched_rr_get_interval)
|
||||
SYSCALL(sys_nanosleep,sys_nanosleep,compat_sys_nanosleep)
|
||||
SYSCALL(sys_mremap,sys_mremap,compat_sys_mremap)
|
||||
SYSCALL(sys_setresuid16,sys_ni_syscall,compat_sys_s390_setresuid16) /* old setresuid16 syscall */
|
||||
SYSCALL(sys_getresuid16,sys_ni_syscall,compat_sys_s390_getresuid16) /* 165 old getresuid16 syscall */
|
||||
NI_SYSCALL /* for vm86 */
|
||||
NI_SYSCALL /* old sys_query_module */
|
||||
SYSCALL(sys_poll,sys_poll,compat_sys_poll)
|
||||
NI_SYSCALL /* old nfsservctl */
|
||||
SYSCALL(sys_setresgid16,sys_ni_syscall,compat_sys_s390_setresgid16) /* 170 old setresgid16 syscall */
|
||||
SYSCALL(sys_getresgid16,sys_ni_syscall,compat_sys_s390_getresgid16) /* old getresgid16 syscall */
|
||||
SYSCALL(sys_prctl,sys_prctl,compat_sys_prctl)
|
||||
SYSCALL(sys_rt_sigreturn,sys_rt_sigreturn,compat_sys_rt_sigreturn)
|
||||
SYSCALL(sys_rt_sigaction,sys_rt_sigaction,compat_sys_rt_sigaction)
|
||||
SYSCALL(sys_rt_sigprocmask,sys_rt_sigprocmask,compat_sys_rt_sigprocmask) /* 175 */
|
||||
SYSCALL(sys_rt_sigpending,sys_rt_sigpending,compat_sys_rt_sigpending)
|
||||
SYSCALL(sys_rt_sigtimedwait,sys_rt_sigtimedwait,compat_sys_rt_sigtimedwait)
|
||||
SYSCALL(sys_rt_sigqueueinfo,sys_rt_sigqueueinfo,compat_sys_rt_sigqueueinfo)
|
||||
SYSCALL(sys_rt_sigsuspend,sys_rt_sigsuspend,compat_sys_rt_sigsuspend)
|
||||
SYSCALL(sys_pread64,sys_pread64,compat_sys_s390_pread64) /* 180 */
|
||||
SYSCALL(sys_pwrite64,sys_pwrite64,compat_sys_s390_pwrite64)
|
||||
SYSCALL(sys_chown16,sys_ni_syscall,compat_sys_s390_chown16) /* old chown16 syscall */
|
||||
SYSCALL(sys_getcwd,sys_getcwd,compat_sys_getcwd)
|
||||
SYSCALL(sys_capget,sys_capget,compat_sys_capget)
|
||||
SYSCALL(sys_capset,sys_capset,compat_sys_capset) /* 185 */
|
||||
SYSCALL(sys_sigaltstack,sys_sigaltstack,compat_sys_sigaltstack)
|
||||
SYSCALL(sys_sendfile,sys_sendfile64,compat_sys_sendfile)
|
||||
NI_SYSCALL /* streams1 */
|
||||
NI_SYSCALL /* streams2 */
|
||||
SYSCALL(sys_vfork,sys_vfork,sys_vfork) /* 190 */
|
||||
SYSCALL(sys_getrlimit,sys_getrlimit,compat_sys_getrlimit)
|
||||
SYSCALL(sys_mmap2,sys_mmap2,compat_sys_s390_mmap2)
|
||||
SYSCALL(sys_truncate64,sys_ni_syscall,compat_sys_s390_truncate64)
|
||||
SYSCALL(sys_ftruncate64,sys_ni_syscall,compat_sys_s390_ftruncate64)
|
||||
SYSCALL(sys_stat64,sys_ni_syscall,compat_sys_s390_stat64) /* 195 */
|
||||
SYSCALL(sys_lstat64,sys_ni_syscall,compat_sys_s390_lstat64)
|
||||
SYSCALL(sys_fstat64,sys_ni_syscall,compat_sys_s390_fstat64)
|
||||
SYSCALL(sys_lchown,sys_lchown,compat_sys_lchown)
|
||||
SYSCALL(sys_getuid,sys_getuid,sys_getuid)
|
||||
SYSCALL(sys_getgid,sys_getgid,sys_getgid) /* 200 */
|
||||
SYSCALL(sys_geteuid,sys_geteuid,sys_geteuid)
|
||||
SYSCALL(sys_getegid,sys_getegid,sys_getegid)
|
||||
SYSCALL(sys_setreuid,sys_setreuid,compat_sys_setreuid)
|
||||
SYSCALL(sys_setregid,sys_setregid,compat_sys_setregid)
|
||||
SYSCALL(sys_getgroups,sys_getgroups,compat_sys_getgroups) /* 205 */
|
||||
SYSCALL(sys_setgroups,sys_setgroups,compat_sys_setgroups)
|
||||
SYSCALL(sys_fchown,sys_fchown,compat_sys_fchown)
|
||||
SYSCALL(sys_setresuid,sys_setresuid,compat_sys_setresuid)
|
||||
SYSCALL(sys_getresuid,sys_getresuid,compat_sys_getresuid)
|
||||
SYSCALL(sys_setresgid,sys_setresgid,compat_sys_setresgid) /* 210 */
|
||||
SYSCALL(sys_getresgid,sys_getresgid,compat_sys_getresgid)
|
||||
SYSCALL(sys_chown,sys_chown,compat_sys_chown)
|
||||
SYSCALL(sys_setuid,sys_setuid,compat_sys_setuid)
|
||||
SYSCALL(sys_setgid,sys_setgid,compat_sys_setgid)
|
||||
SYSCALL(sys_setfsuid,sys_setfsuid,compat_sys_setfsuid) /* 215 */
|
||||
SYSCALL(sys_setfsgid,sys_setfsgid,compat_sys_setfsgid)
|
||||
SYSCALL(sys_pivot_root,sys_pivot_root,compat_sys_pivot_root)
|
||||
SYSCALL(sys_mincore,sys_mincore,compat_sys_mincore)
|
||||
SYSCALL(sys_madvise,sys_madvise,compat_sys_madvise)
|
||||
SYSCALL(sys_getdents64,sys_getdents64,compat_sys_getdents64) /* 220 */
|
||||
SYSCALL(sys_fcntl64,sys_ni_syscall,compat_sys_fcntl64)
|
||||
SYSCALL(sys_readahead,sys_readahead,compat_sys_s390_readahead)
|
||||
SYSCALL(sys_sendfile64,sys_ni_syscall,compat_sys_sendfile64)
|
||||
SYSCALL(sys_setxattr,sys_setxattr,compat_sys_setxattr)
|
||||
SYSCALL(sys_lsetxattr,sys_lsetxattr,compat_sys_lsetxattr) /* 225 */
|
||||
SYSCALL(sys_fsetxattr,sys_fsetxattr,compat_sys_fsetxattr)
|
||||
SYSCALL(sys_getxattr,sys_getxattr,compat_sys_getxattr)
|
||||
SYSCALL(sys_lgetxattr,sys_lgetxattr,compat_sys_lgetxattr)
|
||||
SYSCALL(sys_fgetxattr,sys_fgetxattr,compat_sys_fgetxattr)
|
||||
SYSCALL(sys_listxattr,sys_listxattr,compat_sys_listxattr) /* 230 */
|
||||
SYSCALL(sys_llistxattr,sys_llistxattr,compat_sys_llistxattr)
|
||||
SYSCALL(sys_flistxattr,sys_flistxattr,compat_sys_flistxattr)
|
||||
SYSCALL(sys_removexattr,sys_removexattr,compat_sys_removexattr)
|
||||
SYSCALL(sys_lremovexattr,sys_lremovexattr,compat_sys_lremovexattr)
|
||||
SYSCALL(sys_fremovexattr,sys_fremovexattr,compat_sys_fremovexattr) /* 235 */
|
||||
SYSCALL(sys_gettid,sys_gettid,sys_gettid)
|
||||
SYSCALL(sys_tkill,sys_tkill,compat_sys_tkill)
|
||||
SYSCALL(sys_futex,sys_futex,compat_sys_futex)
|
||||
SYSCALL(sys_sched_setaffinity,sys_sched_setaffinity,compat_sys_sched_setaffinity)
|
||||
SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,compat_sys_sched_getaffinity) /* 240 */
|
||||
SYSCALL(sys_tgkill,sys_tgkill,compat_sys_tgkill)
|
||||
NI_SYSCALL /* reserved for TUX */
|
||||
SYSCALL(sys_io_setup,sys_io_setup,compat_sys_io_setup)
|
||||
SYSCALL(sys_io_destroy,sys_io_destroy,compat_sys_io_destroy)
|
||||
SYSCALL(sys_io_getevents,sys_io_getevents,compat_sys_io_getevents) /* 245 */
|
||||
SYSCALL(sys_io_submit,sys_io_submit,compat_sys_io_submit)
|
||||
SYSCALL(sys_io_cancel,sys_io_cancel,compat_sys_io_cancel)
|
||||
SYSCALL(sys_exit_group,sys_exit_group,compat_sys_exit_group)
|
||||
SYSCALL(sys_epoll_create,sys_epoll_create,compat_sys_epoll_create)
|
||||
SYSCALL(sys_epoll_ctl,sys_epoll_ctl,compat_sys_epoll_ctl) /* 250 */
|
||||
SYSCALL(sys_epoll_wait,sys_epoll_wait,compat_sys_epoll_wait)
|
||||
SYSCALL(sys_set_tid_address,sys_set_tid_address,compat_sys_set_tid_address)
|
||||
SYSCALL(sys_s390_fadvise64,sys_fadvise64_64,compat_sys_s390_fadvise64)
|
||||
SYSCALL(sys_timer_create,sys_timer_create,compat_sys_timer_create)
|
||||
SYSCALL(sys_timer_settime,sys_timer_settime,compat_sys_timer_settime) /* 255 */
|
||||
SYSCALL(sys_timer_gettime,sys_timer_gettime,compat_sys_timer_gettime)
|
||||
SYSCALL(sys_timer_getoverrun,sys_timer_getoverrun,compat_sys_timer_getoverrun)
|
||||
SYSCALL(sys_timer_delete,sys_timer_delete,compat_sys_timer_delete)
|
||||
SYSCALL(sys_clock_settime,sys_clock_settime,compat_sys_clock_settime)
|
||||
SYSCALL(sys_clock_gettime,sys_clock_gettime,compat_sys_clock_gettime) /* 260 */
|
||||
SYSCALL(sys_clock_getres,sys_clock_getres,compat_sys_clock_getres)
|
||||
SYSCALL(sys_clock_nanosleep,sys_clock_nanosleep,compat_sys_clock_nanosleep)
|
||||
NI_SYSCALL /* reserved for vserver */
|
||||
SYSCALL(sys_s390_fadvise64_64,sys_ni_syscall,compat_sys_s390_fadvise64_64)
|
||||
SYSCALL(sys_statfs64,sys_statfs64,compat_sys_statfs64)
|
||||
SYSCALL(sys_fstatfs64,sys_fstatfs64,compat_sys_fstatfs64)
|
||||
SYSCALL(sys_remap_file_pages,sys_remap_file_pages,compat_sys_remap_file_pages)
|
||||
NI_SYSCALL /* 268 sys_mbind */
|
||||
NI_SYSCALL /* 269 sys_get_mempolicy */
|
||||
NI_SYSCALL /* 270 sys_set_mempolicy */
|
||||
SYSCALL(sys_mq_open,sys_mq_open,compat_sys_mq_open)
|
||||
SYSCALL(sys_mq_unlink,sys_mq_unlink,compat_sys_mq_unlink)
|
||||
SYSCALL(sys_mq_timedsend,sys_mq_timedsend,compat_sys_mq_timedsend)
|
||||
SYSCALL(sys_mq_timedreceive,sys_mq_timedreceive,compat_sys_mq_timedreceive)
|
||||
SYSCALL(sys_mq_notify,sys_mq_notify,compat_sys_mq_notify) /* 275 */
|
||||
SYSCALL(sys_mq_getsetattr,sys_mq_getsetattr,compat_sys_mq_getsetattr)
|
||||
SYSCALL(sys_kexec_load,sys_kexec_load,compat_sys_kexec_load)
|
||||
SYSCALL(sys_add_key,sys_add_key,compat_sys_add_key)
|
||||
SYSCALL(sys_request_key,sys_request_key,compat_sys_request_key)
|
||||
SYSCALL(sys_keyctl,sys_keyctl,compat_sys_keyctl) /* 280 */
|
||||
SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid)
|
||||
SYSCALL(sys_ioprio_set,sys_ioprio_set,compat_sys_ioprio_set)
|
||||
SYSCALL(sys_ioprio_get,sys_ioprio_get,compat_sys_ioprio_get)
|
||||
SYSCALL(sys_inotify_init,sys_inotify_init,sys_inotify_init)
|
||||
SYSCALL(sys_inotify_add_watch,sys_inotify_add_watch,compat_sys_inotify_add_watch) /* 285 */
|
||||
SYSCALL(sys_inotify_rm_watch,sys_inotify_rm_watch,compat_sys_inotify_rm_watch)
|
||||
NI_SYSCALL /* 287 sys_migrate_pages */
|
||||
SYSCALL(sys_openat,sys_openat,compat_sys_openat)
|
||||
SYSCALL(sys_mkdirat,sys_mkdirat,compat_sys_mkdirat)
|
||||
SYSCALL(sys_mknodat,sys_mknodat,compat_sys_mknodat) /* 290 */
|
||||
SYSCALL(sys_fchownat,sys_fchownat,compat_sys_fchownat)
|
||||
SYSCALL(sys_futimesat,sys_futimesat,compat_sys_futimesat)
|
||||
SYSCALL(sys_fstatat64,sys_newfstatat,compat_sys_s390_fstatat64)
|
||||
SYSCALL(sys_unlinkat,sys_unlinkat,compat_sys_unlinkat)
|
||||
SYSCALL(sys_renameat,sys_renameat,compat_sys_renameat) /* 295 */
|
||||
SYSCALL(sys_linkat,sys_linkat,compat_sys_linkat)
|
||||
SYSCALL(sys_symlinkat,sys_symlinkat,compat_sys_symlinkat)
|
||||
SYSCALL(sys_readlinkat,sys_readlinkat,compat_sys_readlinkat)
|
||||
SYSCALL(sys_fchmodat,sys_fchmodat,compat_sys_fchmodat)
|
||||
SYSCALL(sys_faccessat,sys_faccessat,compat_sys_faccessat) /* 300 */
|
||||
SYSCALL(sys_pselect6,sys_pselect6,compat_sys_pselect6)
|
||||
SYSCALL(sys_ppoll,sys_ppoll,compat_sys_ppoll)
|
||||
SYSCALL(sys_unshare,sys_unshare,compat_sys_unshare)
|
||||
SYSCALL(sys_set_robust_list,sys_set_robust_list,compat_sys_set_robust_list)
|
||||
SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list)
|
||||
SYSCALL(sys_splice,sys_splice,compat_sys_splice)
|
||||
SYSCALL(sys_sync_file_range,sys_sync_file_range,compat_sys_s390_sync_file_range)
|
||||
SYSCALL(sys_tee,sys_tee,compat_sys_tee)
|
||||
SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice)
|
||||
NI_SYSCALL /* 310 sys_move_pages */
|
||||
SYSCALL(sys_getcpu,sys_getcpu,compat_sys_getcpu)
|
||||
SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait)
|
||||
SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes)
|
||||
SYSCALL(sys_s390_fallocate,sys_fallocate,compat_sys_s390_fallocate)
|
||||
SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat) /* 315 */
|
||||
SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd)
|
||||
NI_SYSCALL /* 0 */
|
||||
SYSCALL(sys_exit,compat_sys_exit)
|
||||
SYSCALL(sys_fork,sys_fork)
|
||||
SYSCALL(sys_read,compat_sys_s390_read)
|
||||
SYSCALL(sys_write,compat_sys_s390_write)
|
||||
SYSCALL(sys_open,compat_sys_open) /* 5 */
|
||||
SYSCALL(sys_close,compat_sys_close)
|
||||
SYSCALL(sys_restart_syscall,sys_restart_syscall)
|
||||
SYSCALL(sys_creat,compat_sys_creat)
|
||||
SYSCALL(sys_link,compat_sys_link)
|
||||
SYSCALL(sys_unlink,compat_sys_unlink) /* 10 */
|
||||
SYSCALL(sys_execve,compat_sys_execve)
|
||||
SYSCALL(sys_chdir,compat_sys_chdir)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_time) /* old time syscall */
|
||||
SYSCALL(sys_mknod,compat_sys_mknod)
|
||||
SYSCALL(sys_chmod,compat_sys_chmod) /* 15 */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_lchown16) /* old lchown16 syscall*/
|
||||
NI_SYSCALL /* old break syscall holder */
|
||||
NI_SYSCALL /* old stat syscall holder */
|
||||
SYSCALL(sys_lseek,compat_sys_lseek)
|
||||
SYSCALL(sys_getpid,sys_getpid) /* 20 */
|
||||
SYSCALL(sys_mount,compat_sys_mount)
|
||||
SYSCALL(sys_oldumount,compat_sys_oldumount)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setuid16) /* old setuid16 syscall*/
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_getuid16) /* old getuid16 syscall*/
|
||||
SYSCALL(sys_ni_syscall,compat_sys_stime) /* 25 old stime syscall */
|
||||
SYSCALL(sys_ptrace,compat_sys_ptrace)
|
||||
SYSCALL(sys_alarm,compat_sys_alarm)
|
||||
NI_SYSCALL /* old fstat syscall */
|
||||
SYSCALL(sys_pause,sys_pause)
|
||||
SYSCALL(sys_utime,compat_sys_utime) /* 30 */
|
||||
NI_SYSCALL /* old stty syscall */
|
||||
NI_SYSCALL /* old gtty syscall */
|
||||
SYSCALL(sys_access,compat_sys_access)
|
||||
SYSCALL(sys_nice,compat_sys_nice)
|
||||
NI_SYSCALL /* 35 old ftime syscall */
|
||||
SYSCALL(sys_sync,sys_sync)
|
||||
SYSCALL(sys_kill,compat_sys_kill)
|
||||
SYSCALL(sys_rename,compat_sys_rename)
|
||||
SYSCALL(sys_mkdir,compat_sys_mkdir)
|
||||
SYSCALL(sys_rmdir,compat_sys_rmdir) /* 40 */
|
||||
SYSCALL(sys_dup,compat_sys_dup)
|
||||
SYSCALL(sys_pipe,compat_sys_pipe)
|
||||
SYSCALL(sys_times,compat_sys_times)
|
||||
NI_SYSCALL /* old prof syscall */
|
||||
SYSCALL(sys_brk,compat_sys_brk) /* 45 */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setgid16) /* old setgid16 syscall*/
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_getgid16) /* old getgid16 syscall*/
|
||||
SYSCALL(sys_signal,compat_sys_signal)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_geteuid16) /* old geteuid16 syscall */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_getegid16) /* 50 old getegid16 syscall */
|
||||
SYSCALL(sys_acct,compat_sys_acct)
|
||||
SYSCALL(sys_umount,compat_sys_umount)
|
||||
NI_SYSCALL /* old lock syscall */
|
||||
SYSCALL(sys_ioctl,compat_sys_ioctl)
|
||||
SYSCALL(sys_fcntl,compat_sys_fcntl) /* 55 */
|
||||
NI_SYSCALL /* intel mpx syscall */
|
||||
SYSCALL(sys_setpgid,compat_sys_setpgid)
|
||||
NI_SYSCALL /* old ulimit syscall */
|
||||
NI_SYSCALL /* old uname syscall */
|
||||
SYSCALL(sys_umask,compat_sys_umask) /* 60 */
|
||||
SYSCALL(sys_chroot,compat_sys_chroot)
|
||||
SYSCALL(sys_ustat,compat_sys_ustat)
|
||||
SYSCALL(sys_dup2,compat_sys_dup2)
|
||||
SYSCALL(sys_getppid,sys_getppid)
|
||||
SYSCALL(sys_getpgrp,sys_getpgrp) /* 65 */
|
||||
SYSCALL(sys_setsid,sys_setsid)
|
||||
SYSCALL(sys_sigaction,compat_sys_sigaction)
|
||||
NI_SYSCALL /* old sgetmask syscall*/
|
||||
NI_SYSCALL /* old ssetmask syscall*/
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setreuid16) /* old setreuid16 syscall */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setregid16) /* old setregid16 syscall */
|
||||
SYSCALL(sys_sigsuspend,compat_sys_sigsuspend)
|
||||
SYSCALL(sys_sigpending,compat_sys_sigpending)
|
||||
SYSCALL(sys_sethostname,compat_sys_sethostname)
|
||||
SYSCALL(sys_setrlimit,compat_sys_setrlimit) /* 75 */
|
||||
SYSCALL(sys_getrlimit,compat_sys_old_getrlimit)
|
||||
SYSCALL(sys_getrusage,compat_sys_getrusage)
|
||||
SYSCALL(sys_gettimeofday,compat_sys_gettimeofday)
|
||||
SYSCALL(sys_settimeofday,compat_sys_settimeofday)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_getgroups16) /* 80 old getgroups16 syscall */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setgroups16) /* old setgroups16 syscall */
|
||||
NI_SYSCALL /* old select syscall */
|
||||
SYSCALL(sys_symlink,compat_sys_symlink)
|
||||
NI_SYSCALL /* old lstat syscall */
|
||||
SYSCALL(sys_readlink,compat_sys_readlink) /* 85 */
|
||||
SYSCALL(sys_uselib,compat_sys_uselib)
|
||||
SYSCALL(sys_swapon,compat_sys_swapon)
|
||||
SYSCALL(sys_reboot,compat_sys_reboot)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_old_readdir) /* old readdir syscall */
|
||||
SYSCALL(sys_old_mmap,compat_sys_s390_old_mmap) /* 90 */
|
||||
SYSCALL(sys_munmap,compat_sys_munmap)
|
||||
SYSCALL(sys_truncate,compat_sys_truncate)
|
||||
SYSCALL(sys_ftruncate,compat_sys_ftruncate)
|
||||
SYSCALL(sys_fchmod,compat_sys_fchmod)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_fchown16) /* 95 old fchown16 syscall*/
|
||||
SYSCALL(sys_getpriority,compat_sys_getpriority)
|
||||
SYSCALL(sys_setpriority,compat_sys_setpriority)
|
||||
NI_SYSCALL /* old profil syscall */
|
||||
SYSCALL(sys_statfs,compat_sys_statfs)
|
||||
SYSCALL(sys_fstatfs,compat_sys_fstatfs) /* 100 */
|
||||
NI_SYSCALL /* ioperm for i386 */
|
||||
SYSCALL(sys_socketcall,compat_sys_socketcall)
|
||||
SYSCALL(sys_syslog,compat_sys_syslog)
|
||||
SYSCALL(sys_setitimer,compat_sys_setitimer)
|
||||
SYSCALL(sys_getitimer,compat_sys_getitimer) /* 105 */
|
||||
SYSCALL(sys_newstat,compat_sys_newstat)
|
||||
SYSCALL(sys_newlstat,compat_sys_newlstat)
|
||||
SYSCALL(sys_newfstat,compat_sys_newfstat)
|
||||
NI_SYSCALL /* old uname syscall */
|
||||
SYSCALL(sys_lookup_dcookie,compat_sys_lookup_dcookie) /* 110 */
|
||||
SYSCALL(sys_vhangup,sys_vhangup)
|
||||
NI_SYSCALL /* old "idle" system call */
|
||||
NI_SYSCALL /* vm86old for i386 */
|
||||
SYSCALL(sys_wait4,compat_sys_wait4)
|
||||
SYSCALL(sys_swapoff,compat_sys_swapoff) /* 115 */
|
||||
SYSCALL(sys_sysinfo,compat_sys_sysinfo)
|
||||
SYSCALL(sys_s390_ipc,compat_sys_s390_ipc)
|
||||
SYSCALL(sys_fsync,compat_sys_fsync)
|
||||
SYSCALL(sys_sigreturn,compat_sys_sigreturn)
|
||||
SYSCALL(sys_clone,compat_sys_clone) /* 120 */
|
||||
SYSCALL(sys_setdomainname,compat_sys_setdomainname)
|
||||
SYSCALL(sys_newuname,compat_sys_newuname)
|
||||
NI_SYSCALL /* modify_ldt for i386 */
|
||||
SYSCALL(sys_adjtimex,compat_sys_adjtimex)
|
||||
SYSCALL(sys_mprotect,compat_sys_mprotect) /* 125 */
|
||||
SYSCALL(sys_sigprocmask,compat_sys_sigprocmask)
|
||||
NI_SYSCALL /* old "create module" */
|
||||
SYSCALL(sys_init_module,compat_sys_init_module)
|
||||
SYSCALL(sys_delete_module,compat_sys_delete_module)
|
||||
NI_SYSCALL /* 130: old get_kernel_syms */
|
||||
SYSCALL(sys_quotactl,compat_sys_quotactl)
|
||||
SYSCALL(sys_getpgid,compat_sys_getpgid)
|
||||
SYSCALL(sys_fchdir,compat_sys_fchdir)
|
||||
SYSCALL(sys_bdflush,compat_sys_bdflush)
|
||||
SYSCALL(sys_sysfs,compat_sys_sysfs) /* 135 */
|
||||
SYSCALL(sys_s390_personality,compat_sys_s390_personality)
|
||||
NI_SYSCALL /* for afs_syscall */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setfsuid16) /* old setfsuid16 syscall */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setfsgid16) /* old setfsgid16 syscall */
|
||||
SYSCALL(sys_llseek,compat_sys_llseek) /* 140 */
|
||||
SYSCALL(sys_getdents,compat_sys_getdents)
|
||||
SYSCALL(sys_select,compat_sys_select)
|
||||
SYSCALL(sys_flock,compat_sys_flock)
|
||||
SYSCALL(sys_msync,compat_sys_msync)
|
||||
SYSCALL(sys_readv,compat_sys_readv) /* 145 */
|
||||
SYSCALL(sys_writev,compat_sys_writev)
|
||||
SYSCALL(sys_getsid,compat_sys_getsid)
|
||||
SYSCALL(sys_fdatasync,compat_sys_fdatasync)
|
||||
SYSCALL(sys_sysctl,compat_sys_sysctl)
|
||||
SYSCALL(sys_mlock,compat_sys_mlock) /* 150 */
|
||||
SYSCALL(sys_munlock,compat_sys_munlock)
|
||||
SYSCALL(sys_mlockall,compat_sys_mlockall)
|
||||
SYSCALL(sys_munlockall,sys_munlockall)
|
||||
SYSCALL(sys_sched_setparam,compat_sys_sched_setparam)
|
||||
SYSCALL(sys_sched_getparam,compat_sys_sched_getparam) /* 155 */
|
||||
SYSCALL(sys_sched_setscheduler,compat_sys_sched_setscheduler)
|
||||
SYSCALL(sys_sched_getscheduler,compat_sys_sched_getscheduler)
|
||||
SYSCALL(sys_sched_yield,sys_sched_yield)
|
||||
SYSCALL(sys_sched_get_priority_max,compat_sys_sched_get_priority_max)
|
||||
SYSCALL(sys_sched_get_priority_min,compat_sys_sched_get_priority_min) /* 160 */
|
||||
SYSCALL(sys_sched_rr_get_interval,compat_sys_sched_rr_get_interval)
|
||||
SYSCALL(sys_nanosleep,compat_sys_nanosleep)
|
||||
SYSCALL(sys_mremap,compat_sys_mremap)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setresuid16) /* old setresuid16 syscall */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_getresuid16) /* 165 old getresuid16 syscall */
|
||||
NI_SYSCALL /* for vm86 */
|
||||
NI_SYSCALL /* old sys_query_module */
|
||||
SYSCALL(sys_poll,compat_sys_poll)
|
||||
NI_SYSCALL /* old nfsservctl */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_setresgid16) /* 170 old setresgid16 syscall */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_getresgid16) /* old getresgid16 syscall */
|
||||
SYSCALL(sys_prctl,compat_sys_prctl)
|
||||
SYSCALL(sys_rt_sigreturn,compat_sys_rt_sigreturn)
|
||||
SYSCALL(sys_rt_sigaction,compat_sys_rt_sigaction)
|
||||
SYSCALL(sys_rt_sigprocmask,compat_sys_rt_sigprocmask) /* 175 */
|
||||
SYSCALL(sys_rt_sigpending,compat_sys_rt_sigpending)
|
||||
SYSCALL(sys_rt_sigtimedwait,compat_sys_rt_sigtimedwait)
|
||||
SYSCALL(sys_rt_sigqueueinfo,compat_sys_rt_sigqueueinfo)
|
||||
SYSCALL(sys_rt_sigsuspend,compat_sys_rt_sigsuspend)
|
||||
SYSCALL(sys_pread64,compat_sys_s390_pread64) /* 180 */
|
||||
SYSCALL(sys_pwrite64,compat_sys_s390_pwrite64)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_chown16) /* old chown16 syscall */
|
||||
SYSCALL(sys_getcwd,compat_sys_getcwd)
|
||||
SYSCALL(sys_capget,compat_sys_capget)
|
||||
SYSCALL(sys_capset,compat_sys_capset) /* 185 */
|
||||
SYSCALL(sys_sigaltstack,compat_sys_sigaltstack)
|
||||
SYSCALL(sys_sendfile64,compat_sys_sendfile)
|
||||
NI_SYSCALL /* streams1 */
|
||||
NI_SYSCALL /* streams2 */
|
||||
SYSCALL(sys_vfork,sys_vfork) /* 190 */
|
||||
SYSCALL(sys_getrlimit,compat_sys_getrlimit)
|
||||
SYSCALL(sys_mmap2,compat_sys_s390_mmap2)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_truncate64)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_ftruncate64)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_stat64) /* 195 */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_lstat64)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_fstat64)
|
||||
SYSCALL(sys_lchown,compat_sys_lchown)
|
||||
SYSCALL(sys_getuid,sys_getuid)
|
||||
SYSCALL(sys_getgid,sys_getgid) /* 200 */
|
||||
SYSCALL(sys_geteuid,sys_geteuid)
|
||||
SYSCALL(sys_getegid,sys_getegid)
|
||||
SYSCALL(sys_setreuid,compat_sys_setreuid)
|
||||
SYSCALL(sys_setregid,compat_sys_setregid)
|
||||
SYSCALL(sys_getgroups,compat_sys_getgroups) /* 205 */
|
||||
SYSCALL(sys_setgroups,compat_sys_setgroups)
|
||||
SYSCALL(sys_fchown,compat_sys_fchown)
|
||||
SYSCALL(sys_setresuid,compat_sys_setresuid)
|
||||
SYSCALL(sys_getresuid,compat_sys_getresuid)
|
||||
SYSCALL(sys_setresgid,compat_sys_setresgid) /* 210 */
|
||||
SYSCALL(sys_getresgid,compat_sys_getresgid)
|
||||
SYSCALL(sys_chown,compat_sys_chown)
|
||||
SYSCALL(sys_setuid,compat_sys_setuid)
|
||||
SYSCALL(sys_setgid,compat_sys_setgid)
|
||||
SYSCALL(sys_setfsuid,compat_sys_setfsuid) /* 215 */
|
||||
SYSCALL(sys_setfsgid,compat_sys_setfsgid)
|
||||
SYSCALL(sys_pivot_root,compat_sys_pivot_root)
|
||||
SYSCALL(sys_mincore,compat_sys_mincore)
|
||||
SYSCALL(sys_madvise,compat_sys_madvise)
|
||||
SYSCALL(sys_getdents64,compat_sys_getdents64) /* 220 */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_fcntl64)
|
||||
SYSCALL(sys_readahead,compat_sys_s390_readahead)
|
||||
SYSCALL(sys_ni_syscall,compat_sys_sendfile64)
|
||||
SYSCALL(sys_setxattr,compat_sys_setxattr)
|
||||
SYSCALL(sys_lsetxattr,compat_sys_lsetxattr) /* 225 */
|
||||
SYSCALL(sys_fsetxattr,compat_sys_fsetxattr)
|
||||
SYSCALL(sys_getxattr,compat_sys_getxattr)
|
||||
SYSCALL(sys_lgetxattr,compat_sys_lgetxattr)
|
||||
SYSCALL(sys_fgetxattr,compat_sys_fgetxattr)
|
||||
SYSCALL(sys_listxattr,compat_sys_listxattr) /* 230 */
|
||||
SYSCALL(sys_llistxattr,compat_sys_llistxattr)
|
||||
SYSCALL(sys_flistxattr,compat_sys_flistxattr)
|
||||
SYSCALL(sys_removexattr,compat_sys_removexattr)
|
||||
SYSCALL(sys_lremovexattr,compat_sys_lremovexattr)
|
||||
SYSCALL(sys_fremovexattr,compat_sys_fremovexattr) /* 235 */
|
||||
SYSCALL(sys_gettid,sys_gettid)
|
||||
SYSCALL(sys_tkill,compat_sys_tkill)
|
||||
SYSCALL(sys_futex,compat_sys_futex)
|
||||
SYSCALL(sys_sched_setaffinity,compat_sys_sched_setaffinity)
|
||||
SYSCALL(sys_sched_getaffinity,compat_sys_sched_getaffinity) /* 240 */
|
||||
SYSCALL(sys_tgkill,compat_sys_tgkill)
|
||||
NI_SYSCALL /* reserved for TUX */
|
||||
SYSCALL(sys_io_setup,compat_sys_io_setup)
|
||||
SYSCALL(sys_io_destroy,compat_sys_io_destroy)
|
||||
SYSCALL(sys_io_getevents,compat_sys_io_getevents) /* 245 */
|
||||
SYSCALL(sys_io_submit,compat_sys_io_submit)
|
||||
SYSCALL(sys_io_cancel,compat_sys_io_cancel)
|
||||
SYSCALL(sys_exit_group,compat_sys_exit_group)
|
||||
SYSCALL(sys_epoll_create,compat_sys_epoll_create)
|
||||
SYSCALL(sys_epoll_ctl,compat_sys_epoll_ctl) /* 250 */
|
||||
SYSCALL(sys_epoll_wait,compat_sys_epoll_wait)
|
||||
SYSCALL(sys_set_tid_address,compat_sys_set_tid_address)
|
||||
SYSCALL(sys_fadvise64_64,compat_sys_s390_fadvise64)
|
||||
SYSCALL(sys_timer_create,compat_sys_timer_create)
|
||||
SYSCALL(sys_timer_settime,compat_sys_timer_settime) /* 255 */
|
||||
SYSCALL(sys_timer_gettime,compat_sys_timer_gettime)
|
||||
SYSCALL(sys_timer_getoverrun,compat_sys_timer_getoverrun)
|
||||
SYSCALL(sys_timer_delete,compat_sys_timer_delete)
|
||||
SYSCALL(sys_clock_settime,compat_sys_clock_settime)
|
||||
SYSCALL(sys_clock_gettime,compat_sys_clock_gettime) /* 260 */
|
||||
SYSCALL(sys_clock_getres,compat_sys_clock_getres)
|
||||
SYSCALL(sys_clock_nanosleep,compat_sys_clock_nanosleep)
|
||||
NI_SYSCALL /* reserved for vserver */
|
||||
SYSCALL(sys_ni_syscall,compat_sys_s390_fadvise64_64)
|
||||
SYSCALL(sys_statfs64,compat_sys_statfs64)
|
||||
SYSCALL(sys_fstatfs64,compat_sys_fstatfs64)
|
||||
SYSCALL(sys_remap_file_pages,compat_sys_remap_file_pages)
|
||||
NI_SYSCALL /* 268 sys_mbind */
|
||||
NI_SYSCALL /* 269 sys_get_mempolicy */
|
||||
NI_SYSCALL /* 270 sys_set_mempolicy */
|
||||
SYSCALL(sys_mq_open,compat_sys_mq_open)
|
||||
SYSCALL(sys_mq_unlink,compat_sys_mq_unlink)
|
||||
SYSCALL(sys_mq_timedsend,compat_sys_mq_timedsend)
|
||||
SYSCALL(sys_mq_timedreceive,compat_sys_mq_timedreceive)
|
||||
SYSCALL(sys_mq_notify,compat_sys_mq_notify) /* 275 */
|
||||
SYSCALL(sys_mq_getsetattr,compat_sys_mq_getsetattr)
|
||||
SYSCALL(sys_kexec_load,compat_sys_kexec_load)
|
||||
SYSCALL(sys_add_key,compat_sys_add_key)
|
||||
SYSCALL(sys_request_key,compat_sys_request_key)
|
||||
SYSCALL(sys_keyctl,compat_sys_keyctl) /* 280 */
|
||||
SYSCALL(sys_waitid,compat_sys_waitid)
|
||||
SYSCALL(sys_ioprio_set,compat_sys_ioprio_set)
|
||||
SYSCALL(sys_ioprio_get,compat_sys_ioprio_get)
|
||||
SYSCALL(sys_inotify_init,sys_inotify_init)
|
||||
SYSCALL(sys_inotify_add_watch,compat_sys_inotify_add_watch) /* 285 */
|
||||
SYSCALL(sys_inotify_rm_watch,compat_sys_inotify_rm_watch)
|
||||
NI_SYSCALL /* 287 sys_migrate_pages */
|
||||
SYSCALL(sys_openat,compat_sys_openat)
|
||||
SYSCALL(sys_mkdirat,compat_sys_mkdirat)
|
||||
SYSCALL(sys_mknodat,compat_sys_mknodat) /* 290 */
|
||||
SYSCALL(sys_fchownat,compat_sys_fchownat)
|
||||
SYSCALL(sys_futimesat,compat_sys_futimesat)
|
||||
SYSCALL(sys_newfstatat,compat_sys_s390_fstatat64)
|
||||
SYSCALL(sys_unlinkat,compat_sys_unlinkat)
|
||||
SYSCALL(sys_renameat,compat_sys_renameat) /* 295 */
|
||||
SYSCALL(sys_linkat,compat_sys_linkat)
|
||||
SYSCALL(sys_symlinkat,compat_sys_symlinkat)
|
||||
SYSCALL(sys_readlinkat,compat_sys_readlinkat)
|
||||
SYSCALL(sys_fchmodat,compat_sys_fchmodat)
|
||||
SYSCALL(sys_faccessat,compat_sys_faccessat) /* 300 */
|
||||
SYSCALL(sys_pselect6,compat_sys_pselect6)
|
||||
SYSCALL(sys_ppoll,compat_sys_ppoll)
|
||||
SYSCALL(sys_unshare,compat_sys_unshare)
|
||||
SYSCALL(sys_set_robust_list,compat_sys_set_robust_list)
|
||||
SYSCALL(sys_get_robust_list,compat_sys_get_robust_list)
|
||||
SYSCALL(sys_splice,compat_sys_splice)
|
||||
SYSCALL(sys_sync_file_range,compat_sys_s390_sync_file_range)
|
||||
SYSCALL(sys_tee,compat_sys_tee)
|
||||
SYSCALL(sys_vmsplice,compat_sys_vmsplice)
|
||||
NI_SYSCALL /* 310 sys_move_pages */
|
||||
SYSCALL(sys_getcpu,compat_sys_getcpu)
|
||||
SYSCALL(sys_epoll_pwait,compat_sys_epoll_pwait)
|
||||
SYSCALL(sys_utimes,compat_sys_utimes)
|
||||
SYSCALL(sys_fallocate,compat_sys_s390_fallocate)
|
||||
SYSCALL(sys_utimensat,compat_sys_utimensat) /* 315 */
|
||||
SYSCALL(sys_signalfd,compat_sys_signalfd)
|
||||
NI_SYSCALL /* 317 old sys_timer_fd */
|
||||
SYSCALL(sys_eventfd,sys_eventfd,compat_sys_eventfd)
|
||||
SYSCALL(sys_timerfd_create,sys_timerfd_create,compat_sys_timerfd_create)
|
||||
SYSCALL(sys_timerfd_settime,sys_timerfd_settime,compat_sys_timerfd_settime) /* 320 */
|
||||
SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime)
|
||||
SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4)
|
||||
SYSCALL(sys_eventfd2,sys_eventfd2,compat_sys_eventfd2)
|
||||
SYSCALL(sys_inotify_init1,sys_inotify_init1,compat_sys_inotify_init1)
|
||||
SYSCALL(sys_pipe2,sys_pipe2,compat_sys_pipe2) /* 325 */
|
||||
SYSCALL(sys_dup3,sys_dup3,compat_sys_dup3)
|
||||
SYSCALL(sys_epoll_create1,sys_epoll_create1,compat_sys_epoll_create1)
|
||||
SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv)
|
||||
SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev)
|
||||
SYSCALL(sys_rt_tgsigqueueinfo,sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo) /* 330 */
|
||||
SYSCALL(sys_perf_event_open,sys_perf_event_open,compat_sys_perf_event_open)
|
||||
SYSCALL(sys_fanotify_init,sys_fanotify_init,compat_sys_fanotify_init)
|
||||
SYSCALL(sys_fanotify_mark,sys_fanotify_mark,compat_sys_fanotify_mark)
|
||||
SYSCALL(sys_prlimit64,sys_prlimit64,compat_sys_prlimit64)
|
||||
SYSCALL(sys_name_to_handle_at,sys_name_to_handle_at,compat_sys_name_to_handle_at) /* 335 */
|
||||
SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at)
|
||||
SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime)
|
||||
SYSCALL(sys_syncfs,sys_syncfs,compat_sys_syncfs)
|
||||
SYSCALL(sys_setns,sys_setns,compat_sys_setns)
|
||||
SYSCALL(sys_process_vm_readv,sys_process_vm_readv,compat_sys_process_vm_readv) /* 340 */
|
||||
SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev)
|
||||
SYSCALL(sys_ni_syscall,sys_s390_runtime_instr,compat_sys_s390_runtime_instr)
|
||||
SYSCALL(sys_kcmp,sys_kcmp,compat_sys_kcmp)
|
||||
SYSCALL(sys_finit_module,sys_finit_module,compat_sys_finit_module)
|
||||
SYSCALL(sys_sched_setattr,sys_sched_setattr,compat_sys_sched_setattr) /* 345 */
|
||||
SYSCALL(sys_sched_getattr,sys_sched_getattr,compat_sys_sched_getattr)
|
||||
SYSCALL(sys_renameat2,sys_renameat2,compat_sys_renameat2)
|
||||
SYSCALL(sys_seccomp,sys_seccomp,compat_sys_seccomp)
|
||||
SYSCALL(sys_getrandom,sys_getrandom,compat_sys_getrandom)
|
||||
SYSCALL(sys_memfd_create,sys_memfd_create,compat_sys_memfd_create) /* 350 */
|
||||
SYSCALL(sys_bpf,sys_bpf,compat_sys_bpf)
|
||||
SYSCALL(sys_ni_syscall,sys_s390_pci_mmio_write,compat_sys_s390_pci_mmio_write)
|
||||
SYSCALL(sys_ni_syscall,sys_s390_pci_mmio_read,compat_sys_s390_pci_mmio_read)
|
||||
SYSCALL(sys_execveat,sys_execveat,compat_sys_execveat)
|
||||
SYSCALL(sys_eventfd,compat_sys_eventfd)
|
||||
SYSCALL(sys_timerfd_create,compat_sys_timerfd_create)
|
||||
SYSCALL(sys_timerfd_settime,compat_sys_timerfd_settime) /* 320 */
|
||||
SYSCALL(sys_timerfd_gettime,compat_sys_timerfd_gettime)
|
||||
SYSCALL(sys_signalfd4,compat_sys_signalfd4)
|
||||
SYSCALL(sys_eventfd2,compat_sys_eventfd2)
|
||||
SYSCALL(sys_inotify_init1,compat_sys_inotify_init1)
|
||||
SYSCALL(sys_pipe2,compat_sys_pipe2) /* 325 */
|
||||
SYSCALL(sys_dup3,compat_sys_dup3)
|
||||
SYSCALL(sys_epoll_create1,compat_sys_epoll_create1)
|
||||
SYSCALL(sys_preadv,compat_sys_preadv)
|
||||
SYSCALL(sys_pwritev,compat_sys_pwritev)
|
||||
SYSCALL(sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo) /* 330 */
|
||||
SYSCALL(sys_perf_event_open,compat_sys_perf_event_open)
|
||||
SYSCALL(sys_fanotify_init,compat_sys_fanotify_init)
|
||||
SYSCALL(sys_fanotify_mark,compat_sys_fanotify_mark)
|
||||
SYSCALL(sys_prlimit64,compat_sys_prlimit64)
|
||||
SYSCALL(sys_name_to_handle_at,compat_sys_name_to_handle_at) /* 335 */
|
||||
SYSCALL(sys_open_by_handle_at,compat_sys_open_by_handle_at)
|
||||
SYSCALL(sys_clock_adjtime,compat_sys_clock_adjtime)
|
||||
SYSCALL(sys_syncfs,compat_sys_syncfs)
|
||||
SYSCALL(sys_setns,compat_sys_setns)
|
||||
SYSCALL(sys_process_vm_readv,compat_sys_process_vm_readv) /* 340 */
|
||||
SYSCALL(sys_process_vm_writev,compat_sys_process_vm_writev)
|
||||
SYSCALL(sys_s390_runtime_instr,compat_sys_s390_runtime_instr)
|
||||
SYSCALL(sys_kcmp,compat_sys_kcmp)
|
||||
SYSCALL(sys_finit_module,compat_sys_finit_module)
|
||||
SYSCALL(sys_sched_setattr,compat_sys_sched_setattr) /* 345 */
|
||||
SYSCALL(sys_sched_getattr,compat_sys_sched_getattr)
|
||||
SYSCALL(sys_renameat2,compat_sys_renameat2)
|
||||
SYSCALL(sys_seccomp,compat_sys_seccomp)
|
||||
SYSCALL(sys_getrandom,compat_sys_getrandom)
|
||||
SYSCALL(sys_memfd_create,compat_sys_memfd_create) /* 350 */
|
||||
SYSCALL(sys_bpf,compat_sys_bpf)
|
||||
SYSCALL(sys_s390_pci_mmio_write,compat_sys_s390_pci_mmio_write)
|
||||
SYSCALL(sys_s390_pci_mmio_read,compat_sys_s390_pci_mmio_read)
|
||||
SYSCALL(sys_execveat,compat_sys_execveat)
|
||||
|
|
|
@ -421,7 +421,7 @@ int topology_cpu_init(struct cpu *cpu)
|
|||
return sysfs_create_group(&cpu->dev.kobj, &topology_cpu_attr_group);
|
||||
}
|
||||
|
||||
const struct cpumask *cpu_thread_mask(int cpu)
|
||||
static const struct cpumask *cpu_thread_mask(int cpu)
|
||||
{
|
||||
return &per_cpu(cpu_topology, cpu).thread_mask;
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ int show_unhandled_signals = 1;
|
|||
|
||||
static inline void __user *get_trap_ip(struct pt_regs *regs)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
unsigned long address;
|
||||
|
||||
if (regs->int_code & 0x200)
|
||||
|
@ -35,10 +34,6 @@ static inline void __user *get_trap_ip(struct pt_regs *regs)
|
|||
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)
|
||||
|
@ -153,11 +148,8 @@ DO_ERROR_INFO(privileged_op, SIGILL, ILL_PRVOPC,
|
|||
"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)
|
||||
{
|
||||
|
@ -182,7 +174,7 @@ static inline void do_fp_trap(struct pt_regs *regs, int fpc)
|
|||
void translation_exception(struct pt_regs *regs)
|
||||
{
|
||||
/* May never happen. */
|
||||
die(regs, "Translation exception");
|
||||
panic("Translation exception");
|
||||
}
|
||||
|
||||
void illegal_op(struct pt_regs *regs)
|
||||
|
@ -210,29 +202,6 @@ void illegal_op(struct pt_regs *regs)
|
|||
#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;
|
||||
|
@ -247,71 +216,14 @@ void illegal_op(struct pt_regs *regs)
|
|||
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;
|
||||
|
@ -377,7 +289,6 @@ static int __init disable_vector_extension(char *str)
|
|||
return 1;
|
||||
}
|
||||
__setup("novx", disable_vector_extension);
|
||||
#endif
|
||||
|
||||
void data_exception(struct pt_regs *regs)
|
||||
{
|
||||
|
@ -386,65 +297,7 @@ 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) {
|
||||
|
@ -454,13 +307,11 @@ void data_exception(struct pt_regs *regs)
|
|||
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");
|
||||
|
|
|
@ -188,7 +188,9 @@ static void adjust_psw_addr(psw_t *psw, unsigned long len)
|
|||
else if (put_user(*(input), __ptr)) \
|
||||
__rc = EMU_ADDRESSING; \
|
||||
if (__rc == 0) \
|
||||
sim_stor_event(regs, __ptr, mask + 1); \
|
||||
sim_stor_event(regs, \
|
||||
(void __force *)__ptr, \
|
||||
mask + 1); \
|
||||
__rc; \
|
||||
})
|
||||
|
||||
|
|
|
@ -32,19 +32,17 @@
|
|||
#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
|
||||
|
@ -87,7 +85,6 @@ static void vdso_init_data(struct vdso_data *vd)
|
|||
vd->ectg_available = test_facility(31);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
/*
|
||||
* Allocate/free per cpu vdso data.
|
||||
*/
|
||||
|
@ -169,7 +166,6 @@ static void vdso_init_cr5(void)
|
|||
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
|
||||
|
@ -191,7 +187,6 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
|||
if (!uses_interp)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
vdso_pagelist = vdso64_pagelist;
|
||||
vdso_pages = vdso64_pages;
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
@ -200,11 +195,6 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
|||
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
|
||||
|
@ -268,7 +258,7 @@ static int __init vdso_init(void)
|
|||
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;
|
||||
|
@ -287,7 +277,6 @@ static int __init vdso_init(void)
|
|||
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;
|
||||
|
@ -307,7 +296,6 @@ static int __init vdso_init(void)
|
|||
if (vdso_alloc_per_cpu(&S390_lowcore))
|
||||
BUG();
|
||||
vdso_init_cr5();
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
get_page(virt_to_page(vdso_data));
|
||||
|
||||
|
|
|
@ -6,17 +6,10 @@
|
|||
#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 */
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
#
|
||||
|
||||
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 += mem.o
|
||||
lib-$(CONFIG_SMP) += spinlock.o
|
||||
lib-$(CONFIG_KPROBES) += probes.o
|
||||
lib-$(CONFIG_UPROBES) += probes.o
|
||||
|
|
|
@ -1,147 +0,0 @@
|
|||
/*
|
||||
* __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 */
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* 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)
|
|
@ -1,78 +0,0 @@
|
|||
# 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
|
|
@ -15,20 +15,6 @@
|
|||
#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,
|
||||
|
@ -41,29 +27,29 @@ 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)
|
||||
|
@ -82,32 +68,32 @@ static inline unsigned long copy_from_user_mvcp(void *x, const void __user *ptr,
|
|||
" 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)
|
||||
|
@ -134,19 +120,19 @@ static inline unsigned long copy_to_user_mvcos(void __user *ptr, const void *x,
|
|||
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)
|
||||
|
@ -165,22 +151,22 @@ static inline unsigned long copy_to_user_mvcs(void __user *ptr, const void *x,
|
|||
" 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)
|
||||
|
@ -208,11 +194,11 @@ static inline unsigned long copy_in_user_mvcos(void __user *to, const void __use
|
|||
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)
|
||||
|
@ -228,23 +214,23 @@ static inline unsigned long copy_in_user_mvc(void __user *to, const void __user
|
|||
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)
|
||||
|
@ -269,18 +255,18 @@ static inline unsigned long clear_user_mvcos(void __user *to, unsigned long size
|
|||
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)
|
||||
|
@ -295,28 +281,28 @@ static inline unsigned long clear_user_xc(void __user *to, unsigned long size)
|
|||
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)
|
||||
|
@ -341,12 +327,12 @@ static inline unsigned long strnlen_user_srst(const char __user *src,
|
|||
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)
|
||||
|
@ -399,7 +385,7 @@ early_param("uaccess_primary", parse_uaccess_pt);
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
#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);
|
|
@ -1,7 +0,0 @@
|
|||
#
|
||||
# Makefile for the FPU instruction emulation.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_MATHEMU) := math.o
|
||||
|
||||
ccflags-y := -I$(src) -Iinclude/math-emu -w
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -18,9 +18,7 @@ enum address_markers_idx {
|
|||
KERNEL_END_NR,
|
||||
VMEMMAP_NR,
|
||||
VMALLOC_NR,
|
||||
#ifdef CONFIG_64BIT
|
||||
MODULES_NR,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct addr_marker address_markers[] = {
|
||||
|
@ -29,9 +27,7 @@ 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 }
|
||||
};
|
||||
|
||||
|
@ -127,12 +123,6 @@ static void walk_pte_level(struct seq_file *m, struct pg_state *st,
|
|||
}
|
||||
}
|
||||
|
||||
#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)
|
||||
{
|
||||
|
@ -145,7 +135,7 @@ static void walk_pmd_level(struct seq_file *m, struct pg_state *st,
|
|||
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);
|
||||
|
@ -155,12 +145,6 @@ static void walk_pmd_level(struct seq_file *m, struct pg_state *st,
|
|||
}
|
||||
}
|
||||
|
||||
#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)
|
||||
{
|
||||
|
@ -173,7 +157,7 @@ static void walk_pud_level(struct seq_file *m, struct pg_state *st,
|
|||
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);
|
||||
|
@ -230,13 +214,9 @@ static int pt_dump_init(void)
|
|||
* 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);
|
||||
|
|
|
@ -51,7 +51,6 @@ struct qout64 {
|
|||
struct qrange range[6];
|
||||
};
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
struct qrange_old {
|
||||
unsigned int start; /* last byte type */
|
||||
unsigned int end; /* last byte reserved */
|
||||
|
@ -65,7 +64,6 @@ struct qout64_old {
|
|||
int segrcnt;
|
||||
struct qrange_old range[6];
|
||||
};
|
||||
#endif
|
||||
|
||||
struct qin64 {
|
||||
char qopcode;
|
||||
|
@ -103,7 +101,6 @@ static int scode_set;
|
|||
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;
|
||||
|
@ -135,7 +132,6 @@ dcss_set_subcodes(void)
|
|||
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;
|
||||
|
@ -208,7 +204,6 @@ dcss_diag(int *func, void *parameter,
|
|||
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(
|
||||
|
@ -225,13 +220,6 @@ dcss_diag(int *func, void *parameter,
|
|||
" 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;
|
||||
|
@ -281,7 +269,6 @@ query_segment_type (struct dcss_segment *seg)
|
|||
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) {
|
||||
|
@ -307,7 +294,6 @@ query_segment_type (struct dcss_segment *seg)
|
|||
}
|
||||
kfree(qout_old);
|
||||
}
|
||||
#endif
|
||||
if (qout->segcnt > 6) {
|
||||
rc = -EOPNOTSUPP;
|
||||
goto out_free;
|
||||
|
|
|
@ -36,15 +36,9 @@
|
|||
#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
|
||||
|
@ -54,7 +48,6 @@
|
|||
|
||||
static unsigned long store_indication __read_mostly;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
static int __init fault_init(void)
|
||||
{
|
||||
if (test_facility(75))
|
||||
|
@ -62,7 +55,6 @@ static int __init fault_init(void)
|
|||
return 0;
|
||||
}
|
||||
early_initcall(fault_init);
|
||||
#endif
|
||||
|
||||
static inline int notify_page_fault(struct pt_regs *regs)
|
||||
{
|
||||
|
@ -133,7 +125,6 @@ static int bad_address(void *p)
|
|||
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);
|
||||
|
@ -187,33 +178,6 @@ bad:
|
|||
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;
|
||||
|
|
|
@ -106,11 +106,9 @@ static inline int gup_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
|
|||
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();
|
||||
|
@ -145,11 +143,9 @@ static inline int gup_pud_range(pgd_t *pgdp, pgd_t pgd, unsigned long addr,
|
|||
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();
|
||||
|
|
|
@ -105,7 +105,6 @@ void __init paging_init(void)
|
|||
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;
|
||||
|
@ -113,10 +112,6 @@ void __init paging_init(void)
|
|||
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);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Access kernel memory without faulting -- s390 specific implementation.
|
||||
*
|
||||
* Copyright IBM Corp. 2009
|
||||
* Copyright IBM Corp. 2009, 2015
|
||||
*
|
||||
* Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
|
||||
*
|
||||
|
@ -16,51 +16,55 @@
|
|||
#include <asm/ctl_reg.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/*
|
||||
* This function writes to kernel memory bypassing DAT and possible
|
||||
* write protection. It copies one to four bytes from src to dst
|
||||
* using the stura instruction.
|
||||
* Returns the number of bytes copied or -EFAULT.
|
||||
*/
|
||||
static long probe_kernel_write_odd(void *dst, const void *src, size_t size)
|
||||
static notrace long s390_kernel_write_odd(void *dst, const void *src, size_t size)
|
||||
{
|
||||
unsigned long count, aligned;
|
||||
int offset, mask;
|
||||
int rc = -EFAULT;
|
||||
unsigned long aligned, offset, count;
|
||||
char tmp[8];
|
||||
|
||||
aligned = (unsigned long) dst & ~3UL;
|
||||
offset = (unsigned long) dst & 3;
|
||||
count = min_t(unsigned long, 4 - offset, size);
|
||||
mask = (0xf << (4 - count)) & 0xf;
|
||||
mask >>= offset;
|
||||
aligned = (unsigned long) dst & ~7UL;
|
||||
offset = (unsigned long) dst & 7UL;
|
||||
size = min(8UL - offset, size);
|
||||
count = size - 1;
|
||||
asm volatile(
|
||||
" bras 1,0f\n"
|
||||
" icm 0,0,0(%3)\n"
|
||||
"0: l 0,0(%1)\n"
|
||||
" lra %1,0(%1)\n"
|
||||
"1: ex %2,0(1)\n"
|
||||
"2: stura 0,%1\n"
|
||||
" la %0,0\n"
|
||||
"3:\n"
|
||||
EX_TABLE(0b,3b) EX_TABLE(1b,3b) EX_TABLE(2b,3b)
|
||||
: "+d" (rc), "+a" (aligned)
|
||||
: "a" (mask), "a" (src) : "cc", "memory", "0", "1");
|
||||
return rc ? rc : count;
|
||||
" mvc 0(1,%4),0(%5)\n"
|
||||
"0: mvc 0(8,%3),0(%0)\n"
|
||||
" ex %1,0(1)\n"
|
||||
" lg %1,0(%3)\n"
|
||||
" lra %0,0(%0)\n"
|
||||
" sturg %1,%0\n"
|
||||
: "+&a" (aligned), "+&a" (count), "=m" (tmp)
|
||||
: "a" (&tmp), "a" (&tmp[offset]), "a" (src)
|
||||
: "cc", "memory", "1");
|
||||
return size;
|
||||
}
|
||||
|
||||
long probe_kernel_write(void *dst, const void *src, size_t size)
|
||||
/*
|
||||
* s390_kernel_write - write to kernel memory bypassing DAT
|
||||
* @dst: destination address
|
||||
* @src: source address
|
||||
* @size: number of bytes to copy
|
||||
*
|
||||
* This function writes to kernel memory bypassing DAT and possible page table
|
||||
* write protection. It writes to the destination using the sturg instruction.
|
||||
* Therefore we have a read-modify-write sequence: the function reads eight
|
||||
* bytes from destination at an eight byte boundary, modifies the bytes
|
||||
* requested and writes the result back in a loop.
|
||||
*
|
||||
* Note: this means that this function may not be called concurrently on
|
||||
* several cpus with overlapping words, since this may potentially
|
||||
* cause data corruption.
|
||||
*/
|
||||
void notrace s390_kernel_write(void *dst, const void *src, size_t size)
|
||||
{
|
||||
long copied = 0;
|
||||
long copied;
|
||||
|
||||
while (size) {
|
||||
copied = probe_kernel_write_odd(dst, src, size);
|
||||
if (copied < 0)
|
||||
break;
|
||||
copied = s390_kernel_write_odd(dst, src, size);
|
||||
dst += copied;
|
||||
src += copied;
|
||||
size -= copied;
|
||||
}
|
||||
return copied < 0 ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
static int __memcpy_real(void *dest, void *src, size_t count)
|
||||
|
|
|
@ -36,10 +36,6 @@ void __init detect_memory_memblock(void)
|
|||
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 */
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include <asm/pgalloc.h>
|
||||
|
||||
unsigned long mmap_rnd_mask;
|
||||
unsigned long mmap_align_mask;
|
||||
static unsigned long mmap_align_mask;
|
||||
|
||||
static unsigned long stack_maxrandom_size(void)
|
||||
{
|
||||
|
@ -177,34 +177,6 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
|||
return addr;
|
||||
}
|
||||
|
||||
#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)
|
||||
{
|
||||
unsigned long random_factor = 0UL;
|
||||
|
||||
if (current->flags & PF_RANDOMIZE)
|
||||
random_factor = arch_mmap_rnd();
|
||||
|
||||
/*
|
||||
* 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(random_factor);
|
||||
mm->get_unmapped_area = arch_get_unmapped_area;
|
||||
} else {
|
||||
mm->mmap_base = mmap_base(random_factor);
|
||||
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)))
|
||||
|
@ -314,5 +286,3 @@ static int __init setup_mmap_rnd(void)
|
|||
return 0;
|
||||
}
|
||||
early_initcall(setup_mmap_rnd);
|
||||
|
||||
#endif
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче