Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull second s390 update from Martin Schwidefsky: "The big thing in this pull request is the UAPI patch from David, and worth mentioning is the page table dumper. The rest are small improvements and bug fixes." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/entry: fix svc number for TIF_SYSCALL system call restart s390/mm,vmem: fix vmem_add_mem()/vmem_remove_range() s390/vmalloc: have separate modules area s390/zcrypt: remove duplicated include from zcrypt_pcixcc.c s390/css_chars: remove superfluous ifdef s390/chsc: make headers usable s390/mm: let kernel text section always begin at 1MB s390/mm: fix mapping of read-only kernel text section s390/mm: add page table dumper s390: add support to start the kernel in 64 bit mode. s390/mm,pageattr: remove superfluous EXPORT_SYMBOLs s390/mm,pageattr: add more page table walk sanity checks s390/mm: fix pmd_huge() usage for kernel mapping s390/dcssblk: cleanup device attribute usage s390/mm: use pfmf instruction to initialize storage keys s390/facilities: cleanup PFMF and HPAGE machine facility detection UAPI: (Scripted) Disintegrate arch/s390/include/asm
This commit is contained in:
commit
e1b28147f6
@ -31,6 +31,18 @@ config DEBUG_STRICT_USER_COPY_CHECKS
|
||||
|
||||
If unsure, or if you run an older (pre 4.4) gcc, say N.
|
||||
|
||||
config S390_PTDUMP
|
||||
bool "Export kernel pagetable layout to userspace via debugfs"
|
||||
depends on DEBUG_KERNEL
|
||||
select DEBUG_FS
|
||||
---help---
|
||||
Say Y here if you want to show the kernel pagetable layout in a
|
||||
debugfs file. This information is only useful for kernel developers
|
||||
who are working in architecture specific areas of the kernel.
|
||||
It is probably not a good idea to enable this feature in a production
|
||||
kernel.
|
||||
If in doubt, say "N"
|
||||
|
||||
config DEBUG_SET_MODULE_RONX
|
||||
def_bool y
|
||||
depends on MODULES
|
||||
|
@ -1,17 +1,3 @@
|
||||
include include/asm-generic/Kbuild.asm
|
||||
|
||||
header-y += chpid.h
|
||||
header-y += chsc.h
|
||||
header-y += cmb.h
|
||||
header-y += dasd.h
|
||||
header-y += debug.h
|
||||
header-y += kvm_virtio.h
|
||||
header-y += monwriter.h
|
||||
header-y += qeth.h
|
||||
header-y += schid.h
|
||||
header-y += tape390.h
|
||||
header-y += ucontext.h
|
||||
header-y += vtoc.h
|
||||
header-y += zcrypt.h
|
||||
|
||||
generic-y += clkdev.h
|
||||
|
@ -1,24 +1,11 @@
|
||||
/*
|
||||
* Copyright IBM Corp. 2007
|
||||
* Copyright IBM Corp. 2007, 2012
|
||||
* Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_CHPID_H
|
||||
#define _ASM_S390_CHPID_H
|
||||
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define __MAX_CHPID 255
|
||||
|
||||
struct chp_id {
|
||||
u8 reserved1;
|
||||
u8 cssid;
|
||||
u8 reserved2;
|
||||
u8 id;
|
||||
} __attribute__((packed));
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <uapi/asm/chpid.h>
|
||||
#include <asm/cio.h>
|
||||
|
||||
static inline void chp_id_init(struct chp_id *chpid)
|
||||
@ -49,6 +36,4 @@ static inline int chp_id_is_valid(struct chp_id *chpid)
|
||||
|
||||
#define chp_id_for_each(c) \
|
||||
for (chp_id_init(c); chp_id_is_valid(c); chp_id_next(c))
|
||||
#endif /* __KERNEL */
|
||||
|
||||
#endif /* _ASM_S390_CHPID_H */
|
||||
|
@ -1,61 +1,12 @@
|
||||
#ifndef S390_CMB_H
|
||||
#define S390_CMB_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <uapi/asm/cmb.h>
|
||||
|
||||
/**
|
||||
* struct cmbdata - channel measurement block data for user space
|
||||
* @size: size of the stored data
|
||||
* @elapsed_time: time since last sampling
|
||||
* @ssch_rsch_count: number of ssch and rsch
|
||||
* @sample_count: number of samples
|
||||
* @device_connect_time: time of device connect
|
||||
* @function_pending_time: time of function pending
|
||||
* @device_disconnect_time: time of device disconnect
|
||||
* @control_unit_queuing_time: time of control unit queuing
|
||||
* @device_active_only_time: time of device active only
|
||||
* @device_busy_time: time of device busy (ext. format)
|
||||
* @initial_command_response_time: initial command response time (ext. format)
|
||||
*
|
||||
* All values are stored as 64 bit for simplicity, especially
|
||||
* in 32 bit emulation mode. All time values are normalized to
|
||||
* nanoseconds.
|
||||
* Currently, two formats are known, which differ by the size of
|
||||
* this structure, i.e. the last two members are only set when
|
||||
* the extended channel measurement facility (first shipped in
|
||||
* z990 machines) is activated.
|
||||
* Potentially, more fields could be added, which would result in a
|
||||
* new ioctl number.
|
||||
*/
|
||||
struct cmbdata {
|
||||
__u64 size;
|
||||
__u64 elapsed_time;
|
||||
/* basic and exended format: */
|
||||
__u64 ssch_rsch_count;
|
||||
__u64 sample_count;
|
||||
__u64 device_connect_time;
|
||||
__u64 function_pending_time;
|
||||
__u64 device_disconnect_time;
|
||||
__u64 control_unit_queuing_time;
|
||||
__u64 device_active_only_time;
|
||||
/* extended format only: */
|
||||
__u64 device_busy_time;
|
||||
__u64 initial_command_response_time;
|
||||
};
|
||||
|
||||
/* enable channel measurement */
|
||||
#define BIODASDCMFENABLE _IO(DASD_IOCTL_LETTER, 32)
|
||||
/* enable channel measurement */
|
||||
#define BIODASDCMFDISABLE _IO(DASD_IOCTL_LETTER, 33)
|
||||
/* read channel measurement data */
|
||||
#define BIODASDREADALLCMB _IOWR(DASD_IOCTL_LETTER, 33, struct cmbdata)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct ccw_device;
|
||||
extern int enable_cmf(struct ccw_device *cdev);
|
||||
extern int disable_cmf(struct ccw_device *cdev);
|
||||
extern u64 cmf_read(struct ccw_device *cdev, int index);
|
||||
extern int cmf_readall(struct ccw_device *cdev, struct cmbdata *data);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* S390_CMB_H */
|
||||
|
@ -3,8 +3,6 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
struct css_general_char {
|
||||
u64 : 12;
|
||||
u32 dynio : 1; /* bit 12 */
|
||||
@ -35,5 +33,4 @@ struct css_general_char {
|
||||
|
||||
extern struct css_general_char css_general_characteristics;
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif
|
||||
|
@ -3,39 +3,14 @@
|
||||
*
|
||||
* Copyright IBM Corp. 1999, 2000
|
||||
*/
|
||||
|
||||
#ifndef DEBUG_H
|
||||
#define DEBUG_H
|
||||
|
||||
#include <linux/fs.h>
|
||||
|
||||
/* Note:
|
||||
* struct __debug_entry must be defined outside of #ifdef __KERNEL__
|
||||
* in order to allow a user program to analyze the 'raw'-view.
|
||||
*/
|
||||
|
||||
struct __debug_entry{
|
||||
union {
|
||||
struct {
|
||||
unsigned long long clock:52;
|
||||
unsigned long long exception:1;
|
||||
unsigned long long level:3;
|
||||
unsigned long long cpuid:8;
|
||||
} fields;
|
||||
|
||||
unsigned long long stck;
|
||||
} id;
|
||||
void* caller;
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
#define __DEBUG_FEATURE_VERSION 2 /* version of debug feature */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/string.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/time.h>
|
||||
#include <uapi/asm/debug.h>
|
||||
|
||||
#define DEBUG_MAX_LEVEL 6 /* debug levels range from 0 to 6 */
|
||||
#define DEBUG_OFF_LEVEL -1 /* level where debug is switched off */
|
||||
@ -254,5 +229,4 @@ int debug_unregister_view(debug_info_t* id, struct debug_view* view);
|
||||
#define PRINT_FATAL(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
|
||||
#endif /* DASD_DEBUG */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* DEBUG_H */
|
||||
|
@ -9,12 +9,6 @@
|
||||
*
|
||||
* Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef __S390_KVM_PARA_H
|
||||
#define __S390_KVM_PARA_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/*
|
||||
* Hypercalls for KVM on s390. The calling convention is similar to the
|
||||
* s390 ABI, so we use R2-R6 for parameters 1-5. In addition we use R1
|
||||
@ -29,6 +23,12 @@
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2.
|
||||
*/
|
||||
#ifndef __S390_KVM_PARA_H
|
||||
#define __S390_KVM_PARA_H
|
||||
|
||||
#include <uapi/asm/kvm_para.h>
|
||||
|
||||
|
||||
|
||||
static inline long kvm_hypercall0(unsigned long nr)
|
||||
{
|
||||
@ -154,6 +154,4 @@ static inline bool kvm_check_and_clear_guest_paused(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __S390_KVM_PARA_H */
|
||||
|
@ -3,17 +3,13 @@
|
||||
*
|
||||
* Derived from "include/asm-i386/mman.h"
|
||||
*/
|
||||
|
||||
#ifndef __S390_MMAN_H__
|
||||
#define __S390_MMAN_H__
|
||||
|
||||
#include <asm-generic/mman.h>
|
||||
#include <uapi/asm/mman.h>
|
||||
|
||||
#if defined(__KERNEL__)
|
||||
#if !defined(__ASSEMBLY__) && defined(CONFIG_64BIT)
|
||||
int s390_mmap_check(unsigned long addr, unsigned long len);
|
||||
#define arch_mmap_check(addr,len,flags) s390_mmap_check(addr,len)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* __S390_MMAN_H__ */
|
||||
|
@ -30,12 +30,20 @@
|
||||
#include <asm/setup.h>
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
static unsigned long pfmf(unsigned long function, unsigned long address)
|
||||
{
|
||||
asm volatile(
|
||||
" .insn rre,0xb9af0000,%[function],%[address]"
|
||||
: [address] "+a" (address)
|
||||
: [function] "d" (function)
|
||||
: "memory");
|
||||
return address;
|
||||
}
|
||||
|
||||
static inline void clear_page(void *page)
|
||||
{
|
||||
if (MACHINE_HAS_PFMF) {
|
||||
asm volatile(
|
||||
" .insn rre,0xb9af0000,%0,%1"
|
||||
: : "d" (0x10000), "a" (page) : "memory", "cc");
|
||||
pfmf(0x10000, (unsigned long)page);
|
||||
} else {
|
||||
register unsigned long reg1 asm ("1") = 0;
|
||||
register void *reg2 asm ("2") = page;
|
||||
|
@ -119,13 +119,12 @@ static inline int is_zero_pfn(unsigned long pfn)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* The vmalloc area will always be on the topmost area of the kernel
|
||||
* mapping. We reserve 96MB (31bit) / 128GB (64bit) for vmalloc,
|
||||
* which should be enough for any sane case.
|
||||
* By putting vmalloc at the top, we maximise the gap between physical
|
||||
* memory and vmalloc to catch misplaced memory accesses. As a side
|
||||
* effect, this also makes sure that 64 bit module code cannot be used
|
||||
* as system call address.
|
||||
* The vmalloc and module area will always be on the topmost area of the kernel
|
||||
* mapping. We reserve 96MB (31bit) / 128GB (64bit) for vmalloc and modules.
|
||||
* On 64 bit kernels we have a 2GB area at the top of the vmalloc area where
|
||||
* modules will reside. That makes sure that inter module branches always
|
||||
* happen without trampolines and in addition the placement within a 2GB frame
|
||||
* is branch prediction unit friendly.
|
||||
*/
|
||||
extern unsigned long VMALLOC_START;
|
||||
extern unsigned long VMALLOC_END;
|
||||
@ -133,6 +132,14 @@ 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
|
||||
|
||||
/*
|
||||
* A 31 bit pagetable entry of S390 has following format:
|
||||
* | PFRA | | OS |
|
||||
@ -507,6 +514,15 @@ static inline int pmd_none(pmd_t pmd)
|
||||
return (pmd_val(pmd) & _SEGMENT_ENTRY_INV) != 0UL;
|
||||
}
|
||||
|
||||
static inline int pmd_large(pmd_t pmd)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
return !!(pmd_val(pmd) & _SEGMENT_ENTRY_LARGE);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int pmd_bad(pmd_t pmd)
|
||||
{
|
||||
unsigned long mask = ~_SEGMENT_ENTRY_ORIGIN & ~_SEGMENT_ENTRY_INV;
|
||||
|
@ -3,316 +3,17 @@
|
||||
* Copyright IBM Corp. 1999, 2000
|
||||
* Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
|
||||
*/
|
||||
|
||||
#ifndef _S390_PTRACE_H
|
||||
#define _S390_PTRACE_H
|
||||
|
||||
/*
|
||||
* Offsets in the user_regs_struct. They are used for the ptrace
|
||||
* system call and in entry.S
|
||||
*/
|
||||
#ifndef __s390x__
|
||||
|
||||
#define PT_PSWMASK 0x00
|
||||
#define PT_PSWADDR 0x04
|
||||
#define PT_GPR0 0x08
|
||||
#define PT_GPR1 0x0C
|
||||
#define PT_GPR2 0x10
|
||||
#define PT_GPR3 0x14
|
||||
#define PT_GPR4 0x18
|
||||
#define PT_GPR5 0x1C
|
||||
#define PT_GPR6 0x20
|
||||
#define PT_GPR7 0x24
|
||||
#define PT_GPR8 0x28
|
||||
#define PT_GPR9 0x2C
|
||||
#define PT_GPR10 0x30
|
||||
#define PT_GPR11 0x34
|
||||
#define PT_GPR12 0x38
|
||||
#define PT_GPR13 0x3C
|
||||
#define PT_GPR14 0x40
|
||||
#define PT_GPR15 0x44
|
||||
#define PT_ACR0 0x48
|
||||
#define PT_ACR1 0x4C
|
||||
#define PT_ACR2 0x50
|
||||
#define PT_ACR3 0x54
|
||||
#define PT_ACR4 0x58
|
||||
#define PT_ACR5 0x5C
|
||||
#define PT_ACR6 0x60
|
||||
#define PT_ACR7 0x64
|
||||
#define PT_ACR8 0x68
|
||||
#define PT_ACR9 0x6C
|
||||
#define PT_ACR10 0x70
|
||||
#define PT_ACR11 0x74
|
||||
#define PT_ACR12 0x78
|
||||
#define PT_ACR13 0x7C
|
||||
#define PT_ACR14 0x80
|
||||
#define PT_ACR15 0x84
|
||||
#define PT_ORIGGPR2 0x88
|
||||
#define PT_FPC 0x90
|
||||
/*
|
||||
* A nasty fact of life that the ptrace api
|
||||
* only supports passing of longs.
|
||||
*/
|
||||
#define PT_FPR0_HI 0x98
|
||||
#define PT_FPR0_LO 0x9C
|
||||
#define PT_FPR1_HI 0xA0
|
||||
#define PT_FPR1_LO 0xA4
|
||||
#define PT_FPR2_HI 0xA8
|
||||
#define PT_FPR2_LO 0xAC
|
||||
#define PT_FPR3_HI 0xB0
|
||||
#define PT_FPR3_LO 0xB4
|
||||
#define PT_FPR4_HI 0xB8
|
||||
#define PT_FPR4_LO 0xBC
|
||||
#define PT_FPR5_HI 0xC0
|
||||
#define PT_FPR5_LO 0xC4
|
||||
#define PT_FPR6_HI 0xC8
|
||||
#define PT_FPR6_LO 0xCC
|
||||
#define PT_FPR7_HI 0xD0
|
||||
#define PT_FPR7_LO 0xD4
|
||||
#define PT_FPR8_HI 0xD8
|
||||
#define PT_FPR8_LO 0XDC
|
||||
#define PT_FPR9_HI 0xE0
|
||||
#define PT_FPR9_LO 0xE4
|
||||
#define PT_FPR10_HI 0xE8
|
||||
#define PT_FPR10_LO 0xEC
|
||||
#define PT_FPR11_HI 0xF0
|
||||
#define PT_FPR11_LO 0xF4
|
||||
#define PT_FPR12_HI 0xF8
|
||||
#define PT_FPR12_LO 0xFC
|
||||
#define PT_FPR13_HI 0x100
|
||||
#define PT_FPR13_LO 0x104
|
||||
#define PT_FPR14_HI 0x108
|
||||
#define PT_FPR14_LO 0x10C
|
||||
#define PT_FPR15_HI 0x110
|
||||
#define PT_FPR15_LO 0x114
|
||||
#define PT_CR_9 0x118
|
||||
#define PT_CR_10 0x11C
|
||||
#define PT_CR_11 0x120
|
||||
#define PT_IEEE_IP 0x13C
|
||||
#define PT_LASTOFF PT_IEEE_IP
|
||||
#define PT_ENDREGS 0x140-1
|
||||
|
||||
#define GPR_SIZE 4
|
||||
#define CR_SIZE 4
|
||||
|
||||
#define STACK_FRAME_OVERHEAD 96 /* size of minimum stack frame */
|
||||
|
||||
#else /* __s390x__ */
|
||||
|
||||
#define PT_PSWMASK 0x00
|
||||
#define PT_PSWADDR 0x08
|
||||
#define PT_GPR0 0x10
|
||||
#define PT_GPR1 0x18
|
||||
#define PT_GPR2 0x20
|
||||
#define PT_GPR3 0x28
|
||||
#define PT_GPR4 0x30
|
||||
#define PT_GPR5 0x38
|
||||
#define PT_GPR6 0x40
|
||||
#define PT_GPR7 0x48
|
||||
#define PT_GPR8 0x50
|
||||
#define PT_GPR9 0x58
|
||||
#define PT_GPR10 0x60
|
||||
#define PT_GPR11 0x68
|
||||
#define PT_GPR12 0x70
|
||||
#define PT_GPR13 0x78
|
||||
#define PT_GPR14 0x80
|
||||
#define PT_GPR15 0x88
|
||||
#define PT_ACR0 0x90
|
||||
#define PT_ACR1 0x94
|
||||
#define PT_ACR2 0x98
|
||||
#define PT_ACR3 0x9C
|
||||
#define PT_ACR4 0xA0
|
||||
#define PT_ACR5 0xA4
|
||||
#define PT_ACR6 0xA8
|
||||
#define PT_ACR7 0xAC
|
||||
#define PT_ACR8 0xB0
|
||||
#define PT_ACR9 0xB4
|
||||
#define PT_ACR10 0xB8
|
||||
#define PT_ACR11 0xBC
|
||||
#define PT_ACR12 0xC0
|
||||
#define PT_ACR13 0xC4
|
||||
#define PT_ACR14 0xC8
|
||||
#define PT_ACR15 0xCC
|
||||
#define PT_ORIGGPR2 0xD0
|
||||
#define PT_FPC 0xD8
|
||||
#define PT_FPR0 0xE0
|
||||
#define PT_FPR1 0xE8
|
||||
#define PT_FPR2 0xF0
|
||||
#define PT_FPR3 0xF8
|
||||
#define PT_FPR4 0x100
|
||||
#define PT_FPR5 0x108
|
||||
#define PT_FPR6 0x110
|
||||
#define PT_FPR7 0x118
|
||||
#define PT_FPR8 0x120
|
||||
#define PT_FPR9 0x128
|
||||
#define PT_FPR10 0x130
|
||||
#define PT_FPR11 0x138
|
||||
#define PT_FPR12 0x140
|
||||
#define PT_FPR13 0x148
|
||||
#define PT_FPR14 0x150
|
||||
#define PT_FPR15 0x158
|
||||
#define PT_CR_9 0x160
|
||||
#define PT_CR_10 0x168
|
||||
#define PT_CR_11 0x170
|
||||
#define PT_IEEE_IP 0x1A8
|
||||
#define PT_LASTOFF PT_IEEE_IP
|
||||
#define PT_ENDREGS 0x1B0-1
|
||||
|
||||
#define GPR_SIZE 8
|
||||
#define CR_SIZE 8
|
||||
|
||||
#define STACK_FRAME_OVERHEAD 160 /* size of minimum stack frame */
|
||||
|
||||
#endif /* __s390x__ */
|
||||
|
||||
#define NUM_GPRS 16
|
||||
#define NUM_FPRS 16
|
||||
#define NUM_CRS 16
|
||||
#define NUM_ACRS 16
|
||||
|
||||
#define NUM_CR_WORDS 3
|
||||
|
||||
#define FPR_SIZE 8
|
||||
#define FPC_SIZE 4
|
||||
#define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */
|
||||
#define ACR_SIZE 4
|
||||
|
||||
|
||||
#define PTRACE_OLDSETOPTIONS 21
|
||||
#include <uapi/asm/ptrace.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
typedef union
|
||||
{
|
||||
float f;
|
||||
double d;
|
||||
__u64 ui;
|
||||
struct
|
||||
{
|
||||
__u32 hi;
|
||||
__u32 lo;
|
||||
} fp;
|
||||
} freg_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__u32 fpc;
|
||||
freg_t fprs[NUM_FPRS];
|
||||
} s390_fp_regs;
|
||||
|
||||
#define FPC_EXCEPTION_MASK 0xF8000000
|
||||
#define FPC_FLAGS_MASK 0x00F80000
|
||||
#define FPC_DXC_MASK 0x0000FF00
|
||||
#define FPC_RM_MASK 0x00000003
|
||||
#define FPC_VALID_MASK 0xF8F8FF03
|
||||
|
||||
/* this typedef defines how a Program Status Word looks like */
|
||||
typedef struct
|
||||
{
|
||||
unsigned long mask;
|
||||
unsigned long addr;
|
||||
} __attribute__ ((aligned(8))) psw_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__u32 mask;
|
||||
__u32 addr;
|
||||
} __attribute__ ((aligned(8))) psw_compat_t;
|
||||
|
||||
#ifndef __s390x__
|
||||
|
||||
#define PSW_MASK_PER 0x40000000UL
|
||||
#define PSW_MASK_DAT 0x04000000UL
|
||||
#define PSW_MASK_IO 0x02000000UL
|
||||
#define PSW_MASK_EXT 0x01000000UL
|
||||
#define PSW_MASK_KEY 0x00F00000UL
|
||||
#define PSW_MASK_BASE 0x00080000UL /* always one */
|
||||
#define PSW_MASK_MCHECK 0x00040000UL
|
||||
#define PSW_MASK_WAIT 0x00020000UL
|
||||
#define PSW_MASK_PSTATE 0x00010000UL
|
||||
#define PSW_MASK_ASC 0x0000C000UL
|
||||
#define PSW_MASK_CC 0x00003000UL
|
||||
#define PSW_MASK_PM 0x00000F00UL
|
||||
#define PSW_MASK_RI 0x00000000UL
|
||||
#define PSW_MASK_EA 0x00000000UL
|
||||
#define PSW_MASK_BA 0x00000000UL
|
||||
|
||||
#define PSW_MASK_USER 0x00003F00UL
|
||||
|
||||
#define PSW_ADDR_AMODE 0x80000000UL
|
||||
#define PSW_ADDR_INSN 0x7FFFFFFFUL
|
||||
|
||||
#define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 20)
|
||||
|
||||
#define PSW_ASC_PRIMARY 0x00000000UL
|
||||
#define PSW_ASC_ACCREG 0x00004000UL
|
||||
#define PSW_ASC_SECONDARY 0x00008000UL
|
||||
#define PSW_ASC_HOME 0x0000C000UL
|
||||
|
||||
#else /* __s390x__ */
|
||||
|
||||
#define PSW_MASK_PER 0x4000000000000000UL
|
||||
#define PSW_MASK_DAT 0x0400000000000000UL
|
||||
#define PSW_MASK_IO 0x0200000000000000UL
|
||||
#define PSW_MASK_EXT 0x0100000000000000UL
|
||||
#define PSW_MASK_BASE 0x0000000000000000UL
|
||||
#define PSW_MASK_KEY 0x00F0000000000000UL
|
||||
#define PSW_MASK_MCHECK 0x0004000000000000UL
|
||||
#define PSW_MASK_WAIT 0x0002000000000000UL
|
||||
#define PSW_MASK_PSTATE 0x0001000000000000UL
|
||||
#define PSW_MASK_ASC 0x0000C00000000000UL
|
||||
#define PSW_MASK_CC 0x0000300000000000UL
|
||||
#define PSW_MASK_PM 0x00000F0000000000UL
|
||||
#define PSW_MASK_RI 0x0000008000000000UL
|
||||
#define PSW_MASK_EA 0x0000000100000000UL
|
||||
#define PSW_MASK_BA 0x0000000080000000UL
|
||||
|
||||
#define PSW_MASK_USER 0x00003F8180000000UL
|
||||
|
||||
#define PSW_ADDR_AMODE 0x0000000000000000UL
|
||||
#define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL
|
||||
|
||||
#define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 52)
|
||||
|
||||
#define PSW_ASC_PRIMARY 0x0000000000000000UL
|
||||
#define PSW_ASC_ACCREG 0x0000400000000000UL
|
||||
#define PSW_ASC_SECONDARY 0x0000800000000000UL
|
||||
#define PSW_ASC_HOME 0x0000C00000000000UL
|
||||
|
||||
#endif /* __s390x__ */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
extern long psw_kernel_bits;
|
||||
extern long psw_user_bits;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The s390_regs structure is used to define the elf_gregset_t.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
psw_t psw;
|
||||
unsigned long gprs[NUM_GPRS];
|
||||
unsigned int acrs[NUM_ACRS];
|
||||
unsigned long orig_gpr2;
|
||||
} s390_regs;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
psw_compat_t psw;
|
||||
__u32 gprs[NUM_GPRS];
|
||||
__u32 acrs[NUM_ACRS];
|
||||
__u32 orig_gpr2;
|
||||
} s390_compat_regs;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__u32 gprs_high[NUM_GPRS];
|
||||
} s390_compat_regs_high;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/*
|
||||
* The pt_regs struct defines the way the registers are stored on
|
||||
@ -376,167 +77,8 @@ struct per_struct_kernel {
|
||||
#define PER_CONTROL_SUSPENSION 0x00400000UL
|
||||
#define PER_CONTROL_ALTERATION 0x00200000UL
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Now for the user space program event recording (trace) definitions.
|
||||
* The following structures are used only for the ptrace interface, don't
|
||||
* touch or even look at it if you don't want to modify the user-space
|
||||
* ptrace interface. In particular stay away from it for in-kernel PER.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned long cr[NUM_CR_WORDS];
|
||||
} per_cr_words;
|
||||
|
||||
#define PER_EM_MASK 0xE8000000UL
|
||||
|
||||
typedef struct
|
||||
{
|
||||
#ifdef __s390x__
|
||||
unsigned : 32;
|
||||
#endif /* __s390x__ */
|
||||
unsigned em_branching : 1;
|
||||
unsigned em_instruction_fetch : 1;
|
||||
/*
|
||||
* Switching on storage alteration automatically fixes
|
||||
* the storage alteration event bit in the users std.
|
||||
*/
|
||||
unsigned em_storage_alteration : 1;
|
||||
unsigned em_gpr_alt_unused : 1;
|
||||
unsigned em_store_real_address : 1;
|
||||
unsigned : 3;
|
||||
unsigned branch_addr_ctl : 1;
|
||||
unsigned : 1;
|
||||
unsigned storage_alt_space_ctl : 1;
|
||||
unsigned : 21;
|
||||
unsigned long starting_addr;
|
||||
unsigned long ending_addr;
|
||||
} per_cr_bits;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned short perc_atmid;
|
||||
unsigned long address;
|
||||
unsigned char access_id;
|
||||
} per_lowcore_words;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned perc_branching : 1;
|
||||
unsigned perc_instruction_fetch : 1;
|
||||
unsigned perc_storage_alteration : 1;
|
||||
unsigned perc_gpr_alt_unused : 1;
|
||||
unsigned perc_store_real_address : 1;
|
||||
unsigned : 3;
|
||||
unsigned atmid_psw_bit_31 : 1;
|
||||
unsigned atmid_validity_bit : 1;
|
||||
unsigned atmid_psw_bit_32 : 1;
|
||||
unsigned atmid_psw_bit_5 : 1;
|
||||
unsigned atmid_psw_bit_16 : 1;
|
||||
unsigned atmid_psw_bit_17 : 1;
|
||||
unsigned si : 2;
|
||||
unsigned long address;
|
||||
unsigned : 4;
|
||||
unsigned access_id : 4;
|
||||
} per_lowcore_bits;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
union {
|
||||
per_cr_words words;
|
||||
per_cr_bits bits;
|
||||
} control_regs;
|
||||
/*
|
||||
* Use these flags instead of setting em_instruction_fetch
|
||||
* directly they are used so that single stepping can be
|
||||
* switched on & off while not affecting other tracing
|
||||
*/
|
||||
unsigned single_step : 1;
|
||||
unsigned instruction_fetch : 1;
|
||||
unsigned : 30;
|
||||
/*
|
||||
* These addresses are copied into cr10 & cr11 if single
|
||||
* stepping is switched off
|
||||
*/
|
||||
unsigned long starting_addr;
|
||||
unsigned long ending_addr;
|
||||
union {
|
||||
per_lowcore_words words;
|
||||
per_lowcore_bits bits;
|
||||
} lowcore;
|
||||
} per_struct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int len;
|
||||
unsigned long kernel_addr;
|
||||
unsigned long process_addr;
|
||||
} ptrace_area;
|
||||
|
||||
/*
|
||||
* S/390 specific non posix ptrace requests. I chose unusual values so
|
||||
* they are unlikely to clash with future ptrace definitions.
|
||||
*/
|
||||
#define PTRACE_PEEKUSR_AREA 0x5000
|
||||
#define PTRACE_POKEUSR_AREA 0x5001
|
||||
#define PTRACE_PEEKTEXT_AREA 0x5002
|
||||
#define PTRACE_PEEKDATA_AREA 0x5003
|
||||
#define PTRACE_POKETEXT_AREA 0x5004
|
||||
#define PTRACE_POKEDATA_AREA 0x5005
|
||||
#define PTRACE_GET_LAST_BREAK 0x5006
|
||||
#define PTRACE_PEEK_SYSTEM_CALL 0x5007
|
||||
#define PTRACE_POKE_SYSTEM_CALL 0x5008
|
||||
#define PTRACE_ENABLE_TE 0x5009
|
||||
#define PTRACE_DISABLE_TE 0x5010
|
||||
|
||||
/*
|
||||
* PT_PROT definition is loosely based on hppa bsd definition in
|
||||
* gdb/hppab-nat.c
|
||||
*/
|
||||
#define PTRACE_PROT 21
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ptprot_set_access_watchpoint,
|
||||
ptprot_set_write_watchpoint,
|
||||
ptprot_disable_watchpoint
|
||||
} ptprot_flags;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned long lowaddr;
|
||||
unsigned long hiaddr;
|
||||
ptprot_flags prot;
|
||||
} ptprot_area;
|
||||
|
||||
/* Sequence of bytes for breakpoint illegal instruction. */
|
||||
#define S390_BREAKPOINT {0x0,0x1}
|
||||
#define S390_BREAKPOINT_U16 ((__u16)0x0001)
|
||||
#define S390_SYSCALL_OPCODE ((__u16)0x0a00)
|
||||
#define S390_SYSCALL_SIZE 2
|
||||
|
||||
/*
|
||||
* The user_regs_struct defines the way the user registers are
|
||||
* store on the stack for signal handling.
|
||||
*/
|
||||
struct user_regs_struct
|
||||
{
|
||||
psw_t psw;
|
||||
unsigned long gprs[NUM_GPRS];
|
||||
unsigned int acrs[NUM_ACRS];
|
||||
unsigned long orig_gpr2;
|
||||
s390_fp_regs fp_regs;
|
||||
/*
|
||||
* These per registers are in here so that gdb can modify them
|
||||
* itself as there is no "official" ptrace interface for hardware
|
||||
* watchpoints. This is the way intel does it.
|
||||
*/
|
||||
per_struct per_info;
|
||||
unsigned long ieee_instruction_pointer; /* obsolete, always 0 */
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/*
|
||||
* These are defined as per linux/ptrace.h, which see.
|
||||
*/
|
||||
@ -562,7 +104,5 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
|
||||
return regs->gprs[15] & PSW_ADDR_INSN;
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _S390_PTRACE_H */
|
||||
|
@ -1,19 +1,8 @@
|
||||
#ifndef ASM_SCHID_H
|
||||
#define ASM_SCHID_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct subchannel_id {
|
||||
__u32 cssid : 8;
|
||||
__u32 : 4;
|
||||
__u32 m : 1;
|
||||
__u32 ssid : 2;
|
||||
__u32 one : 1;
|
||||
__u32 sch_no : 16;
|
||||
} __attribute__ ((packed, aligned(4)));
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/string.h>
|
||||
#include <uapi/asm/schid.h>
|
||||
|
||||
/* Helper function for sane state of pre-allocated subchannel_id. */
|
||||
static inline void
|
||||
@ -29,6 +18,4 @@ schid_equal(struct subchannel_id *schid1, struct subchannel_id *schid2)
|
||||
return !memcmp(schid1, schid2, sizeof(struct subchannel_id));
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* ASM_SCHID_H */
|
||||
|
@ -2,15 +2,11 @@
|
||||
* S390 version
|
||||
* Copyright IBM Corp. 1999, 2010
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_SETUP_H
|
||||
#define _ASM_S390_SETUP_H
|
||||
|
||||
#define COMMAND_LINE_SIZE 4096
|
||||
#include <uapi/asm/setup.h>
|
||||
|
||||
#define ARCH_COMMAND_LINE_SIZE 896
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define PARMAREA 0x10400
|
||||
#define MEMORY_CHUNKS 256
|
||||
@ -75,8 +71,8 @@ extern unsigned int s390_user_mode;
|
||||
#define MACHINE_FLAG_DIAG9C (1UL << 7)
|
||||
#define MACHINE_FLAG_MVCOS (1UL << 8)
|
||||
#define MACHINE_FLAG_KVM (1UL << 9)
|
||||
#define MACHINE_FLAG_HPAGE (1UL << 10)
|
||||
#define MACHINE_FLAG_PFMF (1UL << 11)
|
||||
#define MACHINE_FLAG_EDAT1 (1UL << 10)
|
||||
#define MACHINE_FLAG_EDAT2 (1UL << 11)
|
||||
#define MACHINE_FLAG_LPAR (1UL << 12)
|
||||
#define MACHINE_FLAG_SPP (1UL << 13)
|
||||
#define MACHINE_FLAG_TOPOLOGY (1UL << 14)
|
||||
@ -88,6 +84,8 @@ extern unsigned int s390_user_mode;
|
||||
#define MACHINE_IS_LPAR (S390_lowcore.machine_flags & MACHINE_FLAG_LPAR)
|
||||
|
||||
#define MACHINE_HAS_DIAG9C (S390_lowcore.machine_flags & MACHINE_FLAG_DIAG9C)
|
||||
#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)
|
||||
@ -96,8 +94,8 @@ extern unsigned int s390_user_mode;
|
||||
#define MACHINE_HAS_DIAG44 (1)
|
||||
#define MACHINE_HAS_MVPG (S390_lowcore.machine_flags & MACHINE_FLAG_MVPG)
|
||||
#define MACHINE_HAS_MVCOS (0)
|
||||
#define MACHINE_HAS_HPAGE (0)
|
||||
#define MACHINE_HAS_PFMF (0)
|
||||
#define MACHINE_HAS_EDAT1 (0)
|
||||
#define MACHINE_HAS_EDAT2 (0)
|
||||
#define MACHINE_HAS_SPP (0)
|
||||
#define MACHINE_HAS_TOPOLOGY (0)
|
||||
#define MACHINE_HAS_TE (0)
|
||||
@ -109,8 +107,8 @@ extern unsigned int s390_user_mode;
|
||||
#define MACHINE_HAS_DIAG44 (S390_lowcore.machine_flags & MACHINE_FLAG_DIAG44)
|
||||
#define MACHINE_HAS_MVPG (1)
|
||||
#define MACHINE_HAS_MVCOS (S390_lowcore.machine_flags & MACHINE_FLAG_MVCOS)
|
||||
#define MACHINE_HAS_HPAGE (S390_lowcore.machine_flags & MACHINE_FLAG_HPAGE)
|
||||
#define MACHINE_HAS_PFMF (S390_lowcore.machine_flags & MACHINE_FLAG_PFMF)
|
||||
#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_SPP (S390_lowcore.machine_flags & MACHINE_FLAG_SPP)
|
||||
#define MACHINE_HAS_TOPOLOGY (S390_lowcore.machine_flags & MACHINE_FLAG_TOPOLOGY)
|
||||
#define MACHINE_HAS_TE (S390_lowcore.machine_flags & MACHINE_FLAG_TE)
|
||||
@ -173,5 +171,4 @@ extern void (*_machine_power_off)(void);
|
||||
#define COMMAND_LINE 0x10480
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_S390_SETUP_H */
|
||||
|
@ -3,18 +3,11 @@
|
||||
*
|
||||
* Derived from "include/asm-i386/signal.h"
|
||||
*/
|
||||
|
||||
#ifndef _ASMS390_SIGNAL_H
|
||||
#define _ASMS390_SIGNAL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/time.h>
|
||||
#include <uapi/asm/signal.h>
|
||||
|
||||
/* Avoid too many header ordering problems. */
|
||||
struct siginfo;
|
||||
struct pt_regs;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/* Most things should be clean enough to redefine this at will, if care
|
||||
is taken to make libc match. */
|
||||
#include <asm/sigcontext.h>
|
||||
@ -28,94 +21,6 @@ typedef struct {
|
||||
unsigned long sig[_NSIG_WORDS];
|
||||
} sigset_t;
|
||||
|
||||
#else
|
||||
/* Here we must cater to libcs that poke about in kernel headers. */
|
||||
|
||||
#define NSIG 32
|
||||
typedef unsigned long sigset_t;
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#define SIGHUP 1
|
||||
#define SIGINT 2
|
||||
#define SIGQUIT 3
|
||||
#define SIGILL 4
|
||||
#define SIGTRAP 5
|
||||
#define SIGABRT 6
|
||||
#define SIGIOT 6
|
||||
#define SIGBUS 7
|
||||
#define SIGFPE 8
|
||||
#define SIGKILL 9
|
||||
#define SIGUSR1 10
|
||||
#define SIGSEGV 11
|
||||
#define SIGUSR2 12
|
||||
#define SIGPIPE 13
|
||||
#define SIGALRM 14
|
||||
#define SIGTERM 15
|
||||
#define SIGSTKFLT 16
|
||||
#define SIGCHLD 17
|
||||
#define SIGCONT 18
|
||||
#define SIGSTOP 19
|
||||
#define SIGTSTP 20
|
||||
#define SIGTTIN 21
|
||||
#define SIGTTOU 22
|
||||
#define SIGURG 23
|
||||
#define SIGXCPU 24
|
||||
#define SIGXFSZ 25
|
||||
#define SIGVTALRM 26
|
||||
#define SIGPROF 27
|
||||
#define SIGWINCH 28
|
||||
#define SIGIO 29
|
||||
#define SIGPOLL SIGIO
|
||||
/*
|
||||
#define SIGLOST 29
|
||||
*/
|
||||
#define SIGPWR 30
|
||||
#define SIGSYS 31
|
||||
#define SIGUNUSED 31
|
||||
|
||||
/* These should not be considered constants from userland. */
|
||||
#define SIGRTMIN 32
|
||||
#define SIGRTMAX _NSIG
|
||||
|
||||
/*
|
||||
* SA_FLAGS values:
|
||||
*
|
||||
* SA_ONSTACK indicates that a registered stack_t will be used.
|
||||
* SA_RESTART flag to get restarting signals (which were the default long ago)
|
||||
* SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
|
||||
* SA_RESETHAND clears the handler when the signal is delivered.
|
||||
* SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
|
||||
* SA_NODEFER prevents the current signal from being masked in the handler.
|
||||
*
|
||||
* SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
|
||||
* Unix names RESETHAND and NODEFER respectively.
|
||||
*/
|
||||
#define SA_NOCLDSTOP 0x00000001
|
||||
#define SA_NOCLDWAIT 0x00000002
|
||||
#define SA_SIGINFO 0x00000004
|
||||
#define SA_ONSTACK 0x08000000
|
||||
#define SA_RESTART 0x10000000
|
||||
#define SA_NODEFER 0x40000000
|
||||
#define SA_RESETHAND 0x80000000
|
||||
|
||||
#define SA_NOMASK SA_NODEFER
|
||||
#define SA_ONESHOT SA_RESETHAND
|
||||
|
||||
#define SA_RESTORER 0x04000000
|
||||
|
||||
/*
|
||||
* sigaltstack controls
|
||||
*/
|
||||
#define SS_ONSTACK 1
|
||||
#define SS_DISABLE 2
|
||||
|
||||
#define MINSIGSTKSZ 2048
|
||||
#define SIGSTKSZ 8192
|
||||
|
||||
#include <asm-generic/signal-defs.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct old_sigaction {
|
||||
__sighandler_t sa_handler;
|
||||
old_sigset_t sa_mask;
|
||||
@ -136,35 +41,4 @@ struct k_sigaction {
|
||||
|
||||
#define ptrace_signal_deliver(regs, cookie) do { } while (0)
|
||||
|
||||
#else
|
||||
/* Here we must cater to libcs that poke about in kernel headers. */
|
||||
|
||||
struct sigaction {
|
||||
union {
|
||||
__sighandler_t _sa_handler;
|
||||
void (*_sa_sigaction)(int, struct siginfo *, void *);
|
||||
} _u;
|
||||
#ifndef __s390x__ /* lovely */
|
||||
sigset_t sa_mask;
|
||||
unsigned long sa_flags;
|
||||
void (*sa_restorer)(void);
|
||||
#else /* __s390x__ */
|
||||
unsigned long sa_flags;
|
||||
void (*sa_restorer)(void);
|
||||
sigset_t sa_mask;
|
||||
#endif /* __s390x__ */
|
||||
};
|
||||
|
||||
#define sa_handler _u._sa_handler
|
||||
#define sa_sigaction _u._sa_sigaction
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
typedef struct sigaltstack {
|
||||
void __user *ss_sp;
|
||||
int ss_flags;
|
||||
size_t ss_size;
|
||||
} stack_t;
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -3,49 +3,11 @@
|
||||
*
|
||||
* Derived from "include/asm-i386/termios.h"
|
||||
*/
|
||||
|
||||
#ifndef _S390_TERMIOS_H
|
||||
#define _S390_TERMIOS_H
|
||||
|
||||
#include <asm/termbits.h>
|
||||
#include <asm/ioctls.h>
|
||||
#include <uapi/asm/termios.h>
|
||||
|
||||
struct winsize {
|
||||
unsigned short ws_row;
|
||||
unsigned short ws_col;
|
||||
unsigned short ws_xpixel;
|
||||
unsigned short ws_ypixel;
|
||||
};
|
||||
|
||||
#define NCC 8
|
||||
struct termio {
|
||||
unsigned short c_iflag; /* input mode flags */
|
||||
unsigned short c_oflag; /* output mode flags */
|
||||
unsigned short c_cflag; /* control mode flags */
|
||||
unsigned short c_lflag; /* local mode flags */
|
||||
unsigned char c_line; /* line discipline */
|
||||
unsigned char c_cc[NCC]; /* control characters */
|
||||
};
|
||||
|
||||
/* modem lines */
|
||||
#define TIOCM_LE 0x001
|
||||
#define TIOCM_DTR 0x002
|
||||
#define TIOCM_RTS 0x004
|
||||
#define TIOCM_ST 0x008
|
||||
#define TIOCM_SR 0x010
|
||||
#define TIOCM_CTS 0x020
|
||||
#define TIOCM_CAR 0x040
|
||||
#define TIOCM_RNG 0x080
|
||||
#define TIOCM_DSR 0x100
|
||||
#define TIOCM_CD TIOCM_CAR
|
||||
#define TIOCM_RI TIOCM_RNG
|
||||
#define TIOCM_OUT1 0x2000
|
||||
#define TIOCM_OUT2 0x4000
|
||||
#define TIOCM_LOOP 0x8000
|
||||
|
||||
/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/* intr=^C quit=^\ erase=del kill=^U
|
||||
eof=^D vtime=\0 vmin=\1 sxtc=\0
|
||||
@ -60,6 +22,4 @@ struct termio {
|
||||
|
||||
#include <asm-generic/termios-base.h>
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _S390_TERMIOS_H */
|
||||
|
@ -3,26 +3,14 @@
|
||||
*
|
||||
* Derived from "include/asm-i386/types.h"
|
||||
*/
|
||||
|
||||
#ifndef _S390_TYPES_H
|
||||
#define _S390_TYPES_H
|
||||
|
||||
#include <asm-generic/int-ll64.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* A address type so that arithmetic can be done on it & it can be upgraded to
|
||||
64 bit when necessary
|
||||
*/
|
||||
typedef unsigned long addr_t;
|
||||
typedef __signed__ long saddr_t;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#include <uapi/asm/types.h>
|
||||
|
||||
/*
|
||||
* These aren't exported outside the kernel to avoid name space clashes
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
@ -37,5 +25,4 @@ typedef union {
|
||||
|
||||
#endif /* ! CONFIG_64BIT */
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _S390_TYPES_H */
|
||||
|
@ -3,375 +3,11 @@
|
||||
*
|
||||
* Derived from "include/asm-i386/unistd.h"
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_UNISTD_H_
|
||||
#define _ASM_S390_UNISTD_H_
|
||||
|
||||
/*
|
||||
* This file contains the system call numbers.
|
||||
*/
|
||||
#include <uapi/asm/unistd.h>
|
||||
|
||||
#define __NR_exit 1
|
||||
#define __NR_fork 2
|
||||
#define __NR_read 3
|
||||
#define __NR_write 4
|
||||
#define __NR_open 5
|
||||
#define __NR_close 6
|
||||
#define __NR_restart_syscall 7
|
||||
#define __NR_creat 8
|
||||
#define __NR_link 9
|
||||
#define __NR_unlink 10
|
||||
#define __NR_execve 11
|
||||
#define __NR_chdir 12
|
||||
#define __NR_mknod 14
|
||||
#define __NR_chmod 15
|
||||
#define __NR_lseek 19
|
||||
#define __NR_getpid 20
|
||||
#define __NR_mount 21
|
||||
#define __NR_umount 22
|
||||
#define __NR_ptrace 26
|
||||
#define __NR_alarm 27
|
||||
#define __NR_pause 29
|
||||
#define __NR_utime 30
|
||||
#define __NR_access 33
|
||||
#define __NR_nice 34
|
||||
#define __NR_sync 36
|
||||
#define __NR_kill 37
|
||||
#define __NR_rename 38
|
||||
#define __NR_mkdir 39
|
||||
#define __NR_rmdir 40
|
||||
#define __NR_dup 41
|
||||
#define __NR_pipe 42
|
||||
#define __NR_times 43
|
||||
#define __NR_brk 45
|
||||
#define __NR_signal 48
|
||||
#define __NR_acct 51
|
||||
#define __NR_umount2 52
|
||||
#define __NR_ioctl 54
|
||||
#define __NR_fcntl 55
|
||||
#define __NR_setpgid 57
|
||||
#define __NR_umask 60
|
||||
#define __NR_chroot 61
|
||||
#define __NR_ustat 62
|
||||
#define __NR_dup2 63
|
||||
#define __NR_getppid 64
|
||||
#define __NR_getpgrp 65
|
||||
#define __NR_setsid 66
|
||||
#define __NR_sigaction 67
|
||||
#define __NR_sigsuspend 72
|
||||
#define __NR_sigpending 73
|
||||
#define __NR_sethostname 74
|
||||
#define __NR_setrlimit 75
|
||||
#define __NR_getrusage 77
|
||||
#define __NR_gettimeofday 78
|
||||
#define __NR_settimeofday 79
|
||||
#define __NR_symlink 83
|
||||
#define __NR_readlink 85
|
||||
#define __NR_uselib 86
|
||||
#define __NR_swapon 87
|
||||
#define __NR_reboot 88
|
||||
#define __NR_readdir 89
|
||||
#define __NR_mmap 90
|
||||
#define __NR_munmap 91
|
||||
#define __NR_truncate 92
|
||||
#define __NR_ftruncate 93
|
||||
#define __NR_fchmod 94
|
||||
#define __NR_getpriority 96
|
||||
#define __NR_setpriority 97
|
||||
#define __NR_statfs 99
|
||||
#define __NR_fstatfs 100
|
||||
#define __NR_socketcall 102
|
||||
#define __NR_syslog 103
|
||||
#define __NR_setitimer 104
|
||||
#define __NR_getitimer 105
|
||||
#define __NR_stat 106
|
||||
#define __NR_lstat 107
|
||||
#define __NR_fstat 108
|
||||
#define __NR_lookup_dcookie 110
|
||||
#define __NR_vhangup 111
|
||||
#define __NR_idle 112
|
||||
#define __NR_wait4 114
|
||||
#define __NR_swapoff 115
|
||||
#define __NR_sysinfo 116
|
||||
#define __NR_ipc 117
|
||||
#define __NR_fsync 118
|
||||
#define __NR_sigreturn 119
|
||||
#define __NR_clone 120
|
||||
#define __NR_setdomainname 121
|
||||
#define __NR_uname 122
|
||||
#define __NR_adjtimex 124
|
||||
#define __NR_mprotect 125
|
||||
#define __NR_sigprocmask 126
|
||||
#define __NR_create_module 127
|
||||
#define __NR_init_module 128
|
||||
#define __NR_delete_module 129
|
||||
#define __NR_get_kernel_syms 130
|
||||
#define __NR_quotactl 131
|
||||
#define __NR_getpgid 132
|
||||
#define __NR_fchdir 133
|
||||
#define __NR_bdflush 134
|
||||
#define __NR_sysfs 135
|
||||
#define __NR_personality 136
|
||||
#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
|
||||
#define __NR_getdents 141
|
||||
#define __NR_flock 143
|
||||
#define __NR_msync 144
|
||||
#define __NR_readv 145
|
||||
#define __NR_writev 146
|
||||
#define __NR_getsid 147
|
||||
#define __NR_fdatasync 148
|
||||
#define __NR__sysctl 149
|
||||
#define __NR_mlock 150
|
||||
#define __NR_munlock 151
|
||||
#define __NR_mlockall 152
|
||||
#define __NR_munlockall 153
|
||||
#define __NR_sched_setparam 154
|
||||
#define __NR_sched_getparam 155
|
||||
#define __NR_sched_setscheduler 156
|
||||
#define __NR_sched_getscheduler 157
|
||||
#define __NR_sched_yield 158
|
||||
#define __NR_sched_get_priority_max 159
|
||||
#define __NR_sched_get_priority_min 160
|
||||
#define __NR_sched_rr_get_interval 161
|
||||
#define __NR_nanosleep 162
|
||||
#define __NR_mremap 163
|
||||
#define __NR_query_module 167
|
||||
#define __NR_poll 168
|
||||
#define __NR_nfsservctl 169
|
||||
#define __NR_prctl 172
|
||||
#define __NR_rt_sigreturn 173
|
||||
#define __NR_rt_sigaction 174
|
||||
#define __NR_rt_sigprocmask 175
|
||||
#define __NR_rt_sigpending 176
|
||||
#define __NR_rt_sigtimedwait 177
|
||||
#define __NR_rt_sigqueueinfo 178
|
||||
#define __NR_rt_sigsuspend 179
|
||||
#define __NR_pread64 180
|
||||
#define __NR_pwrite64 181
|
||||
#define __NR_getcwd 183
|
||||
#define __NR_capget 184
|
||||
#define __NR_capset 185
|
||||
#define __NR_sigaltstack 186
|
||||
#define __NR_sendfile 187
|
||||
#define __NR_getpmsg 188
|
||||
#define __NR_putpmsg 189
|
||||
#define __NR_vfork 190
|
||||
#define __NR_pivot_root 217
|
||||
#define __NR_mincore 218
|
||||
#define __NR_madvise 219
|
||||
#define __NR_getdents64 220
|
||||
#define __NR_readahead 222
|
||||
#define __NR_setxattr 224
|
||||
#define __NR_lsetxattr 225
|
||||
#define __NR_fsetxattr 226
|
||||
#define __NR_getxattr 227
|
||||
#define __NR_lgetxattr 228
|
||||
#define __NR_fgetxattr 229
|
||||
#define __NR_listxattr 230
|
||||
#define __NR_llistxattr 231
|
||||
#define __NR_flistxattr 232
|
||||
#define __NR_removexattr 233
|
||||
#define __NR_lremovexattr 234
|
||||
#define __NR_fremovexattr 235
|
||||
#define __NR_gettid 236
|
||||
#define __NR_tkill 237
|
||||
#define __NR_futex 238
|
||||
#define __NR_sched_setaffinity 239
|
||||
#define __NR_sched_getaffinity 240
|
||||
#define __NR_tgkill 241
|
||||
/* Number 242 is reserved for tux */
|
||||
#define __NR_io_setup 243
|
||||
#define __NR_io_destroy 244
|
||||
#define __NR_io_getevents 245
|
||||
#define __NR_io_submit 246
|
||||
#define __NR_io_cancel 247
|
||||
#define __NR_exit_group 248
|
||||
#define __NR_epoll_create 249
|
||||
#define __NR_epoll_ctl 250
|
||||
#define __NR_epoll_wait 251
|
||||
#define __NR_set_tid_address 252
|
||||
#define __NR_fadvise64 253
|
||||
#define __NR_timer_create 254
|
||||
#define __NR_timer_settime (__NR_timer_create+1)
|
||||
#define __NR_timer_gettime (__NR_timer_create+2)
|
||||
#define __NR_timer_getoverrun (__NR_timer_create+3)
|
||||
#define __NR_timer_delete (__NR_timer_create+4)
|
||||
#define __NR_clock_settime (__NR_timer_create+5)
|
||||
#define __NR_clock_gettime (__NR_timer_create+6)
|
||||
#define __NR_clock_getres (__NR_timer_create+7)
|
||||
#define __NR_clock_nanosleep (__NR_timer_create+8)
|
||||
/* Number 263 is reserved for vserver */
|
||||
#define __NR_statfs64 265
|
||||
#define __NR_fstatfs64 266
|
||||
#define __NR_remap_file_pages 267
|
||||
/* Number 268 is reserved for new sys_mbind */
|
||||
/* Number 269 is reserved for new sys_get_mempolicy */
|
||||
/* Number 270 is reserved for new sys_set_mempolicy */
|
||||
#define __NR_mq_open 271
|
||||
#define __NR_mq_unlink 272
|
||||
#define __NR_mq_timedsend 273
|
||||
#define __NR_mq_timedreceive 274
|
||||
#define __NR_mq_notify 275
|
||||
#define __NR_mq_getsetattr 276
|
||||
#define __NR_kexec_load 277
|
||||
#define __NR_add_key 278
|
||||
#define __NR_request_key 279
|
||||
#define __NR_keyctl 280
|
||||
#define __NR_waitid 281
|
||||
#define __NR_ioprio_set 282
|
||||
#define __NR_ioprio_get 283
|
||||
#define __NR_inotify_init 284
|
||||
#define __NR_inotify_add_watch 285
|
||||
#define __NR_inotify_rm_watch 286
|
||||
/* Number 287 is reserved for new sys_migrate_pages */
|
||||
#define __NR_openat 288
|
||||
#define __NR_mkdirat 289
|
||||
#define __NR_mknodat 290
|
||||
#define __NR_fchownat 291
|
||||
#define __NR_futimesat 292
|
||||
#define __NR_unlinkat 294
|
||||
#define __NR_renameat 295
|
||||
#define __NR_linkat 296
|
||||
#define __NR_symlinkat 297
|
||||
#define __NR_readlinkat 298
|
||||
#define __NR_fchmodat 299
|
||||
#define __NR_faccessat 300
|
||||
#define __NR_pselect6 301
|
||||
#define __NR_ppoll 302
|
||||
#define __NR_unshare 303
|
||||
#define __NR_set_robust_list 304
|
||||
#define __NR_get_robust_list 305
|
||||
#define __NR_splice 306
|
||||
#define __NR_sync_file_range 307
|
||||
#define __NR_tee 308
|
||||
#define __NR_vmsplice 309
|
||||
/* Number 310 is reserved for new sys_move_pages */
|
||||
#define __NR_getcpu 311
|
||||
#define __NR_epoll_pwait 312
|
||||
#define __NR_utimes 313
|
||||
#define __NR_fallocate 314
|
||||
#define __NR_utimensat 315
|
||||
#define __NR_signalfd 316
|
||||
#define __NR_timerfd 317
|
||||
#define __NR_eventfd 318
|
||||
#define __NR_timerfd_create 319
|
||||
#define __NR_timerfd_settime 320
|
||||
#define __NR_timerfd_gettime 321
|
||||
#define __NR_signalfd4 322
|
||||
#define __NR_eventfd2 323
|
||||
#define __NR_inotify_init1 324
|
||||
#define __NR_pipe2 325
|
||||
#define __NR_dup3 326
|
||||
#define __NR_epoll_create1 327
|
||||
#define __NR_preadv 328
|
||||
#define __NR_pwritev 329
|
||||
#define __NR_rt_tgsigqueueinfo 330
|
||||
#define __NR_perf_event_open 331
|
||||
#define __NR_fanotify_init 332
|
||||
#define __NR_fanotify_mark 333
|
||||
#define __NR_prlimit64 334
|
||||
#define __NR_name_to_handle_at 335
|
||||
#define __NR_open_by_handle_at 336
|
||||
#define __NR_clock_adjtime 337
|
||||
#define __NR_syncfs 338
|
||||
#define __NR_setns 339
|
||||
#define __NR_process_vm_readv 340
|
||||
#define __NR_process_vm_writev 341
|
||||
#define __NR_s390_runtime_instr 342
|
||||
#define __NR_kcmp 343
|
||||
#define NR_syscalls 344
|
||||
|
||||
/*
|
||||
* There are some system calls that are not present on 64 bit, some
|
||||
* have a different name although they do the same (e.g. __NR_chown32
|
||||
* is __NR_chown on 64 bit).
|
||||
*/
|
||||
#ifndef __s390x__
|
||||
|
||||
#define __NR_time 13
|
||||
#define __NR_lchown 16
|
||||
#define __NR_setuid 23
|
||||
#define __NR_getuid 24
|
||||
#define __NR_stime 25
|
||||
#define __NR_setgid 46
|
||||
#define __NR_getgid 47
|
||||
#define __NR_geteuid 49
|
||||
#define __NR_getegid 50
|
||||
#define __NR_setreuid 70
|
||||
#define __NR_setregid 71
|
||||
#define __NR_getrlimit 76
|
||||
#define __NR_getgroups 80
|
||||
#define __NR_setgroups 81
|
||||
#define __NR_fchown 95
|
||||
#define __NR_ioperm 101
|
||||
#define __NR_setfsuid 138
|
||||
#define __NR_setfsgid 139
|
||||
#define __NR__llseek 140
|
||||
#define __NR__newselect 142
|
||||
#define __NR_setresuid 164
|
||||
#define __NR_getresuid 165
|
||||
#define __NR_setresgid 170
|
||||
#define __NR_getresgid 171
|
||||
#define __NR_chown 182
|
||||
#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */
|
||||
#define __NR_mmap2 192
|
||||
#define __NR_truncate64 193
|
||||
#define __NR_ftruncate64 194
|
||||
#define __NR_stat64 195
|
||||
#define __NR_lstat64 196
|
||||
#define __NR_fstat64 197
|
||||
#define __NR_lchown32 198
|
||||
#define __NR_getuid32 199
|
||||
#define __NR_getgid32 200
|
||||
#define __NR_geteuid32 201
|
||||
#define __NR_getegid32 202
|
||||
#define __NR_setreuid32 203
|
||||
#define __NR_setregid32 204
|
||||
#define __NR_getgroups32 205
|
||||
#define __NR_setgroups32 206
|
||||
#define __NR_fchown32 207
|
||||
#define __NR_setresuid32 208
|
||||
#define __NR_getresuid32 209
|
||||
#define __NR_setresgid32 210
|
||||
#define __NR_getresgid32 211
|
||||
#define __NR_chown32 212
|
||||
#define __NR_setuid32 213
|
||||
#define __NR_setgid32 214
|
||||
#define __NR_setfsuid32 215
|
||||
#define __NR_setfsgid32 216
|
||||
#define __NR_fcntl64 221
|
||||
#define __NR_sendfile64 223
|
||||
#define __NR_fadvise64_64 264
|
||||
#define __NR_fstatat64 293
|
||||
|
||||
#else
|
||||
|
||||
#define __NR_select 142
|
||||
#define __NR_getrlimit 191 /* SuS compliant getrlimit */
|
||||
#define __NR_lchown 198
|
||||
#define __NR_getuid 199
|
||||
#define __NR_getgid 200
|
||||
#define __NR_geteuid 201
|
||||
#define __NR_getegid 202
|
||||
#define __NR_setreuid 203
|
||||
#define __NR_setregid 204
|
||||
#define __NR_getgroups 205
|
||||
#define __NR_setgroups 206
|
||||
#define __NR_fchown 207
|
||||
#define __NR_setresuid 208
|
||||
#define __NR_getresuid 209
|
||||
#define __NR_setresgid 210
|
||||
#define __NR_getresgid 211
|
||||
#define __NR_chown 212
|
||||
#define __NR_setuid 213
|
||||
#define __NR_setgid 214
|
||||
#define __NR_setfsuid 215
|
||||
#define __NR_setfsgid 216
|
||||
#define __NR_newfstatat 293
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
#define __IGNORE_select
|
||||
@ -428,5 +64,4 @@
|
||||
*/
|
||||
#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_S390_UNISTD_H_ */
|
||||
|
@ -1,3 +1,48 @@
|
||||
# UAPI Header export list
|
||||
include include/uapi/asm-generic/Kbuild.asm
|
||||
|
||||
header-y += auxvec.h
|
||||
header-y += bitsperlong.h
|
||||
header-y += byteorder.h
|
||||
header-y += chpid.h
|
||||
header-y += chsc.h
|
||||
header-y += cmb.h
|
||||
header-y += dasd.h
|
||||
header-y += debug.h
|
||||
header-y += errno.h
|
||||
header-y += fcntl.h
|
||||
header-y += ioctl.h
|
||||
header-y += ioctls.h
|
||||
header-y += ipcbuf.h
|
||||
header-y += kvm.h
|
||||
header-y += kvm_para.h
|
||||
header-y += kvm_virtio.h
|
||||
header-y += mman.h
|
||||
header-y += monwriter.h
|
||||
header-y += msgbuf.h
|
||||
header-y += param.h
|
||||
header-y += poll.h
|
||||
header-y += posix_types.h
|
||||
header-y += ptrace.h
|
||||
header-y += qeth.h
|
||||
header-y += resource.h
|
||||
header-y += schid.h
|
||||
header-y += sembuf.h
|
||||
header-y += setup.h
|
||||
header-y += shmbuf.h
|
||||
header-y += sigcontext.h
|
||||
header-y += siginfo.h
|
||||
header-y += signal.h
|
||||
header-y += socket.h
|
||||
header-y += sockios.h
|
||||
header-y += stat.h
|
||||
header-y += statfs.h
|
||||
header-y += swab.h
|
||||
header-y += tape390.h
|
||||
header-y += termbits.h
|
||||
header-y += termios.h
|
||||
header-y += types.h
|
||||
header-y += ucontext.h
|
||||
header-y += unistd.h
|
||||
header-y += vtoc.h
|
||||
header-y += zcrypt.h
|
||||
|
22
arch/s390/include/uapi/asm/chpid.h
Normal file
22
arch/s390/include/uapi/asm/chpid.h
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright IBM Corp. 2007
|
||||
* Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_ASM_S390_CHPID_H
|
||||
#define _UAPI_ASM_S390_CHPID_H
|
||||
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define __MAX_CHPID 255
|
||||
|
||||
struct chp_id {
|
||||
u8 reserved1;
|
||||
u8 cssid;
|
||||
u8 reserved2;
|
||||
u8 id;
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
#endif /* _UAPI_ASM_S390_CHPID_H */
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ioctl interface for /dev/chsc
|
||||
*
|
||||
* Copyright IBM Corp. 2008
|
||||
* Copyright IBM Corp. 2008, 2012
|
||||
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
|
||||
*/
|
||||
|
||||
@ -9,9 +9,12 @@
|
||||
#define _ASM_CHSC_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <asm/chpid.h>
|
||||
#include <asm/schid.h>
|
||||
|
||||
#define CHSC_SIZE 0x1000
|
||||
|
||||
struct chsc_async_header {
|
||||
__u16 length;
|
||||
__u16 code;
|
||||
@ -23,15 +26,14 @@ struct chsc_async_header {
|
||||
|
||||
struct chsc_async_area {
|
||||
struct chsc_async_header header;
|
||||
__u8 data[PAGE_SIZE - 16 /* size of chsc_async_header */];
|
||||
__u8 data[CHSC_SIZE - sizeof(struct chsc_async_header)];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
struct chsc_response_struct {
|
||||
__u16 length;
|
||||
__u16 code;
|
||||
__u32 parms;
|
||||
__u8 data[PAGE_SIZE - 8];
|
||||
__u8 data[CHSC_SIZE - 2 * sizeof(__u16) - sizeof(__u32)];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct chsc_chp_cd {
|
53
arch/s390/include/uapi/asm/cmb.h
Normal file
53
arch/s390/include/uapi/asm/cmb.h
Normal file
@ -0,0 +1,53 @@
|
||||
#ifndef _UAPIS390_CMB_H
|
||||
#define _UAPIS390_CMB_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/**
|
||||
* struct cmbdata - channel measurement block data for user space
|
||||
* @size: size of the stored data
|
||||
* @elapsed_time: time since last sampling
|
||||
* @ssch_rsch_count: number of ssch and rsch
|
||||
* @sample_count: number of samples
|
||||
* @device_connect_time: time of device connect
|
||||
* @function_pending_time: time of function pending
|
||||
* @device_disconnect_time: time of device disconnect
|
||||
* @control_unit_queuing_time: time of control unit queuing
|
||||
* @device_active_only_time: time of device active only
|
||||
* @device_busy_time: time of device busy (ext. format)
|
||||
* @initial_command_response_time: initial command response time (ext. format)
|
||||
*
|
||||
* All values are stored as 64 bit for simplicity, especially
|
||||
* in 32 bit emulation mode. All time values are normalized to
|
||||
* nanoseconds.
|
||||
* Currently, two formats are known, which differ by the size of
|
||||
* this structure, i.e. the last two members are only set when
|
||||
* the extended channel measurement facility (first shipped in
|
||||
* z990 machines) is activated.
|
||||
* Potentially, more fields could be added, which would result in a
|
||||
* new ioctl number.
|
||||
*/
|
||||
struct cmbdata {
|
||||
__u64 size;
|
||||
__u64 elapsed_time;
|
||||
/* basic and exended format: */
|
||||
__u64 ssch_rsch_count;
|
||||
__u64 sample_count;
|
||||
__u64 device_connect_time;
|
||||
__u64 function_pending_time;
|
||||
__u64 device_disconnect_time;
|
||||
__u64 control_unit_queuing_time;
|
||||
__u64 device_active_only_time;
|
||||
/* extended format only: */
|
||||
__u64 device_busy_time;
|
||||
__u64 initial_command_response_time;
|
||||
};
|
||||
|
||||
/* enable channel measurement */
|
||||
#define BIODASDCMFENABLE _IO(DASD_IOCTL_LETTER, 32)
|
||||
/* enable channel measurement */
|
||||
#define BIODASDCMFDISABLE _IO(DASD_IOCTL_LETTER, 33)
|
||||
/* read channel measurement data */
|
||||
#define BIODASDREADALLCMB _IOWR(DASD_IOCTL_LETTER, 33, struct cmbdata)
|
||||
|
||||
#endif /* _UAPIS390_CMB_H */
|
34
arch/s390/include/uapi/asm/debug.h
Normal file
34
arch/s390/include/uapi/asm/debug.h
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* S/390 debug facility
|
||||
*
|
||||
* Copyright IBM Corp. 1999, 2000
|
||||
*/
|
||||
|
||||
#ifndef _UAPIDEBUG_H
|
||||
#define _UAPIDEBUG_H
|
||||
|
||||
#include <linux/fs.h>
|
||||
|
||||
/* Note:
|
||||
* struct __debug_entry must be defined outside of #ifdef __KERNEL__
|
||||
* in order to allow a user program to analyze the 'raw'-view.
|
||||
*/
|
||||
|
||||
struct __debug_entry{
|
||||
union {
|
||||
struct {
|
||||
unsigned long long clock:52;
|
||||
unsigned long long exception:1;
|
||||
unsigned long long level:3;
|
||||
unsigned long long cpuid:8;
|
||||
} fields;
|
||||
|
||||
unsigned long long stck;
|
||||
} id;
|
||||
void* caller;
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
#define __DEBUG_FEATURE_VERSION 2 /* version of debug feature */
|
||||
|
||||
#endif /* _UAPIDEBUG_H */
|
0
arch/s390/include/uapi/asm/kvm_para.h
Normal file
0
arch/s390/include/uapi/asm/kvm_para.h
Normal file
6
arch/s390/include/uapi/asm/mman.h
Normal file
6
arch/s390/include/uapi/asm/mman.h
Normal file
@ -0,0 +1,6 @@
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/mman.h"
|
||||
*/
|
||||
#include <asm-generic/mman.h>
|
472
arch/s390/include/uapi/asm/ptrace.h
Normal file
472
arch/s390/include/uapi/asm/ptrace.h
Normal file
@ -0,0 +1,472 @@
|
||||
/*
|
||||
* S390 version
|
||||
* Copyright IBM Corp. 1999, 2000
|
||||
* Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_S390_PTRACE_H
|
||||
#define _UAPI_S390_PTRACE_H
|
||||
|
||||
/*
|
||||
* Offsets in the user_regs_struct. They are used for the ptrace
|
||||
* system call and in entry.S
|
||||
*/
|
||||
#ifndef __s390x__
|
||||
|
||||
#define PT_PSWMASK 0x00
|
||||
#define PT_PSWADDR 0x04
|
||||
#define PT_GPR0 0x08
|
||||
#define PT_GPR1 0x0C
|
||||
#define PT_GPR2 0x10
|
||||
#define PT_GPR3 0x14
|
||||
#define PT_GPR4 0x18
|
||||
#define PT_GPR5 0x1C
|
||||
#define PT_GPR6 0x20
|
||||
#define PT_GPR7 0x24
|
||||
#define PT_GPR8 0x28
|
||||
#define PT_GPR9 0x2C
|
||||
#define PT_GPR10 0x30
|
||||
#define PT_GPR11 0x34
|
||||
#define PT_GPR12 0x38
|
||||
#define PT_GPR13 0x3C
|
||||
#define PT_GPR14 0x40
|
||||
#define PT_GPR15 0x44
|
||||
#define PT_ACR0 0x48
|
||||
#define PT_ACR1 0x4C
|
||||
#define PT_ACR2 0x50
|
||||
#define PT_ACR3 0x54
|
||||
#define PT_ACR4 0x58
|
||||
#define PT_ACR5 0x5C
|
||||
#define PT_ACR6 0x60
|
||||
#define PT_ACR7 0x64
|
||||
#define PT_ACR8 0x68
|
||||
#define PT_ACR9 0x6C
|
||||
#define PT_ACR10 0x70
|
||||
#define PT_ACR11 0x74
|
||||
#define PT_ACR12 0x78
|
||||
#define PT_ACR13 0x7C
|
||||
#define PT_ACR14 0x80
|
||||
#define PT_ACR15 0x84
|
||||
#define PT_ORIGGPR2 0x88
|
||||
#define PT_FPC 0x90
|
||||
/*
|
||||
* A nasty fact of life that the ptrace api
|
||||
* only supports passing of longs.
|
||||
*/
|
||||
#define PT_FPR0_HI 0x98
|
||||
#define PT_FPR0_LO 0x9C
|
||||
#define PT_FPR1_HI 0xA0
|
||||
#define PT_FPR1_LO 0xA4
|
||||
#define PT_FPR2_HI 0xA8
|
||||
#define PT_FPR2_LO 0xAC
|
||||
#define PT_FPR3_HI 0xB0
|
||||
#define PT_FPR3_LO 0xB4
|
||||
#define PT_FPR4_HI 0xB8
|
||||
#define PT_FPR4_LO 0xBC
|
||||
#define PT_FPR5_HI 0xC0
|
||||
#define PT_FPR5_LO 0xC4
|
||||
#define PT_FPR6_HI 0xC8
|
||||
#define PT_FPR6_LO 0xCC
|
||||
#define PT_FPR7_HI 0xD0
|
||||
#define PT_FPR7_LO 0xD4
|
||||
#define PT_FPR8_HI 0xD8
|
||||
#define PT_FPR8_LO 0XDC
|
||||
#define PT_FPR9_HI 0xE0
|
||||
#define PT_FPR9_LO 0xE4
|
||||
#define PT_FPR10_HI 0xE8
|
||||
#define PT_FPR10_LO 0xEC
|
||||
#define PT_FPR11_HI 0xF0
|
||||
#define PT_FPR11_LO 0xF4
|
||||
#define PT_FPR12_HI 0xF8
|
||||
#define PT_FPR12_LO 0xFC
|
||||
#define PT_FPR13_HI 0x100
|
||||
#define PT_FPR13_LO 0x104
|
||||
#define PT_FPR14_HI 0x108
|
||||
#define PT_FPR14_LO 0x10C
|
||||
#define PT_FPR15_HI 0x110
|
||||
#define PT_FPR15_LO 0x114
|
||||
#define PT_CR_9 0x118
|
||||
#define PT_CR_10 0x11C
|
||||
#define PT_CR_11 0x120
|
||||
#define PT_IEEE_IP 0x13C
|
||||
#define PT_LASTOFF PT_IEEE_IP
|
||||
#define PT_ENDREGS 0x140-1
|
||||
|
||||
#define GPR_SIZE 4
|
||||
#define CR_SIZE 4
|
||||
|
||||
#define STACK_FRAME_OVERHEAD 96 /* size of minimum stack frame */
|
||||
|
||||
#else /* __s390x__ */
|
||||
|
||||
#define PT_PSWMASK 0x00
|
||||
#define PT_PSWADDR 0x08
|
||||
#define PT_GPR0 0x10
|
||||
#define PT_GPR1 0x18
|
||||
#define PT_GPR2 0x20
|
||||
#define PT_GPR3 0x28
|
||||
#define PT_GPR4 0x30
|
||||
#define PT_GPR5 0x38
|
||||
#define PT_GPR6 0x40
|
||||
#define PT_GPR7 0x48
|
||||
#define PT_GPR8 0x50
|
||||
#define PT_GPR9 0x58
|
||||
#define PT_GPR10 0x60
|
||||
#define PT_GPR11 0x68
|
||||
#define PT_GPR12 0x70
|
||||
#define PT_GPR13 0x78
|
||||
#define PT_GPR14 0x80
|
||||
#define PT_GPR15 0x88
|
||||
#define PT_ACR0 0x90
|
||||
#define PT_ACR1 0x94
|
||||
#define PT_ACR2 0x98
|
||||
#define PT_ACR3 0x9C
|
||||
#define PT_ACR4 0xA0
|
||||
#define PT_ACR5 0xA4
|
||||
#define PT_ACR6 0xA8
|
||||
#define PT_ACR7 0xAC
|
||||
#define PT_ACR8 0xB0
|
||||
#define PT_ACR9 0xB4
|
||||
#define PT_ACR10 0xB8
|
||||
#define PT_ACR11 0xBC
|
||||
#define PT_ACR12 0xC0
|
||||
#define PT_ACR13 0xC4
|
||||
#define PT_ACR14 0xC8
|
||||
#define PT_ACR15 0xCC
|
||||
#define PT_ORIGGPR2 0xD0
|
||||
#define PT_FPC 0xD8
|
||||
#define PT_FPR0 0xE0
|
||||
#define PT_FPR1 0xE8
|
||||
#define PT_FPR2 0xF0
|
||||
#define PT_FPR3 0xF8
|
||||
#define PT_FPR4 0x100
|
||||
#define PT_FPR5 0x108
|
||||
#define PT_FPR6 0x110
|
||||
#define PT_FPR7 0x118
|
||||
#define PT_FPR8 0x120
|
||||
#define PT_FPR9 0x128
|
||||
#define PT_FPR10 0x130
|
||||
#define PT_FPR11 0x138
|
||||
#define PT_FPR12 0x140
|
||||
#define PT_FPR13 0x148
|
||||
#define PT_FPR14 0x150
|
||||
#define PT_FPR15 0x158
|
||||
#define PT_CR_9 0x160
|
||||
#define PT_CR_10 0x168
|
||||
#define PT_CR_11 0x170
|
||||
#define PT_IEEE_IP 0x1A8
|
||||
#define PT_LASTOFF PT_IEEE_IP
|
||||
#define PT_ENDREGS 0x1B0-1
|
||||
|
||||
#define GPR_SIZE 8
|
||||
#define CR_SIZE 8
|
||||
|
||||
#define STACK_FRAME_OVERHEAD 160 /* size of minimum stack frame */
|
||||
|
||||
#endif /* __s390x__ */
|
||||
|
||||
#define NUM_GPRS 16
|
||||
#define NUM_FPRS 16
|
||||
#define NUM_CRS 16
|
||||
#define NUM_ACRS 16
|
||||
|
||||
#define NUM_CR_WORDS 3
|
||||
|
||||
#define FPR_SIZE 8
|
||||
#define FPC_SIZE 4
|
||||
#define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */
|
||||
#define ACR_SIZE 4
|
||||
|
||||
|
||||
#define PTRACE_OLDSETOPTIONS 21
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
typedef union
|
||||
{
|
||||
float f;
|
||||
double d;
|
||||
__u64 ui;
|
||||
struct
|
||||
{
|
||||
__u32 hi;
|
||||
__u32 lo;
|
||||
} fp;
|
||||
} freg_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__u32 fpc;
|
||||
freg_t fprs[NUM_FPRS];
|
||||
} s390_fp_regs;
|
||||
|
||||
#define FPC_EXCEPTION_MASK 0xF8000000
|
||||
#define FPC_FLAGS_MASK 0x00F80000
|
||||
#define FPC_DXC_MASK 0x0000FF00
|
||||
#define FPC_RM_MASK 0x00000003
|
||||
#define FPC_VALID_MASK 0xF8F8FF03
|
||||
|
||||
/* this typedef defines how a Program Status Word looks like */
|
||||
typedef struct
|
||||
{
|
||||
unsigned long mask;
|
||||
unsigned long addr;
|
||||
} __attribute__ ((aligned(8))) psw_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__u32 mask;
|
||||
__u32 addr;
|
||||
} __attribute__ ((aligned(8))) psw_compat_t;
|
||||
|
||||
#ifndef __s390x__
|
||||
|
||||
#define PSW_MASK_PER 0x40000000UL
|
||||
#define PSW_MASK_DAT 0x04000000UL
|
||||
#define PSW_MASK_IO 0x02000000UL
|
||||
#define PSW_MASK_EXT 0x01000000UL
|
||||
#define PSW_MASK_KEY 0x00F00000UL
|
||||
#define PSW_MASK_BASE 0x00080000UL /* always one */
|
||||
#define PSW_MASK_MCHECK 0x00040000UL
|
||||
#define PSW_MASK_WAIT 0x00020000UL
|
||||
#define PSW_MASK_PSTATE 0x00010000UL
|
||||
#define PSW_MASK_ASC 0x0000C000UL
|
||||
#define PSW_MASK_CC 0x00003000UL
|
||||
#define PSW_MASK_PM 0x00000F00UL
|
||||
#define PSW_MASK_RI 0x00000000UL
|
||||
#define PSW_MASK_EA 0x00000000UL
|
||||
#define PSW_MASK_BA 0x00000000UL
|
||||
|
||||
#define PSW_MASK_USER 0x00003F00UL
|
||||
|
||||
#define PSW_ADDR_AMODE 0x80000000UL
|
||||
#define PSW_ADDR_INSN 0x7FFFFFFFUL
|
||||
|
||||
#define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 20)
|
||||
|
||||
#define PSW_ASC_PRIMARY 0x00000000UL
|
||||
#define PSW_ASC_ACCREG 0x00004000UL
|
||||
#define PSW_ASC_SECONDARY 0x00008000UL
|
||||
#define PSW_ASC_HOME 0x0000C000UL
|
||||
|
||||
#else /* __s390x__ */
|
||||
|
||||
#define PSW_MASK_PER 0x4000000000000000UL
|
||||
#define PSW_MASK_DAT 0x0400000000000000UL
|
||||
#define PSW_MASK_IO 0x0200000000000000UL
|
||||
#define PSW_MASK_EXT 0x0100000000000000UL
|
||||
#define PSW_MASK_BASE 0x0000000000000000UL
|
||||
#define PSW_MASK_KEY 0x00F0000000000000UL
|
||||
#define PSW_MASK_MCHECK 0x0004000000000000UL
|
||||
#define PSW_MASK_WAIT 0x0002000000000000UL
|
||||
#define PSW_MASK_PSTATE 0x0001000000000000UL
|
||||
#define PSW_MASK_ASC 0x0000C00000000000UL
|
||||
#define PSW_MASK_CC 0x0000300000000000UL
|
||||
#define PSW_MASK_PM 0x00000F0000000000UL
|
||||
#define PSW_MASK_RI 0x0000008000000000UL
|
||||
#define PSW_MASK_EA 0x0000000100000000UL
|
||||
#define PSW_MASK_BA 0x0000000080000000UL
|
||||
|
||||
#define PSW_MASK_USER 0x00003F8180000000UL
|
||||
|
||||
#define PSW_ADDR_AMODE 0x0000000000000000UL
|
||||
#define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL
|
||||
|
||||
#define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 52)
|
||||
|
||||
#define PSW_ASC_PRIMARY 0x0000000000000000UL
|
||||
#define PSW_ASC_ACCREG 0x0000400000000000UL
|
||||
#define PSW_ASC_SECONDARY 0x0000800000000000UL
|
||||
#define PSW_ASC_HOME 0x0000C00000000000UL
|
||||
|
||||
#endif /* __s390x__ */
|
||||
|
||||
|
||||
/*
|
||||
* The s390_regs structure is used to define the elf_gregset_t.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
psw_t psw;
|
||||
unsigned long gprs[NUM_GPRS];
|
||||
unsigned int acrs[NUM_ACRS];
|
||||
unsigned long orig_gpr2;
|
||||
} s390_regs;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
psw_compat_t psw;
|
||||
__u32 gprs[NUM_GPRS];
|
||||
__u32 acrs[NUM_ACRS];
|
||||
__u32 orig_gpr2;
|
||||
} s390_compat_regs;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__u32 gprs_high[NUM_GPRS];
|
||||
} s390_compat_regs_high;
|
||||
|
||||
|
||||
/*
|
||||
* Now for the user space program event recording (trace) definitions.
|
||||
* The following structures are used only for the ptrace interface, don't
|
||||
* touch or even look at it if you don't want to modify the user-space
|
||||
* ptrace interface. In particular stay away from it for in-kernel PER.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned long cr[NUM_CR_WORDS];
|
||||
} per_cr_words;
|
||||
|
||||
#define PER_EM_MASK 0xE8000000UL
|
||||
|
||||
typedef struct
|
||||
{
|
||||
#ifdef __s390x__
|
||||
unsigned : 32;
|
||||
#endif /* __s390x__ */
|
||||
unsigned em_branching : 1;
|
||||
unsigned em_instruction_fetch : 1;
|
||||
/*
|
||||
* Switching on storage alteration automatically fixes
|
||||
* the storage alteration event bit in the users std.
|
||||
*/
|
||||
unsigned em_storage_alteration : 1;
|
||||
unsigned em_gpr_alt_unused : 1;
|
||||
unsigned em_store_real_address : 1;
|
||||
unsigned : 3;
|
||||
unsigned branch_addr_ctl : 1;
|
||||
unsigned : 1;
|
||||
unsigned storage_alt_space_ctl : 1;
|
||||
unsigned : 21;
|
||||
unsigned long starting_addr;
|
||||
unsigned long ending_addr;
|
||||
} per_cr_bits;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned short perc_atmid;
|
||||
unsigned long address;
|
||||
unsigned char access_id;
|
||||
} per_lowcore_words;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned perc_branching : 1;
|
||||
unsigned perc_instruction_fetch : 1;
|
||||
unsigned perc_storage_alteration : 1;
|
||||
unsigned perc_gpr_alt_unused : 1;
|
||||
unsigned perc_store_real_address : 1;
|
||||
unsigned : 3;
|
||||
unsigned atmid_psw_bit_31 : 1;
|
||||
unsigned atmid_validity_bit : 1;
|
||||
unsigned atmid_psw_bit_32 : 1;
|
||||
unsigned atmid_psw_bit_5 : 1;
|
||||
unsigned atmid_psw_bit_16 : 1;
|
||||
unsigned atmid_psw_bit_17 : 1;
|
||||
unsigned si : 2;
|
||||
unsigned long address;
|
||||
unsigned : 4;
|
||||
unsigned access_id : 4;
|
||||
} per_lowcore_bits;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
union {
|
||||
per_cr_words words;
|
||||
per_cr_bits bits;
|
||||
} control_regs;
|
||||
/*
|
||||
* Use these flags instead of setting em_instruction_fetch
|
||||
* directly they are used so that single stepping can be
|
||||
* switched on & off while not affecting other tracing
|
||||
*/
|
||||
unsigned single_step : 1;
|
||||
unsigned instruction_fetch : 1;
|
||||
unsigned : 30;
|
||||
/*
|
||||
* These addresses are copied into cr10 & cr11 if single
|
||||
* stepping is switched off
|
||||
*/
|
||||
unsigned long starting_addr;
|
||||
unsigned long ending_addr;
|
||||
union {
|
||||
per_lowcore_words words;
|
||||
per_lowcore_bits bits;
|
||||
} lowcore;
|
||||
} per_struct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int len;
|
||||
unsigned long kernel_addr;
|
||||
unsigned long process_addr;
|
||||
} ptrace_area;
|
||||
|
||||
/*
|
||||
* S/390 specific non posix ptrace requests. I chose unusual values so
|
||||
* they are unlikely to clash with future ptrace definitions.
|
||||
*/
|
||||
#define PTRACE_PEEKUSR_AREA 0x5000
|
||||
#define PTRACE_POKEUSR_AREA 0x5001
|
||||
#define PTRACE_PEEKTEXT_AREA 0x5002
|
||||
#define PTRACE_PEEKDATA_AREA 0x5003
|
||||
#define PTRACE_POKETEXT_AREA 0x5004
|
||||
#define PTRACE_POKEDATA_AREA 0x5005
|
||||
#define PTRACE_GET_LAST_BREAK 0x5006
|
||||
#define PTRACE_PEEK_SYSTEM_CALL 0x5007
|
||||
#define PTRACE_POKE_SYSTEM_CALL 0x5008
|
||||
#define PTRACE_ENABLE_TE 0x5009
|
||||
#define PTRACE_DISABLE_TE 0x5010
|
||||
|
||||
/*
|
||||
* PT_PROT definition is loosely based on hppa bsd definition in
|
||||
* gdb/hppab-nat.c
|
||||
*/
|
||||
#define PTRACE_PROT 21
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ptprot_set_access_watchpoint,
|
||||
ptprot_set_write_watchpoint,
|
||||
ptprot_disable_watchpoint
|
||||
} ptprot_flags;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned long lowaddr;
|
||||
unsigned long hiaddr;
|
||||
ptprot_flags prot;
|
||||
} ptprot_area;
|
||||
|
||||
/* Sequence of bytes for breakpoint illegal instruction. */
|
||||
#define S390_BREAKPOINT {0x0,0x1}
|
||||
#define S390_BREAKPOINT_U16 ((__u16)0x0001)
|
||||
#define S390_SYSCALL_OPCODE ((__u16)0x0a00)
|
||||
#define S390_SYSCALL_SIZE 2
|
||||
|
||||
/*
|
||||
* The user_regs_struct defines the way the user registers are
|
||||
* store on the stack for signal handling.
|
||||
*/
|
||||
struct user_regs_struct
|
||||
{
|
||||
psw_t psw;
|
||||
unsigned long gprs[NUM_GPRS];
|
||||
unsigned int acrs[NUM_ACRS];
|
||||
unsigned long orig_gpr2;
|
||||
s390_fp_regs fp_regs;
|
||||
/*
|
||||
* These per registers are in here so that gdb can modify them
|
||||
* itself as there is no "official" ptrace interface for hardware
|
||||
* watchpoints. This is the way intel does it.
|
||||
*/
|
||||
per_struct per_info;
|
||||
unsigned long ieee_instruction_pointer; /* obsolete, always 0 */
|
||||
};
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _UAPI_S390_PTRACE_H */
|
16
arch/s390/include/uapi/asm/schid.h
Normal file
16
arch/s390/include/uapi/asm/schid.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef _UAPIASM_SCHID_H
|
||||
#define _UAPIASM_SCHID_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct subchannel_id {
|
||||
__u32 cssid : 8;
|
||||
__u32 : 4;
|
||||
__u32 m : 1;
|
||||
__u32 ssid : 2;
|
||||
__u32 one : 1;
|
||||
__u32 sch_no : 16;
|
||||
} __attribute__ ((packed, aligned(4)));
|
||||
|
||||
|
||||
#endif /* _UAPIASM_SCHID_H */
|
13
arch/s390/include/uapi/asm/setup.h
Normal file
13
arch/s390/include/uapi/asm/setup.h
Normal file
@ -0,0 +1,13 @@
|
||||
/*
|
||||
* S390 version
|
||||
* Copyright IBM Corp. 1999, 2010
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_ASM_S390_SETUP_H
|
||||
#define _UAPI_ASM_S390_SETUP_H
|
||||
|
||||
#define COMMAND_LINE_SIZE 4096
|
||||
|
||||
#define ARCH_COMMAND_LINE_SIZE 896
|
||||
|
||||
#endif /* _UAPI_ASM_S390_SETUP_H */
|
135
arch/s390/include/uapi/asm/signal.h
Normal file
135
arch/s390/include/uapi/asm/signal.h
Normal file
@ -0,0 +1,135 @@
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/signal.h"
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_ASMS390_SIGNAL_H
|
||||
#define _UAPI_ASMS390_SIGNAL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/time.h>
|
||||
|
||||
/* Avoid too many header ordering problems. */
|
||||
struct siginfo;
|
||||
struct pt_regs;
|
||||
|
||||
#ifndef __KERNEL__
|
||||
/* Here we must cater to libcs that poke about in kernel headers. */
|
||||
|
||||
#define NSIG 32
|
||||
typedef unsigned long sigset_t;
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#define SIGHUP 1
|
||||
#define SIGINT 2
|
||||
#define SIGQUIT 3
|
||||
#define SIGILL 4
|
||||
#define SIGTRAP 5
|
||||
#define SIGABRT 6
|
||||
#define SIGIOT 6
|
||||
#define SIGBUS 7
|
||||
#define SIGFPE 8
|
||||
#define SIGKILL 9
|
||||
#define SIGUSR1 10
|
||||
#define SIGSEGV 11
|
||||
#define SIGUSR2 12
|
||||
#define SIGPIPE 13
|
||||
#define SIGALRM 14
|
||||
#define SIGTERM 15
|
||||
#define SIGSTKFLT 16
|
||||
#define SIGCHLD 17
|
||||
#define SIGCONT 18
|
||||
#define SIGSTOP 19
|
||||
#define SIGTSTP 20
|
||||
#define SIGTTIN 21
|
||||
#define SIGTTOU 22
|
||||
#define SIGURG 23
|
||||
#define SIGXCPU 24
|
||||
#define SIGXFSZ 25
|
||||
#define SIGVTALRM 26
|
||||
#define SIGPROF 27
|
||||
#define SIGWINCH 28
|
||||
#define SIGIO 29
|
||||
#define SIGPOLL SIGIO
|
||||
/*
|
||||
#define SIGLOST 29
|
||||
*/
|
||||
#define SIGPWR 30
|
||||
#define SIGSYS 31
|
||||
#define SIGUNUSED 31
|
||||
|
||||
/* These should not be considered constants from userland. */
|
||||
#define SIGRTMIN 32
|
||||
#define SIGRTMAX _NSIG
|
||||
|
||||
/*
|
||||
* SA_FLAGS values:
|
||||
*
|
||||
* SA_ONSTACK indicates that a registered stack_t will be used.
|
||||
* SA_RESTART flag to get restarting signals (which were the default long ago)
|
||||
* SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
|
||||
* SA_RESETHAND clears the handler when the signal is delivered.
|
||||
* SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
|
||||
* SA_NODEFER prevents the current signal from being masked in the handler.
|
||||
*
|
||||
* SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
|
||||
* Unix names RESETHAND and NODEFER respectively.
|
||||
*/
|
||||
#define SA_NOCLDSTOP 0x00000001
|
||||
#define SA_NOCLDWAIT 0x00000002
|
||||
#define SA_SIGINFO 0x00000004
|
||||
#define SA_ONSTACK 0x08000000
|
||||
#define SA_RESTART 0x10000000
|
||||
#define SA_NODEFER 0x40000000
|
||||
#define SA_RESETHAND 0x80000000
|
||||
|
||||
#define SA_NOMASK SA_NODEFER
|
||||
#define SA_ONESHOT SA_RESETHAND
|
||||
|
||||
#define SA_RESTORER 0x04000000
|
||||
|
||||
/*
|
||||
* sigaltstack controls
|
||||
*/
|
||||
#define SS_ONSTACK 1
|
||||
#define SS_DISABLE 2
|
||||
|
||||
#define MINSIGSTKSZ 2048
|
||||
#define SIGSTKSZ 8192
|
||||
|
||||
#include <asm-generic/signal-defs.h>
|
||||
|
||||
#ifndef __KERNEL__
|
||||
/* Here we must cater to libcs that poke about in kernel headers. */
|
||||
|
||||
struct sigaction {
|
||||
union {
|
||||
__sighandler_t _sa_handler;
|
||||
void (*_sa_sigaction)(int, struct siginfo *, void *);
|
||||
} _u;
|
||||
#ifndef __s390x__ /* lovely */
|
||||
sigset_t sa_mask;
|
||||
unsigned long sa_flags;
|
||||
void (*sa_restorer)(void);
|
||||
#else /* __s390x__ */
|
||||
unsigned long sa_flags;
|
||||
void (*sa_restorer)(void);
|
||||
sigset_t sa_mask;
|
||||
#endif /* __s390x__ */
|
||||
};
|
||||
|
||||
#define sa_handler _u._sa_handler
|
||||
#define sa_sigaction _u._sa_sigaction
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
typedef struct sigaltstack {
|
||||
void __user *ss_sp;
|
||||
int ss_flags;
|
||||
size_t ss_size;
|
||||
} stack_t;
|
||||
|
||||
|
||||
#endif /* _UAPI_ASMS390_SIGNAL_H */
|
49
arch/s390/include/uapi/asm/termios.h
Normal file
49
arch/s390/include/uapi/asm/termios.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/termios.h"
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_S390_TERMIOS_H
|
||||
#define _UAPI_S390_TERMIOS_H
|
||||
|
||||
#include <asm/termbits.h>
|
||||
#include <asm/ioctls.h>
|
||||
|
||||
struct winsize {
|
||||
unsigned short ws_row;
|
||||
unsigned short ws_col;
|
||||
unsigned short ws_xpixel;
|
||||
unsigned short ws_ypixel;
|
||||
};
|
||||
|
||||
#define NCC 8
|
||||
struct termio {
|
||||
unsigned short c_iflag; /* input mode flags */
|
||||
unsigned short c_oflag; /* output mode flags */
|
||||
unsigned short c_cflag; /* control mode flags */
|
||||
unsigned short c_lflag; /* local mode flags */
|
||||
unsigned char c_line; /* line discipline */
|
||||
unsigned char c_cc[NCC]; /* control characters */
|
||||
};
|
||||
|
||||
/* modem lines */
|
||||
#define TIOCM_LE 0x001
|
||||
#define TIOCM_DTR 0x002
|
||||
#define TIOCM_RTS 0x004
|
||||
#define TIOCM_ST 0x008
|
||||
#define TIOCM_SR 0x010
|
||||
#define TIOCM_CTS 0x020
|
||||
#define TIOCM_CAR 0x040
|
||||
#define TIOCM_RNG 0x080
|
||||
#define TIOCM_DSR 0x100
|
||||
#define TIOCM_CD TIOCM_CAR
|
||||
#define TIOCM_RI TIOCM_RNG
|
||||
#define TIOCM_OUT1 0x2000
|
||||
#define TIOCM_OUT2 0x4000
|
||||
#define TIOCM_LOOP 0x8000
|
||||
|
||||
/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
|
||||
|
||||
|
||||
#endif /* _UAPI_S390_TERMIOS_H */
|
22
arch/s390/include/uapi/asm/types.h
Normal file
22
arch/s390/include/uapi/asm/types.h
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/types.h"
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_S390_TYPES_H
|
||||
#define _UAPI_S390_TYPES_H
|
||||
|
||||
#include <asm-generic/int-ll64.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* A address type so that arithmetic can be done on it & it can be upgraded to
|
||||
64 bit when necessary
|
||||
*/
|
||||
typedef unsigned long addr_t;
|
||||
typedef __signed__ long saddr_t;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _UAPI_S390_TYPES_H */
|
374
arch/s390/include/uapi/asm/unistd.h
Normal file
374
arch/s390/include/uapi/asm/unistd.h
Normal file
@ -0,0 +1,374 @@
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/unistd.h"
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_ASM_S390_UNISTD_H_
|
||||
#define _UAPI_ASM_S390_UNISTD_H_
|
||||
|
||||
/*
|
||||
* This file contains the system call numbers.
|
||||
*/
|
||||
|
||||
#define __NR_exit 1
|
||||
#define __NR_fork 2
|
||||
#define __NR_read 3
|
||||
#define __NR_write 4
|
||||
#define __NR_open 5
|
||||
#define __NR_close 6
|
||||
#define __NR_restart_syscall 7
|
||||
#define __NR_creat 8
|
||||
#define __NR_link 9
|
||||
#define __NR_unlink 10
|
||||
#define __NR_execve 11
|
||||
#define __NR_chdir 12
|
||||
#define __NR_mknod 14
|
||||
#define __NR_chmod 15
|
||||
#define __NR_lseek 19
|
||||
#define __NR_getpid 20
|
||||
#define __NR_mount 21
|
||||
#define __NR_umount 22
|
||||
#define __NR_ptrace 26
|
||||
#define __NR_alarm 27
|
||||
#define __NR_pause 29
|
||||
#define __NR_utime 30
|
||||
#define __NR_access 33
|
||||
#define __NR_nice 34
|
||||
#define __NR_sync 36
|
||||
#define __NR_kill 37
|
||||
#define __NR_rename 38
|
||||
#define __NR_mkdir 39
|
||||
#define __NR_rmdir 40
|
||||
#define __NR_dup 41
|
||||
#define __NR_pipe 42
|
||||
#define __NR_times 43
|
||||
#define __NR_brk 45
|
||||
#define __NR_signal 48
|
||||
#define __NR_acct 51
|
||||
#define __NR_umount2 52
|
||||
#define __NR_ioctl 54
|
||||
#define __NR_fcntl 55
|
||||
#define __NR_setpgid 57
|
||||
#define __NR_umask 60
|
||||
#define __NR_chroot 61
|
||||
#define __NR_ustat 62
|
||||
#define __NR_dup2 63
|
||||
#define __NR_getppid 64
|
||||
#define __NR_getpgrp 65
|
||||
#define __NR_setsid 66
|
||||
#define __NR_sigaction 67
|
||||
#define __NR_sigsuspend 72
|
||||
#define __NR_sigpending 73
|
||||
#define __NR_sethostname 74
|
||||
#define __NR_setrlimit 75
|
||||
#define __NR_getrusage 77
|
||||
#define __NR_gettimeofday 78
|
||||
#define __NR_settimeofday 79
|
||||
#define __NR_symlink 83
|
||||
#define __NR_readlink 85
|
||||
#define __NR_uselib 86
|
||||
#define __NR_swapon 87
|
||||
#define __NR_reboot 88
|
||||
#define __NR_readdir 89
|
||||
#define __NR_mmap 90
|
||||
#define __NR_munmap 91
|
||||
#define __NR_truncate 92
|
||||
#define __NR_ftruncate 93
|
||||
#define __NR_fchmod 94
|
||||
#define __NR_getpriority 96
|
||||
#define __NR_setpriority 97
|
||||
#define __NR_statfs 99
|
||||
#define __NR_fstatfs 100
|
||||
#define __NR_socketcall 102
|
||||
#define __NR_syslog 103
|
||||
#define __NR_setitimer 104
|
||||
#define __NR_getitimer 105
|
||||
#define __NR_stat 106
|
||||
#define __NR_lstat 107
|
||||
#define __NR_fstat 108
|
||||
#define __NR_lookup_dcookie 110
|
||||
#define __NR_vhangup 111
|
||||
#define __NR_idle 112
|
||||
#define __NR_wait4 114
|
||||
#define __NR_swapoff 115
|
||||
#define __NR_sysinfo 116
|
||||
#define __NR_ipc 117
|
||||
#define __NR_fsync 118
|
||||
#define __NR_sigreturn 119
|
||||
#define __NR_clone 120
|
||||
#define __NR_setdomainname 121
|
||||
#define __NR_uname 122
|
||||
#define __NR_adjtimex 124
|
||||
#define __NR_mprotect 125
|
||||
#define __NR_sigprocmask 126
|
||||
#define __NR_create_module 127
|
||||
#define __NR_init_module 128
|
||||
#define __NR_delete_module 129
|
||||
#define __NR_get_kernel_syms 130
|
||||
#define __NR_quotactl 131
|
||||
#define __NR_getpgid 132
|
||||
#define __NR_fchdir 133
|
||||
#define __NR_bdflush 134
|
||||
#define __NR_sysfs 135
|
||||
#define __NR_personality 136
|
||||
#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
|
||||
#define __NR_getdents 141
|
||||
#define __NR_flock 143
|
||||
#define __NR_msync 144
|
||||
#define __NR_readv 145
|
||||
#define __NR_writev 146
|
||||
#define __NR_getsid 147
|
||||
#define __NR_fdatasync 148
|
||||
#define __NR__sysctl 149
|
||||
#define __NR_mlock 150
|
||||
#define __NR_munlock 151
|
||||
#define __NR_mlockall 152
|
||||
#define __NR_munlockall 153
|
||||
#define __NR_sched_setparam 154
|
||||
#define __NR_sched_getparam 155
|
||||
#define __NR_sched_setscheduler 156
|
||||
#define __NR_sched_getscheduler 157
|
||||
#define __NR_sched_yield 158
|
||||
#define __NR_sched_get_priority_max 159
|
||||
#define __NR_sched_get_priority_min 160
|
||||
#define __NR_sched_rr_get_interval 161
|
||||
#define __NR_nanosleep 162
|
||||
#define __NR_mremap 163
|
||||
#define __NR_query_module 167
|
||||
#define __NR_poll 168
|
||||
#define __NR_nfsservctl 169
|
||||
#define __NR_prctl 172
|
||||
#define __NR_rt_sigreturn 173
|
||||
#define __NR_rt_sigaction 174
|
||||
#define __NR_rt_sigprocmask 175
|
||||
#define __NR_rt_sigpending 176
|
||||
#define __NR_rt_sigtimedwait 177
|
||||
#define __NR_rt_sigqueueinfo 178
|
||||
#define __NR_rt_sigsuspend 179
|
||||
#define __NR_pread64 180
|
||||
#define __NR_pwrite64 181
|
||||
#define __NR_getcwd 183
|
||||
#define __NR_capget 184
|
||||
#define __NR_capset 185
|
||||
#define __NR_sigaltstack 186
|
||||
#define __NR_sendfile 187
|
||||
#define __NR_getpmsg 188
|
||||
#define __NR_putpmsg 189
|
||||
#define __NR_vfork 190
|
||||
#define __NR_pivot_root 217
|
||||
#define __NR_mincore 218
|
||||
#define __NR_madvise 219
|
||||
#define __NR_getdents64 220
|
||||
#define __NR_readahead 222
|
||||
#define __NR_setxattr 224
|
||||
#define __NR_lsetxattr 225
|
||||
#define __NR_fsetxattr 226
|
||||
#define __NR_getxattr 227
|
||||
#define __NR_lgetxattr 228
|
||||
#define __NR_fgetxattr 229
|
||||
#define __NR_listxattr 230
|
||||
#define __NR_llistxattr 231
|
||||
#define __NR_flistxattr 232
|
||||
#define __NR_removexattr 233
|
||||
#define __NR_lremovexattr 234
|
||||
#define __NR_fremovexattr 235
|
||||
#define __NR_gettid 236
|
||||
#define __NR_tkill 237
|
||||
#define __NR_futex 238
|
||||
#define __NR_sched_setaffinity 239
|
||||
#define __NR_sched_getaffinity 240
|
||||
#define __NR_tgkill 241
|
||||
/* Number 242 is reserved for tux */
|
||||
#define __NR_io_setup 243
|
||||
#define __NR_io_destroy 244
|
||||
#define __NR_io_getevents 245
|
||||
#define __NR_io_submit 246
|
||||
#define __NR_io_cancel 247
|
||||
#define __NR_exit_group 248
|
||||
#define __NR_epoll_create 249
|
||||
#define __NR_epoll_ctl 250
|
||||
#define __NR_epoll_wait 251
|
||||
#define __NR_set_tid_address 252
|
||||
#define __NR_fadvise64 253
|
||||
#define __NR_timer_create 254
|
||||
#define __NR_timer_settime (__NR_timer_create+1)
|
||||
#define __NR_timer_gettime (__NR_timer_create+2)
|
||||
#define __NR_timer_getoverrun (__NR_timer_create+3)
|
||||
#define __NR_timer_delete (__NR_timer_create+4)
|
||||
#define __NR_clock_settime (__NR_timer_create+5)
|
||||
#define __NR_clock_gettime (__NR_timer_create+6)
|
||||
#define __NR_clock_getres (__NR_timer_create+7)
|
||||
#define __NR_clock_nanosleep (__NR_timer_create+8)
|
||||
/* Number 263 is reserved for vserver */
|
||||
#define __NR_statfs64 265
|
||||
#define __NR_fstatfs64 266
|
||||
#define __NR_remap_file_pages 267
|
||||
/* Number 268 is reserved for new sys_mbind */
|
||||
/* Number 269 is reserved for new sys_get_mempolicy */
|
||||
/* Number 270 is reserved for new sys_set_mempolicy */
|
||||
#define __NR_mq_open 271
|
||||
#define __NR_mq_unlink 272
|
||||
#define __NR_mq_timedsend 273
|
||||
#define __NR_mq_timedreceive 274
|
||||
#define __NR_mq_notify 275
|
||||
#define __NR_mq_getsetattr 276
|
||||
#define __NR_kexec_load 277
|
||||
#define __NR_add_key 278
|
||||
#define __NR_request_key 279
|
||||
#define __NR_keyctl 280
|
||||
#define __NR_waitid 281
|
||||
#define __NR_ioprio_set 282
|
||||
#define __NR_ioprio_get 283
|
||||
#define __NR_inotify_init 284
|
||||
#define __NR_inotify_add_watch 285
|
||||
#define __NR_inotify_rm_watch 286
|
||||
/* Number 287 is reserved for new sys_migrate_pages */
|
||||
#define __NR_openat 288
|
||||
#define __NR_mkdirat 289
|
||||
#define __NR_mknodat 290
|
||||
#define __NR_fchownat 291
|
||||
#define __NR_futimesat 292
|
||||
#define __NR_unlinkat 294
|
||||
#define __NR_renameat 295
|
||||
#define __NR_linkat 296
|
||||
#define __NR_symlinkat 297
|
||||
#define __NR_readlinkat 298
|
||||
#define __NR_fchmodat 299
|
||||
#define __NR_faccessat 300
|
||||
#define __NR_pselect6 301
|
||||
#define __NR_ppoll 302
|
||||
#define __NR_unshare 303
|
||||
#define __NR_set_robust_list 304
|
||||
#define __NR_get_robust_list 305
|
||||
#define __NR_splice 306
|
||||
#define __NR_sync_file_range 307
|
||||
#define __NR_tee 308
|
||||
#define __NR_vmsplice 309
|
||||
/* Number 310 is reserved for new sys_move_pages */
|
||||
#define __NR_getcpu 311
|
||||
#define __NR_epoll_pwait 312
|
||||
#define __NR_utimes 313
|
||||
#define __NR_fallocate 314
|
||||
#define __NR_utimensat 315
|
||||
#define __NR_signalfd 316
|
||||
#define __NR_timerfd 317
|
||||
#define __NR_eventfd 318
|
||||
#define __NR_timerfd_create 319
|
||||
#define __NR_timerfd_settime 320
|
||||
#define __NR_timerfd_gettime 321
|
||||
#define __NR_signalfd4 322
|
||||
#define __NR_eventfd2 323
|
||||
#define __NR_inotify_init1 324
|
||||
#define __NR_pipe2 325
|
||||
#define __NR_dup3 326
|
||||
#define __NR_epoll_create1 327
|
||||
#define __NR_preadv 328
|
||||
#define __NR_pwritev 329
|
||||
#define __NR_rt_tgsigqueueinfo 330
|
||||
#define __NR_perf_event_open 331
|
||||
#define __NR_fanotify_init 332
|
||||
#define __NR_fanotify_mark 333
|
||||
#define __NR_prlimit64 334
|
||||
#define __NR_name_to_handle_at 335
|
||||
#define __NR_open_by_handle_at 336
|
||||
#define __NR_clock_adjtime 337
|
||||
#define __NR_syncfs 338
|
||||
#define __NR_setns 339
|
||||
#define __NR_process_vm_readv 340
|
||||
#define __NR_process_vm_writev 341
|
||||
#define __NR_s390_runtime_instr 342
|
||||
#define __NR_kcmp 343
|
||||
#define NR_syscalls 344
|
||||
|
||||
/*
|
||||
* There are some system calls that are not present on 64 bit, some
|
||||
* have a different name although they do the same (e.g. __NR_chown32
|
||||
* is __NR_chown on 64 bit).
|
||||
*/
|
||||
#ifndef __s390x__
|
||||
|
||||
#define __NR_time 13
|
||||
#define __NR_lchown 16
|
||||
#define __NR_setuid 23
|
||||
#define __NR_getuid 24
|
||||
#define __NR_stime 25
|
||||
#define __NR_setgid 46
|
||||
#define __NR_getgid 47
|
||||
#define __NR_geteuid 49
|
||||
#define __NR_getegid 50
|
||||
#define __NR_setreuid 70
|
||||
#define __NR_setregid 71
|
||||
#define __NR_getrlimit 76
|
||||
#define __NR_getgroups 80
|
||||
#define __NR_setgroups 81
|
||||
#define __NR_fchown 95
|
||||
#define __NR_ioperm 101
|
||||
#define __NR_setfsuid 138
|
||||
#define __NR_setfsgid 139
|
||||
#define __NR__llseek 140
|
||||
#define __NR__newselect 142
|
||||
#define __NR_setresuid 164
|
||||
#define __NR_getresuid 165
|
||||
#define __NR_setresgid 170
|
||||
#define __NR_getresgid 171
|
||||
#define __NR_chown 182
|
||||
#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */
|
||||
#define __NR_mmap2 192
|
||||
#define __NR_truncate64 193
|
||||
#define __NR_ftruncate64 194
|
||||
#define __NR_stat64 195
|
||||
#define __NR_lstat64 196
|
||||
#define __NR_fstat64 197
|
||||
#define __NR_lchown32 198
|
||||
#define __NR_getuid32 199
|
||||
#define __NR_getgid32 200
|
||||
#define __NR_geteuid32 201
|
||||
#define __NR_getegid32 202
|
||||
#define __NR_setreuid32 203
|
||||
#define __NR_setregid32 204
|
||||
#define __NR_getgroups32 205
|
||||
#define __NR_setgroups32 206
|
||||
#define __NR_fchown32 207
|
||||
#define __NR_setresuid32 208
|
||||
#define __NR_getresuid32 209
|
||||
#define __NR_setresgid32 210
|
||||
#define __NR_getresgid32 211
|
||||
#define __NR_chown32 212
|
||||
#define __NR_setuid32 213
|
||||
#define __NR_setgid32 214
|
||||
#define __NR_setfsuid32 215
|
||||
#define __NR_setfsgid32 216
|
||||
#define __NR_fcntl64 221
|
||||
#define __NR_sendfile64 223
|
||||
#define __NR_fadvise64_64 264
|
||||
#define __NR_fstatat64 293
|
||||
|
||||
#else
|
||||
|
||||
#define __NR_select 142
|
||||
#define __NR_getrlimit 191 /* SuS compliant getrlimit */
|
||||
#define __NR_lchown 198
|
||||
#define __NR_getuid 199
|
||||
#define __NR_getgid 200
|
||||
#define __NR_geteuid 201
|
||||
#define __NR_getegid 202
|
||||
#define __NR_setreuid 203
|
||||
#define __NR_setregid 204
|
||||
#define __NR_getgroups 205
|
||||
#define __NR_setgroups 206
|
||||
#define __NR_fchown 207
|
||||
#define __NR_setresuid 208
|
||||
#define __NR_getresuid 209
|
||||
#define __NR_setresgid 210
|
||||
#define __NR_getresgid 211
|
||||
#define __NR_chown 212
|
||||
#define __NR_setuid 213
|
||||
#define __NR_setgid 214
|
||||
#define __NR_setfsuid 215
|
||||
#define __NR_setfsgid 216
|
||||
#define __NR_newfstatat 293
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _UAPI_ASM_S390_UNISTD_H_ */
|
@ -283,14 +283,6 @@ static noinline __init void setup_facility_list(void)
|
||||
ARRAY_SIZE(S390_lowcore.stfle_fac_list));
|
||||
}
|
||||
|
||||
static noinline __init void setup_hpage(void)
|
||||
{
|
||||
if (!test_facility(2) || !test_facility(8))
|
||||
return;
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_HPAGE;
|
||||
__ctl_set_bit(0, 23);
|
||||
}
|
||||
|
||||
static __init void detect_mvpg(void)
|
||||
{
|
||||
#ifndef CONFIG_64BIT
|
||||
@ -378,10 +370,14 @@ static __init void detect_diag44(void)
|
||||
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);
|
||||
}
|
||||
if (test_facility(78))
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_EDAT2;
|
||||
if (test_facility(3))
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_IDTE;
|
||||
if (test_facility(8))
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_PFMF;
|
||||
if (test_facility(27))
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_MVCOS;
|
||||
if (test_facility(40))
|
||||
@ -484,7 +480,6 @@ void __init startup_init(void)
|
||||
detect_diag9c();
|
||||
detect_diag44();
|
||||
detect_machine_facilities();
|
||||
setup_hpage();
|
||||
setup_topology();
|
||||
sclp_facilities_detect();
|
||||
detect_memory_layout(memory_chunk);
|
||||
|
@ -295,7 +295,7 @@ sysc_sigpending:
|
||||
jno sysc_return
|
||||
lmg %r2,%r7,__PT_R2(%r11) # load svc arguments
|
||||
lghi %r8,0 # svc 0 returns -ENOSYS
|
||||
lh %r1,__PT_INT_CODE+2(%r11) # load new svc number
|
||||
llgh %r1,__PT_INT_CODE+2(%r11) # load new svc number
|
||||
cghi %r1,NR_syscalls
|
||||
jnl sysc_nr_ok # invalid svc number -> do svc 0
|
||||
slag %r8,%r1,2
|
||||
|
@ -52,7 +52,7 @@ __HEAD
|
||||
.long 0x02000370,0x60000050 # the channel program the PSW
|
||||
.long 0x020003c0,0x60000050 # at location 0 is loaded.
|
||||
.long 0x02000410,0x60000050 # Initial processing starts
|
||||
.long 0x02000460,0x60000050 # at 0xf0 = iplstart.
|
||||
.long 0x02000460,0x60000050 # at 0x200 = iplstart.
|
||||
.long 0x020004b0,0x60000050
|
||||
.long 0x02000500,0x60000050
|
||||
.long 0x02000550,0x60000050
|
||||
@ -62,11 +62,54 @@ __HEAD
|
||||
.long 0x02000690,0x60000050
|
||||
.long 0x020006e0,0x20000050
|
||||
|
||||
.org 0xf0
|
||||
.org 0x200
|
||||
#
|
||||
# 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)
|
||||
sigp %r1,%r0,0x12 # switch to esame mode
|
||||
bras %r13,0f
|
||||
.fill 16,4,0x0
|
||||
0: lmh %r0,%r15,0(%r13) # clear high-order half of gprs
|
||||
sam31 # switch to 31 bit addressing mode
|
||||
#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:
|
||||
br %r14
|
||||
.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
|
||||
|
||||
#
|
||||
# subroutine for loading cards from the reader
|
||||
#
|
||||
.Lloader:
|
||||
la %r4,0(%r14)
|
||||
la %r3,.Lorb # r2 = address of orb into r2
|
||||
la %r5,.Lirb # r4 = address of irb
|
||||
la %r6,.Lccws
|
||||
@ -83,9 +126,7 @@ __HEAD
|
||||
ssch 0(%r3) # load chunk of 1600 bytes
|
||||
bnz .Llderr
|
||||
.Lwait4irq:
|
||||
mvc 0x78(8),.Lnewpsw # set up IO interrupt psw
|
||||
lpsw .Lwaitpsw
|
||||
.Lioint:
|
||||
bas %r14,.Lirqwait
|
||||
c %r1,0xb8 # compare subchannel number
|
||||
bne .Lwait4irq
|
||||
tsch 0(%r5)
|
||||
@ -104,7 +145,7 @@ __HEAD
|
||||
sr %r0,%r3 # #ccws*80-residual=#bytes read
|
||||
ar %r2,%r0
|
||||
|
||||
br %r14 # r2 contains the total size
|
||||
br %r4 # r2 contains the total size
|
||||
|
||||
.Lcont:
|
||||
ahi %r2,0x640 # add 0x640 to total size
|
||||
@ -128,10 +169,6 @@ __HEAD
|
||||
.Lloadp:.long 0,0
|
||||
.align 8
|
||||
.Lcrash:.long 0x000a0000,0x00000000
|
||||
.Lnewpsw:
|
||||
.long 0x00080000,0x80000000+.Lioint
|
||||
.Lwaitpsw:
|
||||
.long 0x020a0000,0x80000000+.Lioint
|
||||
|
||||
.align 8
|
||||
.Lccws: .rept 19
|
||||
@ -140,6 +177,7 @@ __HEAD
|
||||
.long 0x02200050,0x00000000
|
||||
|
||||
iplstart:
|
||||
bas %r14,.Lsetmode # Immediately switch to 64 bit mode
|
||||
lh %r1,0xb8 # test if subchannel number
|
||||
bct %r1,.Lnoload # is valid
|
||||
l %r1,0xb8 # load ipl subchannel number
|
||||
@ -209,8 +247,8 @@ iplstart:
|
||||
#
|
||||
# reset files in VM reader
|
||||
#
|
||||
stidp __LC_SAVE_AREA_SYNC # store cpuid
|
||||
tm __LC_SAVE_AREA_SYNC,0xff# running VM ?
|
||||
stidp .Lcpuid # store cpuid
|
||||
tm .Lcpuid,0xff # running VM ?
|
||||
bno .Lnoreset
|
||||
la %r2,.Lreset
|
||||
lhi %r3,26
|
||||
@ -222,23 +260,14 @@ iplstart:
|
||||
tm 31(%r5),0xff # bits is set in the schib
|
||||
bz .Lnoreset
|
||||
.Lwaitforirq:
|
||||
mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw
|
||||
.Lwaitrdrirq:
|
||||
lpsw .Lrdrwaitpsw
|
||||
.Lrdrint:
|
||||
bas %r14,.Lirqwait # wait for IO interrupt
|
||||
c %r1,0xb8 # compare subchannel number
|
||||
bne .Lwaitrdrirq
|
||||
bne .Lwaitforirq
|
||||
la %r5,.Lirb
|
||||
tsch 0(%r5)
|
||||
.Lnoreset:
|
||||
b .Lnoload
|
||||
|
||||
.align 8
|
||||
.Lrdrnewpsw:
|
||||
.long 0x00080000,0x80000000+.Lrdrint
|
||||
.Lrdrwaitpsw:
|
||||
.long 0x020a0000,0x80000000+.Lrdrint
|
||||
|
||||
#
|
||||
# everything loaded, go for it
|
||||
#
|
||||
@ -254,6 +283,8 @@ iplstart:
|
||||
.byte 0xc8,0xd6,0xd3,0xc4 # "change rdr all keep nohold"
|
||||
.L_eof: .long 0xc5d6c600 /* C'EOF' */
|
||||
.L_hdr: .long 0xc8c4d900 /* C'HDR' */
|
||||
.align 8
|
||||
.Lcpuid:.fill 8,1,0
|
||||
|
||||
#
|
||||
# SALIPL loader support. Based on a patch by Rob van der Heij.
|
||||
@ -263,6 +294,7 @@ iplstart:
|
||||
.org 0x800
|
||||
ENTRY(start)
|
||||
stm %r0,%r15,0x07b0 # store registers
|
||||
bas %r14,.Lsetmode # Immediately switch to 64 bit mode
|
||||
basr %r12,%r0
|
||||
.base:
|
||||
l %r11,.parm
|
||||
@ -343,6 +375,18 @@ 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)
|
||||
sigp %r1,%r0,0x12 # switch to esame mode
|
||||
bras %r13,0f
|
||||
.fill 16,4,0x0
|
||||
0: lmh %r0,%r15,0(%r13) # clear high-order half of gprs
|
||||
sam31 # switch to 31 bit addressing mode
|
||||
#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
|
||||
@ -410,22 +454,17 @@ ENTRY(startup_kdump)
|
||||
#endif
|
||||
|
||||
#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)
|
||||
sigp %r1,%r0,0x12 # switch to esame mode
|
||||
/* Continue with 64bit startup code in head64.S */
|
||||
sam64 # switch to 64 bit mode
|
||||
larl %r13,4f
|
||||
lmh %r0,%r15,0(%r13) # clear high-order half
|
||||
jg startup_continue
|
||||
4: .fill 16,4,0x0
|
||||
#else
|
||||
mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0)
|
||||
/* Continue with 31bit startup code in head31.S */
|
||||
l %r13,4f-.LPG0(%r13)
|
||||
b 0(%r13)
|
||||
.align 8
|
||||
4: .long startup_continue
|
||||
#endif
|
||||
|
||||
.align 8
|
||||
5: .long 0x7fffffff,0xffffffff
|
||||
|
||||
|
@ -78,10 +78,7 @@ ENTRY(startup_continue)
|
||||
|
||||
ENTRY(_ehead)
|
||||
|
||||
#ifdef CONFIG_SHARED_KERNEL
|
||||
.org 0x100000 - 0x11000 # head.o ends at 0x11000
|
||||
#endif
|
||||
|
||||
#
|
||||
# startup-code, running in absolute addressing mode
|
||||
#
|
||||
|
@ -76,10 +76,7 @@ ENTRY(startup_continue)
|
||||
|
||||
ENTRY(_ehead)
|
||||
|
||||
#ifdef CONFIG_SHARED_KERNEL
|
||||
.org 0x100000 - 0x11000 # head.o ends at 0x11000
|
||||
#endif
|
||||
|
||||
#
|
||||
# startup-code, running in absolute addressing mode
|
||||
#
|
||||
|
@ -44,6 +44,17 @@
|
||||
#define PLT_ENTRY_SIZE 20
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
void *module_alloc(unsigned long size)
|
||||
{
|
||||
if (PAGE_ALIGN(size) > MODULES_LEN)
|
||||
return NULL;
|
||||
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
|
||||
GFP_KERNEL, PAGE_KERNEL, -1,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Free memory returned from module_alloc */
|
||||
void module_free(struct module *mod, void *module_region)
|
||||
{
|
||||
|
@ -105,6 +105,11 @@ 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];
|
||||
EXPORT_SYMBOL(lowcore_ptr);
|
||||
@ -544,19 +549,23 @@ static void __init setup_memory_end(void)
|
||||
|
||||
/* Choose kernel address space layout: 2, 3, or 4 levels. */
|
||||
#ifdef CONFIG_64BIT
|
||||
vmalloc_size = VMALLOC_END ?: 128UL << 30;
|
||||
vmalloc_size = VMALLOC_END ?: (128UL << 30) - MODULES_LEN;
|
||||
tmp = (memory_end ?: real_memory_size) / PAGE_SIZE;
|
||||
tmp = tmp * (sizeof(struct page) + PAGE_SIZE) + vmalloc_size;
|
||||
if (tmp <= (1UL << 42))
|
||||
vmax = 1UL << 42; /* 3-level kernel page table */
|
||||
else
|
||||
vmax = 1UL << 53; /* 4-level kernel page table */
|
||||
/* module area is at the end of the kernel address space. */
|
||||
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 */
|
||||
#endif
|
||||
/* 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 */
|
||||
@ -768,6 +777,40 @@ static void __init reserve_crashkernel(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init init_storage_keys(unsigned long start, unsigned long end)
|
||||
{
|
||||
unsigned long boundary, function, size;
|
||||
|
||||
while (start < end) {
|
||||
if (MACHINE_HAS_EDAT2) {
|
||||
/* set storage keys for a 2GB frame */
|
||||
function = 0x22000 | PAGE_DEFAULT_KEY;
|
||||
size = 1UL << 31;
|
||||
boundary = (start + size) & ~(size - 1);
|
||||
if (boundary <= end) {
|
||||
do {
|
||||
start = pfmf(function, start);
|
||||
} while (start < boundary);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (MACHINE_HAS_EDAT1) {
|
||||
/* set storage keys for a 1MB frame */
|
||||
function = 0x21000 | PAGE_DEFAULT_KEY;
|
||||
size = 1UL << 20;
|
||||
boundary = (start + size) & ~(size - 1);
|
||||
if (boundary <= end) {
|
||||
do {
|
||||
start = pfmf(function, start);
|
||||
} while (start < boundary);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
page_set_storage_key(start, PAGE_DEFAULT_KEY, 0);
|
||||
start += PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init setup_memory(void)
|
||||
{
|
||||
unsigned long bootmap_size;
|
||||
@ -846,9 +889,7 @@ static void __init setup_memory(void)
|
||||
memblock_add_node(PFN_PHYS(start_chunk),
|
||||
PFN_PHYS(end_chunk - start_chunk), 0);
|
||||
pfn = max(start_chunk, start_pfn);
|
||||
for (; pfn < end_chunk; pfn++)
|
||||
page_set_storage_key(PFN_PHYS(pfn),
|
||||
PAGE_DEFAULT_KEY, 0);
|
||||
init_storage_keys(PFN_PHYS(pfn), PFN_PHYS(end_chunk));
|
||||
}
|
||||
|
||||
psw_set_key(PAGE_DEFAULT_KEY);
|
||||
|
@ -7,3 +7,4 @@ obj-y := init.o fault.o extmem.o mmap.o vmem.o pgtable.o maccess.o \
|
||||
obj-$(CONFIG_CMM) += cmm.o
|
||||
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
|
||||
obj-$(CONFIG_DEBUG_SET_MODULE_RONX) += pageattr.o
|
||||
obj-$(CONFIG_S390_PTDUMP) += dump_pagetables.o
|
||||
|
226
arch/s390/mm/dump_pagetables.c
Normal file
226
arch/s390/mm/dump_pagetables.c
Normal file
@ -0,0 +1,226 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
static unsigned long max_addr;
|
||||
|
||||
struct addr_marker {
|
||||
unsigned long start_address;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
enum address_markers_idx {
|
||||
IDENTITY_NR = 0,
|
||||
KERNEL_START_NR,
|
||||
KERNEL_END_NR,
|
||||
VMEMMAP_NR,
|
||||
VMALLOC_NR,
|
||||
#ifdef CONFIG_64BIT
|
||||
MODULES_NR,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct addr_marker address_markers[] = {
|
||||
[IDENTITY_NR] = {0, "Identity Mapping"},
|
||||
[KERNEL_START_NR] = {(unsigned long)&_stext, "Kernel Image Start"},
|
||||
[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 }
|
||||
};
|
||||
|
||||
struct pg_state {
|
||||
int level;
|
||||
unsigned int current_prot;
|
||||
unsigned long start_address;
|
||||
unsigned long current_address;
|
||||
const struct addr_marker *marker;
|
||||
};
|
||||
|
||||
static void print_prot(struct seq_file *m, unsigned int pr, int level)
|
||||
{
|
||||
static const char * const level_name[] =
|
||||
{ "ASCE", "PGD", "PUD", "PMD", "PTE" };
|
||||
|
||||
seq_printf(m, "%s ", level_name[level]);
|
||||
if (pr & _PAGE_INVALID)
|
||||
seq_printf(m, "I\n");
|
||||
else
|
||||
seq_printf(m, "%s\n", pr & _PAGE_RO ? "RO" : "RW");
|
||||
}
|
||||
|
||||
static void note_page(struct seq_file *m, struct pg_state *st,
|
||||
unsigned int new_prot, int level)
|
||||
{
|
||||
static const char units[] = "KMGTPE";
|
||||
int width = sizeof(unsigned long) * 2;
|
||||
const char *unit = units;
|
||||
unsigned int prot, cur;
|
||||
unsigned long delta;
|
||||
|
||||
/*
|
||||
* If we have a "break" in the series, we need to flush the state
|
||||
* that we have now. "break" is either changing perms, levels or
|
||||
* address space marker.
|
||||
*/
|
||||
prot = new_prot;
|
||||
cur = st->current_prot;
|
||||
|
||||
if (!st->level) {
|
||||
/* First entry */
|
||||
st->current_prot = new_prot;
|
||||
st->level = level;
|
||||
st->marker = address_markers;
|
||||
seq_printf(m, "---[ %s ]---\n", st->marker->name);
|
||||
} else if (prot != cur || level != st->level ||
|
||||
st->current_address >= st->marker[1].start_address) {
|
||||
/* Print the actual finished series */
|
||||
seq_printf(m, "0x%0*lx-0x%0*lx",
|
||||
width, st->start_address,
|
||||
width, st->current_address);
|
||||
delta = (st->current_address - st->start_address) >> 10;
|
||||
while (!(delta & 0x3ff) && unit[1]) {
|
||||
delta >>= 10;
|
||||
unit++;
|
||||
}
|
||||
seq_printf(m, "%9lu%c ", delta, *unit);
|
||||
print_prot(m, st->current_prot, st->level);
|
||||
if (st->current_address >= st->marker[1].start_address) {
|
||||
st->marker++;
|
||||
seq_printf(m, "---[ %s ]---\n", st->marker->name);
|
||||
}
|
||||
st->start_address = st->current_address;
|
||||
st->current_prot = new_prot;
|
||||
st->level = level;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The actual page table walker functions. In order to keep the implementation
|
||||
* of print_prot() short, we only check and pass _PAGE_INVALID and _PAGE_RO
|
||||
* flags to note_page() if a region, segment or page table entry is invalid or
|
||||
* read-only.
|
||||
* After all it's just a hint that the current level being walked contains an
|
||||
* invalid or read-only entry.
|
||||
*/
|
||||
static void walk_pte_level(struct seq_file *m, struct pg_state *st,
|
||||
pmd_t *pmd, unsigned long addr)
|
||||
{
|
||||
unsigned int prot;
|
||||
pte_t *pte;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PTRS_PER_PTE && addr < max_addr; i++) {
|
||||
st->current_address = addr;
|
||||
pte = pte_offset_kernel(pmd, addr);
|
||||
prot = pte_val(*pte) & (_PAGE_RO | _PAGE_INVALID);
|
||||
note_page(m, st, prot, 4);
|
||||
addr += PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
static void walk_pmd_level(struct seq_file *m, struct pg_state *st,
|
||||
pud_t *pud, unsigned long addr)
|
||||
{
|
||||
unsigned int prot;
|
||||
pmd_t *pmd;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PTRS_PER_PMD && addr < max_addr; i++) {
|
||||
st->current_address = addr;
|
||||
pmd = pmd_offset(pud, addr);
|
||||
if (!pmd_none(*pmd)) {
|
||||
if (pmd_large(*pmd)) {
|
||||
prot = pmd_val(*pmd) & _SEGMENT_ENTRY_RO;
|
||||
note_page(m, st, prot, 3);
|
||||
} else
|
||||
walk_pte_level(m, st, pmd, addr);
|
||||
} else
|
||||
note_page(m, st, _PAGE_INVALID, 3);
|
||||
addr += PMD_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
static void walk_pud_level(struct seq_file *m, struct pg_state *st,
|
||||
pgd_t *pgd, unsigned long addr)
|
||||
{
|
||||
pud_t *pud;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PTRS_PER_PUD && addr < max_addr; i++) {
|
||||
st->current_address = addr;
|
||||
pud = pud_offset(pgd, addr);
|
||||
if (!pud_none(*pud))
|
||||
walk_pmd_level(m, st, pud, addr);
|
||||
else
|
||||
note_page(m, st, _PAGE_INVALID, 2);
|
||||
addr += PUD_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
static void walk_pgd_level(struct seq_file *m)
|
||||
{
|
||||
unsigned long addr = 0;
|
||||
struct pg_state st;
|
||||
pgd_t *pgd;
|
||||
int i;
|
||||
|
||||
memset(&st, 0, sizeof(st));
|
||||
for (i = 0; i < PTRS_PER_PGD && addr < max_addr; i++) {
|
||||
st.current_address = addr;
|
||||
pgd = pgd_offset_k(addr);
|
||||
if (!pgd_none(*pgd))
|
||||
walk_pud_level(m, &st, pgd, addr);
|
||||
else
|
||||
note_page(m, &st, _PAGE_INVALID, 1);
|
||||
addr += PGDIR_SIZE;
|
||||
}
|
||||
/* Flush out the last page */
|
||||
st.current_address = max_addr;
|
||||
note_page(m, &st, 0, 0);
|
||||
}
|
||||
|
||||
static int ptdump_show(struct seq_file *m, void *v)
|
||||
{
|
||||
walk_pgd_level(m);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ptdump_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
return single_open(filp, ptdump_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations ptdump_fops = {
|
||||
.open = ptdump_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int pt_dump_init(void)
|
||||
{
|
||||
/*
|
||||
* Figure out the maximum virtual address being accessible with the
|
||||
* 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);
|
||||
return 0;
|
||||
}
|
||||
device_initcall(pt_dump_init);
|
@ -8,25 +8,38 @@
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
static pte_t *walk_page_table(unsigned long addr)
|
||||
{
|
||||
pgd_t *pgdp;
|
||||
pud_t *pudp;
|
||||
pmd_t *pmdp;
|
||||
pte_t *ptep;
|
||||
|
||||
pgdp = pgd_offset_k(addr);
|
||||
if (pgd_none(*pgdp))
|
||||
return NULL;
|
||||
pudp = pud_offset(pgdp, addr);
|
||||
if (pud_none(*pudp))
|
||||
return NULL;
|
||||
pmdp = pmd_offset(pudp, addr);
|
||||
if (pmd_none(*pmdp) || pmd_large(*pmdp))
|
||||
return NULL;
|
||||
ptep = pte_offset_kernel(pmdp, addr);
|
||||
if (pte_none(*ptep))
|
||||
return NULL;
|
||||
return ptep;
|
||||
}
|
||||
|
||||
static void change_page_attr(unsigned long addr, int numpages,
|
||||
pte_t (*set) (pte_t))
|
||||
{
|
||||
pte_t *ptep, pte;
|
||||
pmd_t *pmdp;
|
||||
pud_t *pudp;
|
||||
pgd_t *pgdp;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < numpages; i++) {
|
||||
pgdp = pgd_offset(&init_mm, addr);
|
||||
pudp = pud_offset(pgdp, addr);
|
||||
pmdp = pmd_offset(pudp, addr);
|
||||
if (pmd_huge(*pmdp)) {
|
||||
WARN_ON_ONCE(1);
|
||||
continue;
|
||||
}
|
||||
ptep = pte_offset_kernel(pmdp, addr);
|
||||
|
||||
ptep = walk_page_table(addr);
|
||||
if (WARN_ON_ONCE(!ptep))
|
||||
break;
|
||||
pte = *ptep;
|
||||
pte = set(pte);
|
||||
__ptep_ipte(addr, ptep);
|
||||
@ -40,21 +53,18 @@ int set_memory_ro(unsigned long addr, int numpages)
|
||||
change_page_attr(addr, numpages, pte_wrprotect);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(set_memory_ro);
|
||||
|
||||
int set_memory_rw(unsigned long addr, int numpages)
|
||||
{
|
||||
change_page_attr(addr, numpages, pte_mkwrite);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(set_memory_rw);
|
||||
|
||||
/* not possible */
|
||||
int set_memory_nx(unsigned long addr, int numpages)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(set_memory_nx);
|
||||
|
||||
int set_memory_x(unsigned long addr, int numpages)
|
||||
{
|
||||
|
@ -79,7 +79,8 @@ static pte_t __ref *vmem_pte_alloc(unsigned long address)
|
||||
*/
|
||||
static int vmem_add_mem(unsigned long start, unsigned long size, int ro)
|
||||
{
|
||||
unsigned long address;
|
||||
unsigned long end = start + size;
|
||||
unsigned long address = start;
|
||||
pgd_t *pg_dir;
|
||||
pud_t *pu_dir;
|
||||
pmd_t *pm_dir;
|
||||
@ -87,7 +88,7 @@ static int vmem_add_mem(unsigned long start, unsigned long size, int ro)
|
||||
pte_t pte;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
for (address = start; address < start + size; address += PAGE_SIZE) {
|
||||
while (address < end) {
|
||||
pg_dir = pgd_offset_k(address);
|
||||
if (pgd_none(*pg_dir)) {
|
||||
pu_dir = vmem_pud_alloc();
|
||||
@ -108,12 +109,11 @@ static int vmem_add_mem(unsigned long start, unsigned long size, int ro)
|
||||
pm_dir = pmd_offset(pu_dir, address);
|
||||
|
||||
#if defined(CONFIG_64BIT) && !defined(CONFIG_DEBUG_PAGEALLOC)
|
||||
if (MACHINE_HAS_HPAGE && !(address & ~HPAGE_MASK) &&
|
||||
(address + HPAGE_SIZE <= start + size) &&
|
||||
(address >= HPAGE_SIZE)) {
|
||||
if (MACHINE_HAS_EDAT1 && pmd_none(*pm_dir) && address &&
|
||||
!(address & ~PMD_MASK) && (address + PMD_SIZE <= end)) {
|
||||
pte_val(pte) |= _SEGMENT_ENTRY_LARGE;
|
||||
pmd_val(*pm_dir) = pte_val(pte);
|
||||
address += HPAGE_SIZE - PAGE_SIZE;
|
||||
address += PMD_SIZE;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
@ -126,10 +126,11 @@ static int vmem_add_mem(unsigned long start, unsigned long size, int ro)
|
||||
|
||||
pt_dir = pte_offset_kernel(pm_dir, address);
|
||||
*pt_dir = pte;
|
||||
address += PAGE_SIZE;
|
||||
}
|
||||
ret = 0;
|
||||
out:
|
||||
flush_tlb_kernel_range(start, start + size);
|
||||
flush_tlb_kernel_range(start, end);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -139,7 +140,8 @@ out:
|
||||
*/
|
||||
static void vmem_remove_range(unsigned long start, unsigned long size)
|
||||
{
|
||||
unsigned long address;
|
||||
unsigned long end = start + size;
|
||||
unsigned long address = start;
|
||||
pgd_t *pg_dir;
|
||||
pud_t *pu_dir;
|
||||
pmd_t *pm_dir;
|
||||
@ -147,25 +149,32 @@ static void vmem_remove_range(unsigned long start, unsigned long size)
|
||||
pte_t pte;
|
||||
|
||||
pte_val(pte) = _PAGE_TYPE_EMPTY;
|
||||
for (address = start; address < start + size; address += PAGE_SIZE) {
|
||||
while (address < end) {
|
||||
pg_dir = pgd_offset_k(address);
|
||||
pu_dir = pud_offset(pg_dir, address);
|
||||
if (pud_none(*pu_dir))
|
||||
continue;
|
||||
pm_dir = pmd_offset(pu_dir, address);
|
||||
if (pmd_none(*pm_dir))
|
||||
continue;
|
||||
|
||||
if (pmd_huge(*pm_dir)) {
|
||||
pmd_clear(pm_dir);
|
||||
address += HPAGE_SIZE - PAGE_SIZE;
|
||||
if (pgd_none(*pg_dir)) {
|
||||
address += PGDIR_SIZE;
|
||||
continue;
|
||||
}
|
||||
pu_dir = pud_offset(pg_dir, address);
|
||||
if (pud_none(*pu_dir)) {
|
||||
address += PUD_SIZE;
|
||||
continue;
|
||||
}
|
||||
pm_dir = pmd_offset(pu_dir, address);
|
||||
if (pmd_none(*pm_dir)) {
|
||||
address += PMD_SIZE;
|
||||
continue;
|
||||
}
|
||||
if (pmd_large(*pm_dir)) {
|
||||
pmd_clear(pm_dir);
|
||||
address += PMD_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
pt_dir = pte_offset_kernel(pm_dir, address);
|
||||
*pt_dir = pte;
|
||||
address += PAGE_SIZE;
|
||||
}
|
||||
flush_tlb_kernel_range(start, start + size);
|
||||
flush_tlb_kernel_range(start, end);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -330,8 +339,8 @@ void __init vmem_map_init(void)
|
||||
unsigned long start, end;
|
||||
int i;
|
||||
|
||||
ro_start = ((unsigned long)&_stext) & PAGE_MASK;
|
||||
ro_end = PFN_ALIGN((unsigned long)&_eshared);
|
||||
ro_start = PFN_ALIGN((unsigned long)&_stext);
|
||||
ro_end = (unsigned long)&_eshared & PAGE_MASK;
|
||||
for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) {
|
||||
if (memory_chunk[i].type == CHUNK_CRASHK ||
|
||||
memory_chunk[i].type == CHUNK_OLDMEM)
|
||||
|
@ -69,23 +69,9 @@ static ssize_t dcssblk_add_store(struct device * dev, struct device_attribute *a
|
||||
size_t count);
|
||||
static ssize_t dcssblk_remove_store(struct device * dev, struct device_attribute *attr, const char * buf,
|
||||
size_t count);
|
||||
static ssize_t dcssblk_save_store(struct device * dev, struct device_attribute *attr, const char * buf,
|
||||
size_t count);
|
||||
static ssize_t dcssblk_save_show(struct device *dev, struct device_attribute *attr, char *buf);
|
||||
static ssize_t dcssblk_shared_store(struct device * dev, struct device_attribute *attr, const char * buf,
|
||||
size_t count);
|
||||
static ssize_t dcssblk_shared_show(struct device *dev, struct device_attribute *attr, char *buf);
|
||||
static ssize_t dcssblk_seglist_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf);
|
||||
|
||||
static DEVICE_ATTR(add, S_IWUSR, NULL, dcssblk_add_store);
|
||||
static DEVICE_ATTR(remove, S_IWUSR, NULL, dcssblk_remove_store);
|
||||
static DEVICE_ATTR(save, S_IWUSR | S_IRUSR, dcssblk_save_show,
|
||||
dcssblk_save_store);
|
||||
static DEVICE_ATTR(shared, S_IWUSR | S_IRUSR, dcssblk_shared_show,
|
||||
dcssblk_shared_store);
|
||||
static DEVICE_ATTR(seglist, S_IRUSR, dcssblk_seglist_show, NULL);
|
||||
|
||||
static struct device *dcssblk_root_dev;
|
||||
|
||||
@ -416,6 +402,8 @@ out:
|
||||
up_write(&dcssblk_devices_sem);
|
||||
return rc;
|
||||
}
|
||||
static DEVICE_ATTR(shared, S_IWUSR | S_IRUSR, dcssblk_shared_show,
|
||||
dcssblk_shared_store);
|
||||
|
||||
/*
|
||||
* device attribute for save operation on current copy
|
||||
@ -476,6 +464,8 @@ dcssblk_save_store(struct device *dev, struct device_attribute *attr, const char
|
||||
up_write(&dcssblk_devices_sem);
|
||||
return count;
|
||||
}
|
||||
static DEVICE_ATTR(save, S_IWUSR | S_IRUSR, dcssblk_save_show,
|
||||
dcssblk_save_store);
|
||||
|
||||
/*
|
||||
* device attribute for showing all segments in a device
|
||||
@ -502,6 +492,21 @@ dcssblk_seglist_show(struct device *dev, struct device_attribute *attr,
|
||||
up_read(&dcssblk_devices_sem);
|
||||
return i;
|
||||
}
|
||||
static DEVICE_ATTR(seglist, S_IRUSR, dcssblk_seglist_show, NULL);
|
||||
|
||||
static struct attribute *dcssblk_dev_attrs[] = {
|
||||
&dev_attr_shared.attr,
|
||||
&dev_attr_save.attr,
|
||||
&dev_attr_seglist.attr,
|
||||
NULL,
|
||||
};
|
||||
static struct attribute_group dcssblk_dev_attr_group = {
|
||||
.attrs = dcssblk_dev_attrs,
|
||||
};
|
||||
static const struct attribute_group *dcssblk_dev_attr_groups[] = {
|
||||
&dcssblk_dev_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/*
|
||||
* device attribute for adding devices
|
||||
@ -590,6 +595,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
|
||||
|
||||
dev_set_name(&dev_info->dev, dev_info->segment_name);
|
||||
dev_info->dev.release = dcssblk_release_segment;
|
||||
dev_info->dev.groups = dcssblk_dev_attr_groups;
|
||||
INIT_LIST_HEAD(&dev_info->lh);
|
||||
dev_info->gd = alloc_disk(DCSSBLK_MINORS_PER_DISK);
|
||||
if (dev_info->gd == NULL) {
|
||||
@ -637,21 +643,10 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
|
||||
* register the device
|
||||
*/
|
||||
rc = device_register(&dev_info->dev);
|
||||
if (rc) {
|
||||
module_put(THIS_MODULE);
|
||||
goto dev_list_del;
|
||||
}
|
||||
get_device(&dev_info->dev);
|
||||
rc = device_create_file(&dev_info->dev, &dev_attr_shared);
|
||||
if (rc)
|
||||
goto unregister_dev;
|
||||
rc = device_create_file(&dev_info->dev, &dev_attr_save);
|
||||
if (rc)
|
||||
goto unregister_dev;
|
||||
rc = device_create_file(&dev_info->dev, &dev_attr_seglist);
|
||||
if (rc)
|
||||
goto unregister_dev;
|
||||
goto put_dev;
|
||||
|
||||
get_device(&dev_info->dev);
|
||||
add_disk(dev_info->gd);
|
||||
|
||||
switch (dev_info->segment_type) {
|
||||
@ -668,12 +663,11 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
|
||||
rc = count;
|
||||
goto out;
|
||||
|
||||
unregister_dev:
|
||||
put_dev:
|
||||
list_del(&dev_info->lh);
|
||||
blk_cleanup_queue(dev_info->dcssblk_queue);
|
||||
dev_info->gd->queue = NULL;
|
||||
put_disk(dev_info->gd);
|
||||
device_unregister(&dev_info->dev);
|
||||
list_for_each_entry(seg_info, &dev_info->seg_list, lh) {
|
||||
segment_unload(seg_info->segment_name);
|
||||
}
|
||||
|
@ -39,7 +39,6 @@
|
||||
#include "zcrypt_msgtype6.h"
|
||||
#include "zcrypt_pcixcc.h"
|
||||
#include "zcrypt_cca_key.h"
|
||||
#include "zcrypt_msgtype6.h"
|
||||
|
||||
#define PCIXCC_MIN_MOD_SIZE 16 /* 128 bits */
|
||||
#define PCIXCC_MIN_MOD_SIZE_OLD 64 /* 512 bits */
|
||||
|
Loading…
Reference in New Issue
Block a user