[PATCH] s390 (16/16): s390/s390x unification - part 7.

From: Martin Schwidefsky (schwidefsky@de.ibm.com)
Date: Mon Apr 14 2003 - 12:56:19 EST


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/



This archive was generated by hypermail 2b29 : Tue Apr 15 2003 - 22:00:32 EST