Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: (22 commits) [S390] Update default configuration. [S390] hibernate: Do real CPU swap at resume time [S390] dasd: tolerate devices that have no feature codes [S390] zcrypt: Do not add/remove devices in s/r callbacks [S390] hibernate: make sure pfn_is_nosave handles lowcore pages [S390] smp: introduce LC_ORDER and simplify lowcore handling [S390] ptrace: use common code for simple peek/poke operations [S390] fix disabled_wait inline assembly clobber list [S390] Change kernel_page_present coding style. [S390] hibernation: reset system after resume [S390] hibernation: fix guest page hinting related crash [S390] Get rid of init_module/delete_module compat functions. [S390] Convert sys_execve to function with parameters. [S390] Convert sys_clone to function with parameters. [S390] qdio: change state of all primed input buffers [S390] qdio: reduce per device debug messages [S390] cio: introduce consistent subchannel scanning [S390] cio: idset use actual number of ssids [S390] cio: dont kfree vmalloced memory [S390] cio: introduce css_settle ...
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.30
|
||||
# Mon Jun 22 11:08:16 2009
|
||||
# Linux kernel version: 2.6.31
|
||||
# Tue Sep 22 17:43:13 2009
|
||||
#
|
||||
CONFIG_SCHED_MC=y
|
||||
CONFIG_MMU=y
|
||||
@@ -24,6 +24,7 @@ CONFIG_PGSTE=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
|
||||
CONFIG_S390=y
|
||||
CONFIG_SCHED_OMIT_FRAME_POINTER=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
@@ -48,11 +49,12 @@ CONFIG_AUDIT=y
|
||||
#
|
||||
# RCU Subsystem
|
||||
#
|
||||
CONFIG_CLASSIC_RCU=y
|
||||
# CONFIG_TREE_RCU is not set
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
CONFIG_TREE_RCU=y
|
||||
# CONFIG_TREE_PREEMPT_RCU is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
CONFIG_RCU_FANOUT=64
|
||||
# CONFIG_RCU_FANOUT_EXACT is not set
|
||||
# CONFIG_TREE_RCU_TRACE is not set
|
||||
# CONFIG_PREEMPT_RCU_TRACE is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
@@ -103,11 +105,12 @@ CONFIG_TIMERFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_AIO=y
|
||||
CONFIG_HAVE_PERF_COUNTERS=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
|
||||
#
|
||||
# Performance Counters
|
||||
# Kernel Performance Events And Counters
|
||||
#
|
||||
# CONFIG_PERF_EVENTS is not set
|
||||
# CONFIG_PERF_COUNTERS is not set
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
@@ -116,7 +119,6 @@ CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_HAVE_SYSCALL_WRAPPERS=y
|
||||
@@ -176,6 +178,7 @@ CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_64BIT=y
|
||||
# CONFIG_KTIME_SCALAR is not set
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=32
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
@@ -257,7 +260,6 @@ CONFIG_FORCE_MAX_ZONEORDER=9
|
||||
CONFIG_PFAULT=y
|
||||
# CONFIG_SHARED_KERNEL is not set
|
||||
# CONFIG_CMM is not set
|
||||
# CONFIG_PAGE_STATES is not set
|
||||
# CONFIG_APPLDATA_BASE is not set
|
||||
CONFIG_HZ_100=y
|
||||
# CONFIG_HZ_250 is not set
|
||||
@@ -280,6 +282,7 @@ CONFIG_PM_SLEEP_SMP=y
|
||||
CONFIG_PM_SLEEP=y
|
||||
CONFIG_HIBERNATION=y
|
||||
CONFIG_PM_STD_PARTITION=""
|
||||
# CONFIG_PM_RUNTIME is not set
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
@@ -394,6 +397,7 @@ CONFIG_IP_SCTP=m
|
||||
# CONFIG_SCTP_HMAC_NONE is not set
|
||||
# CONFIG_SCTP_HMAC_SHA1 is not set
|
||||
CONFIG_SCTP_HMAC_MD5=y
|
||||
# CONFIG_RDS is not set
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
@@ -487,6 +491,7 @@ CONFIG_CCW=y
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_DEVTMPFS is not set
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=y
|
||||
@@ -501,6 +506,7 @@ CONFIG_BLK_DEV=y
|
||||
CONFIG_BLK_DEV_LOOP=m
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
# CONFIG_BLK_DEV_OSD is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
@@ -594,8 +600,11 @@ CONFIG_BLK_DEV_DM=y
|
||||
CONFIG_DM_CRYPT=y
|
||||
CONFIG_DM_SNAPSHOT=y
|
||||
CONFIG_DM_MIRROR=y
|
||||
# CONFIG_DM_LOG_USERSPACE is not set
|
||||
CONFIG_DM_ZERO=y
|
||||
CONFIG_DM_MULTIPATH=m
|
||||
# CONFIG_DM_MULTIPATH_QL is not set
|
||||
# CONFIG_DM_MULTIPATH_ST is not set
|
||||
# CONFIG_DM_DELAY is not set
|
||||
# CONFIG_DM_UEVENT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
@@ -615,7 +624,6 @@ CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_KS8842 is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
CONFIG_NETDEV_10000=y
|
||||
# CONFIG_TR is not set
|
||||
@@ -678,6 +686,7 @@ CONFIG_SCLP_CONSOLE=y
|
||||
CONFIG_SCLP_VT220_TTY=y
|
||||
CONFIG_SCLP_VT220_CONSOLE=y
|
||||
CONFIG_SCLP_CPI=m
|
||||
CONFIG_SCLP_ASYNC=m
|
||||
CONFIG_S390_TAPE=m
|
||||
|
||||
#
|
||||
@@ -737,6 +746,7 @@ CONFIG_FS_POSIX_ACL=y
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
# CONFIG_NILFS2_FS is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
CONFIG_FSNOTIFY=y
|
||||
CONFIG_DNOTIFY=y
|
||||
@@ -798,7 +808,6 @@ CONFIG_MISC_FILESYSTEMS=y
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
# CONFIG_EXOFS_FS is not set
|
||||
# CONFIG_NILFS2_FS is not set
|
||||
CONFIG_NETWORK_FILESYSTEMS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
@@ -885,11 +894,13 @@ CONFIG_DEBUG_MEMORY_INIT=y
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||
# CONFIG_DEBUG_CREDENTIALS is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_KPROBES_SANITY_TEST is not set
|
||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
|
||||
# CONFIG_LKDTM is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_LATENCYTOP is not set
|
||||
@@ -979,11 +990,13 @@ CONFIG_CRYPTO_PCBC=m
|
||||
#
|
||||
CONFIG_CRYPTO_HMAC=m
|
||||
# CONFIG_CRYPTO_XCBC is not set
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
|
||||
#
|
||||
# Digest
|
||||
#
|
||||
CONFIG_CRYPTO_CRC32C=m
|
||||
CONFIG_CRYPTO_GHASH=m
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
CONFIG_CRYPTO_MD5=m
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
|
@@ -86,6 +86,7 @@
|
||||
#define __LC_PGM_OLD_PSW 0x0150
|
||||
#define __LC_MCK_OLD_PSW 0x0160
|
||||
#define __LC_IO_OLD_PSW 0x0170
|
||||
#define __LC_RESTART_PSW 0x01a0
|
||||
#define __LC_EXT_NEW_PSW 0x01b0
|
||||
#define __LC_SVC_NEW_PSW 0x01c0
|
||||
#define __LC_PGM_NEW_PSW 0x01d0
|
||||
@@ -189,6 +190,14 @@ union save_area {
|
||||
#define SAVE_AREA_BASE SAVE_AREA_BASE_S390X
|
||||
#endif
|
||||
|
||||
#ifndef __s390x__
|
||||
#define LC_ORDER 0
|
||||
#else
|
||||
#define LC_ORDER 1
|
||||
#endif
|
||||
|
||||
#define LC_PAGES (1UL << LC_ORDER)
|
||||
|
||||
struct _lowcore
|
||||
{
|
||||
#ifndef __s390x__
|
||||
|
@@ -295,7 +295,7 @@ static inline void ATTRIB_NORET disabled_wait(unsigned long code)
|
||||
" oi 0x384(1),0x10\n"/* fake protection bit */
|
||||
" lpswe 0(%1)"
|
||||
: "=m" (ctl_buf)
|
||||
: "a" (&dw_psw), "a" (&ctl_buf), "m" (dw_psw) : "cc", "0");
|
||||
: "a" (&dw_psw), "a" (&ctl_buf), "m" (dw_psw) : "cc", "0", "1");
|
||||
#endif /* __s390x__ */
|
||||
while (1);
|
||||
}
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kbuild.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/sigp.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
@@ -59,6 +60,10 @@ int main(void)
|
||||
DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
|
||||
DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
|
||||
DEFINE(CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC);
|
||||
|
||||
/* constants for SIGP */
|
||||
DEFINE(__SIGP_STOP, sigp_stop);
|
||||
DEFINE(__SIGP_RESTART, sigp_restart);
|
||||
DEFINE(__SIGP_SENSE, sigp_sense);
|
||||
DEFINE(__SIGP_INITIAL_CPU_RESET, sigp_initial_cpu_reset);
|
||||
return 0;
|
||||
}
|
||||
|
@@ -443,66 +443,28 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
|
||||
* sys32_execve() executes a new program after the asm stub has set
|
||||
* things up for us. This should basically do what I want it to.
|
||||
*/
|
||||
asmlinkage long sys32_execve(void)
|
||||
asmlinkage long sys32_execve(char __user *name, compat_uptr_t __user *argv,
|
||||
compat_uptr_t __user *envp)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
char *filename;
|
||||
unsigned long result;
|
||||
int rc;
|
||||
long rc;
|
||||
|
||||
filename = getname(compat_ptr(regs->orig_gpr2));
|
||||
if (IS_ERR(filename)) {
|
||||
result = PTR_ERR(filename);
|
||||
goto out;
|
||||
}
|
||||
rc = compat_do_execve(filename, compat_ptr(regs->gprs[3]),
|
||||
compat_ptr(regs->gprs[4]), regs);
|
||||
if (rc) {
|
||||
result = rc;
|
||||
goto out_putname;
|
||||
}
|
||||
filename = getname(name);
|
||||
rc = PTR_ERR(filename);
|
||||
if (IS_ERR(filename))
|
||||
return rc;
|
||||
rc = compat_do_execve(filename, argv, envp, regs);
|
||||
if (rc)
|
||||
goto out;
|
||||
current->thread.fp_regs.fpc=0;
|
||||
asm volatile("sfpc %0,0" : : "d" (0));
|
||||
result = regs->gprs[2];
|
||||
out_putname:
|
||||
putname(filename);
|
||||
rc = regs->gprs[2];
|
||||
out:
|
||||
return result;
|
||||
putname(filename);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
|
||||
asmlinkage long
|
||||
sys32_init_module(void __user *umod, unsigned long len,
|
||||
const char __user *uargs)
|
||||
{
|
||||
return sys_init_module(umod, len, uargs);
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
sys32_delete_module(const char __user *name_user, unsigned int flags)
|
||||
{
|
||||
return sys_delete_module(name_user, flags);
|
||||
}
|
||||
|
||||
#else /* CONFIG_MODULES */
|
||||
|
||||
asmlinkage long
|
||||
sys32_init_module(void __user *umod, unsigned long len,
|
||||
const char __user *uargs)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
sys32_delete_module(const char __user *name_user, unsigned int flags)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf,
|
||||
size_t count, u32 poshi, u32 poslo)
|
||||
{
|
||||
@@ -801,23 +763,6 @@ asmlinkage long sys32_write(unsigned int fd, char __user * buf, size_t count)
|
||||
return sys_write(fd, buf, count);
|
||||
}
|
||||
|
||||
asmlinkage long sys32_clone(void)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
unsigned long clone_flags;
|
||||
unsigned long newsp;
|
||||
int __user *parent_tidptr, *child_tidptr;
|
||||
|
||||
clone_flags = regs->gprs[3] & 0xffffffffUL;
|
||||
newsp = regs->orig_gpr2 & 0x7fffffffUL;
|
||||
parent_tidptr = compat_ptr(regs->gprs[4]);
|
||||
child_tidptr = compat_ptr(regs->gprs[5]);
|
||||
if (!newsp)
|
||||
newsp = regs->gprs[15];
|
||||
return do_fork(clone_flags, newsp, regs, 0,
|
||||
parent_tidptr, child_tidptr);
|
||||
}
|
||||
|
||||
/*
|
||||
* 31 bit emulation wrapper functions for sys_fadvise64/fadvise64_64.
|
||||
* These need to rewrite the advise values for POSIX_FADV_{DONTNEED,NOREUSE}
|
||||
|
@@ -198,7 +198,8 @@ long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
|
||||
compat_sigset_t __user *oset, size_t sigsetsize);
|
||||
long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize);
|
||||
long sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo);
|
||||
long sys32_execve(void);
|
||||
long sys32_execve(char __user *name, compat_uptr_t __user *argv,
|
||||
compat_uptr_t __user *envp);
|
||||
long sys32_init_module(void __user *umod, unsigned long len,
|
||||
const char __user *uargs);
|
||||
long sys32_delete_module(const char __user *name_user, unsigned int flags);
|
||||
@@ -222,7 +223,6 @@ unsigned long old32_mmap(struct mmap_arg_struct_emu31 __user *arg);
|
||||
long sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg);
|
||||
long sys32_read(unsigned int fd, char __user * buf, size_t count);
|
||||
long sys32_write(unsigned int fd, char __user * buf, size_t count);
|
||||
long sys32_clone(void);
|
||||
long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise);
|
||||
long sys32_fadvise64_64(struct fadvise64_64_args __user *args);
|
||||
long sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
|
||||
|
@@ -568,18 +568,18 @@ compat_sys_sigprocmask_wrapper:
|
||||
llgtr %r4,%r4 # compat_old_sigset_t *
|
||||
jg compat_sys_sigprocmask # branch to system call
|
||||
|
||||
.globl sys32_init_module_wrapper
|
||||
sys32_init_module_wrapper:
|
||||
.globl sys_init_module_wrapper
|
||||
sys_init_module_wrapper:
|
||||
llgtr %r2,%r2 # void *
|
||||
llgfr %r3,%r3 # unsigned long
|
||||
llgtr %r4,%r4 # char *
|
||||
jg sys32_init_module # branch to system call
|
||||
jg sys_init_module # branch to system call
|
||||
|
||||
.globl sys32_delete_module_wrapper
|
||||
sys32_delete_module_wrapper:
|
||||
.globl sys_delete_module_wrapper
|
||||
sys_delete_module_wrapper:
|
||||
llgtr %r2,%r2 # const char *
|
||||
llgfr %r3,%r3 # unsigned int
|
||||
jg sys32_delete_module # branch to system call
|
||||
jg sys_delete_module # branch to system call
|
||||
|
||||
.globl sys32_quotactl_wrapper
|
||||
sys32_quotactl_wrapper:
|
||||
@@ -1840,3 +1840,18 @@ sys_perf_event_open_wrapper:
|
||||
lgfr %r5,%r5 # int
|
||||
llgfr %r6,%r6 # unsigned long
|
||||
jg sys_perf_event_open # branch to system call
|
||||
|
||||
.globl sys_clone_wrapper
|
||||
sys_clone_wrapper:
|
||||
llgfr %r2,%r2 # unsigned long
|
||||
llgfr %r3,%r3 # unsigned long
|
||||
llgtr %r4,%r4 # int *
|
||||
llgtr %r5,%r5 # int *
|
||||
jg sys_clone # branch to system call
|
||||
|
||||
.globl sys32_execve_wrapper
|
||||
sys32_execve_wrapper:
|
||||
llgtr %r2,%r2 # char *
|
||||
llgtr %r3,%r3 # compat_uptr_t *
|
||||
llgtr %r4,%r4 # compat_uptr_t *
|
||||
jg sys32_execve # branch to system call
|
||||
|
@@ -42,10 +42,12 @@ long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);
|
||||
long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
|
||||
u32 len_low);
|
||||
long sys_fork(void);
|
||||
long sys_clone(void);
|
||||
long sys_clone(unsigned long newsp, unsigned long clone_flags,
|
||||
int __user *parent_tidptr, int __user *child_tidptr);
|
||||
long sys_vfork(void);
|
||||
void execve_tail(void);
|
||||
long sys_execve(void);
|
||||
long sys_execve(char __user *name, char __user * __user *argv,
|
||||
char __user * __user *envp);
|
||||
long sys_sigsuspend(int history0, int history1, old_sigset_t mask);
|
||||
long sys_sigaction(int sig, const struct old_sigaction __user *act,
|
||||
struct old_sigaction __user *oact);
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include <linux/elfcore.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/compat.h>
|
||||
#include <asm/compat.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
@@ -230,17 +231,11 @@ SYSCALL_DEFINE0(fork)
|
||||
return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE0(clone)
|
||||
SYSCALL_DEFINE4(clone, unsigned long, newsp, unsigned long, clone_flags,
|
||||
int __user *, parent_tidptr, int __user *, child_tidptr)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
unsigned long clone_flags;
|
||||
unsigned long newsp;
|
||||
int __user *parent_tidptr, *child_tidptr;
|
||||
|
||||
clone_flags = regs->gprs[3];
|
||||
newsp = regs->orig_gpr2;
|
||||
parent_tidptr = (int __user *) regs->gprs[4];
|
||||
child_tidptr = (int __user *) regs->gprs[5];
|
||||
if (!newsp)
|
||||
newsp = regs->gprs[15];
|
||||
return do_fork(clone_flags, newsp, regs, 0,
|
||||
@@ -274,30 +269,25 @@ asmlinkage void execve_tail(void)
|
||||
/*
|
||||
* sys_execve() executes a new program.
|
||||
*/
|
||||
SYSCALL_DEFINE0(execve)
|
||||
SYSCALL_DEFINE3(execve, char __user *, name, char __user * __user *, argv,
|
||||
char __user * __user *, envp)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
char *filename;
|
||||
unsigned long result;
|
||||
int rc;
|
||||
long rc;
|
||||
|
||||
filename = getname((char __user *) regs->orig_gpr2);
|
||||
if (IS_ERR(filename)) {
|
||||
result = PTR_ERR(filename);
|
||||
filename = getname(name);
|
||||
rc = PTR_ERR(filename);
|
||||
if (IS_ERR(filename))
|
||||
return rc;
|
||||
rc = do_execve(filename, argv, envp, regs);
|
||||
if (rc)
|
||||
goto out;
|
||||
}
|
||||
rc = do_execve(filename, (char __user * __user *) regs->gprs[3],
|
||||
(char __user * __user *) regs->gprs[4], regs);
|
||||
if (rc) {
|
||||
result = rc;
|
||||
goto out_putname;
|
||||
}
|
||||
execve_tail();
|
||||
result = regs->gprs[2];
|
||||
out_putname:
|
||||
putname(filename);
|
||||
rc = regs->gprs[2];
|
||||
out:
|
||||
return result;
|
||||
putname(filename);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -339,24 +339,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
int copied, ret;
|
||||
|
||||
switch (request) {
|
||||
case PTRACE_PEEKTEXT:
|
||||
case PTRACE_PEEKDATA:
|
||||
/* Remove high order bit from address (only for 31 bit). */
|
||||
addr &= PSW_ADDR_INSN;
|
||||
/* read word at location addr. */
|
||||
return generic_ptrace_peekdata(child, addr, data);
|
||||
|
||||
case PTRACE_PEEKUSR:
|
||||
/* read the word at location addr in the USER area. */
|
||||
return peek_user(child, addr, data);
|
||||
|
||||
case PTRACE_POKETEXT:
|
||||
case PTRACE_POKEDATA:
|
||||
/* Remove high order bit from address (only for 31 bit). */
|
||||
addr &= PSW_ADDR_INSN;
|
||||
/* write the word at location addr. */
|
||||
return generic_ptrace_pokedata(child, addr, data);
|
||||
|
||||
case PTRACE_POKEUSR:
|
||||
/* write the word at location addr in the USER area */
|
||||
return poke_user(child, addr, data);
|
||||
@@ -386,8 +372,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
copied += sizeof(unsigned long);
|
||||
}
|
||||
return 0;
|
||||
default:
|
||||
/* Removing high order bit from addr (only for 31 bit). */
|
||||
addr &= PSW_ADDR_INSN;
|
||||
return ptrace_request(child, request, addr, data);
|
||||
}
|
||||
return ptrace_request(child, request, addr, data);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
@@ -24,8 +24,6 @@ LC_EXT_INT_CODE = 0x86 # addr of ext int code
|
||||
# R3 = external interruption parameter if R2=0
|
||||
#
|
||||
|
||||
.section ".init.text","ax"
|
||||
|
||||
_sclp_wait_int:
|
||||
stm %r6,%r15,24(%r15) # save registers
|
||||
basr %r13,0 # get base register
|
||||
@@ -318,9 +316,8 @@ _sclp_print_early:
|
||||
.long _sclp_work_area
|
||||
.Lascebc:
|
||||
.long _ascebc
|
||||
.previous
|
||||
|
||||
.section ".init.data","a"
|
||||
.section .data,"aw",@progbits
|
||||
.balign 4096
|
||||
_sclp_work_area:
|
||||
.fill 4096
|
||||
|
@@ -475,10 +475,8 @@ static int __cpuinit smp_alloc_lowcore(int cpu)
|
||||
{
|
||||
unsigned long async_stack, panic_stack;
|
||||
struct _lowcore *lowcore;
|
||||
int lc_order;
|
||||
|
||||
lc_order = sizeof(long) == 8 ? 1 : 0;
|
||||
lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, lc_order);
|
||||
lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, LC_ORDER);
|
||||
if (!lowcore)
|
||||
return -ENOMEM;
|
||||
async_stack = __get_free_pages(GFP_KERNEL, ASYNC_ORDER);
|
||||
@@ -509,16 +507,14 @@ static int __cpuinit smp_alloc_lowcore(int cpu)
|
||||
out:
|
||||
free_page(panic_stack);
|
||||
free_pages(async_stack, ASYNC_ORDER);
|
||||
free_pages((unsigned long) lowcore, lc_order);
|
||||
free_pages((unsigned long) lowcore, LC_ORDER);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void smp_free_lowcore(int cpu)
|
||||
{
|
||||
struct _lowcore *lowcore;
|
||||
int lc_order;
|
||||
|
||||
lc_order = sizeof(long) == 8 ? 1 : 0;
|
||||
lowcore = lowcore_ptr[cpu];
|
||||
#ifndef CONFIG_64BIT
|
||||
if (MACHINE_HAS_IEEE)
|
||||
@@ -528,7 +524,7 @@ static void smp_free_lowcore(int cpu)
|
||||
#endif
|
||||
free_page(lowcore->panic_stack - PAGE_SIZE);
|
||||
free_pages(lowcore->async_stack - ASYNC_SIZE, ASYNC_ORDER);
|
||||
free_pages((unsigned long) lowcore, lc_order);
|
||||
free_pages((unsigned long) lowcore, LC_ORDER);
|
||||
lowcore_ptr[cpu] = NULL;
|
||||
}
|
||||
|
||||
@@ -664,7 +660,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
unsigned long async_stack, panic_stack;
|
||||
struct _lowcore *lowcore;
|
||||
unsigned int cpu;
|
||||
int lc_order;
|
||||
|
||||
smp_detect_cpus();
|
||||
|
||||
@@ -674,8 +669,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
print_cpu_info();
|
||||
|
||||
/* Reallocate current lowcore, but keep its contents. */
|
||||
lc_order = sizeof(long) == 8 ? 1 : 0;
|
||||
lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, lc_order);
|
||||
lowcore = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, LC_ORDER);
|
||||
panic_stack = __get_free_page(GFP_KERNEL);
|
||||
async_stack = __get_free_pages(GFP_KERNEL, ASYNC_ORDER);
|
||||
BUG_ON(!lowcore || !panic_stack || !async_stack);
|
||||
@@ -1047,42 +1041,6 @@ out:
|
||||
static SYSDEV_CLASS_ATTR(dispatching, 0644, dispatching_show,
|
||||
dispatching_store);
|
||||
|
||||
/*
|
||||
* If the resume kernel runs on another cpu than the suspended kernel,
|
||||
* we have to switch the cpu IDs in the logical map.
|
||||
*/
|
||||
void smp_switch_boot_cpu_in_resume(u32 resume_phys_cpu_id,
|
||||
struct _lowcore *suspend_lowcore)
|
||||
{
|
||||
int cpu, suspend_cpu_id, resume_cpu_id;
|
||||
u32 suspend_phys_cpu_id;
|
||||
|
||||
suspend_phys_cpu_id = __cpu_logical_map[suspend_lowcore->cpu_nr];
|
||||
suspend_cpu_id = suspend_lowcore->cpu_nr;
|
||||
|
||||
for_each_present_cpu(cpu) {
|
||||
if (__cpu_logical_map[cpu] == resume_phys_cpu_id) {
|
||||
resume_cpu_id = cpu;
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
panic("Could not find resume cpu in logical map.\n");
|
||||
|
||||
found:
|
||||
printk("Resume cpu ID: %i/%i\n", resume_phys_cpu_id, resume_cpu_id);
|
||||
printk("Suspend cpu ID: %i/%i\n", suspend_phys_cpu_id, suspend_cpu_id);
|
||||
|
||||
__cpu_logical_map[resume_cpu_id] = suspend_phys_cpu_id;
|
||||
__cpu_logical_map[suspend_cpu_id] = resume_phys_cpu_id;
|
||||
|
||||
lowcore_ptr[suspend_cpu_id]->cpu_addr = resume_phys_cpu_id;
|
||||
}
|
||||
|
||||
u32 smp_get_phys_cpu_id(void)
|
||||
{
|
||||
return __cpu_logical_map[smp_processor_id()];
|
||||
}
|
||||
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
int cpu;
|
||||
|
@@ -6,36 +6,26 @@
|
||||
* Author(s): Hans-Joachim Picht <hans@linux.vnet.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/ipl.h>
|
||||
|
||||
/*
|
||||
* References to section boundaries
|
||||
*/
|
||||
extern const void __nosave_begin, __nosave_end;
|
||||
|
||||
/*
|
||||
* check if given pfn is in the 'nosave' or in the read only NSS section
|
||||
*/
|
||||
int pfn_is_nosave(unsigned long pfn)
|
||||
{
|
||||
unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT;
|
||||
unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end))
|
||||
>> PAGE_SHIFT;
|
||||
unsigned long eshared_pfn = PFN_DOWN(__pa(&_eshared)) - 1;
|
||||
unsigned long stext_pfn = PFN_DOWN(__pa(&_stext));
|
||||
unsigned long nosave_begin_pfn = PFN_DOWN(__pa(&__nosave_begin));
|
||||
unsigned long nosave_end_pfn = PFN_DOWN(__pa(&__nosave_end));
|
||||
|
||||
/* Always save lowcore pages (LC protection might be enabled). */
|
||||
if (pfn <= LC_PAGES)
|
||||
return 0;
|
||||
if (pfn >= nosave_begin_pfn && pfn < nosave_end_pfn)
|
||||
return 1;
|
||||
if (pfn >= stext_pfn && pfn <= eshared_pfn) {
|
||||
if (ipl_info.type == IPL_TYPE_NSS)
|
||||
return 1;
|
||||
} else if ((tprot(pfn * PAGE_SIZE) && pfn > 0))
|
||||
/* Skip memory holes and read-only pages (NSS, DCSS, ...). */
|
||||
if (tprot(PFN_PHYS(pfn)))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
/*
|
||||
@@ -41,6 +42,9 @@ swsusp_arch_suspend:
|
||||
/* Get pointer to save area */
|
||||
lghi %r1,0x1000
|
||||
|
||||
/* Save CPU address */
|
||||
stap __LC_CPU_ADDRESS(%r1)
|
||||
|
||||
/* Store registers */
|
||||
mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */
|
||||
stfpc 0x31c(%r1) /* store fpu control */
|
||||
@@ -102,11 +106,10 @@ swsusp_arch_resume:
|
||||
aghi %r15,-STACK_FRAME_OVERHEAD
|
||||
stg %r1,__SF_BACKCHAIN(%r15)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Save boot cpu number */
|
||||
brasl %r14,smp_get_phys_cpu_id
|
||||
lgr %r10,%r2
|
||||
#endif
|
||||
/* Make all free pages stable */
|
||||
lghi %r2,1
|
||||
brasl %r14,arch_set_page_states
|
||||
|
||||
/* Deactivate DAT */
|
||||
stnsm __SF_EMPTY(%r15),0xfb
|
||||
|
||||
@@ -133,6 +136,69 @@ swsusp_arch_resume:
|
||||
2:
|
||||
ptlb /* flush tlb */
|
||||
|
||||
/* Reset System */
|
||||
larl %r1,restart_entry
|
||||
larl %r2,.Lrestart_diag308_psw
|
||||
og %r1,0(%r2)
|
||||
stg %r1,0(%r0)
|
||||
larl %r1,.Lnew_pgm_check_psw
|
||||
epsw %r2,%r3
|
||||
stm %r2,%r3,0(%r1)
|
||||
mvc __LC_PGM_NEW_PSW(16,%r0),0(%r1)
|
||||
lghi %r0,0
|
||||
diag %r0,%r0,0x308
|
||||
restart_entry:
|
||||
lhi %r1,1
|
||||
sigp %r1,%r0,0x12
|
||||
sam64
|
||||
larl %r1,.Lnew_pgm_check_psw
|
||||
lpswe 0(%r1)
|
||||
pgm_check_entry:
|
||||
|
||||
/* Switch to original suspend CPU */
|
||||
larl %r1,.Lresume_cpu /* Resume CPU address: r2 */
|
||||
stap 0(%r1)
|
||||
llgh %r2,0(%r1)
|
||||
lghi %r3,0x1000
|
||||
llgh %r1,__LC_CPU_ADDRESS(%r3) /* Suspend CPU address: r1 */
|
||||
cgr %r1,%r2
|
||||
je restore_registers /* r1 = r2 -> nothing to do */
|
||||
larl %r4,.Lrestart_suspend_psw /* Set new restart PSW */
|
||||
mvc __LC_RESTART_PSW(16,%r0),0(%r4)
|
||||
3:
|
||||
sigp %r9,%r1,__SIGP_INITIAL_CPU_RESET
|
||||
brc 8,4f /* accepted */
|
||||
brc 2,3b /* busy, try again */
|
||||
|
||||
/* Suspend CPU not available -> panic */
|
||||
larl %r15,init_thread_union
|
||||
ahi %r15,1<<(PAGE_SHIFT+THREAD_ORDER)
|
||||
larl %r2,.Lpanic_string
|
||||
larl %r3,_sclp_print_early
|
||||
lghi %r1,0
|
||||
sam31
|
||||
sigp %r1,%r0,0x12
|
||||
basr %r14,%r3
|
||||
larl %r3,.Ldisabled_wait_31
|
||||
lpsw 0(%r3)
|
||||
4:
|
||||
/* Switch to suspend CPU */
|
||||
sigp %r9,%r1,__SIGP_RESTART /* start suspend CPU */
|
||||
brc 2,4b /* busy, try again */
|
||||
5:
|
||||
sigp %r9,%r2,__SIGP_STOP /* stop resume (current) CPU */
|
||||
6: j 6b
|
||||
|
||||
restart_suspend:
|
||||
larl %r1,.Lresume_cpu
|
||||
llgh %r2,0(%r1)
|
||||
7:
|
||||
sigp %r9,%r2,__SIGP_SENSE /* Wait for resume CPU */
|
||||
brc 2,7b /* busy, try again */
|
||||
tmll %r9,0x40 /* Test if resume CPU is stopped */
|
||||
jz 7b
|
||||
|
||||
restore_registers:
|
||||
/* Restore registers */
|
||||
lghi %r13,0x1000 /* %r1 = pointer to save arae */
|
||||
|
||||
@@ -166,19 +232,33 @@ swsusp_arch_resume:
|
||||
/* Pointer to save area */
|
||||
lghi %r13,0x1000
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Switch CPUs */
|
||||
lgr %r2,%r10 /* get cpu id */
|
||||
llgf %r3,0x318(%r13)
|
||||
brasl %r14,smp_switch_boot_cpu_in_resume
|
||||
#endif
|
||||
/* Restore prefix register */
|
||||
spx 0x318(%r13)
|
||||
|
||||
/* Activate DAT */
|
||||
stosm __SF_EMPTY(%r15),0x04
|
||||
|
||||
/* Make all free pages unstable */
|
||||
lghi %r2,0
|
||||
brasl %r14,arch_set_page_states
|
||||
|
||||
/* Return 0 */
|
||||
lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15)
|
||||
lghi %r2,0
|
||||
br %r14
|
||||
|
||||
.section .data.nosave,"aw",@progbits
|
||||
.align 8
|
||||
.Ldisabled_wait_31:
|
||||
.long 0x000a0000,0x00000000
|
||||
.Lpanic_string:
|
||||
.asciz "Resume not possible because suspend CPU is no longer available"
|
||||
.align 8
|
||||
.Lrestart_diag308_psw:
|
||||
.long 0x00080000,0x80000000
|
||||
.Lrestart_suspend_psw:
|
||||
.quad 0x0000000180000000,restart_suspend
|
||||
.Lnew_pgm_check_psw:
|
||||
.quad 0,pgm_check_entry
|
||||
.Lresume_cpu:
|
||||
.byte 0,0
|
||||
|
@@ -19,7 +19,7 @@ SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall)
|
||||
SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper)
|
||||
SYSCALL(sys_link,sys_link,sys32_link_wrapper)
|
||||
SYSCALL(sys_unlink,sys_unlink,sys32_unlink_wrapper) /* 10 */
|
||||
SYSCALL(sys_execve,sys_execve,sys32_execve)
|
||||
SYSCALL(sys_execve,sys_execve,sys32_execve_wrapper)
|
||||
SYSCALL(sys_chdir,sys_chdir,sys32_chdir_wrapper)
|
||||
SYSCALL(sys_time,sys_ni_syscall,sys32_time_wrapper) /* old time syscall */
|
||||
SYSCALL(sys_mknod,sys_mknod,sys32_mknod_wrapper)
|
||||
@@ -128,7 +128,7 @@ SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper)
|
||||
SYSCALL(sys_ipc,sys_ipc,sys32_ipc_wrapper)
|
||||
SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper)
|
||||
SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn)
|
||||
SYSCALL(sys_clone,sys_clone,sys32_clone) /* 120 */
|
||||
SYSCALL(sys_clone,sys_clone,sys_clone_wrapper) /* 120 */
|
||||
SYSCALL(sys_setdomainname,sys_setdomainname,sys32_setdomainname_wrapper)
|
||||
SYSCALL(sys_newuname,sys_s390_newuname,sys32_newuname_wrapper)
|
||||
NI_SYSCALL /* modify_ldt for i386 */
|
||||
@@ -136,8 +136,8 @@ SYSCALL(sys_adjtimex,sys_adjtimex,compat_sys_adjtimex_wrapper)
|
||||
SYSCALL(sys_mprotect,sys_mprotect,sys32_mprotect_wrapper) /* 125 */
|
||||
SYSCALL(sys_sigprocmask,sys_sigprocmask,compat_sys_sigprocmask_wrapper)
|
||||
NI_SYSCALL /* old "create module" */
|
||||
SYSCALL(sys_init_module,sys_init_module,sys32_init_module_wrapper)
|
||||
SYSCALL(sys_delete_module,sys_delete_module,sys32_delete_module_wrapper)
|
||||
SYSCALL(sys_init_module,sys_init_module,sys_init_module_wrapper)
|
||||
SYSCALL(sys_delete_module,sys_delete_module,sys_delete_module_wrapper)
|
||||
NI_SYSCALL /* 130: old get_kernel_syms */
|
||||
SYSCALL(sys_quotactl,sys_quotactl,sys32_quotactl_wrapper)
|
||||
SYSCALL(sys_getpgid,sys_getpgid,sys32_getpgid_wrapper)
|
||||
|
@@ -50,28 +50,64 @@ void __init cmma_init(void)
|
||||
cmma_flag = 0;
|
||||
}
|
||||
|
||||
void arch_free_page(struct page *page, int order)
|
||||
static inline void set_page_unstable(struct page *page, int order)
|
||||
{
|
||||
int i, rc;
|
||||
|
||||
if (!cmma_flag)
|
||||
return;
|
||||
for (i = 0; i < (1 << order); i++)
|
||||
asm volatile(".insn rrf,0xb9ab0000,%0,%1,%2,0"
|
||||
: "=&d" (rc)
|
||||
: "a" ((page_to_pfn(page) + i) << PAGE_SHIFT),
|
||||
: "a" (page_to_phys(page + i)),
|
||||
"i" (ESSA_SET_UNUSED));
|
||||
}
|
||||
|
||||
void arch_free_page(struct page *page, int order)
|
||||
{
|
||||
if (!cmma_flag)
|
||||
return;
|
||||
set_page_unstable(page, order);
|
||||
}
|
||||
|
||||
static inline void set_page_stable(struct page *page, int order)
|
||||
{
|
||||
int i, rc;
|
||||
|
||||
for (i = 0; i < (1 << order); i++)
|
||||
asm volatile(".insn rrf,0xb9ab0000,%0,%1,%2,0"
|
||||
: "=&d" (rc)
|
||||
: "a" (page_to_phys(page + i)),
|
||||
"i" (ESSA_SET_STABLE));
|
||||
}
|
||||
|
||||
void arch_alloc_page(struct page *page, int order)
|
||||
{
|
||||
int i, rc;
|
||||
if (!cmma_flag)
|
||||
return;
|
||||
set_page_stable(page, order);
|
||||
}
|
||||
|
||||
void arch_set_page_states(int make_stable)
|
||||
{
|
||||
unsigned long flags, order, t;
|
||||
struct list_head *l;
|
||||
struct page *page;
|
||||
struct zone *zone;
|
||||
|
||||
if (!cmma_flag)
|
||||
return;
|
||||
for (i = 0; i < (1 << order); i++)
|
||||
asm volatile(".insn rrf,0xb9ab0000,%0,%1,%2,0"
|
||||
: "=&d" (rc)
|
||||
: "a" ((page_to_pfn(page) + i) << PAGE_SHIFT),
|
||||
"i" (ESSA_SET_STABLE));
|
||||
if (make_stable)
|
||||
drain_local_pages(NULL);
|
||||
for_each_populated_zone(zone) {
|
||||
spin_lock_irqsave(&zone->lock, flags);
|
||||
for_each_migratetype_order(order, t) {
|
||||
list_for_each(l, &zone->free_area[order].free_list[t]) {
|
||||
page = list_entry(l, struct page, lru);
|
||||
if (make_stable)
|
||||
set_page_stable(page, order);
|
||||
else
|
||||
set_page_unstable(page, order);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
}
|
||||
}
|
||||
|
@@ -314,21 +314,18 @@ int s390_enable_sie(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(s390_enable_sie);
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
#if defined(CONFIG_DEBUG_PAGEALLOC) && defined(CONFIG_HIBERNATION)
|
||||
bool kernel_page_present(struct page *page)
|
||||
{
|
||||
unsigned long addr;
|
||||
int cc;
|
||||
|
||||
addr = page_to_phys(page);
|
||||
asm("lra %1,0(%1)\n"
|
||||
"ipm %0\n"
|
||||
"srl %0,28"
|
||||
:"=d"(cc),"+a"(addr)::"cc");
|
||||
asm volatile(
|
||||
" lra %1,0(%1)\n"
|
||||
" ipm %0\n"
|
||||
" srl %0,28"
|
||||
: "=d" (cc), "+a" (addr) : : "cc");
|
||||
return cc == 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_HIBERNATION */
|
||||
#endif /* CONFIG_DEBUG_PAGEALLOC */
|
||||
|
||||
#endif /* CONFIG_HIBERNATION && CONFIG_DEBUG_PAGEALLOC */
|
||||
|
Reference in New Issue
Block a user