Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6: (34 commits) [S390] Don't use small stacks when lockdep is used. [S390] cio: Use device_reprobe() instead of bus_rescan_devices(). [S390] cio: Retry internal operations after vary off. [S390] cio: Use path verification for last path gone after vary off. [S390] non-unique constant/macro identifiers. [S390] Memory detection fixes. [S390] cio: Make ccw_dev_id_is_equal() more robust. [S390] Convert extmem spin_lock into a mutex. [S390] set KBUILD_IMAGE. [S390] lockdep: show held locks when showing a stackdump [S390] Add dynamic size check for usercopy functions. [S390] Use diag260 for memory size detection. [S390] pfault code cleanup. [S390] Cleanup memory_chunk array usage. [S390] Misaligned wait PSW at memory detection. [S390] cpu shutdown rework [S390] cpcmd <-> __cpcmd calling issues [S390] Bad kexec control page allocation. [S390] Reset infrastructure for re-IPL. [S390] Some documentation typos. ...
Esse commit está contido em:
@@ -278,17 +278,16 @@ struct ccw_dev_id {
|
||||
static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1,
|
||||
struct ccw_dev_id *dev_id2)
|
||||
{
|
||||
return !memcmp(dev_id1, dev_id2, sizeof(struct ccw_dev_id));
|
||||
if ((dev_id1->ssid == dev_id2->ssid) &&
|
||||
(dev_id1->devno == dev_id2->devno))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern int diag210(struct diag210 *addr);
|
||||
|
||||
extern void wait_cons_dev(void);
|
||||
|
||||
extern void clear_all_subchannels(void);
|
||||
|
||||
extern void cio_reset_channel_paths(void);
|
||||
|
||||
extern void css_schedule_reprobe(void);
|
||||
|
||||
extern void reipl_ccw_dev(struct ccw_dev_id *id);
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
* Christian Borntraeger (cborntra@de.ibm.com),
|
||||
*/
|
||||
|
||||
#ifndef __CPCMD__
|
||||
#define __CPCMD__
|
||||
#ifndef _ASM_S390_CPCMD_H
|
||||
#define _ASM_S390_CPCMD_H
|
||||
|
||||
/*
|
||||
* the lowlevel function for cpcmd
|
||||
@@ -16,9 +16,6 @@
|
||||
*/
|
||||
extern int __cpcmd(const char *cmd, char *response, int rlen, int *response_code);
|
||||
|
||||
#ifndef __s390x__
|
||||
#define cpcmd __cpcmd
|
||||
#else
|
||||
/*
|
||||
* cpcmd is the in-kernel interface for issuing CP commands
|
||||
*
|
||||
@@ -33,6 +30,5 @@ extern int __cpcmd(const char *cmd, char *response, int rlen, int *response_code
|
||||
* NOTE: If the response buffer is not below 2 GB, cpcmd can sleep
|
||||
*/
|
||||
extern int cpcmd(const char *cmd, char *response, int rlen, int *response_code);
|
||||
#endif /*__s390x__*/
|
||||
|
||||
#endif
|
||||
#endif /* _ASM_S390_CPCMD_H */
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
/* Maximum address we can use for the control pages */
|
||||
/* Not more than 2GB */
|
||||
#define KEXEC_CONTROL_MEMORY_LIMIT (1<<31)
|
||||
#define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31)
|
||||
|
||||
/* Allocate one page for the pdp and the second for the code */
|
||||
#define KEXEC_CONTROL_CODE_SIZE 4096
|
||||
|
||||
@@ -362,6 +362,14 @@ static inline void set_prefix(__u32 address)
|
||||
asm volatile("spx %0" : : "m" (address) : "memory");
|
||||
}
|
||||
|
||||
static inline __u32 store_prefix(void)
|
||||
{
|
||||
__u32 address;
|
||||
|
||||
asm volatile("stpx %0" : "=m" (address));
|
||||
return address;
|
||||
}
|
||||
|
||||
#define __PANIC_MAGIC 0xDEADC0DE
|
||||
|
||||
#endif
|
||||
|
||||
@@ -110,12 +110,21 @@ extern char empty_zero_page[PAGE_SIZE];
|
||||
#define VMALLOC_OFFSET (8*1024*1024)
|
||||
#define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) \
|
||||
& ~(VMALLOC_OFFSET-1))
|
||||
#ifndef __s390x__
|
||||
# define VMALLOC_END (0x7fffffffL)
|
||||
#else /* __s390x__ */
|
||||
# define VMALLOC_END (0x40000000000L)
|
||||
#endif /* __s390x__ */
|
||||
|
||||
/*
|
||||
* We need some free virtual space to be able to do vmalloc.
|
||||
* VMALLOC_MIN_SIZE defines the minimum size of the vmalloc
|
||||
* area. On a machine with 2GB memory we make sure that we
|
||||
* have at least 128MB free space for vmalloc. On a machine
|
||||
* with 4TB we make sure we have at least 1GB.
|
||||
*/
|
||||
#ifndef __s390x__
|
||||
#define VMALLOC_MIN_SIZE 0x8000000UL
|
||||
#define VMALLOC_END 0x80000000UL
|
||||
#else /* __s390x__ */
|
||||
#define VMALLOC_MIN_SIZE 0x40000000UL
|
||||
#define VMALLOC_END 0x40000000000UL
|
||||
#endif /* __s390x__ */
|
||||
|
||||
/*
|
||||
* A 31 bit pagetable entry of S390 has following format:
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* include/asm-s390/reset.h
|
||||
*
|
||||
* Copyright IBM Corp. 2006
|
||||
* Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_RESET_H
|
||||
#define _ASM_S390_RESET_H
|
||||
|
||||
#include <linux/list.h>
|
||||
|
||||
struct reset_call {
|
||||
struct list_head list;
|
||||
void (*fn)(void);
|
||||
};
|
||||
|
||||
extern void register_reset_call(struct reset_call *reset);
|
||||
extern void unregister_reset_call(struct reset_call *reset);
|
||||
extern void s390_reset_system(void);
|
||||
extern void (*s390_reset_mcck_handler)(void);
|
||||
|
||||
#endif /* _ASM_S390_RESET_H */
|
||||
@@ -2,7 +2,7 @@
|
||||
* include/asm-s390/setup.h
|
||||
*
|
||||
* S390 version
|
||||
* Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
* Copyright IBM Corp. 1999,2006
|
||||
*/
|
||||
|
||||
#ifndef _ASM_S390_SETUP_H
|
||||
@@ -30,6 +30,17 @@
|
||||
#endif /* __s390x__ */
|
||||
#define COMMAND_LINE ((char *) (0x10480))
|
||||
|
||||
#define CHUNK_READ_WRITE 0
|
||||
#define CHUNK_READ_ONLY 1
|
||||
|
||||
struct mem_chunk {
|
||||
unsigned long addr;
|
||||
unsigned long size;
|
||||
unsigned long type;
|
||||
};
|
||||
|
||||
extern struct mem_chunk memory_chunk[];
|
||||
|
||||
/*
|
||||
* Machine features detected in head.S
|
||||
*/
|
||||
@@ -53,7 +64,6 @@ extern unsigned long machine_flags;
|
||||
#define MACHINE_HAS_MVCOS (machine_flags & 512)
|
||||
#endif /* __s390x__ */
|
||||
|
||||
|
||||
#define MACHINE_HAS_SCLP (!MACHINE_IS_P390)
|
||||
|
||||
/*
|
||||
@@ -71,7 +81,6 @@ extern unsigned int console_irq;
|
||||
#define SET_CONSOLE_3215 do { console_mode = 2; } while (0)
|
||||
#define SET_CONSOLE_3270 do { console_mode = 3; } while (0)
|
||||
|
||||
|
||||
struct ipl_list_hdr {
|
||||
u32 len;
|
||||
u8 reserved1[3];
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/sigp.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
/*
|
||||
s390 specific smp.c headers
|
||||
@@ -101,6 +102,13 @@ smp_call_function_on(void (*func) (void *info), void *info,
|
||||
func(info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void smp_send_stop(void)
|
||||
{
|
||||
/* Disable all interrupts/machine checks */
|
||||
__load_psw_mask(PSW_KERNEL_BITS & ~PSW_MASK_MCHECK);
|
||||
}
|
||||
|
||||
#define smp_cpu_not_running(cpu) 1
|
||||
#define smp_get_cpu(cpu) ({ 0; })
|
||||
#define smp_put_cpu(cpu) ({ 0; })
|
||||
|
||||
@@ -115,6 +115,16 @@ extern void account_system_vtime(struct task_struct *);
|
||||
#define account_vtime(x) do { /* empty */ } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PFAULT
|
||||
extern void pfault_irq_init(void);
|
||||
extern int pfault_init(void);
|
||||
extern void pfault_fini(void);
|
||||
#else /* CONFIG_PFAULT */
|
||||
#define pfault_irq_init() do { } while (0)
|
||||
#define pfault_init() ({-1;})
|
||||
#define pfault_fini() do { } while (0)
|
||||
#endif /* CONFIG_PFAULT */
|
||||
|
||||
#define finish_arch_switch(prev) do { \
|
||||
set_fs(current->thread.mm_segment); \
|
||||
account_vtime(prev); \
|
||||
|
||||
@@ -75,39 +75,7 @@ struct termio {
|
||||
*/
|
||||
#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
|
||||
|
||||
/*
|
||||
* Translate a "termio" structure into a "termios". Ugh.
|
||||
*/
|
||||
#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \
|
||||
unsigned short __tmp; \
|
||||
get_user(__tmp,&(termio)->x); \
|
||||
(termios)->x = (0xffff0000 & ((termios)->x)) | __tmp; \
|
||||
}
|
||||
|
||||
#define user_termio_to_kernel_termios(termios, termio) \
|
||||
({ \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \
|
||||
copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
|
||||
})
|
||||
|
||||
/*
|
||||
* Translate a "termios" structure into a "termio". Ugh.
|
||||
*/
|
||||
#define kernel_termios_to_user_termio(termio, termios) \
|
||||
({ \
|
||||
put_user((termios)->c_iflag, &(termio)->c_iflag); \
|
||||
put_user((termios)->c_oflag, &(termio)->c_oflag); \
|
||||
put_user((termios)->c_cflag, &(termio)->c_cflag); \
|
||||
put_user((termios)->c_lflag, &(termio)->c_lflag); \
|
||||
put_user((termios)->c_line, &(termio)->c_line); \
|
||||
copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
|
||||
#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
|
||||
#include <asm-generic/termios.h>
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ extern int __get_user_bad(void) __attribute__((noreturn));
|
||||
* Returns number of bytes that could not be copied.
|
||||
* On success, this will be zero.
|
||||
*/
|
||||
static inline unsigned long
|
||||
static inline unsigned long __must_check
|
||||
__copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||
{
|
||||
if (__builtin_constant_p(n) && (n <= 256))
|
||||
@@ -226,7 +226,7 @@ __copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||
* Returns number of bytes that could not be copied.
|
||||
* On success, this will be zero.
|
||||
*/
|
||||
static inline unsigned long
|
||||
static inline unsigned long __must_check
|
||||
copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||
{
|
||||
might_sleep();
|
||||
@@ -252,7 +252,7 @@ copy_to_user(void __user *to, const void *from, unsigned long n)
|
||||
* If some data could not be copied, this function will pad the copied
|
||||
* data to the requested size using zero bytes.
|
||||
*/
|
||||
static inline unsigned long
|
||||
static inline unsigned long __must_check
|
||||
__copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
if (__builtin_constant_p(n) && (n <= 256))
|
||||
@@ -277,7 +277,7 @@ __copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
* If some data could not be copied, this function will pad the copied
|
||||
* data to the requested size using zero bytes.
|
||||
*/
|
||||
static inline unsigned long
|
||||
static inline unsigned long __must_check
|
||||
copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
might_sleep();
|
||||
@@ -288,13 +288,13 @@ copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
return n;
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
static inline unsigned long __must_check
|
||||
__copy_in_user(void __user *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
return uaccess.copy_in_user(n, to, from);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
static inline unsigned long __must_check
|
||||
copy_in_user(void __user *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
might_sleep();
|
||||
@@ -306,7 +306,7 @@ copy_in_user(void __user *to, const void __user *from, unsigned long n)
|
||||
/*
|
||||
* Copy a null terminated string from userspace.
|
||||
*/
|
||||
static inline long
|
||||
static inline long __must_check
|
||||
strncpy_from_user(char *dst, const char __user *src, long count)
|
||||
{
|
||||
long res = -EFAULT;
|
||||
@@ -343,13 +343,13 @@ strnlen_user(const char __user * src, unsigned long n)
|
||||
* Zero Userspace
|
||||
*/
|
||||
|
||||
static inline unsigned long
|
||||
static inline unsigned long __must_check
|
||||
__clear_user(void __user *to, unsigned long n)
|
||||
{
|
||||
return uaccess.clear_user(n, to);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
static inline unsigned long __must_check
|
||||
clear_user(void __user *to, unsigned long n)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
+41
-50
@@ -180,40 +180,8 @@ struct ica_xcRB {
|
||||
* for the implementation details for the contents of the
|
||||
* block
|
||||
*
|
||||
* Z90STAT_TOTALCOUNT
|
||||
* Return an integer count of all device types together.
|
||||
*
|
||||
* Z90STAT_PCICACOUNT
|
||||
* Return an integer count of all PCICAs.
|
||||
*
|
||||
* Z90STAT_PCICCCOUNT
|
||||
* Return an integer count of all PCICCs.
|
||||
*
|
||||
* Z90STAT_PCIXCCMCL2COUNT
|
||||
* Return an integer count of all MCL2 PCIXCCs.
|
||||
*
|
||||
* Z90STAT_PCIXCCMCL3COUNT
|
||||
* Return an integer count of all MCL3 PCIXCCs.
|
||||
*
|
||||
* Z90STAT_CEX2CCOUNT
|
||||
* Return an integer count of all CEX2Cs.
|
||||
*
|
||||
* Z90STAT_CEX2ACOUNT
|
||||
* Return an integer count of all CEX2As.
|
||||
*
|
||||
* Z90STAT_REQUESTQ_COUNT
|
||||
* Return an integer count of the number of entries waiting to be
|
||||
* sent to a device.
|
||||
*
|
||||
* Z90STAT_PENDINGQ_COUNT
|
||||
* Return an integer count of the number of entries sent to a
|
||||
* device awaiting the reply.
|
||||
*
|
||||
* Z90STAT_TOTALOPEN_COUNT
|
||||
* Return an integer count of the number of open file handles.
|
||||
*
|
||||
* Z90STAT_DOMAIN_INDEX
|
||||
* Return the integer value of the Cryptographic Domain.
|
||||
* ZSECSENDCPRB
|
||||
* Send an arbitrary CPRB to a crypto card.
|
||||
*
|
||||
* Z90STAT_STATUS_MASK
|
||||
* Return an 64 element array of unsigned chars for the status of
|
||||
@@ -235,28 +203,51 @@ struct ica_xcRB {
|
||||
* of successfully completed requests per device since the device
|
||||
* was detected and made available.
|
||||
*
|
||||
* ICAZ90STATUS (deprecated)
|
||||
* Z90STAT_REQUESTQ_COUNT
|
||||
* Return an integer count of the number of entries waiting to be
|
||||
* sent to a device.
|
||||
*
|
||||
* Z90STAT_PENDINGQ_COUNT
|
||||
* Return an integer count of the number of entries sent to all
|
||||
* devices awaiting the reply.
|
||||
*
|
||||
* Z90STAT_TOTALOPEN_COUNT
|
||||
* Return an integer count of the number of open file handles.
|
||||
*
|
||||
* Z90STAT_DOMAIN_INDEX
|
||||
* Return the integer value of the Cryptographic Domain.
|
||||
*
|
||||
* The following ioctls are deprecated and should be no longer used:
|
||||
*
|
||||
* Z90STAT_TOTALCOUNT
|
||||
* Return an integer count of all device types together.
|
||||
*
|
||||
* Z90STAT_PCICACOUNT
|
||||
* Return an integer count of all PCICAs.
|
||||
*
|
||||
* Z90STAT_PCICCCOUNT
|
||||
* Return an integer count of all PCICCs.
|
||||
*
|
||||
* Z90STAT_PCIXCCMCL2COUNT
|
||||
* Return an integer count of all MCL2 PCIXCCs.
|
||||
*
|
||||
* Z90STAT_PCIXCCMCL3COUNT
|
||||
* Return an integer count of all MCL3 PCIXCCs.
|
||||
*
|
||||
* Z90STAT_CEX2CCOUNT
|
||||
* Return an integer count of all CEX2Cs.
|
||||
*
|
||||
* Z90STAT_CEX2ACOUNT
|
||||
* Return an integer count of all CEX2As.
|
||||
*
|
||||
* ICAZ90STATUS
|
||||
* Return some device driver status in a ica_z90_status struct
|
||||
* This takes an ica_z90_status struct as its arg.
|
||||
*
|
||||
* NOTE: this ioctl() is deprecated, and has been replaced with
|
||||
* single ioctl()s for each type of status being requested
|
||||
*
|
||||
* Z90STAT_PCIXCCCOUNT (deprecated)
|
||||
* Z90STAT_PCIXCCCOUNT
|
||||
* Return an integer count of all PCIXCCs (MCL2 + MCL3).
|
||||
* This is DEPRECATED now that MCL3 PCIXCCs are treated differently from
|
||||
* MCL2 PCIXCCs.
|
||||
*
|
||||
* Z90QUIESCE (not recommended)
|
||||
* Quiesce the driver. This is intended to stop all new
|
||||
* requests from being processed. Its use is NOT recommended,
|
||||
* except in circumstances where there is no other way to stop
|
||||
* callers from accessing the driver. Its original use was to
|
||||
* allow the driver to be "drained" of work in preparation for
|
||||
* a system shutdown.
|
||||
*
|
||||
* NOTE: once issued, this ban on new work cannot be undone
|
||||
* except by unloading and reloading the driver.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário