* [PATCH] s390: core changes.
@ 2004-06-30 17:07 Martin Schwidefsky
0 siblings, 0 replies; 5+ messages in thread
From: Martin Schwidefsky @ 2004-06-30 17:07 UTC (permalink / raw)
To: akpm, linux-kernel
[PATCH] s390: core changes.
From: Arnd Bergmann <arndb@de.ibm.com>
From: Christian Bornträger <cborntra@de.ibm.com>
From: Michael Holzheu <holzheu@de.ibm.com>
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
s390 core changes:
- Fix cpu_idle loop if /proc/sys/kernel/hz_timer is set.
- Store correct trap indication on 64 bit for call to do_debugger_trap
in the single stepped svc code.
- Avoid the use of alloca in the debug feature.
- Remove extraneous includes of linux/version.h.
- Regenerate default configuration.
- Mention eServer z890 in Kconfig help text.
- Prevent gcc 3.4 from removing statically defined per cpu variables.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
diffstat:
arch/s390/Kconfig | 6 +-
arch/s390/defconfig | 19 +++++--
arch/s390/kernel/debug.c | 120 ++++++++++++++++++++++++---------------------
arch/s390/kernel/entry64.S | 3 -
arch/s390/kernel/time.c | 11 +---
include/asm-s390/debug.h | 1
include/asm-s390/percpu.h | 68 ++++++++++++++++++++-----
include/asm-s390/vtoc.h | 1
8 files changed, 144 insertions(+), 85 deletions(-)
diff -urN linux-2.6/arch/s390/Kconfig linux-2.6-s390/arch/s390/Kconfig
--- linux-2.6/arch/s390/Kconfig Wed Jun 16 07:19:13 2004
+++ linux-2.6-s390/arch/s390/Kconfig Wed Jun 30 17:06:34 2004
@@ -67,9 +67,9 @@
on older 31 bit only CPUs.
config MARCH_Z990
- bool "IBM eServer zSeries model z990"
+ bool "IBM eServer zSeries model z890 and z990"
help
- Select this enable optimizations for model z990.
+ Select this enable optimizations for model z890/z990.
This will be slightly faster but does not work on
older machines such as the z900.
@@ -154,7 +154,7 @@
tristate "QDIO support"
---help---
This driver provides the Queued Direct I/O base support for the
- IBM S/390 (G5 and G6) and eServer zSeries (z800, z900 and z990).
+ IBM S/390 (G5 and G6) and eServer zSeries (z800, z890, z900 and z990).
For details please refer to the documentation provided by IBM at
<http://www10.software.ibm.com/developerworks/opensource/linux390>
diff -urN linux-2.6/arch/s390/defconfig linux-2.6-s390/arch/s390/defconfig
--- linux-2.6/arch/s390/defconfig Wed Jun 30 17:06:11 2004
+++ linux-2.6-s390/arch/s390/defconfig Wed Jun 30 17:06:34 2004
@@ -29,6 +29,7 @@
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y
@@ -45,6 +46,7 @@
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
#
# Base setup
@@ -84,12 +86,14 @@
# CONFIG_SHARED_KERNEL is not set
# CONFIG_CMM is not set
# CONFIG_VIRT_TIMER is not set
-# CONFIG_NO_IDLE_HZ is not set
+CONFIG_NO_IDLE_HZ=y
+CONFIG_NO_IDLE_HZ_INIT=y
# CONFIG_PCMCIA is not set
#
# Generic Driver Options
#
+CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set
# CONFIG_DEBUG_DRIVER is not set
@@ -126,7 +130,6 @@
# SCSI low-level drivers
#
# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_SATA is not set
# CONFIG_SCSI_EATA_PIO is not set
# CONFIG_SCSI_DEBUG is not set
@@ -277,6 +280,7 @@
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
# CONFIG_NET_SCH_DELAY is not set
+# CONFIG_NET_SCH_INGRESS is not set
CONFIG_NET_QOS=y
CONFIG_NET_ESTIMATOR=y
CONFIG_NET_CLS=y
@@ -285,8 +289,11 @@
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
+# CONFIG_CLS_U32_PERF is not set
+# CONFIG_NET_CLS_IND is not set
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
+# CONFIG_NET_CLS_ACT is not set
CONFIG_NET_CLS_POLICE=y
#
@@ -311,7 +318,11 @@
# CONFIG_MII is not set
#
-# Gigabit Ethernet (1000/10000 Mbit)
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
#
#
@@ -450,7 +461,6 @@
# CONFIG_SOLARIS_X86_PARTITION is not set
# CONFIG_UNIXWARE_DISKLABEL is not set
# CONFIG_LDM_PARTITION is not set
-# CONFIG_NEC98_PARTITION is not set
# CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set
@@ -509,5 +519,6 @@
#
# Library routines
#
+# CONFIG_CRC16 is not set
# CONFIG_CRC32 is not set
# CONFIG_LIBCRC32C is not set
diff -urN linux-2.6/arch/s390/kernel/debug.c linux-2.6-s390/arch/s390/kernel/debug.c
--- linux-2.6/arch/s390/kernel/debug.c Wed Jun 16 07:18:58 2004
+++ linux-2.6-s390/arch/s390/kernel/debug.c Wed Jun 30 17:06:34 2004
@@ -54,7 +54,7 @@
*
*/
long args[0];
-} debug_sprintf_entry;
+} debug_sprintf_entry_t;
extern void tod_to_timeval(uint64_t todval, struct timeval *xtime);
@@ -88,7 +88,7 @@
int area, debug_entry_t * entry, char *out_buf);
static int debug_sprintf_format_fn(debug_info_t * id, struct debug_view *view,
- char *out_buf, debug_sprintf_entry *curr_event);
+ char *out_buf, debug_sprintf_entry_t *curr_event);
/* globals */
@@ -692,31 +692,21 @@
}
/*
- * debug_common:
+ * debug_finish_entry:
* - set timestamp, caller address, cpu number etc.
*/
-extern inline debug_entry_t *debug_common(debug_info_t * id, int level,
- const void *buf, int len, int exception)
+extern inline void debug_finish_entry(debug_info_t * id, debug_entry_t* active,
+ int level, int exception)
{
- unsigned long flags;
- debug_entry_t *active;
-
- spin_lock_irqsave(&id->lock, flags);
- active = get_active_entry(id);
STCK(active->id.stck);
active->id.fields.cpuid = smp_processor_id();
active->caller = __builtin_return_address(0);
active->id.fields.exception = exception;
active->id.fields.level = level;
- memset(DEBUG_DATA(active), 0, id->buf_size);
- memcpy(DEBUG_DATA(active), buf, MIN(len, id->buf_size));
proceed_active_entry(id);
if(exception)
proceed_active_area(id);
- spin_unlock_irqrestore(&id->lock, flags);
-
- return active;
}
/*
@@ -727,7 +717,17 @@
debug_entry_t *debug_event_common(debug_info_t * id, int level, const void *buf,
int len)
{
- return debug_common(id, level, buf, len, 0);
+ unsigned long flags;
+ debug_entry_t *active;
+
+ spin_lock_irqsave(&id->lock, flags);
+ active = get_active_entry(id);
+ memset(DEBUG_DATA(active), 0, id->buf_size);
+ memcpy(DEBUG_DATA(active), buf, MIN(len, id->buf_size));
+ debug_finish_entry(id, active, level, 0);
+ spin_unlock_irqrestore(&id->lock, flags);
+
+ return active;
}
/*
@@ -738,7 +738,17 @@
debug_entry_t *debug_exception_common(debug_info_t * id, int level,
const void *buf, int len)
{
- return debug_common(id, level, buf, len, 1);
+ unsigned long flags;
+ debug_entry_t *active;
+
+ spin_lock_irqsave(&id->lock, flags);
+ active = get_active_entry(id);
+ memset(DEBUG_DATA(active), 0, id->buf_size);
+ memcpy(DEBUG_DATA(active), buf, MIN(len, id->buf_size));
+ debug_finish_entry(id, active, level, 1);
+ spin_unlock_irqrestore(&id->lock, flags);
+
+ return active;
}
/*
@@ -764,27 +774,28 @@
int level,char *string,...)
{
va_list ap;
- int numargs,alloc_size,idx;
- debug_sprintf_entry *curr_event;
- debug_entry_t *retval = NULL;
+ int numargs,idx;
+ unsigned long flags;
+ debug_sprintf_entry_t *curr_event;
+ debug_entry_t *active;
if((!id) || (level > id->level))
return NULL;
- else {
- numargs=debug_count_numargs(string);
- alloc_size=offsetof(debug_sprintf_entry,args[numargs]);
- curr_event=alloca(alloc_size);
-
- if(curr_event){
- va_start(ap,string);
- curr_event->string=string;
- for(idx=0;idx<numargs;idx++)
- curr_event->args[idx]=va_arg(ap,long);
- retval=debug_common(id,level, curr_event,alloc_size,0);
- va_end(ap);
- }
- return retval;
- }
+
+ numargs=debug_count_numargs(string);
+
+ spin_lock_irqsave(&id->lock, flags);
+ active = get_active_entry(id);
+ curr_event=(debug_sprintf_entry_t *) DEBUG_DATA(active);
+ va_start(ap,string);
+ curr_event->string=string;
+ for(idx=0;idx<MIN(numargs,((id->buf_size / sizeof(long))-1));idx++)
+ curr_event->args[idx]=va_arg(ap,long);
+ va_end(ap);
+ debug_finish_entry(id, active, level, 0);
+ spin_unlock_irqrestore(&id->lock, flags);
+
+ return active;
}
/*
@@ -795,27 +806,28 @@
int level,char *string,...)
{
va_list ap;
- int numargs,alloc_size,idx;
- debug_sprintf_entry *curr_event;
- debug_entry_t *retval = NULL;
+ int numargs,idx;
+ unsigned long flags;
+ debug_sprintf_entry_t *curr_event;
+ debug_entry_t *active;
if((!id) || (level > id->level))
return NULL;
- else {
- numargs=debug_count_numargs(string);
- alloc_size=offsetof(debug_sprintf_entry,args[numargs]);
- curr_event=alloca(alloc_size);
-
- if(curr_event){
- va_start(ap,string);
- curr_event->string=string;
- for(idx=0;idx<numargs;idx++)
- curr_event->args[idx]=va_arg(ap,long);
- retval=debug_common(id,level, curr_event,alloc_size,1);
- va_end(ap);
- }
- return retval;
- }
+
+ numargs=debug_count_numargs(string);
+
+ spin_lock_irqsave(&id->lock, flags);
+ active = get_active_entry(id);
+ curr_event=(debug_sprintf_entry_t *)DEBUG_DATA(active);
+ va_start(ap,string);
+ curr_event->string=string;
+ for(idx=0;idx<MIN(numargs,((id->buf_size / sizeof(long))-1));idx++)
+ curr_event->args[idx]=va_arg(ap,long);
+ va_end(ap);
+ debug_finish_entry(id, active, level, 1);
+ spin_unlock_irqrestore(&id->lock, flags);
+
+ return active;
}
/*
@@ -1127,7 +1139,7 @@
#define DEBUG_SPRINTF_MAX_ARGS 10
int debug_sprintf_format_fn(debug_info_t * id, struct debug_view *view,
- char *out_buf, debug_sprintf_entry *curr_event)
+ char *out_buf, debug_sprintf_entry_t *curr_event)
{
int num_longs, num_used_args = 0,i, rc = 0;
int index[DEBUG_SPRINTF_MAX_ARGS];
diff -urN linux-2.6/arch/s390/kernel/entry64.S linux-2.6-s390/arch/s390/kernel/entry64.S
--- linux-2.6/arch/s390/kernel/entry64.S Wed Jun 16 07:19:01 2004
+++ linux-2.6-s390/arch/s390/kernel/entry64.S Wed Jun 30 17:06:34 2004
@@ -305,7 +305,8 @@
#
sysc_singlestep:
ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP
- mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check
+ lhi %r0,__LC_PGM_OLD_PSW
+ sth %r0,SP_TRAP(%r15) # set trap indication to pgm check
la %r2,SP_PTREGS(%r15) # address of register-save area
larl %r14,sysc_return # load adr. of system return
jg do_debugger_trap # branch to do_debugger_trap
diff -urN linux-2.6/arch/s390/kernel/time.c linux-2.6-s390/arch/s390/kernel/time.c
--- linux-2.6/arch/s390/kernel/time.c Wed Jun 16 07:18:38 2004
+++ linux-2.6-s390/arch/s390/kernel/time.c Wed Jun 30 17:06:34 2004
@@ -518,19 +518,19 @@
* Stop the HZ tick on the current CPU.
* Only cpu_idle may call this function.
*/
-int stop_hz_timer(void)
+void stop_hz_timer(void)
{
__u64 timer;
if (sysctl_hz_timer != 0)
- return 1;
+ return;
/*
* Leave the clock comparator set up for the next timer
* tick if either rcu or a softirq is pending.
*/
if (rcu_pending(smp_processor_id()) || local_softirq_pending())
- return 1;
+ return;
/*
* This cpu is going really idle. Set up the clock comparator
@@ -540,8 +540,6 @@
timer = (__u64) (next_timer_interrupt() - jiffies) + jiffies_64;
timer = jiffies_timer_cc + timer * CLK_TICKS_PER_JIFFY;
asm volatile ("SCKC %0" : : "m" (timer));
-
- return 0;
}
#endif
@@ -572,8 +570,7 @@
#endif
#ifdef CONFIG_NO_IDLE_HZ
- if (stop_hz_timer())
- return 1;
+ stop_hz_timer();
#endif
/* enable monitor call class 0 */
diff -urN linux-2.6/include/asm-s390/debug.h linux-2.6-s390/include/asm-s390/debug.h
--- linux-2.6/include/asm-s390/debug.h Wed Jun 16 07:19:23 2004
+++ linux-2.6-s390/include/asm-s390/debug.h Wed Jun 30 17:06:34 2004
@@ -34,7 +34,6 @@
#define __DEBUG_FEATURE_VERSION 1 /* version of debug feature */
#ifdef __KERNEL__
-#include <linux/version.h>
#include <linux/spinlock.h>
#include <linux/kernel.h>
#include <linux/time.h>
diff -urN linux-2.6/include/asm-s390/percpu.h linux-2.6-s390/include/asm-s390/percpu.h
--- linux-2.6/include/asm-s390/percpu.h Wed Jun 16 07:20:04 2004
+++ linux-2.6-s390/include/asm-s390/percpu.h Wed Jun 30 17:06:34 2004
@@ -1,30 +1,70 @@
#ifndef __ARCH_S390_PERCPU__
#define __ARCH_S390_PERCPU__
-#include <asm-generic/percpu.h>
+#include <linux/compiler.h>
#include <asm/lowcore.h>
+#define __GENERIC_PER_CPU
+
/*
- * For builtin kernel code s390 uses the generic implementation for
- * per cpu data, with the exception that the offset of the cpu local
- * data area is cached in the cpu's lowcore memory
+ * s390 uses its own implementation for per cpu data, the offset of
+ * the cpu local data area is cached in the cpu's lowcore memory.
* For 64 bit module code s390 forces the use of a GOT slot for the
* address of the per cpu variable. This is needed because the module
* may be more than 4G above the per cpu area.
*/
#if defined(__s390x__) && defined(MODULE)
-#define __get_got_cpu_var(var,offset) \
+
+#define __reloc_hide(var,offset) \
(*({ unsigned long *__ptr; \
- asm ( "larl %0,per_cpu__"#var"@GOTENT" : "=a" (__ptr) ); \
- ((typeof(&per_cpu__##var))((*__ptr) + offset)); \
- }))
-#undef __get_cpu_var
-#define __get_cpu_var(var) __get_got_cpu_var(var,S390_lowcore.percpu_offset)
-#undef per_cpu
-#define per_cpu(var,cpu) __get_got_cpu_var(var,__per_cpu_offset[cpu])
+ asm ( "larl %0,per_cpu__"#var"@GOTENT" \
+ : "=a" (__ptr) : "X" (per_cpu__##var) ); \
+ (typeof(&per_cpu__##var))((*__ptr) + (offset)); }))
+
#else
-#undef __get_cpu_var
-#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, S390_lowcore.percpu_offset))
+
+#define __reloc_hide(var, offset) \
+ (*({ unsigned long __ptr; \
+ asm ( "" : "=a" (__ptr) : "0" (&per_cpu__##var) ); \
+ (typeof(&per_cpu__##var)) (__ptr + (offset)); }))
+
#endif
+#ifdef CONFIG_SMP
+
+extern unsigned long __per_cpu_offset[NR_CPUS];
+
+/* Separate out the type, so (int[3], foo) works. */
+#define DEFINE_PER_CPU(type, name) \
+ __attribute__((__section__(".data.percpu"))) \
+ __typeof__(type) per_cpu__##name
+
+#define __get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset)
+#define per_cpu(var,cpu) __reloc_hide(var,__per_cpu_offset[cpu])
+
+/* A macro to avoid #include hell... */
+#define percpu_modcopy(pcpudst, src, size) \
+do { \
+ unsigned int __i; \
+ for (__i = 0; __i < NR_CPUS; __i++) \
+ if (cpu_possible(__i)) \
+ memcpy((pcpudst)+__per_cpu_offset[__i], \
+ (src), (size)); \
+} while (0)
+
+#else /* ! SMP */
+
+#define DEFINE_PER_CPU(type, name) \
+ __typeof__(type) per_cpu__##name
+
+#define __get_cpu_var(var) __reloc_hide(var,0)
+#define per_cpu(var,cpu) __reloc_hide(var,0)
+
+#endif /* SMP */
+
+#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
+
+#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
+#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
+
#endif /* __ARCH_S390_PERCPU__ */
diff -urN linux-2.6/include/asm-s390/vtoc.h linux-2.6-s390/include/asm-s390/vtoc.h
--- linux-2.6/include/asm-s390/vtoc.h Wed Jun 16 07:19:37 2004
+++ linux-2.6-s390/include/asm-s390/vtoc.h Wed Jun 30 17:06:34 2004
@@ -14,7 +14,6 @@
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/hdreg.h>
-#include <linux/version.h>
#include <asm/dasd.h>
#endif
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] s390: core changes.
@ 2004-08-05 13:13 Martin Schwidefsky
0 siblings, 0 replies; 5+ messages in thread
From: Martin Schwidefsky @ 2004-08-05 13:13 UTC (permalink / raw)
To: akpm, linux-kernel
[PATCH] s390: core changes.
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
s390 core changes:
- Add 32 bit compat code for ptrace requests PTRACE_GETEVENTMSG,
PTRACE_GETSIGINFO and PTRACE_SETSIGINFO.
- Make non-smp kernel compile.
- Regenerate default configuration.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
diffstat:
arch/s390/appldata/appldata_base.c | 1
arch/s390/defconfig | 4 +--
arch/s390/kernel/compat_linux.h | 3 ++
arch/s390/kernel/compat_signal.c | 47 +++++++++++++++++++++++++++++++++++++
arch/s390/kernel/ptrace.c | 13 ++++++++++
arch/s390/mm/cmm.c | 1
drivers/s390/net/iucv.c | 7 +++--
7 files changed, 71 insertions(+), 5 deletions(-)
diff -urN linux-2.6/arch/s390/appldata/appldata_base.c linux-2.6-s390/arch/s390/appldata/appldata_base.c
--- linux-2.6/arch/s390/appldata/appldata_base.c Thu Aug 5 14:20:32 2004
+++ linux-2.6-s390/arch/s390/appldata/appldata_base.c Thu Aug 5 14:20:57 2004
@@ -17,6 +17,7 @@
#include <linux/errno.h>
#include <asm/uaccess.h>
#include <asm/io.h>
+#include <asm/smp.h>
#include <linux/interrupt.h>
#include <linux/proc_fs.h>
#include <linux/page-flags.h>
diff -urN linux-2.6/arch/s390/defconfig linux-2.6-s390/arch/s390/defconfig
--- linux-2.6/arch/s390/defconfig Thu Aug 5 14:20:32 2004
+++ linux-2.6-s390/arch/s390/defconfig Thu Aug 5 14:20:57 2004
@@ -11,7 +11,6 @@
#
CONFIG_EXPERIMENTAL=y
CONFIG_CLEAN_COMPILE=y
-CONFIG_STANDALONE=y
#
# General setup
@@ -93,6 +92,7 @@
#
# Generic Driver Options
#
+CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set
# CONFIG_DEBUG_DRIVER is not set
@@ -511,7 +511,7 @@
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_AES_GENERIC is not set
# CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_TEA is not set
diff -urN linux-2.6/arch/s390/kernel/compat_linux.h linux-2.6-s390/arch/s390/kernel/compat_linux.h
--- linux-2.6/arch/s390/kernel/compat_linux.h Wed Jun 16 07:19:42 2004
+++ linux-2.6-s390/arch/s390/kernel/compat_linux.h Thu Aug 5 14:20:57 2004
@@ -214,4 +214,7 @@
} _sigev_un;
};
+extern int copy_siginfo_to_user32(siginfo_t32 __user *to, siginfo_t *from);
+extern int copy_siginfo_from_user32(siginfo_t *to, siginfo_t32 __user *from);
+
#endif /* _ASM_S390X_S390_H */
diff -urN linux-2.6/arch/s390/kernel/compat_signal.c linux-2.6-s390/arch/s390/kernel/compat_signal.c
--- linux-2.6/arch/s390/kernel/compat_signal.c Thu Aug 5 14:20:32 2004
+++ linux-2.6-s390/arch/s390/kernel/compat_signal.c Thu Aug 5 14:20:57 2004
@@ -106,6 +106,53 @@
return err;
}
+int copy_siginfo_from_user32(siginfo_t *to, siginfo_t32 __user *from)
+{
+ int err;
+ u32 tmp;
+
+ if (!access_ok (VERIFY_READ, from, sizeof(siginfo_t32)))
+ return -EFAULT;
+
+ err = __get_user(to->si_signo, &from->si_signo);
+ err |= __get_user(to->si_errno, &from->si_errno);
+ err |= __get_user(to->si_code, &from->si_code);
+
+ if (from->si_code < 0)
+ err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
+ else {
+ switch (from->si_code >> 16) {
+ case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
+ case __SI_MESGQ >> 16:
+ err |= __get_user(to->si_int, &from->si_int);
+ /* fallthrough */
+ case __SI_KILL >> 16:
+ err |= __get_user(to->si_pid, &from->si_pid);
+ err |= __get_user(to->si_uid, &from->si_uid);
+ break;
+ case __SI_CHLD >> 16:
+ err |= __get_user(to->si_pid, &from->si_pid);
+ err |= __get_user(to->si_uid, &from->si_uid);
+ err |= __get_user(to->si_utime, &from->si_utime);
+ err |= __get_user(to->si_stime, &from->si_stime);
+ err |= __get_user(to->si_status, &from->si_status);
+ break;
+ case __SI_FAULT >> 16:
+ err |= __get_user(tmp, &from->si_addr);
+ to->si_addr = (void *)(u64) (tmp & PSW32_ADDR_INSN);
+ break;
+ case __SI_POLL >> 16:
+ case __SI_TIMER >> 16:
+ err |= __get_user(to->si_band, &from->si_band);
+ err |= __get_user(to->si_fd, &from->si_fd);
+ break;
+ default:
+ break;
+ }
+ }
+ return err;
+}
+
/*
* Atomically swap in the new signal mask, and wait for a signal.
*/
diff -urN linux-2.6/arch/s390/kernel/ptrace.c linux-2.6-s390/arch/s390/kernel/ptrace.c
--- linux-2.6/arch/s390/kernel/ptrace.c Wed Jun 16 07:19:53 2004
+++ linux-2.6-s390/arch/s390/kernel/ptrace.c Thu Aug 5 14:20:57 2004
@@ -553,6 +553,19 @@
copied += sizeof(unsigned int);
}
return 0;
+ case PTRACE_GETEVENTMSG:
+ return put_user((__u32) child->ptrace_message,
+ (unsigned int __user *) data);
+ case PTRACE_GETSIGINFO:
+ if (child->last_siginfo == NULL)
+ return -EINVAL;
+ return copy_siginfo_to_user32((siginfo_t32 __user *) data,
+ child->last_siginfo);
+ case PTRACE_SETSIGINFO:
+ if (child->last_siginfo == NULL)
+ return -EINVAL;
+ return copy_siginfo_from_user32(child->last_siginfo,
+ (siginfo_t32 __user *) data);
}
return ptrace_request(child, request, addr, data);
}
diff -urN linux-2.6/arch/s390/mm/cmm.c linux-2.6-s390/arch/s390/mm/cmm.c
--- linux-2.6/arch/s390/mm/cmm.c Thu Aug 5 14:20:32 2004
+++ linux-2.6-s390/arch/s390/mm/cmm.c Thu Aug 5 14:20:57 2004
@@ -19,6 +19,7 @@
#include <asm/pgalloc.h>
#include <asm/uaccess.h>
+#include <asm/smp.h>
#include "../../../drivers/s390/net/smsgiucv.h"
diff -urN linux-2.6/drivers/s390/net/iucv.c linux-2.6-s390/drivers/s390/net/iucv.c
--- linux-2.6/drivers/s390/net/iucv.c Thu Aug 5 14:20:39 2004
+++ linux-2.6-s390/drivers/s390/net/iucv.c Thu Aug 5 14:20:57 2004
@@ -1,5 +1,5 @@
/*
- * $Id: iucv.c,v 1.39 2004/07/12 06:54:14 braunu Exp $
+ * $Id: iucv.c,v 1.40 2004/08/04 12:29:33 cborntra Exp $
*
* IUCV network driver
*
@@ -29,7 +29,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
- * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.39 $
+ * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.40 $
*
*/
\f
@@ -53,6 +53,7 @@
#include <asm/io.h>
#include <asm/s390_ext.h>
#include <asm/ebcdic.h>
+#include <asm/smp.h>
#include <asm/ccwdev.h> //for root device stuff
/* FLAGS:
@@ -354,7 +355,7 @@
static void
iucv_banner(void)
{
- char vbuf[] = "$Revision: 1.39 $";
+ char vbuf[] = "$Revision: 1.40 $";
char *version = vbuf;
if ((version = strchr(version, ':'))) {
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] s390: core changes.
@ 2004-08-17 13:51 Martin Schwidefsky
2004-08-17 14:12 ` Christoph Hellwig
0 siblings, 1 reply; 5+ messages in thread
From: Martin Schwidefsky @ 2004-08-17 13:51 UTC (permalink / raw)
To: akpm, linux-kernel
[PATCH] s390: core changes.
From: Jan Glauber <jan.glauber@de.ibm.com>
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
s390 core changes:
- Use copy_siginfo_from_user32 instead of copy_from_user to get the
siginfo structure in sys32_rt_sigqueueinfo.
- Remove prototype for non-existant stop_timers function.
- Regenerate default configuration.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
diffstat:
arch/s390/defconfig | 4 ++--
arch/s390/kernel/compat_linux.c | 3 +--
arch/s390/kernel/vtime.c | 2 +-
include/asm-s390/timer.h | 2 --
4 files changed, 4 insertions(+), 7 deletions(-)
diff -urN linux-2.6/arch/s390/defconfig linux-2.6-s390/arch/s390/defconfig
--- linux-2.6/arch/s390/defconfig Sat Aug 14 12:56:00 2004
+++ linux-2.6-s390/arch/s390/defconfig Tue Aug 17 14:38:19 2004
@@ -419,7 +419,6 @@
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
# CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
@@ -511,11 +510,12 @@
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES_GENERIC is not set
+# CONFIG_CRYPTO_AES is not set
# CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_DEFLATE is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_CRC32C is not set
diff -urN linux-2.6/arch/s390/kernel/compat_linux.c linux-2.6-s390/arch/s390/kernel/compat_linux.c
--- linux-2.6/arch/s390/kernel/compat_linux.c Sat Aug 14 12:55:59 2004
+++ linux-2.6-s390/arch/s390/kernel/compat_linux.c Tue Aug 17 14:38:19 2004
@@ -725,8 +725,7 @@
int ret;
mm_segment_t old_fs = get_fs();
- if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
- copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
+ if (copy_siginfo_from_user32(&info, uinfo))
return -EFAULT;
set_fs (KERNEL_DS);
ret = sys_rt_sigqueueinfo(pid, sig, &info);
diff -urN linux-2.6/arch/s390/kernel/vtime.c linux-2.6-s390/arch/s390/kernel/vtime.c
--- linux-2.6/arch/s390/kernel/vtime.c Sat Aug 14 12:56:22 2004
+++ linux-2.6-s390/arch/s390/kernel/vtime.c Tue Aug 17 14:38:19 2004
@@ -21,7 +21,7 @@
#include <asm/s390_ext.h>
#include <asm/timer.h>
-#define VTIMER_MAGIC (0x4b87ad6e + 1)
+#define VTIMER_MAGIC (TIMER_MAGIC + 1)
static ext_int_info_t ext_int_info_timer;
DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer);
diff -urN linux-2.6/include/asm-s390/timer.h linux-2.6-s390/include/asm-s390/timer.h
--- linux-2.6/include/asm-s390/timer.h Sat Aug 14 12:54:51 2004
+++ linux-2.6-s390/include/asm-s390/timer.h Tue Aug 17 14:38:19 2004
@@ -45,6 +45,4 @@
extern int mod_virt_timer(struct vtimer_list *timer, __u64 expires);
extern int del_virt_timer(struct vtimer_list *timer);
-int stop_timers(void);
-
#endif
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] s390: core changes.
2004-08-17 13:51 [PATCH] s390: core changes Martin Schwidefsky
@ 2004-08-17 14:12 ` Christoph Hellwig
0 siblings, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2004-08-17 14:12 UTC (permalink / raw)
To: Martin Schwidefsky; +Cc: akpm, linux-kernel
Btw, any chance to get some qeth vs ipv6 fixes for mainline? At least
some fixes that the driver actually builds?
Q2: fedora has some s390-relate patches in their tree, did you review them?
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] s390: core changes.
@ 2004-08-30 18:02 Martin Schwidefsky
0 siblings, 0 replies; 5+ messages in thread
From: Martin Schwidefsky @ 2004-08-30 18:02 UTC (permalink / raw)
To: akpm, linux-kernel
[PATCH] s390: core changes.
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
s390 core changes:
- Fix a race condition between kernel thread creation and preemption.
- Fix idal_is_needed for the border case 0x7ffff000.
- Get rid of compiler warnings in compat_signal.c and profile.c.
- Regenerate default configuration.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
diffstat:
arch/s390/defconfig | 11 ++++++++---
arch/s390/kernel/compat_signal.c | 24 +++++++++++++++++-------
arch/s390/kernel/entry.S | 5 ++++-
arch/s390/kernel/entry64.S | 5 ++++-
arch/s390/kernel/process.c | 27 +++------------------------
arch/s390/kernel/profile.c | 1 +
include/asm-s390/idals.h | 2 +-
7 files changed, 38 insertions(+), 37 deletions(-)
diff -urN linux-2.6/arch/s390/defconfig linux-2.6-s390/arch/s390/defconfig
--- linux-2.6/arch/s390/defconfig Mon Aug 30 19:14:07 2004
+++ linux-2.6-s390/arch/s390/defconfig Mon Aug 30 19:14:21 2004
@@ -1,5 +1,7 @@
#
# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.9-rc1
+# Mon Aug 30 19:03:48 2004
#
CONFIG_MMU=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
@@ -130,9 +132,7 @@
#
# SCSI low-level drivers
#
-# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
# CONFIG_SCSI_DEBUG is not set
CONFIG_ZFCP=y
CONFIG_CCW=y
@@ -168,6 +168,7 @@
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
+# CONFIG_MD_RAID10 is not set
CONFIG_MD_RAID5=m
# CONFIG_MD_RAID6 is not set
CONFIG_MD_MULTIPATH=m
@@ -236,11 +237,13 @@
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_TUNNEL is not set
CONFIG_IPV6=y
# CONFIG_IPV6_PRIVACY is not set
# CONFIG_INET6_AH is not set
# CONFIG_INET6_ESP is not set
# CONFIG_INET6_IPCOMP is not set
+# CONFIG_INET6_TUNNEL is not set
# CONFIG_IPV6_TUNNEL is not set
# CONFIG_NETFILTER is not set
CONFIG_XFRM=y
@@ -442,6 +445,7 @@
CONFIG_EXPORTFS=y
CONFIG_SUNRPC=y
# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
# CONFIG_SMB_FS is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
@@ -485,8 +489,8 @@
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_INFO is not set
#
# Security options
@@ -505,6 +509,7 @@
# CONFIG_CRYPTO_SHA1_Z990 is not set
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WHIRLPOOL is not set
# CONFIG_CRYPTO_DES is not set
# CONFIG_CRYPTO_DES_Z990 is not set
# CONFIG_CRYPTO_BLOWFISH is not set
diff -urN linux-2.6/arch/s390/kernel/compat_signal.c linux-2.6-s390/arch/s390/kernel/compat_signal.c
--- linux-2.6/arch/s390/kernel/compat_signal.c Mon Aug 30 19:14:07 2004
+++ linux-2.6-s390/arch/s390/kernel/compat_signal.c Mon Aug 30 19:14:21 2004
@@ -218,14 +218,17 @@
struct old_sigaction32 __user *oact)
{
struct k_sigaction new_ka, old_ka;
+ unsigned long sa_handler, sa_restorer;
int ret;
if (act) {
compat_old_sigset_t mask;
if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
- __get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler) ||
- __get_user((unsigned long)new_ka.sa.sa_restorer, &act->sa_restorer))
+ __get_user(sa_handler, &act->sa_handler) ||
+ __get_user(sa_restorer, &act->sa_restorer))
return -EFAULT;
+ new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
+ new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer;
__get_user(new_ka.sa.sa_flags, &act->sa_flags);
__get_user(mask, &act->sa_mask);
siginitset(&new_ka.sa.sa_mask, mask);
@@ -234,9 +237,11 @@
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
if (!ret && oact) {
+ sa_handler = (unsigned long) old_ka.sa.sa_handler;
+ sa_restorer = (unsigned long) old_ka.sa.sa_restorer;
if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
- __put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler) ||
- __put_user((unsigned long)old_ka.sa.sa_restorer, &oact->sa_restorer))
+ __put_user(sa_handler, &oact->sa_handler) ||
+ __put_user(sa_restorer, &oact->sa_restorer))
return -EFAULT;
__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
@@ -253,6 +258,7 @@
struct sigaction32 __user *oact, size_t sigsetsize)
{
struct k_sigaction new_ka, old_ka;
+ unsigned long sa_handler;
int ret;
compat_sigset_t set32;
@@ -261,7 +267,7 @@
return -EINVAL;
if (act) {
- ret = get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler);
+ ret = get_user(sa_handler, &act->sa_handler);
ret |= __copy_from_user(&set32, &act->sa_mask,
sizeof(compat_sigset_t));
switch (_NSIG_WORDS) {
@@ -278,6 +284,7 @@
if (ret)
return -EFAULT;
+ new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
}
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
@@ -311,17 +318,19 @@
struct pt_regs *regs)
{
stack_t kss, koss;
+ unsigned long ss_sp;
int ret, err = 0;
mm_segment_t old_fs = get_fs();
if (uss) {
if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
return -EFAULT;
- err |= __get_user((unsigned long) kss.ss_sp, &uss->ss_sp);
+ err |= __get_user(ss_sp, &uss->ss_sp);
err |= __get_user(kss.ss_size, &uss->ss_size);
err |= __get_user(kss.ss_flags, &uss->ss_flags);
if (err)
return -EFAULT;
+ kss.ss_sp = (void *) ss_sp;
}
set_fs (KERNEL_DS);
@@ -333,7 +342,8 @@
if (!ret && uoss) {
if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
return -EFAULT;
- err |= __put_user((unsigned long) koss.ss_sp, &uoss->ss_sp);
+ ss_sp = (unsigned long) koss.ss_sp;
+ err |= __put_user(ss_sp, &uoss->ss_sp);
err |= __put_user(koss.ss_size, &uoss->ss_size);
err |= __put_user(koss.ss_flags, &uoss->ss_flags);
if (err)
diff -urN linux-2.6/arch/s390/kernel/entry.S linux-2.6-s390/arch/s390/kernel/entry.S
--- linux-2.6/arch/s390/kernel/entry.S Sat Aug 14 12:54:51 2004
+++ linux-2.6-s390/arch/s390/kernel/entry.S Mon Aug 30 19:14:21 2004
@@ -304,7 +304,10 @@
ret_from_fork:
l %r13,__LC_SVC_NEW_PSW+4
l %r9,__LC_THREAD_INFO # load pointer to thread_info struct
- l %r1,BASED(.Lschedtail)
+ tm SP_PSW+1(%r15),0x01 # forking a kernel thread ?
+ bo BASED(0f)
+ st %r15,SP_R15(%r15) # store stack pointer for new kthread
+0: l %r1,BASED(.Lschedtail)
basr %r14,%r1
stosm 24(%r15),0x03 # reenable interrupts
b BASED(sysc_return)
diff -urN linux-2.6/arch/s390/kernel/entry64.S linux-2.6-s390/arch/s390/kernel/entry64.S
--- linux-2.6/arch/s390/kernel/entry64.S Sat Aug 14 12:54:51 2004
+++ linux-2.6-s390/arch/s390/kernel/entry64.S Mon Aug 30 19:14:21 2004
@@ -304,7 +304,10 @@
ret_from_fork:
lg %r13,__LC_SVC_NEW_PSW+8
lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct
- brasl %r14,schedule_tail
+ tm SP_PSW+1(%r15),0x01 # forking a kernel thread ?
+ jo 0f
+ stg %r15,SP_R15(%r15) # store stack pointer for new kthread
+0: brasl %r14,schedule_tail
stosm 24(%r15),0x03 # reenable interrupts
j sysc_return
diff -urN linux-2.6/arch/s390/kernel/process.c linux-2.6-s390/arch/s390/kernel/process.c
--- linux-2.6/arch/s390/kernel/process.c Mon Aug 30 19:14:07 2004
+++ linux-2.6-s390/arch/s390/kernel/process.c Mon Aug 30 19:14:21 2004
@@ -186,41 +186,20 @@
extern void kernel_thread_starter(void);
-#ifndef CONFIG_ARCH_S390X
-
-__asm__(".align 4\n"
- "kernel_thread_starter:\n"
- " l 15,0(8)\n"
- " sr 15,7\n"
- " stosm 24(15),3\n"
- " lr 2,10\n"
- " basr 14,9\n"
- " sr 2,2\n"
- " br 11\n");
-
-#else /* CONFIG_ARCH_S390X */
-
__asm__(".align 4\n"
"kernel_thread_starter:\n"
- " lg 15,0(8)\n"
- " sgr 15,7\n"
- " stosm 48(15),3\n"
- " lgr 2,10\n"
+ " la 2,0(10)\n"
" basr 14,9\n"
- " sgr 2,2\n"
+ " la 2,0\n"
" br 11\n");
-#endif /* CONFIG_ARCH_S390X */
-
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
struct pt_regs regs;
memset(®s, 0, sizeof(regs));
- regs.psw.mask = PSW_KERNEL_BITS;
+ regs.psw.mask = PSW_KERNEL_BITS | PSW_MASK_IO | PSW_MASK_EXT;
regs.psw.addr = (unsigned long) kernel_thread_starter | PSW_ADDR_AMODE;
- regs.gprs[7] = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
- regs.gprs[8] = __LC_KERNEL_STACK;
regs.gprs[9] = (unsigned long) fn;
regs.gprs[10] = (unsigned long) arg;
regs.gprs[11] = (unsigned long) do_exit;
diff -urN linux-2.6/arch/s390/kernel/profile.c linux-2.6-s390/arch/s390/kernel/profile.c
--- linux-2.6/arch/s390/kernel/profile.c Mon Aug 30 19:14:07 2004
+++ linux-2.6-s390/arch/s390/kernel/profile.c Mon Aug 30 19:14:21 2004
@@ -6,6 +6,7 @@
*
*/
#include <linux/proc_fs.h>
+#include <linux/profile.h>
static struct proc_dir_entry * root_irq_dir;
diff -urN linux-2.6/include/asm-s390/idals.h linux-2.6-s390/include/asm-s390/idals.h
--- linux-2.6/include/asm-s390/idals.h Sat Aug 14 12:54:48 2004
+++ linux-2.6-s390/include/asm-s390/idals.h Mon Aug 30 19:14:21 2004
@@ -35,7 +35,7 @@
idal_is_needed(void *vaddr, unsigned int length)
{
#ifdef __s390x__
- return ((__pa(vaddr) + length) >> 31) != 0;
+ return ((__pa(vaddr) + length - 1) >> 31) != 0;
#else
return 0;
#endif
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2004-08-30 18:56 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-17 13:51 [PATCH] s390: core changes Martin Schwidefsky
2004-08-17 14:12 ` Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2004-08-30 18:02 Martin Schwidefsky
2004-08-05 13:13 Martin Schwidefsky
2004-06-30 17:07 Martin Schwidefsky
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox