Messages in this thread Patch in this message | | | From | Martin Schwidefsky <> | Subject | [PATCH] s390 (16/16): s390/s390x unification - part 7. | Date | Mon, 14 Apr 2003 19:56:19 +0200 |
| |
Merge s390x and s390 to one architecture.
diffstat: posix_types.h | 47 ++- processor.h | 162 +++++++++--- ptrace.h | 234 +++++++++++++----- qdio.h | 4 rwsem.h | 81 ++++++ sembuf.h | 6 setup.h | 24 + shmbuf.h | 8 sigcontext.h | 21 + signal.h | 6 sigp.h | 28 ++ smp.h | 4 spinlock.h | 100 +++++++ stat.h | 30 ++ statfs.h | 13 + string.h | 53 +++- system.h | 102 +++++++- thread_info.h | 28 +- tlbflush.h | 12 types.h | 28 +- uaccess.h | 734 +++++++++++++++++++++++++++++++--------------------------- unistd.h | 109 +++++++- 22 files changed, 1331 insertions(+), 503 deletions(-)
diff -urN linux-2.5.67/include/asm-s390/posix_types.h linux-2.5.67-s390/include/asm-s390/posix_types.h --- linux-2.5.67/include/asm-s390/posix_types.h Mon Apr 14 19:11:45 2003 +++ linux-2.5.67-s390/include/asm-s390/posix_types.h Mon Apr 14 19:11:59 2003 @@ -15,18 +15,9 @@ * assume GCC is being used. */ -typedef unsigned short __kernel_dev_t; -typedef unsigned long __kernel_ino_t; -typedef unsigned short __kernel_mode_t; -typedef unsigned short __kernel_nlink_t; typedef long __kernel_off_t; typedef int __kernel_pid_t; -typedef unsigned short __kernel_ipc_pid_t; -typedef unsigned short __kernel_uid_t; -typedef unsigned short __kernel_gid_t; typedef unsigned long __kernel_size_t; -typedef int __kernel_ssize_t; -typedef int __kernel_ptrdiff_t; typedef long __kernel_time_t; typedef long __kernel_suseconds_t; typedef long __kernel_clock_t; @@ -36,15 +27,45 @@ typedef char * __kernel_caddr_t; typedef unsigned short __kernel_uid16_t; typedef unsigned short __kernel_gid16_t; + +#ifdef __GNUC__ +typedef long long __kernel_loff_t; +#endif + +#ifndef __s390x__ + +typedef unsigned short __kernel_dev_t; +typedef unsigned long __kernel_ino_t; +typedef unsigned short __kernel_mode_t; +typedef unsigned short __kernel_nlink_t; +typedef unsigned short __kernel_ipc_pid_t; +typedef unsigned short __kernel_uid_t; +typedef unsigned short __kernel_gid_t; +typedef int __kernel_ssize_t; +typedef int __kernel_ptrdiff_t; typedef unsigned int __kernel_uid32_t; typedef unsigned int __kernel_gid32_t; - typedef unsigned short __kernel_old_uid_t; typedef unsigned short __kernel_old_gid_t; -#ifdef __GNUC__ -typedef long long __kernel_loff_t; -#endif +#else /* __s390x__ */ + +typedef unsigned int __kernel_dev_t; +typedef unsigned int __kernel_ino_t; +typedef unsigned int __kernel_mode_t; +typedef unsigned int __kernel_nlink_t; +typedef int __kernel_ipc_pid_t; +typedef unsigned int __kernel_uid_t; +typedef unsigned int __kernel_gid_t; +typedef long __kernel_ssize_t; +typedef long __kernel_ptrdiff_t; +typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ +typedef __kernel_uid_t __kernel_old_uid_t; +typedef __kernel_gid_t __kernel_old_gid_t; +typedef __kernel_uid_t __kernel_uid32_t; +typedef __kernel_gid_t __kernel_gid32_t; + +#endif /* __s390x__ */ typedef struct { #if defined(__KERNEL__) || defined(__USE_ALL) diff -urN linux-2.5.67/include/asm-s390/processor.h linux-2.5.67-s390/include/asm-s390/processor.h --- linux-2.5.67/include/asm-s390/processor.h Mon Apr 14 19:11:45 2003 +++ linux-2.5.67-s390/include/asm-s390/processor.h Mon Apr 14 19:11:59 2003 @@ -44,6 +44,9 @@ __u16 cpu_nr; unsigned long loops_per_jiffy; unsigned long *pgd_quick; +#ifdef __s390x__ + unsigned long *pmd_quick; +#endif /* __s390x__ */ unsigned long *pte_quick; unsigned long pgtable_cache_sz; }; @@ -54,58 +57,90 @@ extern struct task_struct *last_task_used_math; /* - * User space process size: 2GB (default). + * User space process size: 2GB for 31 bit, 4TB for 64 bit. */ -#define TASK_SIZE (0x80000000) -/* This decides where the kernel will search for a free chunk of vm - * space during mmap's. - */ -#define TASK_UNMAPPED_BASE (TASK_SIZE / 2) +#ifndef __s390x__ + +# define TASK_SIZE (0x80000000UL) +# define TASK_UNMAPPED_BASE (TASK_SIZE / 2) + +#else /* __s390x__ */ + +# define TASK_SIZE (0x20000000000UL) +# define TASK31_SIZE (0x80000000UL) +# define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \ + (TASK31_SIZE / 2) : (TASK_SIZE / 2)) + +#endif /* __s390x__ */ typedef struct { __u32 ar4; } mm_segment_t; -/* if you change the thread_struct structure, you must - * update the _TSS_* defines in entry.S +/* + * Thread structure */ - -struct thread_struct - { +struct thread_struct { s390_fp_regs fp_regs; - __u32 ar2; /* kernel access register 2 */ - __u32 ar4; /* kernel access register 4 */ - __u32 ksp; /* kernel stack pointer */ - __u32 user_seg; /* HSTD */ - __u32 error_code; /* error-code of last prog-excep. */ - __u32 prot_addr; /* address of protection-excep. */ - __u32 trap_no; - per_struct per_info;/* Must be aligned on an 4 byte boundary*/ + unsigned int ar2; /* kernel access register 2 */ + unsigned int ar4; /* kernel access register 4 */ + unsigned long ksp; /* kernel stack pointer */ + unsigned long user_seg; /* HSTD */ + unsigned long prot_addr; /* address of protection-excep. */ + unsigned int error_code; /* error-code of last prog-excep. */ + unsigned int trap_no; + per_struct per_info; /* Used to give failing instruction back to user for ieee exceptions */ - addr_t ieee_instruction_pointer; + unsigned long ieee_instruction_pointer; /* pfault_wait is used to block the process on a pfault event */ - addr_t pfault_wait; + unsigned long pfault_wait; }; typedef struct thread_struct thread_struct; -#define INIT_THREAD {{0,{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}, \ - {0},{0},{0},{0},{0},{0}}}, \ - 0, 0, \ - sizeof(init_stack) + (__u32) &init_stack, \ - (__pa((__u32) &swapper_pg_dir[0]) + _SEGMENT_TABLE),\ - 0,0,0, \ - (per_struct) {{{{0,}}},0,0,0,0,{{0,}}}, \ - 0, 0 \ -} +#ifndef __s390x__ +# define __SWAPPER_PG_DIR __pa(&swapper_pg_dir[0]) + _SEGMENT_TABLE +#else /* __s390x__ */ +# define __SWAPPER_PG_DIR __pa(&swapper_pg_dir[0]) + _REGION_TABLE +#endif /* __s390x__ */ + +#define INIT_THREAD {{0,{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}, \ + {0},{0},{0},{0},{0},{0}}}, \ + 0, 0, \ + sizeof(init_stack) + (unsigned long) &init_stack, \ + __SWAPPER_PG_DIR, \ + 0,0,0, \ + (per_struct) {{{{0,}}},0,0,0,0,{{0,}}}, \ + 0, 0 \ +} + +/* + * Do necessary setup to start up a new thread. + */ +#ifndef __s390x__ -/* need to define ... */ #define start_thread(regs, new_psw, new_stackp) do { \ regs->psw.mask = PSW_USER_BITS; \ - regs->psw.addr = new_psw | PSW_ADDR_AMODE31; \ + regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ regs->gprs[15] = new_stackp ; \ } while (0) +#else /* __s390x__ */ + +#define start_thread(regs, new_psw, new_stackp) do { \ + regs->psw.mask = PSW_USER_BITS; \ + regs->psw.addr = new_psw; \ + regs->gprs[15] = new_stackp; \ +} while (0) + +#define start_thread31(regs, new_psw, new_stackp) do { \ + regs->psw.mask = PSW_USER32_BITS; \ + regs->psw.addr = new_psw; \ + regs->gprs[15] = new_stackp; \ +} while (0) + +#endif /* __s390x__ */ + /* Forward declaration, a strange C thing */ struct task_struct; struct mm_struct; @@ -129,14 +164,19 @@ unsigned long get_wchan(struct task_struct *p); #define __KSTK_PTREGS(tsk) ((struct pt_regs *) \ - (((addr_t) tsk->thread_info + THREAD_SIZE - sizeof(struct pt_regs)) & -8L)) + (((unsigned long) tsk->thread_info + THREAD_SIZE - sizeof(struct pt_regs)) & -8L)) #define KSTK_EIP(tsk) (__KSTK_PTREGS(tsk)->psw.addr) #define KSTK_ESP(tsk) (__KSTK_PTREGS(tsk)->gprs[15]) /* * Give up the time slice of the virtual PU. */ -#define cpu_relax() asm volatile ("diag 0,0,68" : : : "memory") +#ifndef __s390x__ +# define cpu_relax() asm volatile ("diag 0,0,68" : : : "memory") +#else /* __s390x__ */ +# define cpu_relax() \ + asm volatile ("ex 0,%0" : : "i" (__LC_DIAG44_OPCODE) : "memory") +#endif /* __s390x__ */ /* * Set PSW mask to specified value, while leaving the @@ -150,13 +190,22 @@ psw_t psw; psw.mask = mask; +#ifndef __s390x__ asm volatile ( " basr %0,0\n" "0: ahi %0,1f-0b\n" - " st %0,4(%1)\n" + " st %0,4(%1)\n" " lpsw 0(%1)\n" "1:" : "=&d" (addr) : "a" (&psw) : "memory", "cc" ); +#else /* __s390x__ */ + asm volatile ( + " larl %0,1f\n" + " stg %0,8(%1)\n" + " lpswe 0(%1)\n" + "1:" + : "=&d" (addr) : "a" (&psw) : "memory", "cc" ); +#endif /* __s390x__ */ } /* @@ -169,6 +218,7 @@ wait_psw.mask = PSW_BASE_BITS | PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | PSW_MASK_WAIT; +#ifndef __s390x__ asm volatile ( " basr %0,0\n" "0: la %0,1f-0b(%0)\n" @@ -177,6 +227,14 @@ " lpsw 0(%1)\n" "1:" : "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" ); +#else /* __s390x__ */ + asm volatile ( + " larl %0,0f\n" + " stg %0,8(%1)\n" + " lpswe 0(%1)\n" + "0:" + : "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" ); +#endif /* __s390x__ */ } /* @@ -196,7 +254,7 @@ * Store status and then load disabled wait psw, * the processor is dead afterwards */ - +#ifndef __s390x__ asm volatile (" stctl 0,0,0(%1)\n" " ni 0(%1),0xef\n" /* switch off protection */ " lctl 0,0,0(%1)\n" @@ -213,6 +271,38 @@ " oi 0(%1),0x10\n" /* fake protection bit */ " lpsw 0(%0)" : : "a" (dw_psw), "a" (&ctl_buf) : "cc" ); +#else /* __s390x__ */ + asm volatile (" stctg 0,0,0(%1)\n" + " ni 4(%1),0xef\n" /* switch off protection */ + " lctlg 0,0,0(%1)\n" + " lghi 1,0x1000\n" + " stpt 0x328(1)\n" /* store timer */ + " stckc 0x330(1)\n" /* store clock comparator */ + " stpx 0x318(1)\n" /* store prefix register */ + " stam 0,15,0x340(1)\n" /* store access registers */ + " stfpc 0x31c(1)\n" /* store fpu control */ + " std 0,0x200(1)\n" /* store f0 */ + " std 1,0x208(1)\n" /* store f1 */ + " std 2,0x210(1)\n" /* store f2 */ + " std 3,0x218(1)\n" /* store f3 */ + " std 4,0x220(1)\n" /* store f4 */ + " std 5,0x228(1)\n" /* store f5 */ + " std 6,0x230(1)\n" /* store f6 */ + " std 7,0x238(1)\n" /* store f7 */ + " std 8,0x240(1)\n" /* store f8 */ + " std 9,0x248(1)\n" /* store f9 */ + " std 10,0x250(1)\n" /* store f10 */ + " std 11,0x258(1)\n" /* store f11 */ + " std 12,0x260(1)\n" /* store f12 */ + " std 13,0x268(1)\n" /* store f13 */ + " std 14,0x270(1)\n" /* store f14 */ + " std 15,0x278(1)\n" /* store f15 */ + " stmg 0,15,0x280(1)\n" /* store general registers */ + " stctg 0,15,0x380(1)\n" /* store control registers */ + " oi 0x384(1),0x10\n" /* fake protection bit */ + " lpswe 0(%0)" + : : "a" (dw_psw), "a" (&ctl_buf) : "cc", "0", "1"); +#endif /* __s390x__ */ } #endif diff -urN linux-2.5.67/include/asm-s390/ptrace.h linux-2.5.67-s390/include/asm-s390/ptrace.h --- linux-2.5.67/include/asm-s390/ptrace.h Mon Apr 7 19:32:16 2003 +++ linux-2.5.67-s390/include/asm-s390/ptrace.h Mon Apr 14 19:11:59 2003 @@ -13,6 +13,8 @@ * 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 @@ -92,18 +94,89 @@ #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 GPR_SIZE 4 + #define FPR_SIZE 8 #define FPC_SIZE 4 #define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */ -#define CR_SIZE 4 #define ACR_SIZE 4 -#define STACK_FRAME_OVERHEAD 96 /* size of minimum stack frame */ #define PTRACE_OLDSETOPTIONS 21 @@ -113,13 +186,39 @@ #include <linux/types.h> #include <asm/setup.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 { - __u32 mask; - __u32 addr; + unsigned long mask; + unsigned long addr; } __attribute__ ((aligned(8))) psw_t; +#ifndef __s390x__ + #define PSW_MASK_PER 0x40000000UL #define PSW_MASK_DAT 0x04000000UL #define PSW_MASK_IO 0x02000000UL @@ -132,7 +231,7 @@ #define PSW_MASK_CC 0x00003000UL #define PSW_MASK_PM 0x00000F00UL -#define PSW_ADDR_AMODE31 0x80000000UL +#define PSW_ADDR_AMODE 0x80000000UL #define PSW_ADDR_INSN 0x7FFFFFFFUL #define PSW_BASE_BITS 0x00080000UL @@ -142,34 +241,41 @@ #define PSW_ASC_SECONDARY 0x00008000UL #define PSW_ASC_HOME 0x0000C000UL -#define PSW_KERNEL_BITS (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY) -#define PSW_USER_BITS (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \ +#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_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_ADDR_AMODE 0x0000000000000000UL +#define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL + +#define PSW_BASE_BITS 0x0000000180000000UL +#define PSW_BASE32_BITS 0x0000000080000000UL + +#define PSW_ASC_PRIMARY 0x0000000000000000UL +#define PSW_ASC_ACCREG 0x0000400000000000UL +#define PSW_ASC_SECONDARY 0x0000800000000000UL +#define PSW_ASC_HOME 0x0000C00000000000UL + +#define PSW_USER32_BITS (PSW_BASE32_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \ PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | \ PSW_MASK_PSTATE) -typedef union -{ - float f; - double d; - __u64 ui; - struct - { - __u32 hi; - __u32 lo; - } fp; -} freg_t; +#endif /* __s390x__ */ -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 +#define PSW_KERNEL_BITS (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY) +#define PSW_USER_BITS (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \ + PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | \ + PSW_MASK_PSTATE) /* * The first entries in pt_regs and user_regs_struct @@ -180,9 +286,9 @@ typedef struct { psw_t psw; - __u32 gprs[NUM_GPRS]; - __u32 acrs[NUM_ACRS]; - __u32 orig_gpr2; + unsigned long gprs[NUM_GPRS]; + unsigned int acrs[NUM_ACRS]; + unsigned long orig_gpr2; } s390_regs; /* @@ -192,24 +298,27 @@ struct pt_regs { psw_t psw; - __u32 gprs[NUM_GPRS]; - __u32 acrs[NUM_ACRS]; - __u32 orig_gpr2; - __u32 trap; -}; + unsigned long gprs[NUM_GPRS]; + unsigned int acrs[NUM_ACRS]; + unsigned long orig_gpr2; + unsigned int trap; +} __attribute__ ((packed)); /* * Now for the program event recording (trace) definitions. */ typedef struct { - __u32 cr[3]; + unsigned long cr[3]; } per_cr_words; -#define PER_EM_MASK 0xE8000000 +#define PER_EM_MASK 0xE8000000UL typedef struct { +#ifdef __s390x__ + unsigned : 32; +#endif /* __s390x__ */ unsigned em_branching : 1; unsigned em_instruction_fetch : 1; /* @@ -224,33 +333,34 @@ unsigned : 1; unsigned storage_alt_space_ctl : 1; unsigned : 21; - addr_t starting_addr; - addr_t ending_addr; + unsigned long starting_addr; + unsigned long ending_addr; } per_cr_bits; typedef struct { - __u16 perc_atmid; /* 0x096 */ - __u32 address; /* 0x098 */ - __u8 access_id; /* 0x0a1 */ + unsigned short perc_atmid; + unsigned long address; + unsigned char access_id; } per_lowcore_words; typedef struct { - unsigned perc_branching : 1; /* 0x096 */ + 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 : 4; + 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; - addr_t address; /* 0x098 */ - unsigned : 4; /* 0x0a1 */ + unsigned long address; + unsigned : 4; unsigned access_id : 4; } per_lowcore_bits; @@ -272,8 +382,8 @@ * These addresses are copied into cr10 & cr11 if single * stepping is switched off */ - __u32 starting_addr; - __u32 ending_addr; + unsigned long starting_addr; + unsigned long ending_addr; union { per_lowcore_words words; per_lowcore_bits bits; @@ -282,9 +392,9 @@ typedef struct { - __u32 len; - addr_t kernel_addr; - addr_t process_addr; + unsigned int len; + unsigned long kernel_addr; + unsigned long process_addr; } ptrace_area; /* @@ -313,9 +423,9 @@ typedef struct { - addr_t lowaddr; - addr_t hiaddr; - ptprot_flags prot; + unsigned long lowaddr; + unsigned long hiaddr; + ptprot_flags prot; } ptprot_area; /* Sequence of bytes for breakpoint illegal instruction. */ @@ -331,9 +441,9 @@ struct user_regs_struct { psw_t psw; - __u32 gprs[NUM_GPRS]; - __u32 acrs[NUM_ACRS]; - __u32 orig_gpr2; + 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 @@ -341,13 +451,13 @@ * watchpoints. This is the way intel does it. */ per_struct per_info; - addr_t ieee_instruction_pointer; + unsigned long ieee_instruction_pointer; /* Used to give failing instruction back to user for ieee exceptions */ }; #ifdef __KERNEL__ #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) -#define instruction_pointer(regs) ((regs)->psw.addr & PSW_MASK_INSN) +#define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) extern void show_regs(struct pt_regs * regs); #endif diff -urN linux-2.5.67/include/asm-s390/qdio.h linux-2.5.67-s390/include/asm-s390/qdio.h --- linux-2.5.67/include/asm-s390/qdio.h Mon Apr 7 19:30:44 2003 +++ linux-2.5.67-s390/include/asm-s390/qdio.h Mon Apr 14 19:11:59 2003 @@ -20,9 +20,9 @@ #define QDIO_NAME "qdio " -#ifndef CONFIG_ARCH_S390X +#ifndef __s390x__ #define QDIO_32_BIT -#endif /* CONFIG_ARCH_S390X */ +#endif /* __s390x__ */ /**** CONSTANTS, that are relied on without using these symbols *****/ #define QDIO_MAX_QUEUES_PER_IRQ 32 /* used in width of unsigned int */ diff -urN linux-2.5.67/include/asm-s390/rwsem.h linux-2.5.67-s390/include/asm-s390/rwsem.h --- linux-2.5.67/include/asm-s390/rwsem.h Mon Apr 7 19:31:18 2003 +++ linux-2.5.67-s390/include/asm-s390/rwsem.h Mon Apr 14 19:11:59 2003 @@ -63,10 +63,17 @@ struct list_head wait_list; }; +#ifndef __s390x__ #define RWSEM_UNLOCKED_VALUE 0x00000000 #define RWSEM_ACTIVE_BIAS 0x00000001 #define RWSEM_ACTIVE_MASK 0x0000ffff #define RWSEM_WAITING_BIAS (-0x00010000) +#else /* __s390x__ */ +#define RWSEM_UNLOCKED_VALUE 0x0000000000000000L +#define RWSEM_ACTIVE_BIAS 0x0000000000000001L +#define RWSEM_ACTIVE_MASK 0x00000000ffffffffL +#define RWSEM_WAITING_BIAS (-0x0000000100000000L) +#endif /* __s390x__ */ #define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) @@ -94,11 +101,19 @@ signed long old, new; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%2)\n" "0: lr %1,%0\n" " ahi %1,%3\n" " cs %0,%1,0(%2)\n" " jl 0b" +#else /* __s390x__ */ + " lg %0,0(%2)\n" + "0: lgr %1,%0\n" + " aghi %1,%3\n" + " csg %0,%1,0(%2)\n" + " jl 0b" +#endif /* __s390x__ */ : "=&d" (old), "=&d" (new) : "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" ); @@ -114,6 +129,7 @@ signed long old, new; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%2)\n" "0: ltr %1,%0\n" " jm 1f\n" @@ -121,6 +137,15 @@ " cs %0,%1,0(%2)\n" " jl 0b\n" "1:" +#else /* __s390x__ */ + " lg %0,0(%2)\n" + "0: ltgr %1,%0\n" + " jm 1f\n" + " aghi %1,%3\n" + " csg %0,%1,0(%2)\n" + " jl 0b\n" + "1:" +#endif /* __s390x__ */ : "=&d" (old), "=&d" (new) : "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" ); @@ -136,11 +161,19 @@ tmp = RWSEM_ACTIVE_WRITE_BIAS; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%2)\n" "0: lr %1,%0\n" " a %1,%3\n" " cs %0,%1,0(%2)\n" " jl 0b" +#else /* __s390x__ */ + " lg %0,0(%2)\n" + "0: lgr %1,%0\n" + " ag %1,%3\n" + " csg %0,%1,0(%2)\n" + " jl 0b" +#endif /* __s390x__ */ : "=&d" (old), "=&d" (new) : "a" (&sem->count), "m" (tmp) : "cc", "memory" ); @@ -156,11 +189,19 @@ signed long old; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%1)\n" "0: ltr %0,%0\n" " jnz 1f\n" " cs %0,%2,0(%1)\n" " jl 0b\n" +#else /* __s390x__ */ + " lg %0,0(%1)\n" + "0: ltgr %0,%0\n" + " jnz 1f\n" + " csg %0,%2,0(%1)\n" + " jl 0b\n" +#endif /* __s390x__ */ "1:" : "=&d" (old) : "a" (&sem->count), "d" (RWSEM_ACTIVE_WRITE_BIAS) @@ -176,11 +217,19 @@ signed long old, new; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%2)\n" "0: lr %1,%0\n" " ahi %1,%3\n" " cs %0,%1,0(%2)\n" " jl 0b" +#else /* __s390x__ */ + " lg %0,0(%2)\n" + "0: lgr %1,%0\n" + " aghi %1,%3\n" + " csg %0,%1,0(%2)\n" + " jl 0b" +#endif /* __s390x__ */ : "=&d" (old), "=&d" (new) : "a" (&sem->count), "i" (-RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" ); @@ -198,11 +247,19 @@ tmp = -RWSEM_ACTIVE_WRITE_BIAS; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%2)\n" "0: lr %1,%0\n" " a %1,%3\n" " cs %0,%1,0(%2)\n" " jl 0b" +#else /* __s390x__ */ + " lg %0,0(%2)\n" + "0: lgr %1,%0\n" + " ag %1,%3\n" + " csg %0,%1,0(%2)\n" + " jl 0b" +#endif /* __s390x__ */ : "=&d" (old), "=&d" (new) : "a" (&sem->count), "m" (tmp) : "cc", "memory" ); @@ -220,11 +277,19 @@ tmp = -RWSEM_WAITING_BIAS; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%2)\n" "0: lr %1,%0\n" " a %1,%3\n" " cs %0,%1,0(%2)\n" " jl 0b" +#else /* __s390x__ */ + " lg %0,0(%2)\n" + "0: lgr %1,%0\n" + " ag %1,%3\n" + " csg %0,%1,0(%2)\n" + " jl 0b" +#endif /* __s390x__ */ : "=&d" (old), "=&d" (new) : "a" (&sem->count), "m" (tmp) : "cc", "memory" ); @@ -240,11 +305,19 @@ signed long old, new; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%2)\n" "0: lr %1,%0\n" " ar %1,%3\n" " cs %0,%1,0(%2)\n" " jl 0b" +#else /* __s390x__ */ + " lg %0,0(%2)\n" + "0: lgr %1,%0\n" + " agr %1,%3\n" + " csg %0,%1,0(%2)\n" + " jl 0b" +#endif /* __s390x__ */ : "=&d" (old), "=&d" (new) : "a" (&sem->count), "d" (delta) : "cc", "memory" ); @@ -258,11 +331,19 @@ signed long old, new; __asm__ __volatile__( +#ifndef __s390x__ " l %0,0(%2)\n" "0: lr %1,%0\n" " ar %1,%3\n" " cs %0,%1,0(%2)\n" " jl 0b" +#else /* __s390x__ */ + " lg %0,0(%2)\n" + "0: lgr %1,%0\n" + " agr %1,%3\n" + " csg %0,%1,0(%2)\n" + " jl 0b" +#endif /* __s390x__ */ : "=&d" (old), "=&d" (new) : "a" (&sem->count), "d" (delta) : "cc", "memory" ); diff -urN linux-2.5.67/include/asm-s390/sembuf.h linux-2.5.67-s390/include/asm-s390/sembuf.h --- linux-2.5.67/include/asm-s390/sembuf.h Mon Apr 7 19:31:41 2003 +++ linux-2.5.67-s390/include/asm-s390/sembuf.h Mon Apr 14 19:11:59 2003 @@ -7,16 +7,20 @@ * between kernel and user space. * * Pad space is left for: - * - 64-bit time_t to solve y2038 problem + * - 64-bit time_t to solve y2038 problem (for !__s390x__) * - 2 miscellaneous 32-bit values */ struct semid64_ds { struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ __kernel_time_t sem_otime; /* last semop time */ +#ifndef __s390x__ unsigned long __unused1; +#endif /* ! __s390x__ */ __kernel_time_t sem_ctime; /* last change time */ +#ifndef __s390x__ unsigned long __unused2; +#endif /* ! __s390x__ */ unsigned long sem_nsems; /* no. of semaphores in array */ unsigned long __unused3; unsigned long __unused4; diff -urN linux-2.5.67/include/asm-s390/setup.h linux-2.5.67-s390/include/asm-s390/setup.h --- linux-2.5.67/include/asm-s390/setup.h Mon Apr 7 19:32:48 2003 +++ linux-2.5.67-s390/include/asm-s390/setup.h Mon Apr 14 19:11:59 2003 @@ -15,9 +15,15 @@ #ifndef __ASSEMBLY__ +#ifndef __s390x__ #define IPL_DEVICE (*(unsigned long *) (0x10404)) #define INITRD_START (*(unsigned long *) (0x1040C)) #define INITRD_SIZE (*(unsigned long *) (0x10414)) +#else /* __s390x__ */ +#define IPL_DEVICE (*(unsigned long *) (0x10400)) +#define INITRD_START (*(unsigned long *) (0x10408)) +#define INITRD_SIZE (*(unsigned long *) (0x10410)) +#endif /* __s390x__ */ #define COMMAND_LINE ((char *) (0x10480)) /* @@ -26,10 +32,18 @@ extern unsigned long machine_flags; #define MACHINE_IS_VM (machine_flags & 1) -#define MACHINE_HAS_IEEE (machine_flags & 2) #define MACHINE_IS_P390 (machine_flags & 4) -#define MACHINE_HAS_CSP (machine_flags & 8) #define MACHINE_HAS_MVPG (machine_flags & 16) +#define MACHINE_HAS_DIAG44 (machine_flags & 32) + +#ifndef __s390x__ +#define MACHINE_HAS_IEEE (machine_flags & 2) +#define MACHINE_HAS_CSP (machine_flags & 8) +#else /* __s390x__ */ +#define MACHINE_HAS_IEEE (1) +#define MACHINE_HAS_CSP (1) +#endif /* __s390x__ */ + #define MACHINE_HAS_SCLP (!MACHINE_IS_P390) @@ -50,9 +64,15 @@ #else +#ifndef __s390x__ #define IPL_DEVICE 0x10404 #define INITRD_START 0x1040C #define INITRD_SIZE 0x10414 +#else /* __s390x__ */ +#define IPL_DEVICE 0x10400 +#define INITRD_START 0x10408 +#define INITRD_SIZE 0x10410 +#endif /* __s390x__ */ #define COMMAND_LINE 0x10480 #endif diff -urN linux-2.5.67/include/asm-s390/shmbuf.h linux-2.5.67-s390/include/asm-s390/shmbuf.h --- linux-2.5.67/include/asm-s390/shmbuf.h Mon Apr 7 19:33:02 2003 +++ linux-2.5.67-s390/include/asm-s390/shmbuf.h Mon Apr 14 19:11:59 2003 @@ -7,7 +7,7 @@ * between kernel and user space. * * Pad space is left for: - * - 64-bit time_t to solve y2038 problem + * - 64-bit time_t to solve y2038 problem (for !__s390x__) * - 2 miscellaneous 32-bit values */ @@ -15,11 +15,17 @@ struct ipc64_perm shm_perm; /* operation perms */ size_t shm_segsz; /* size of segment (bytes) */ __kernel_time_t shm_atime; /* last attach time */ +#ifndef __s390x__ unsigned long __unused1; +#endif /* ! __s390x__ */ __kernel_time_t shm_dtime; /* last detach time */ +#ifndef __s390x__ unsigned long __unused2; +#endif /* ! __s390x__ */ __kernel_time_t shm_ctime; /* last change time */ +#ifndef __s390x__ unsigned long __unused3; +#endif /* ! __s390x__ */ __kernel_pid_t shm_cpid; /* pid of creator */ __kernel_pid_t shm_lpid; /* pid of last operator */ unsigned long shm_nattch; /* no. of current attaches */ diff -urN linux-2.5.67/include/asm-s390/sigcontext.h linux-2.5.67-s390/include/asm-s390/sigcontext.h --- linux-2.5.67/include/asm-s390/sigcontext.h Mon Apr 7 19:31:51 2003 +++ linux-2.5.67-s390/include/asm-s390/sigcontext.h Mon Apr 14 19:11:59 2003 @@ -12,13 +12,24 @@ #define __NUM_FPRS 16 #define __NUM_ACRS 16 -/* - Has to be at least _NSIG_WORDS from asm/signal.h - */ -#define _SIGCONTEXT_NSIG 64 -#define _SIGCONTEXT_NSIG_BPW 32 +#ifndef __s390x__ + +/* Has to be at least _NSIG_WORDS from asm/signal.h */ +#define _SIGCONTEXT_NSIG 64 +#define _SIGCONTEXT_NSIG_BPW 32 /* Size of stack frame allocated when calling signal handler. */ #define __SIGNAL_FRAMESIZE 96 + +#else /* __s390x__ */ + +/* Has to be at least _NSIG_WORDS from asm/signal.h */ +#define _SIGCONTEXT_NSIG 64 +#define _SIGCONTEXT_NSIG_BPW 64 +/* Size of stack frame allocated when calling signal handler. */ +#define __SIGNAL_FRAMESIZE 160 + +#endif /* __s390x__ */ + #define _SIGCONTEXT_NSIG_WORDS (_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW) #define _SIGMASK_COPY_SIZE (sizeof(unsigned long)*_SIGCONTEXT_NSIG_WORDS) diff -urN linux-2.5.67/include/asm-s390/signal.h linux-2.5.67-s390/include/asm-s390/signal.h --- linux-2.5.67/include/asm-s390/signal.h Mon Apr 14 19:11:45 2003 +++ linux-2.5.67-s390/include/asm-s390/signal.h Mon Apr 14 19:11:59 2003 @@ -171,9 +171,15 @@ __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 diff -urN linux-2.5.67/include/asm-s390/sigp.h linux-2.5.67-s390/include/asm-s390/sigp.h --- linux-2.5.67/include/asm-s390/sigp.h Mon Apr 7 19:31:23 2003 +++ linux-2.5.67-s390/include/asm-s390/sigp.h Mon Apr 14 19:11:59 2003 @@ -72,10 +72,17 @@ sigp_ccode ccode; __asm__ __volatile__( +#ifndef __s390x__ " sr 1,1\n" /* parameter=0 in gpr 1 */ " sigp 1,%1,0(%2)\n" " ipm %0\n" " srl %0,28\n" +#else /* __s390x__ */ + " sgr 1,1\n" /* parameter=0 in gpr 1 */ + " sigp 1,%1,0(%2)\n" + " ipm %0\n" + " srl %0,28" +#endif /* __s390x__ */ : "=d" (ccode) : "d" (__cpu_logical_map[cpu_addr]), "a" (order_code) : "cc" , "memory", "1" ); @@ -86,15 +93,23 @@ * Signal processor with parameter */ extern __inline__ sigp_ccode -signal_processor_p(__u32 parameter,__u16 cpu_addr,sigp_order_code order_code) +signal_processor_p(unsigned long parameter,__u16 cpu_addr, + sigp_order_code order_code) { sigp_ccode ccode; __asm__ __volatile__( +#ifndef __s390x__ " lr 1,%1\n" /* parameter in gpr 1 */ " sigp 1,%2,0(%3)\n" " ipm %0\n" " srl %0,28\n" +#else /* __s390x__ */ + " lgr 1,%1\n" /* parameter in gpr 1 */ + " sigp 1,%2,0(%3)\n" + " ipm %0\n" + " srl %0,28\n" +#endif /* __s390x__ */ : "=d" (ccode) : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]), "a" (order_code) @@ -106,18 +121,27 @@ * Signal processor with parameter and return status */ extern __inline__ sigp_ccode -signal_processor_ps(__u32 *statusptr, __u32 parameter, +signal_processor_ps(__u32 *statusptr, unsigned long parameter, __u16 cpu_addr, sigp_order_code order_code) { sigp_ccode ccode; __asm__ __volatile__( +#ifndef __s390x__ " sr 2,2\n" /* clear status so it doesn't contain rubbish if not saved. */ " lr 3,%2\n" /* parameter in gpr 3 */ " sigp 2,%3,0(%4)\n" " st 2,%1\n" " ipm %0\n" " srl %0,28\n" +#else /* __s390x__ */ + " sgr 2,2\n" /* clear status so it doesn't contain rubbish if not saved. */ + " lgr 3,%2\n" /* parameter in gpr 3 */ + " sigp 2,%3,0(%4)\n" + " stg 2,%1\n" + " ipm %0\n" + " srl %0,28\n" +#endif /* __s390x__ */ : "=d" (ccode), "=m" (*statusptr) : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]), "a" (order_code) diff -urN linux-2.5.67/include/asm-s390/smp.h linux-2.5.67-s390/include/asm-s390/smp.h --- linux-2.5.67/include/asm-s390/smp.h Mon Apr 7 19:31:20 2003 +++ linux-2.5.67-s390/include/asm-s390/smp.h Mon Apr 14 19:11:59 2003 @@ -52,7 +52,11 @@ extern inline unsigned int num_online_cpus(void) { +#ifndef __s390x__ return hweight32(cpu_online_map); +#else /* __s390x__ */ + return hweight64(cpu_online_map); +#endif /* __s390x__ */ } extern inline int any_online_cpu(unsigned int mask) diff -urN linux-2.5.67/include/asm-s390/spinlock.h linux-2.5.67-s390/include/asm-s390/spinlock.h --- linux-2.5.67/include/asm-s390/spinlock.h Mon Apr 14 19:11:45 2003 +++ linux-2.5.67-s390/include/asm-s390/spinlock.h Mon Apr 14 19:11:59 2003 @@ -11,6 +11,22 @@ #ifndef __ASM_SPINLOCK_H #define __ASM_SPINLOCK_H +#ifdef __s390x__ +/* + * Grmph, take care of %&#! user space programs that include + * asm/spinlock.h. The diagnose is only available in kernel + * context. + */ +#ifdef __KERNEL__ +#include <asm/lowcore.h> +#define __DIAG44_INSN "ex" +#define __DIAG44_OPERAND __LC_DIAG44_OPCODE +#else +#define __DIAG44_INSN "#" +#define __DIAG44_OPERAND 0 +#endif +#endif /* __s390x__ */ + /* * Simple spin lock operations. There are two variants, one clears IRQ's * on the local processor, one does not. @@ -19,8 +35,13 @@ */ typedef struct { +#ifndef __s390x__ volatile unsigned long lock; } spinlock_t; +#else /* __s390x__ */ + volatile unsigned int lock; +} __attribute__ ((aligned (4))) spinlock_t; +#endif /* __s390x__ */ #define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 } #define spin_lock_init(lp) do { (lp)->lock = 0; } while(0) @@ -29,6 +50,7 @@ extern inline void _raw_spin_lock(spinlock_t *lp) { +#ifndef __s390x__ unsigned int reg1, reg2; __asm__ __volatile(" bras %0,1f\n" "0: diag 0,0,68\n" @@ -37,11 +59,26 @@ " jl 0b\n" : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock) : "a" (&lp->lock) : "cc" ); +#else /* __s390x__ */ + unsigned long reg1, reg2; + __asm__ __volatile(" bras %1,1f\n" + "0: " __DIAG44_INSN " 0,%4\n" + "1: slr %0,%0\n" + " cs %0,%1,0(%3)\n" + " jl 0b\n" + : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock) + : "a" (&lp->lock), "i" (__DIAG44_OPERAND) + : "cc" ); +#endif /* __s390x__ */ } extern inline int _raw_spin_trylock(spinlock_t *lp) { +#ifndef __s390x__ unsigned long result, reg; +#else /* __s390x__ */ + unsigned int result, reg; +#endif /* __s390x__ */ __asm__ __volatile(" slr %0,%0\n" " basr %1,0\n" "0: cs %0,%1,0(%3)" @@ -80,6 +117,7 @@ #define rwlock_is_locked(x) ((x)->lock != 0) +#ifndef __s390x__ #define _raw_read_lock(rw) \ asm volatile(" l 2,0(%1)\n" \ " j 1f\n" \ @@ -90,7 +128,21 @@ " jl 0b" \ : "+m" ((rw)->lock) : "a" (&(rw)->lock) \ : "2", "3", "cc" ) +#else /* __s390x__ */ +#define _raw_read_lock(rw) \ + asm volatile(" lg 2,0(%1)\n" \ + " j 1f\n" \ + "0: " __DIAG44_INSN " 0,%2\n" \ + "1: nihh 2,0x7fff\n" /* clear high (=write) bit */ \ + " la 3,1(2)\n" /* one more reader */ \ + " csg 2,3,0(%1)\n" /* try to write new value */ \ + " jl 0b" \ + : "+m" ((rw)->lock) \ + : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \ + : "2", "3", "cc" ) +#endif /* __s390x__ */ +#ifndef __s390x__ #define _raw_read_unlock(rw) \ asm volatile(" l 2,0(%1)\n" \ " j 1f\n" \ @@ -101,7 +153,21 @@ " jl 0b" \ : "+m" ((rw)->lock) : "a" (&(rw)->lock) \ : "2", "3", "cc" ) +#else /* __s390x__ */ +#define _raw_read_unlock(rw) \ + asm volatile(" lg 2,0(%1)\n" \ + " j 1f\n" \ + "0: " __DIAG44_INSN " 0,%2\n" \ + "1: lgr 3,2\n" \ + " bctgr 3,0\n" /* one less reader */ \ + " csg 2,3,0(%1)\n" \ + " jl 0b" \ + : "+m" ((rw)->lock) \ + : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \ + : "2", "3", "cc" ) +#endif /* __s390x__ */ +#ifndef __s390x__ #define _raw_write_lock(rw) \ asm volatile(" lhi 3,1\n" \ " sll 3,31\n" /* new lock value = 0x80000000 */ \ @@ -112,7 +178,20 @@ " jl 0b" \ : "+m" ((rw)->lock) : "a" (&(rw)->lock) \ : "2", "3", "cc" ) +#else /* __s390x__ */ +#define _raw_write_lock(rw) \ + asm volatile(" llihh 3,0x8000\n" /* new lock value = 0x80...0 */ \ + " j 1f\n" \ + "0: " __DIAG44_INSN " 0,%2\n" \ + "1: slgr 2,2\n" /* old lock value must be 0 */ \ + " csg 2,3,0(%1)\n" \ + " jl 0b" \ + : "+m" ((rw)->lock) \ + : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \ + : "2", "3", "cc" ) +#endif /* __s390x__ */ +#ifndef __s390x__ #define _raw_write_unlock(rw) \ asm volatile(" slr 3,3\n" /* new lock value = 0 */ \ " j 1f\n" \ @@ -123,15 +202,34 @@ " jl 0b" \ : "+m" ((rw)->lock) : "a" (&(rw)->lock) \ : "2", "3", "cc" ) +#else /* __s390x__ */ +#define _raw_write_unlock(rw) \ + asm volatile(" slgr 3,3\n" /* new lock value = 0 */ \ + " j 1f\n" \ + "0: " __DIAG44_INSN " 0,%2\n" \ + "1: llihh 2,0x8000\n" /* old lock value must be 0x8..0 */\ + " csg 2,3,0(%1)\n" \ + " jl 0b" \ + : "+m" ((rw)->lock) \ + : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \ + : "2", "3", "cc" ) +#endif /* __s390x__ */ extern inline int _raw_write_trylock(rwlock_t *rw) { unsigned int result, reg; - __asm__ __volatile__(" lhi %0,1\n" + __asm__ __volatile__( +#ifndef __s390x__ + " lhi %0,1\n" " sll %0,31\n" " basr %1,0\n" "0: cs %0,%1,0(%3)\n" +#else /* __s390x__ */ + " llihh %0,0x8000\n" + " basr %1,0\n" + "0: csg %0,%1,0(%3)\n" +#endif /* __s390x__ */ : "=&d" (result), "=&d" (reg), "+m" (rw->lock) : "a" (&rw->lock) : "cc" ); return !result; diff -urN linux-2.5.67/include/asm-s390/stat.h linux-2.5.67-s390/include/asm-s390/stat.h --- linux-2.5.67/include/asm-s390/stat.h Mon Apr 7 19:32:51 2003 +++ linux-2.5.67-s390/include/asm-s390/stat.h Mon Apr 14 19:11:59 2003 @@ -9,6 +9,7 @@ #ifndef _S390_STAT_H #define _S390_STAT_H +#ifndef __s390x__ struct __old_kernel_stat { unsigned short st_dev; unsigned short st_ino; @@ -46,8 +47,6 @@ unsigned long __unused5; }; -#define STAT_HAVE_NSEC 1 - /* This matches struct stat64 in glibc2.1, hence the absolutely * insane amounts of padding around dev_t's. */ @@ -76,4 +75,31 @@ unsigned long long st_ino; }; +#else /* __s390x__ */ + +struct stat { + unsigned long st_dev; + unsigned long st_ino; + unsigned long st_nlink; + unsigned int st_mode; + unsigned int st_uid; + unsigned int st_gid; + unsigned int __pad1; + unsigned long st_rdev; + unsigned long st_size; + unsigned long st_atime; + unsigned long st_atime_nsec; + unsigned long st_mtime; + unsigned long st_mtime_nsec; + unsigned long st_ctime; + unsigned long st_ctime_nsec; + unsigned long st_blksize; + long st_blocks; + unsigned long __unused[3]; +}; + +#endif /* __s390x__ */ + +#define STAT_HAVE_NSEC 1 + #endif diff -urN linux-2.5.67/include/asm-s390/statfs.h linux-2.5.67-s390/include/asm-s390/statfs.h --- linux-2.5.67/include/asm-s390/statfs.h Mon Apr 7 19:32:56 2003 +++ linux-2.5.67-s390/include/asm-s390/statfs.h Mon Apr 14 19:11:59 2003 @@ -18,6 +18,7 @@ #endif struct statfs { +#ifndef __s390x__ long f_type; long f_bsize; long f_blocks; @@ -28,6 +29,18 @@ __kernel_fsid_t f_fsid; long f_namelen; long f_spare[6]; +#else /* __s390x__ */ + int f_type; + int f_bsize; + long f_blocks; + long f_bfree; + long f_bavail; + long f_files; + long f_ffree; + __kernel_fsid_t f_fsid; + int f_namelen; + int f_spare[6]; +#endif /* __s390x__ */ }; #endif diff -urN linux-2.5.67/include/asm-s390/string.h linux-2.5.67-s390/include/asm-s390/string.h --- linux-2.5.67/include/asm-s390/string.h Mon Apr 7 19:33:03 2003 +++ linux-2.5.67-s390/include/asm-s390/string.h Mon Apr 14 19:11:59 2003 @@ -49,13 +49,24 @@ { void *ptr; - __asm__ __volatile__ (" lr 0,%2\n" + __asm__ __volatile__ ( +#ifndef __s390x__ + " lr 0,%2\n" " lr 1,%1\n" " la %0,0(%3,%1)\n" "0: srst %0,1\n" " jo 0b\n" " brc 13,1f\n" " slr %0,%0\n" +#else /* __s390x__ */ + " lgr 0,%2\n" + " lgr 1,%1\n" + " la %0,0(%3,%1)\n" + "0: srst %0,1\n" + " jo 0b\n" + " brc 13,1f\n" + " slgr %0,%0\n" +#endif /* __s390x__ */ "1:" : "=&a" (ptr) : "a" (cs), "d" (c), "d" (count) : "cc", "0", "1" ); @@ -66,9 +77,16 @@ { char *tmp = dest; - __asm__ __volatile__ (" sr 0,0\n" + __asm__ __volatile__ ( +#ifndef __s390x__ + " sr 0,0\n" "0: mvst %0,%1\n" " jo 0b" +#else /* __s390x__ */ + " slgr 0,0\n" + "0: mvst %0,%1\n" + " jo 0b" +#endif /* __s390x__ */ : "+&a" (dest), "+&a" (src) : : "cc", "memory", "0" ); return tmp; @@ -78,12 +96,22 @@ { size_t len; - __asm__ __volatile__ (" sr 0,0\n" + __asm__ __volatile__ ( +#ifndef __s390x__ + " sr 0,0\n" " lr %0,%1\n" "0: srst 0,%0\n" " jo 0b\n" " lr %0,0\n" " sr %0,%1" +#else /* __s390x__ */ + " slgr 0,0\n" + " lgr %0,%1\n" + "0: srst 0,%0\n" + " jo 0b\n" + " lgr %0,0\n" + " sgr %0,%1" +#endif /* __s390x__ */ : "=&a" (len) : "a" (s) : "cc", "0" ); return len; @@ -93,25 +121,30 @@ { char *tmp = dest; - __asm__ __volatile__ (" sr 0,0\n" + __asm__ __volatile__ ( +#ifndef __s390x__ + " sr 0,0\n" "0: srst 0,%0\n" " jo 0b\n" " lr %0,0\n" " sr 0,0\n" "1: mvst %0,%1\n" " jo 1b" +#else /* __s390x__ */ + " slgr 0,0\n" + "0: srst 0,%0\n" + " jo 0b\n" + " lgr %0,0\n" + " slgr 0,0\n" + "1: mvst %0,%1\n" + " jo 1b" +#endif /* __s390x__ */ : "+&a" (dest), "+&a" (src) : : "cc", "memory", "0" ); return tmp; } extern void *alloca(size_t); - #endif /* __KERNEL__ */ #endif /* __S390_STRING_H_ */ - - - - - diff -urN linux-2.5.67/include/asm-s390/system.h linux-2.5.67-s390/include/asm-s390/system.h --- linux-2.5.67/include/asm-s390/system.h Mon Apr 14 19:11:45 2003 +++ linux-2.5.67-s390/include/asm-s390/system.h Mon Apr 14 19:11:59 2003 @@ -23,6 +23,15 @@ extern struct task_struct *resume(void *, void *); +#ifdef __s390x__ +#define __FLAG_SHIFT 56 +extern void __misaligned_u16(void); +extern void __misaligned_u32(void); +extern void __misaligned_u64(void); +#else /* __s390x__ */ +#define __FLAG_SHIFT 24 +#endif /* __s390x__ */ + static inline void save_fp_regs(s390_fp_regs *fpregs) { asm volatile ( @@ -88,7 +97,7 @@ #define nop() __asm__ __volatile__ ("nop") #define xchg(ptr,x) \ - ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) + ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(void *)(ptr),sizeof(*(ptr)))) static inline unsigned long __xchg(unsigned long x, void * ptr, int size) { @@ -137,6 +146,17 @@ : "memory", "cc", "0" ); x = old; break; +#ifdef __s390x__ + case 8: + asm volatile ( + " lg %0,0(%2)\n" + "0: csg %0,%1,0(%2)\n" + " jl 0b\n" + : "=&d" (old) : "d" (x), "a" (ptr) + : "memory", "cc", "0" ); + x = old; + break; +#endif /* __s390x__ */ } return x; } @@ -208,6 +228,14 @@ : "=&d" (prev) : "0" (old), "d" (new), "a" (ptr) : "memory", "cc" ); return prev; +#ifdef __s390x__ + case 8: + asm volatile ( + " csg %0,%2,0(%3)\n" + : "=&d" (prev) : "0" (old), "d" (new), "a" (ptr) + : "memory", "cc" ); + return prev; +#endif /* __s390x__ */ } return old; } @@ -241,15 +269,15 @@ /* interrupt control.. */ #define local_irq_enable() ({ \ - __u8 __dummy; \ + unsigned long __dummy; \ __asm__ __volatile__ ( \ "stosm 0(%1),0x03" : "=m" (__dummy) : "a" (&__dummy) ); \ }) #define local_irq_disable() ({ \ - __u32 __flags; \ + unsigned long __flags; \ __asm__ __volatile__ ( \ - "stnsm 0(%1),0xFC" : "=m" (__flags) : "a" (&__flags) ); \ + "stnsm 0(%1),0xfc" : "=m" (__flags) : "a" (&__flags) ); \ __flags; \ }) @@ -263,9 +291,70 @@ ({ \ unsigned long flags; \ local_save_flags(flags); \ - !((flags >> 24) & 3); \ + !((flags >> __FLAG_SHIFT) & 3); \ }) +#ifdef __s390x__ + +#define __load_psw(psw) \ + __asm__ __volatile__("lpswe 0(%0)" : : "a" (&psw) : "cc" ); + +#define __ctl_load(array, low, high) ({ \ + __asm__ __volatile__ ( \ + " la 1,%0\n" \ + " bras 2,0f\n" \ + " lctlg 0,0,0(1)\n" \ + "0: ex %1,0(2)" \ + : : "m" (array), "a" (((low)<<4)+(high)) : "1", "2" ); \ + }) + +#define __ctl_store(array, low, high) ({ \ + __asm__ __volatile__ ( \ + " la 1,%0\n" \ + " bras 2,0f\n" \ + " stctg 0,0,0(1)\n" \ + "0: ex %1,0(2)" \ + : "=m" (array) : "a" (((low)<<4)+(high)): "1", "2" ); \ + }) + +#define __ctl_set_bit(cr, bit) ({ \ + __u8 __dummy[24]; \ + __asm__ __volatile__ ( \ + " la 1,%0\n" /* align to 8 byte */ \ + " aghi 1,7\n" \ + " nill 1,0xfff8\n" \ + " bras 2,0f\n" /* skip indirect insns */ \ + " stctg 0,0,0(1)\n" \ + " lctlg 0,0,0(1)\n" \ + "0: ex %1,0(2)\n" /* execute stctl */ \ + " lg 0,0(1)\n" \ + " ogr 0,%2\n" /* set the bit */ \ + " stg 0,0(1)\n" \ + "1: ex %1,6(2)" /* execute lctl */ \ + : "=m" (__dummy) : "a" (cr*17), "a" (1L<<(bit)) \ + : "cc", "0", "1", "2"); \ + }) + +#define __ctl_clear_bit(cr, bit) ({ \ + __u8 __dummy[24]; \ + __asm__ __volatile__ ( \ + " la 1,%0\n" /* align to 8 byte */ \ + " aghi 1,7\n" \ + " nill 1,0xfff8\n" \ + " bras 2,0f\n" /* skip indirect insns */ \ + " stctg 0,0,0(1)\n" \ + " lctlg 0,0,0(1)\n" \ + "0: ex %1,0(2)\n" /* execute stctl */ \ + " lg 0,0(1)\n" \ + " ngr 0,%2\n" /* set the bit */ \ + " stg 0,0(1)\n" \ + "1: ex %1,6(2)" /* execute lctl */ \ + : "=m" (__dummy) : "a" (cr*17), "a" (~(1L<<(bit))) \ + : "cc", "0", "1", "2"); \ + }) + +#else /* __s390x__ */ + #define __load_psw(psw) \ __asm__ __volatile__("lpsw 0(%0)" : : "a" (&psw) : "cc" ); @@ -273,7 +362,7 @@ __asm__ __volatile__ ( \ " la 1,%0\n" \ " bras 2,0f\n" \ - " lctl 0,0,0(1)\n" \ + " lctl 0,0,0(1)\n" \ "0: ex %1,0(2)" \ : : "m" (array), "a" (((low)<<4)+(high)) : "1", "2" ); \ }) @@ -324,6 +413,7 @@ : "=m" (__dummy) : "a" (cr*17), "a" (~(1<<(bit))) \ : "cc", "0", "1", "2"); \ }) +#endif /* __s390x__ */ /* For spinlocks etc */ #define local_irq_save(x) ((x) = local_irq_disable()) diff -urN linux-2.5.67/include/asm-s390/thread_info.h linux-2.5.67-s390/include/asm-s390/thread_info.h --- linux-2.5.67/include/asm-s390/thread_info.h Mon Apr 7 19:31:57 2003 +++ linux-2.5.67-s390/include/asm-s390/thread_info.h Mon Apr 14 19:11:59 2003 @@ -13,6 +13,7 @@ #ifndef __ASSEMBLY__ #include <asm/processor.h> +#include <asm/lowcore.h> /* * low level task data that entry.S needs immediate access to @@ -46,27 +47,36 @@ #define init_thread_info (init_thread_union.thread_info) #define init_stack (init_thread_union.stack) +/* + * Size of kernel stack for each process + */ +#ifndef __s390x__ +#define THREAD_ORDER 1 +#define ASYNC_ORDER 1 +#else /* __s390x__ */ +#define THREAD_ORDER 2 +#define ASYNC_ORDER 2 +#endif /* __s390x__ */ + +#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) +#define ASYNC_SIZE (PAGE_SIZE << ASYNC_ORDER) + /* how to get the thread information struct from C */ static inline struct thread_info *current_thread_info(void) { - return (struct thread_info *)((*(unsigned long *) 0xc40)-8192); + return (struct thread_info *)((*(unsigned long *) __LC_KERNEL_STACK)-THREAD_SIZE); } /* thread information allocation */ #define alloc_thread_info() ((struct thread_info *) \ - __get_free_pages(GFP_KERNEL,1)) -#define free_thread_info(ti) free_pages((unsigned long) (ti), 1) + __get_free_pages(GFP_KERNEL,THREAD_ORDER)) +#define free_thread_info(ti) free_pages((unsigned long) (ti),THREAD_ORDER) #define get_thread_info(ti) get_task_struct((ti)->task) #define put_thread_info(ti) put_task_struct((ti)->task) #endif /* - * Size of kernel stack for each process - */ -#define THREAD_SIZE (2*PAGE_SIZE) - -/* * thread information flags bit numbers */ #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ @@ -77,6 +87,7 @@ #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ +#define TIF_31BIT 18 /* 32bit process */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) @@ -85,6 +96,7 @@ #define _TIF_RESTART_SVC (1<<TIF_RESTART_SVC) #define _TIF_USEDFPU (1<<TIF_USEDFPU) #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) +#define _TIF_31BIT (1<<TIF_31BIT) #endif /* __KERNEL__ */ diff -urN linux-2.5.67/include/asm-s390/tlbflush.h linux-2.5.67-s390/include/asm-s390/tlbflush.h --- linux-2.5.67/include/asm-s390/tlbflush.h Mon Apr 7 19:32:57 2003 +++ linux-2.5.67-s390/include/asm-s390/tlbflush.h Mon Apr 14 19:11:59 2003 @@ -28,7 +28,6 @@ #define local_flush_tlb() \ do { __asm__ __volatile__("ptlb": : :"memory"); } while (0) - #ifndef CONFIG_SMP /* @@ -70,7 +69,13 @@ static inline void global_flush_tlb(void) { - if (MACHINE_HAS_CSP) { +#ifndef __s390x__ + if (!MACHINE_HAS_CSP) { + smp_ptlb_all(); + return; + } +#endif /* __s390x__ */ + { long dummy = 0; __asm__ __volatile__ ( " la 4,1(%0)\n" @@ -78,8 +83,7 @@ " slr 3,3\n" " csp 2,4" : : "a" (&dummy) : "cc", "2", "3", "4" ); - } else - smp_ptlb_all(); + } } /* diff -urN linux-2.5.67/include/asm-s390/types.h linux-2.5.67-s390/include/asm-s390/types.h --- linux-2.5.67/include/asm-s390/types.h Mon Apr 7 19:31:22 2003 +++ linux-2.5.67-s390/include/asm-s390/types.h Mon Apr 14 19:11:59 2003 @@ -27,15 +27,21 @@ typedef __signed__ int __s32; typedef unsigned int __u32; +#ifndef __s390x__ #if defined(__GNUC__) && !defined(__STRICT_ANSI__) typedef __signed__ long long __s64; typedef unsigned long long __u64; #endif +#else /* __s390x__ */ +typedef __signed__ long __s64; +typedef unsigned long __u64; +#endif + /* A address type so that arithmetic can be done on it & it can be upgraded to 64 bit when necessary */ -typedef __u32 addr_t; -typedef __s32 saddr_t; +typedef unsigned long addr_t; +typedef __signed__ long saddr_t; #endif /* __ASSEMBLY__ */ @@ -44,7 +50,11 @@ */ #ifdef __KERNEL__ +#ifndef __s390x__ #define BITS_PER_LONG 32 +#else +#define BITS_PER_LONG 64 +#endif #ifndef __ASSEMBLY__ @@ -57,11 +67,17 @@ typedef signed int s32; typedef unsigned int u32; +#ifndef __s390x__ typedef signed long long s64; typedef unsigned long long u64; +#else /* __s390x__ */ +typedef signed long s64; +typedef unsigned long u64; +#endif /* __s390x__ */ typedef u32 dma_addr_t; +#ifndef __s390x__ typedef union { unsigned long long pair; struct { @@ -75,7 +91,7 @@ #define HAVE_SECTOR_T #endif -#endif /* __ASSEMBLY__ */ - -#endif /* __KERNEL__ */ -#endif +#endif /* ! __s390x__ */ +#endif /* __ASSEMBLY__ */ +#endif /* __KERNEL__ */ +#endif /* _S390_TYPES_H */ diff -urN linux-2.5.67/include/asm-s390/uaccess.h linux-2.5.67-s390/include/asm-s390/uaccess.h --- linux-2.5.67/include/asm-s390/uaccess.h Mon Apr 7 19:30:44 2003 +++ linux-2.5.67-s390/include/asm-s390/uaccess.h Mon Apr 14 19:11:59 2003 @@ -72,284 +72,261 @@ }; /* - * These are the main single-value transfer routines. They automatically - * use the right size if we just have the right pointer type. + * Standard fixup section for uaccess inline functions. + * local label 0: is the fault point + * local label 1: is the return point + * %0 is the error variable + * %3 is the error value -EFAULT */ - -extern inline int __put_user_asm_8(void *x, void *ptr) -{ - int err; - - __asm__ __volatile__ ( " sr %0,%0\n" - " lr 2,%1\n" - " lr 4,%2\n" - " sacf 512\n" - "0: mvc 0(8,4),0(2)\n" - " sacf 0\n" - "1:\n" - ".section .fixup,\"ax\"\n" - "2: sacf 0\n" - " lhi %0,%h3\n" - " bras 4,3f\n" - " .long 1b\n" - "3: l 4,0(4)\n" - " br 4\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 0b,2b\n" - ".previous" - : "=&d" (err) - : "d" (x), "d" (ptr), "K" (-EFAULT) - : "cc", "2", "4" ); - return err; -} - -extern inline int __put_user_asm_4(__u32 x, void *ptr) -{ - int err; - - __asm__ __volatile__ ( " sr %0,%0\n" - " lr 4,%2\n" - " sacf 512\n" - "0: st %1,0(4)\n" - " sacf 0\n" - "1:\n" - ".section .fixup,\"ax\"\n" - "2: sacf 0\n" - " lhi %0,%h3\n" - " bras 4,3f\n" - " .long 1b\n" - "3: l 4,0(4)\n" - " br 4\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 0b,2b\n" - ".previous" - : "=&d" (err) - : "d" (x), "d" (ptr), "K" (-EFAULT) - : "cc", "4" ); - return err; -} - -extern inline int __put_user_asm_2(__u16 x, void *ptr) -{ - int err; - - __asm__ __volatile__ ( " sr %0,%0\n" - " lr 4,%2\n" - " sacf 512\n" - "0: sth %1,0(4)\n" - " sacf 0\n" - "1:\n" - ".section .fixup,\"ax\"\n" - "2: sacf 0\n" - " lhi %0,%h3\n" - " bras 4,3f\n" - " .long 1b\n" - "3: l 4,0(4)\n" - " br 4\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 0b,2b\n" - ".previous" - : "=&d" (err) - : "d" (x), "d" (ptr), "K" (-EFAULT) - : "cc", "4" ); - return err; -} - -extern inline int __put_user_asm_1(__u8 x, void *ptr) -{ - int err; - - __asm__ __volatile__ ( " sr %0,%0\n" - " lr 4,%2\n" - " sacf 512\n" - "0: stc %1,0(4)\n" - " sacf 0\n" - "1:\n" - ".section .fixup,\"ax\"\n" - "2: sacf 0\n" - " lhi %0,%h3\n" - " bras 4,3f\n" - " .long 1b\n" - "3: l 4,0(4)\n" - " br 4\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 0b,2b\n" - ".previous" - : "=&d" (err) - : "d" (x), "d" (ptr), "K" (-EFAULT) - : "cc", "4" ); - return err; -} +#ifndef __s390x__ +#define __uaccess_fixup \ + ".section .fixup,\"ax\"\n" \ + "8: sacf 0\n" \ + " lhi %0,%h3\n" \ + " bras 4,9f\n" \ + " .long 1b\n" \ + "9: l 4,0(4)\n" \ + " br 4\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " .align 4\n" \ + " .long 0b,8b\n" \ + ".previous" +#else /* __s390x__ */ +#define __uaccess_fixup \ + ".section .fixup,\"ax\"\n" \ + "9: sacf 0\n" \ + " lhi %0,%h3\n" \ + " jg 1b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " .align 8\n" \ + " .quad 0b,9b\n" \ + ".previous" +#endif /* __s390x__ */ /* - * (u8)(u32) ... autsch, but that the only way we can suppress the - * warnings when compiling binfmt_elf.c + * These are the main single-value transfer routines. They automatically + * use the right size if we just have the right pointer type. */ -#define __put_user(x, ptr) \ -({ \ - __typeof__(*(ptr)) __x = (x); \ - int __pu_err; \ - switch (sizeof (*(ptr))) { \ - case 1: \ - __pu_err = __put_user_asm_1((__u8)(__u32) __x, \ - ptr); \ - break; \ - case 2: \ - __pu_err = __put_user_asm_2((__u16)(__u32) __x, \ - ptr); \ - break; \ - case 4: \ - __pu_err = __put_user_asm_4((__u32) __x, \ - ptr); \ - break; \ - case 8: \ - __pu_err = __put_user_asm_8(&__x, ptr); \ - break; \ - default: \ - __pu_err = __put_user_bad(); \ - break; \ - } \ - __pu_err; \ +#ifndef __s390x__ + +#define __put_user_asm_8(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 2,%2\n" \ + " la 4,%1\n" \ + " sacf 512\n" \ + "0: mvc 0(8,4),0(2)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err) \ + : "m" (*(__u64*)(ptr)), "m" (x), "K" (-EFAULT) \ + : "cc", "2", "4" ); \ +}) + +#else /* __s390x__ */ + +#define __put_user_asm_8(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 4,%1\n" \ + " sacf 512\n" \ + "0: stg %2,0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err) \ + : "m" (*(__u64*)(ptr)), "d" (x), "K" (-EFAULT) \ + : "cc", "4" ); \ +}) + +#endif /* __s390x__ */ + +#define __put_user_asm_4(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 4,%1\n" \ + " sacf 512\n" \ + "0: st %2,0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err) \ + : "m" (*(__u32*)(ptr)), "d" (x), "K" (-EFAULT) \ + : "cc", "4" ); \ +}) + +#define __put_user_asm_2(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 4,%1\n" \ + " sacf 512\n" \ + "0: sth %2,0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err) \ + : "m" (*(__u16*)(ptr)), "d" (x), "K" (-EFAULT) \ + : "cc", "4" ); \ +}) + +#define __put_user_asm_1(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 4,%1\n" \ + " sacf 512\n" \ + "0: stc %2,0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err) \ + : "m" (*(__u8*)(ptr)), "d" (x), "K" (-EFAULT) \ + : "cc", "4" ); \ +}) + +#define __put_user(x, ptr) \ +({ \ + __typeof__(*(ptr)) __x = (x); \ + int __pu_err; \ + switch (sizeof (*(ptr))) { \ + case 1: \ + __put_user_asm_1(__x, ptr, __pu_err); \ + break; \ + case 2: \ + __put_user_asm_2(__x, ptr, __pu_err); \ + break; \ + case 4: \ + __put_user_asm_4(__x, ptr, __pu_err); \ + break; \ + case 8: \ + __put_user_asm_8(__x, ptr, __pu_err); \ + break; \ + default: \ + __pu_err = __put_user_bad(); \ + break; \ + } \ + __pu_err; \ }) #define put_user(x, ptr) __put_user(x, ptr) extern int __put_user_bad(void); -#define __get_user_asm_8(x, ptr, err) \ -({ \ - __asm__ __volatile__ ( " sr %1,%1\n" \ - " la 2,%0\n" \ - " la 4,%2\n" \ - " sacf 512\n" \ - "0: mvc 0(8,2),0(4)\n" \ - " sacf 0\n" \ - "1:\n" \ - ".section .fixup,\"ax\"\n" \ - "2: sacf 0\n" \ - " lhi %1,%h3\n" \ - " bras 4,3f\n" \ - " .long 1b\n" \ - "3: l 4,0(4)\n" \ - " br 4\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 4\n" \ - " .long 0b,2b\n" \ - ".previous" \ - : "=m" (x) , "=&d" (err) \ - : "m" (*(const __u64*)(ptr)),"K" (-EFAULT) \ - : "cc", "2", "4" ); \ -}) - -#define __get_user_asm_4(x, ptr, err) \ -({ \ - __asm__ __volatile__ ( " sr %1,%1\n" \ - " la 4,%2\n" \ - " sacf 512\n" \ - "0: l %0,0(4)\n" \ - " sacf 0\n" \ - "1:\n" \ - ".section .fixup,\"ax\"\n" \ - "2: sacf 0\n" \ - " lhi %1,%h3\n" \ - " bras 4,3f\n" \ - " .long 1b\n" \ - "3: l 4,0(4)\n" \ - " br 4\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 4\n" \ - " .long 0b,2b\n" \ - ".previous" \ - : "=d" (x) , "=&d" (err) \ - : "m" (*(const __u32*)(ptr)),"K" (-EFAULT) \ - : "cc", "4" ); \ -}) - -#define __get_user_asm_2(x, ptr, err) \ -({ \ - __asm__ __volatile__ ( " sr %1,%1\n" \ - " la 4,%2\n" \ - " sacf 512\n" \ - "0: lh %0,0(4)\n" \ - " sacf 0\n" \ - "1:\n" \ - ".section .fixup,\"ax\"\n" \ - "2: sacf 0\n" \ - " lhi %1,%h3\n" \ - " bras 4,3f\n" \ - " .long 1b\n" \ - "3: l 4,0(4)\n" \ - " br 4\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 4\n" \ - " .long 0b,2b\n" \ - ".previous" \ - : "=d" (x) , "=&d" (err) \ - : "m" (*(const __u16*)(ptr)),"K" (-EFAULT) \ - : "cc", "4" ); \ -}) - -#define __get_user_asm_1(x, ptr, err) \ -({ \ - __asm__ __volatile__ ( " sr %1,%1\n" \ - " la 4,%2\n" \ - " sr %0,%0\n" \ - " sacf 512\n" \ - "0: ic %0,0(4)\n" \ - " sacf 0\n" \ - "1:\n" \ - ".section .fixup,\"ax\"\n" \ - "2: sacf 0\n" \ - " lhi %1,%h3\n" \ - " bras 4,3f\n" \ - " .long 1b\n" \ - "3: l 4,0(4)\n" \ - " br 4\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 4\n" \ - " .long 0b,2b\n" \ - ".previous" \ - : "=d" (x) , "=&d" (err) \ - : "m" (*(const __u8*)(ptr)),"K" (-EFAULT) \ - : "cc", "4" ); \ -}) +#ifndef __s390x__ -#define __get_user(x, ptr) \ -({ \ - __typeof__(*(ptr)) __x; \ - int __gu_err; \ - switch (sizeof(*(ptr))) { \ - case 1: \ - __get_user_asm_1(__x, ptr, __gu_err); \ - break; \ - case 2: \ - __get_user_asm_2(__x, ptr, __gu_err); \ - break; \ - case 4: \ - __get_user_asm_4(__x, ptr, __gu_err); \ - break; \ - case 8: \ - __get_user_asm_8(__x, ptr, __gu_err); \ - break; \ - default: \ - __x = 0; \ - __gu_err = __get_user_bad(); \ - break; \ - } \ - (x) = __x; \ - __gu_err; \ +#define __get_user_asm_8(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 2,%1\n" \ + " la 4,%2\n" \ + " sacf 512\n" \ + "0: mvc 0(8,2),0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err), "=m" (x) \ + : "m" (*(const __u64*)(ptr)),"K" (-EFAULT) \ + : "cc", "2", "4" ); \ +}) + +#else /* __s390x__ */ + +#define __get_user_asm_8(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 4,%2\n" \ + " sacf 512\n" \ + "0: lg %1,0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err), "=d" (x) \ + : "m" (*(const __u64*)(ptr)),"K" (-EFAULT) \ + : "cc", "4" ); \ +}) + +#endif /* __s390x__ */ + + +#define __get_user_asm_4(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 4,%2\n" \ + " sacf 512\n" \ + "0: l %1,0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err), "=d" (x) \ + : "m" (*(const __u32*)(ptr)),"K" (-EFAULT) \ + : "cc", "4" ); \ +}) + +#define __get_user_asm_2(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 4,%2\n" \ + " sacf 512\n" \ + "0: lh %1,0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err), "=d" (x) \ + : "m" (*(const __u16*)(ptr)),"K" (-EFAULT) \ + : "cc", "4" ); \ +}) + +#define __get_user_asm_1(x, ptr, err) \ +({ \ + __asm__ __volatile__ ( \ + " sr %0,%0\n" \ + " la 4,%2\n" \ + " sr %1,%1\n" \ + " sacf 512\n" \ + "0: ic %1,0(4)\n" \ + " sacf 0\n" \ + "1:\n" \ + __uaccess_fixup \ + : "=&d" (err), "=d" (x) \ + : "m" (*(const __u8*)(ptr)),"K" (-EFAULT) \ + : "cc", "4" ); \ +}) + +#define __get_user(x, ptr) \ +({ \ + __typeof__(*(ptr)) __x; \ + int __gu_err; \ + switch (sizeof(*(ptr))) { \ + case 1: \ + __get_user_asm_1(__x, ptr, __gu_err); \ + break; \ + case 2: \ + __get_user_asm_2(__x, ptr, __gu_err); \ + break; \ + case 4: \ + __get_user_asm_4(__x, ptr, __gu_err); \ + break; \ + case 8: \ + __get_user_asm_8(__x, ptr, __gu_err); \ + break; \ + default: \ + __x = 0; \ + __gu_err = __get_user_bad(); \ + break; \ + } \ + (x) = __x; \ + __gu_err; \ }) #define get_user(x, ptr) __get_user(x, ptr) @@ -357,7 +334,8 @@ extern int __get_user_bad(void); /* - * access register are set up, that 4 points to secondary (user) , 2 to primary (kernel) + * access register are set up, that 4 points to secondary (user), + * 2 to primary (kernel) */ extern long __copy_to_user_asm(const void *from, long n, const void *to); @@ -402,42 +380,81 @@ * Copy a null terminated string from userspace. */ +#ifndef __s390x__ + static inline long __strncpy_from_user(char *dst, const char *src, long count) { int len; - __asm__ __volatile__ ( " slr %0,%0\n" - " lr 2,%1\n" - " lr 4,%2\n" - " slr 3,3\n" - " sacf 512\n" - "0: ic 3,0(%0,4)\n" - "1: stc 3,0(%0,2)\n" - " ltr 3,3\n" - " jz 2f\n" - " ahi %0,1\n" - " clr %0,%3\n" - " jl 0b\n" - "2: sacf 0\n" - ".section .fixup,\"ax\"\n" - "3: lhi %0,%h4\n" - " basr 3,0\n" - " l 3,4f-.(3)\n" - " br 3\n" - "4: .long 2b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 0b,3b\n" - " .long 1b,3b\n" - ".previous" - : "=&a" (len) - : "a" (dst), "d" (src), "d" (count), - "K" (-EFAULT) - : "2", "3", "4", "memory", "cc" ); - return len; + __asm__ __volatile__ ( + " slr %0,%0\n" + " lr 2,%1\n" + " lr 4,%2\n" + " slr 3,3\n" + " sacf 512\n" + "0: ic 3,0(%0,4)\n" + "1: stc 3,0(%0,2)\n" + " ltr 3,3\n" + " jz 2f\n" + " ahi %0,1\n" + " clr %0,%3\n" + " jl 0b\n" + "2: sacf 0\n" + ".section .fixup,\"ax\"\n" + "3: lhi %0,%h4\n" + " basr 3,0\n" + " l 3,4f-.(3)\n" + " br 3\n" + "4: .long 2b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 4\n" + " .long 0b,3b\n" + " .long 1b,3b\n" + ".previous" + : "=&a" (len) + : "a" (dst), "d" (src), "d" (count), "K" (-EFAULT) + : "2", "3", "4", "memory", "cc" ); + return len; } +#else /* __s390x__ */ + +static inline long +__strncpy_from_user(char *dst, const char *src, long count) +{ + long len; + __asm__ __volatile__ ( + " slgr %0,%0\n" + " lgr 2,%1\n" + " lgr 4,%2\n" + " slr 3,3\n" + " sacf 512\n" + "0: ic 3,0(%0,4)\n" + "1: stc 3,0(%0,2)\n" + " ltr 3,3\n" + " jz 2f\n" + " aghi %0,1\n" + " cgr %0,%3\n" + " jl 0b\n" + "2: sacf 0\n" + ".section .fixup,\"ax\"\n" + "3: lghi %0,%h4\n" + " jg 2b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 8\n" + " .quad 0b,3b\n" + " .quad 1b,3b\n" + ".previous" + : "=&a" (len) + : "a" (dst), "d" (src), "d" (count), "K" (-EFAULT) + : "cc", "2" ,"3", "4" ); + return len; +} + +#endif /* __s390x__ */ + static inline long strncpy_from_user(char *dst, const char *src, long count) { @@ -453,35 +470,92 @@ * * Return 0 for error */ +#ifndef __s390x__ + +static inline unsigned long +strnlen_user(const char * src, unsigned long n) +{ + __asm__ __volatile__ ( + " alr %0,%1\n" + " slr 0,0\n" + " lr 4,%1\n" + " sacf 512\n" + "0: srst %0,4\n" + " jo 0b\n" + " slr %0,%1\n" + " ahi %0,1\n" + " sacf 0\n" + "1:\n" + ".section .fixup,\"ax\"\n" + "2: sacf 0\n" + " slr %0,%0\n" + " bras 4,3f\n" + " .long 1b\n" + "3: l 4,0(4)\n" + " br 4\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 4\n" + " .long 0b,2b\n" + ".previous" + : "+&a" (n) : "d" (src) + : "cc", "0", "4" ); + return n; +} + +#else /* __s390x__ */ + static inline unsigned long strnlen_user(const char * src, unsigned long n) { - __asm__ __volatile__ (" alr %0,%1\n" - " slr 0,0\n" - " lr 4,%1\n" - " sacf 512\n" - "0: srst %0,4\n" - " jo 0b\n" - " slr %0,%1\n" - " ahi %0,1\n" - " sacf 0\n" - "1:\n" - ".section .fixup,\"ax\"\n" - "2: sacf 0\n" - " slr %0,%0\n" - " bras 4,3f\n" - " .long 1b\n" - "3: l 4,0(4)\n" - " br 4\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 0b,2b\n" - ".previous" - : "+&a" (n) : "d" (src) - : "cc", "0", "4" ); - return n; +#if 0 + __asm__ __volatile__ ( + " algr %0,%1\n" + " slgr 0,0\n" + " lgr 4,%1\n" + " sacf 512\n" + "0: srst %0,4\n" + " jo 0b\n" + " slgr %0,%1\n" + " aghi %0,1\n" + "1: sacf 0\n" + ".section .fixup,\"ax\"\n" + "2: slgr %0,%0\n" + " jg 1b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 8\n" + " .quad 0b,2b\n" + ".previous" + : "+&a" (n) : "d" (src) + : "cc", "0", "4" ); +#else + __asm__ __volatile__ ( + " lgr 4,%1\n" + " sacf 512\n" + "0: cli 0(4),0x00\n" + " la 4,1(4)\n" + " je 1f\n" + " brctg %0,0b\n" + "1: lgr %0,4\n" + " slgr %0,%1\n" + "2: sacf 0\n" + ".section .fixup,\"ax\"\n" + "3: slgr %0,%0\n" + " jg 2b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 8\n" + " .quad 0b,3b\n" + ".previous" + : "+&a" (n) : "d" (src) + : "cc", "4" ); +#endif + return n; } + +#endif /* __s390x__ */ + #define strlen_user(str) strnlen_user(str, ~0UL) /* @@ -490,18 +564,18 @@ extern long __clear_user_asm(void *to, long n); -#define __clear_user(to, n) \ -({ \ - __clear_user_asm(to, n); \ +#define __clear_user(to, n) \ +({ \ + __clear_user_asm(to, n); \ }) static inline unsigned long clear_user(void *to, unsigned long n) { - if (access_ok(VERIFY_WRITE, to, n)) - n = __clear_user(to, n); - return n; + if (access_ok(VERIFY_WRITE, to, n)) + n = __clear_user(to, n); + return n; } -#endif /* _S390_UACCESS_H */ +#endif /* _S390_UACCESS_H */ diff -urN linux-2.5.67/include/asm-s390/unistd.h linux-2.5.67-s390/include/asm-s390/unistd.h --- linux-2.5.67/include/asm-s390/unistd.h Mon Apr 14 19:11:50 2003 +++ linux-2.5.67-s390/include/asm-s390/unistd.h Mon Apr 14 19:11:59 2003 @@ -261,6 +261,91 @@ #define NR_syscalls 263 +/* + * 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). + */ +#ifdef __s390x__ +#undef __NR_time +#undef __NR_lchown +#undef __NR_setuid +#undef __NR_getuid +#undef __NR_stime +#undef __NR_setgid +#undef __NR_getgid +#undef __NR_geteuid +#undef __NR_getegid +#undef __NR_setreuid +#undef __NR_setregid +#undef __NR_getrlimit +#undef __NR_getgroups +#undef __NR_setgroups +#undef __NR_fchown +#undef __NR_ioperm +#undef __NR_setfsuid +#undef __NR_setfsgid +#undef __NR__llseek +#undef __NR__newselect +#undef __NR_setresuid +#undef __NR_getresuid +#undef __NR_setresgid +#undef __NR_getresgid +#undef __NR_chown +#undef __NR_ugetrlimit +#undef __NR_mmap2 +#undef __NR_truncate64 +#undef __NR_ftruncate64 +#undef __NR_stat64 +#undef __NR_lstat64 +#undef __NR_fstat64 +#undef __NR_lchown32 +#undef __NR_getuid32 +#undef __NR_getgid32 +#undef __NR_geteuid32 +#undef __NR_getegid32 +#undef __NR_setreuid32 +#undef __NR_setregid32 +#undef __NR_getgroups32 +#undef __NR_setgroups32 +#undef __NR_fchown32 +#undef __NR_setresuid32 +#undef __NR_getresuid32 +#undef __NR_setresgid32 +#undef __NR_getresgid32 +#undef __NR_chown32 +#undef __NR_setuid32 +#undef __NR_setgid32 +#undef __NR_setfsuid32 +#undef __NR_setfsgid32 +#undef __NR_getdents64 +#undef __NR_fcntl64 +#undef __NR_sendfile64 + +#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 + +#endif + /* user-visible error numbers are in the range -1 - -122: see <asm-s390/errno.h> */ #define __syscall_return(type, res) \ @@ -279,10 +364,10 @@ register long __svcres asm("2"); \ long __res; \ __asm__ __volatile__ ( \ - " .if %b1 < 256\n" \ + " .if %1 < 256\n" \ " svc %b1\n" \ " .else\n" \ - " lhi %%r1,%b1\n" \ + " la %%r1,%1\n" \ " svc 0\n" \ " .endif" \ : "=d" (__svcres) \ @@ -298,10 +383,10 @@ register long __svcres asm("2"); \ long __res; \ __asm__ __volatile__ ( \ - " .if %b1 < 256\n" \ + " .if %1 < 256\n" \ " svc %b1\n" \ " .else\n" \ - " lhi %%r1,%b1\n" \ + " la %%r1,%1\n" \ " svc 0\n" \ " .endif" \ : "=d" (__svcres) \ @@ -319,10 +404,10 @@ register long __svcres asm("2"); \ long __res; \ __asm__ __volatile__ ( \ - " .if %b1 < 256\n" \ + " .if %1 < 256\n" \ " svc %b1\n" \ " .else\n" \ - " lhi %%r1,%b1\n" \ + " la %%r1,%1\n" \ " svc 0\n" \ " .endif" \ : "=d" (__svcres) \ @@ -342,10 +427,10 @@ register long __svcres asm("2"); \ long __res; \ __asm__ __volatile__ ( \ - " .if %b1 < 256\n" \ + " .if %1 < 256\n" \ " svc %b1\n" \ " .else\n" \ - " lhi %%r1,%b1\n" \ + " la %%r1,%1\n" \ " svc 0\n" \ " .endif" \ : "=d" (__svcres) \ @@ -368,10 +453,10 @@ register long __svcres asm("2"); \ long __res; \ __asm__ __volatile__ ( \ - " .if %b1 < 256\n" \ + " .if %1 < 256\n" \ " svc %b1\n" \ " .else\n" \ - " lhi %%r1,%b1\n" \ + " la %%r1,%1\n" \ " svc 0\n" \ " .endif" \ : "=d" (__svcres) \ @@ -397,10 +482,10 @@ register long __svcres asm("2"); \ long __res; \ __asm__ __volatile__ ( \ - " .if %b1 < 256\n" \ + " .if %1 < 256\n" \ " svc %b1\n" \ " .else\n" \ - " lhi %%r1,%b1\n" \ + " la %%r1,%1\n" \ " svc 0\n" \ " .endif" \ : "=d" (__svcres) \ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |