提交 68e37028 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 updates from Martin Schwidefsky:
 - wire up the system calls seccomp, getrandom and memfd_create
 - use static system information as input to add_device_randomness
 - .. and three bug fixes

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/sclp: remove unnecessary XTABS flag
  s390/3215: fix tty output containing tabs
  s390: wire up memfd_create syscall
  s390: add system information as device randomness
  s390/kdump: Clear subchannel ID to signal non-CCW/SCSI IPL
  s390: wire up seccomp and getrandom syscalls
...@@ -283,7 +283,10 @@ ...@@ -283,7 +283,10 @@
#define __NR_sched_setattr 345 #define __NR_sched_setattr 345
#define __NR_sched_getattr 346 #define __NR_sched_getattr 346
#define __NR_renameat2 347 #define __NR_renameat2 347
#define NR_syscalls 348 #define __NR_seccomp 348
#define __NR_getrandom 349
#define __NR_memfd_create 350
#define NR_syscalls 351
/* /*
* There are some system calls that are not present on 64 bit, some * There are some system calls that are not present on 64 bit, some
......
...@@ -214,3 +214,6 @@ COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, fla ...@@ -214,3 +214,6 @@ COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, fla
COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags);
COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags);
COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags);
COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs)
COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags)
COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags)
...@@ -2060,6 +2060,13 @@ void s390_reset_system(void (*func)(void *), void *data) ...@@ -2060,6 +2060,13 @@ void s390_reset_system(void (*func)(void *), void *data)
S390_lowcore.program_new_psw.addr = S390_lowcore.program_new_psw.addr =
PSW_ADDR_AMODE | (unsigned long) s390_base_pgm_handler; PSW_ADDR_AMODE | (unsigned long) s390_base_pgm_handler;
/*
* Clear subchannel ID and number to signal new kernel that no CCW or
* SCSI IPL has been done (for kexec and kdump)
*/
S390_lowcore.subchannel_id = 0;
S390_lowcore.subchannel_nr = 0;
/* Store status at absolute zero */ /* Store status at absolute zero */
store_status(); store_status();
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/unistd.h> #include <linux/unistd.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/random.h>
#include <linux/user.h> #include <linux/user.h>
#include <linux/tty.h> #include <linux/tty.h>
#include <linux/ioport.h> #include <linux/ioport.h>
...@@ -61,6 +62,7 @@ ...@@ -61,6 +62,7 @@
#include <asm/diag.h> #include <asm/diag.h>
#include <asm/os_info.h> #include <asm/os_info.h>
#include <asm/sclp.h> #include <asm/sclp.h>
#include <asm/sysinfo.h>
#include "entry.h" #include "entry.h"
/* /*
...@@ -766,6 +768,7 @@ static void __init setup_hwcaps(void) ...@@ -766,6 +768,7 @@ static void __init setup_hwcaps(void)
#endif #endif
get_cpu_id(&cpu_id); get_cpu_id(&cpu_id);
add_device_randomness(&cpu_id, sizeof(cpu_id));
switch (cpu_id.machine) { switch (cpu_id.machine) {
case 0x9672: case 0x9672:
#if !defined(CONFIG_64BIT) #if !defined(CONFIG_64BIT)
...@@ -803,6 +806,19 @@ static void __init setup_hwcaps(void) ...@@ -803,6 +806,19 @@ static void __init setup_hwcaps(void)
} }
} }
/*
* Add system information as device randomness
*/
static void __init setup_randomness(void)
{
struct sysinfo_3_2_2 *vmms;
vmms = (struct sysinfo_3_2_2 *) alloc_page(GFP_KERNEL);
if (vmms && stsi(vmms, 3, 2, 2) == 0 && vmms->count)
add_device_randomness(&vmms, vmms->count);
free_page((unsigned long) vmms);
}
/* /*
* Setup function called from init/main.c just after the banner * Setup function called from init/main.c just after the banner
* was printed. * was printed.
...@@ -901,6 +917,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -901,6 +917,9 @@ void __init setup_arch(char **cmdline_p)
/* Setup zfcpdump support */ /* Setup zfcpdump support */
setup_zfcpdump(); setup_zfcpdump();
/* Add system specific data to the random pool */
setup_randomness();
} }
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
......
...@@ -356,3 +356,6 @@ SYSCALL(sys_finit_module,sys_finit_module,compat_sys_finit_module) ...@@ -356,3 +356,6 @@ SYSCALL(sys_finit_module,sys_finit_module,compat_sys_finit_module)
SYSCALL(sys_sched_setattr,sys_sched_setattr,compat_sys_sched_setattr) /* 345 */ SYSCALL(sys_sched_setattr,sys_sched_setattr,compat_sys_sched_setattr) /* 345 */
SYSCALL(sys_sched_getattr,sys_sched_getattr,compat_sys_sched_getattr) SYSCALL(sys_sched_getattr,sys_sched_getattr,compat_sys_sched_getattr)
SYSCALL(sys_renameat2,sys_renameat2,compat_sys_renameat2) SYSCALL(sys_renameat2,sys_renameat2,compat_sys_renameat2)
SYSCALL(sys_seccomp,sys_seccomp,compat_sys_seccomp)
SYSCALL(sys_getrandom,sys_getrandom,compat_sys_getrandom)
SYSCALL(sys_memfd_create,sys_memfd_create,compat_sys_memfd_create) /* 350 */
...@@ -1035,12 +1035,26 @@ static int tty3215_write(struct tty_struct * tty, ...@@ -1035,12 +1035,26 @@ static int tty3215_write(struct tty_struct * tty,
const unsigned char *buf, int count) const unsigned char *buf, int count)
{ {
struct raw3215_info *raw; struct raw3215_info *raw;
int i, written;
if (!tty) if (!tty)
return 0; return 0;
raw = (struct raw3215_info *) tty->driver_data; raw = (struct raw3215_info *) tty->driver_data;
raw3215_write(raw, buf, count); written = count;
return count; while (count > 0) {
for (i = 0; i < count; i++)
if (buf[i] == '\t' || buf[i] == '\n')
break;
raw3215_write(raw, buf, i);
count -= i;
buf += i;
if (count > 0) {
raw3215_putchar(raw, *buf);
count--;
buf++;
}
}
return written;
} }
/* /*
...@@ -1188,7 +1202,7 @@ static int __init tty3215_init(void) ...@@ -1188,7 +1202,7 @@ static int __init tty3215_init(void)
driver->subtype = SYSTEM_TYPE_TTY; driver->subtype = SYSTEM_TYPE_TTY;
driver->init_termios = tty_std_termios; driver->init_termios = tty_std_termios;
driver->init_termios.c_iflag = IGNBRK | IGNPAR; driver->init_termios.c_iflag = IGNBRK | IGNPAR;
driver->init_termios.c_oflag = ONLCR | XTABS; driver->init_termios.c_oflag = ONLCR;
driver->init_termios.c_lflag = ISIG; driver->init_termios.c_lflag = ISIG;
driver->flags = TTY_DRIVER_REAL_RAW; driver->flags = TTY_DRIVER_REAL_RAW;
tty_set_operations(driver, &tty3215_ops); tty_set_operations(driver, &tty3215_ops);
......
...@@ -559,7 +559,7 @@ sclp_tty_init(void) ...@@ -559,7 +559,7 @@ sclp_tty_init(void)
driver->subtype = SYSTEM_TYPE_TTY; driver->subtype = SYSTEM_TYPE_TTY;
driver->init_termios = tty_std_termios; driver->init_termios = tty_std_termios;
driver->init_termios.c_iflag = IGNBRK | IGNPAR; driver->init_termios.c_iflag = IGNBRK | IGNPAR;
driver->init_termios.c_oflag = ONLCR | XTABS; driver->init_termios.c_oflag = ONLCR;
driver->init_termios.c_lflag = ISIG | ECHO; driver->init_termios.c_lflag = ISIG | ECHO;
driver->flags = TTY_DRIVER_REAL_RAW; driver->flags = TTY_DRIVER_REAL_RAW;
tty_set_operations(driver, &sclp_ops); tty_set_operations(driver, &sclp_ops);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册