Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Martin Schwidefsky: - New entropy generation for the pseudo random number generator. - Early boot printk output via sclp to help debug crashes on boot. This needs to be enabled with a kernel parameter. - Add proper no-execute support with a bit in the page table entry. - Bug fixes and cleanups. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (65 commits) s390/syscall: fix single stepped system calls s390/zcrypt: make ap_bus explicitly non-modular s390/zcrypt: Removed unneeded debug feature directory creation. s390: add missing "do {} while (0)" loop constructs to multiline macros s390/mm: add cond_resched call to kernel page table dumper s390: get rid of MACHINE_HAS_PFMF and MACHINE_HAS_HPAGE s390/mm: make memory_block_size_bytes available for !MEMORY_HOTPLUG s390: replace ACCESS_ONCE with READ_ONCE s390: Audit and remove any remaining unnecessary uses of module.h s390: mm: Audit and remove any unnecessary uses of module.h s390: kernel: Audit and remove any unnecessary uses of module.h s390/kdump: Use "LINUX" ELF note name instead of "CORE" s390: add no-execute support s390: report new vector facilities s390: use correct input data address for setup_randomness s390/sclp: get rid of common response code handling s390/sclp: don't add new lines to each printed string s390/sclp: make early sclp code readable s390/sclp: disable early sclp code as soon as the base sclp driver is active s390/sclp: move early printk code to drivers ...
This commit is contained in:
@@ -10,31 +10,25 @@ CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
||||
# Do not trace early setup code
|
||||
CFLAGS_REMOVE_als.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_early.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_sclp.o = $(CC_FLAGS_FTRACE)
|
||||
|
||||
endif
|
||||
|
||||
GCOV_PROFILE_als.o := n
|
||||
GCOV_PROFILE_early.o := n
|
||||
GCOV_PROFILE_sclp.o := n
|
||||
|
||||
KCOV_INSTRUMENT_als.o := n
|
||||
KCOV_INSTRUMENT_early.o := n
|
||||
KCOV_INSTRUMENT_sclp.o := n
|
||||
|
||||
UBSAN_SANITIZE_als.o := n
|
||||
UBSAN_SANITIZE_early.o := n
|
||||
UBSAN_SANITIZE_sclp.o := n
|
||||
|
||||
#
|
||||
# Use -march=z900 for sclp.c and als.c to be able to print an error
|
||||
# Use -march=z900 for als.c to be able to print an error
|
||||
# message if the kernel is started on a machine which is too old
|
||||
#
|
||||
ifneq ($(CC_FLAGS_MARCH),-march=z900)
|
||||
CFLAGS_REMOVE_als.o += $(CC_FLAGS_MARCH)
|
||||
CFLAGS_als.o += -march=z900
|
||||
CFLAGS_REMOVE_sclp.o += $(CC_FLAGS_MARCH)
|
||||
CFLAGS_sclp.o += -march=z900
|
||||
AFLAGS_REMOVE_head.o += $(CC_FLAGS_MARCH)
|
||||
AFLAGS_head.o += -march=z900
|
||||
endif
|
||||
@@ -61,7 +55,7 @@ CFLAGS_sysinfo.o += -w
|
||||
|
||||
obj-y := traps.o time.o process.o base.o early.o setup.o idle.o vtime.o
|
||||
obj-y += processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o
|
||||
obj-y += debug.o irq.o ipl.o dis.o diag.o sclp.o vdso.o als.o
|
||||
obj-y += debug.o irq.o ipl.o dis.o diag.o vdso.o als.o
|
||||
obj-y += sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o
|
||||
obj-y += runtime_instr.o cache.o fpu.o dumpstack.o
|
||||
obj-y += entry.o reipl.o relocate_kernel.o
|
||||
@@ -76,7 +70,7 @@ obj-$(CONFIG_AUDIT) += audit.o
|
||||
compat-obj-$(CONFIG_AUDIT) += compat_audit.o
|
||||
obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o
|
||||
obj-$(CONFIG_COMPAT) += compat_wrapper.o $(compat-obj-y)
|
||||
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
|
||||
|
@@ -41,7 +41,8 @@ static void __init print_machine_type(void)
|
||||
get_cpu_id(&id);
|
||||
u16_to_hex(type_str, id.machine);
|
||||
strcat(mach_str, type_str);
|
||||
_sclp_print_early(mach_str);
|
||||
strcat(mach_str, "\n");
|
||||
sclp_early_printk(mach_str);
|
||||
}
|
||||
|
||||
static void __init u16_to_decimal(char *str, u16 val)
|
||||
@@ -79,7 +80,8 @@ static void __init print_missing_facilities(void)
|
||||
* z/VM adds a four character prefix.
|
||||
*/
|
||||
if (strlen(als_str) > 70) {
|
||||
_sclp_print_early(als_str);
|
||||
strcat(als_str, "\n");
|
||||
sclp_early_printk(als_str);
|
||||
*als_str = '\0';
|
||||
}
|
||||
u16_to_decimal(val_str, i * BITS_PER_LONG + j);
|
||||
@@ -87,13 +89,14 @@ static void __init print_missing_facilities(void)
|
||||
first = 0;
|
||||
}
|
||||
}
|
||||
_sclp_print_early(als_str);
|
||||
_sclp_print_early("See Principles of Operations for facility bits");
|
||||
strcat(als_str, "\n");
|
||||
sclp_early_printk(als_str);
|
||||
sclp_early_printk("See Principles of Operations for facility bits\n");
|
||||
}
|
||||
|
||||
static void __init facility_mismatch(void)
|
||||
{
|
||||
_sclp_print_early("The Linux kernel requires more recent processor hardware");
|
||||
sclp_early_printk("The Linux kernel requires more recent processor hardware\n");
|
||||
print_machine_type();
|
||||
print_missing_facilities();
|
||||
disabled_wait(0x8badcccc);
|
||||
|
@@ -28,7 +28,6 @@
|
||||
#include <linux/shm.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/quota.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/personality.h>
|
||||
#include <linux/stat.h>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/stddef.h>
|
||||
|
@@ -8,7 +8,8 @@
|
||||
#include <linux/crash_dump.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/bootmem.h>
|
||||
@@ -329,7 +330,11 @@ static void *nt_init_name(void *buf, Elf64_Word type, void *desc, int d_len,
|
||||
|
||||
static inline void *nt_init(void *buf, Elf64_Word type, void *desc, int d_len)
|
||||
{
|
||||
return nt_init_name(buf, type, desc, d_len, KEXEC_CORE_NOTE_NAME);
|
||||
const char *note_name = "LINUX";
|
||||
|
||||
if (type == NT_PRPSINFO || type == NT_PRSTATUS || type == NT_PRFPREG)
|
||||
note_name = KEXEC_CORE_NOTE_NAME;
|
||||
return nt_init_name(buf, type, desc, d_len, note_name);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -20,7 +20,7 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/debugfs.h>
|
||||
@@ -866,7 +866,7 @@ static inline void
|
||||
debug_finish_entry(debug_info_t * id, debug_entry_t* active, int level,
|
||||
int exception)
|
||||
{
|
||||
active->id.stck = get_tod_clock_fast();
|
||||
active->id.stck = get_tod_clock_fast() - sched_clock_base_cc;
|
||||
active->id.fields.cpuid = smp_processor_id();
|
||||
active->caller = __builtin_return_address(0);
|
||||
active->id.fields.exception = exception;
|
||||
@@ -1455,23 +1455,24 @@ int
|
||||
debug_dflt_header_fn(debug_info_t * id, struct debug_view *view,
|
||||
int area, debug_entry_t * entry, char *out_buf)
|
||||
{
|
||||
struct timespec64 time_spec;
|
||||
unsigned long sec, usec;
|
||||
char *except_str;
|
||||
unsigned long caller;
|
||||
int rc = 0;
|
||||
unsigned int level;
|
||||
|
||||
level = entry->id.fields.level;
|
||||
stck_to_timespec64(entry->id.stck, &time_spec);
|
||||
sec = (entry->id.stck >> 12) + (sched_clock_base_cc >> 12);
|
||||
sec = sec - (TOD_UNIX_EPOCH >> 12);
|
||||
usec = do_div(sec, USEC_PER_SEC);
|
||||
|
||||
if (entry->id.fields.exception)
|
||||
except_str = "*";
|
||||
else
|
||||
except_str = "-";
|
||||
caller = (unsigned long) entry->caller;
|
||||
rc += sprintf(out_buf, "%02i %011lld:%06lu %1u %1s %02i %p ",
|
||||
area, (long long)time_spec.tv_sec,
|
||||
time_spec.tv_nsec / 1000, level, except_str,
|
||||
rc += sprintf(out_buf, "%02i %011ld:%06lu %1u %1s %02i %p ",
|
||||
area, sec, usec, level, except_str,
|
||||
entry->id.fields.cpuid, (void *)caller);
|
||||
return rc;
|
||||
}
|
||||
|
@@ -5,7 +5,8 @@
|
||||
* Author(s): Michael Holzheu <holzheu@de.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/debugfs.h>
|
||||
|
@@ -16,7 +16,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
@@ -354,6 +354,10 @@ static __init void detect_machine_facilities(void)
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_VX;
|
||||
__ctl_set_bit(0, 17);
|
||||
}
|
||||
if (test_facility(130)) {
|
||||
S390_lowcore.machine_flags |= MACHINE_FLAG_NX;
|
||||
__ctl_set_bit(0, 20);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void save_vector_registers(void)
|
||||
@@ -364,6 +368,18 @@ static inline void save_vector_registers(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static int __init topology_setup(char *str)
|
||||
{
|
||||
bool enabled;
|
||||
int rc;
|
||||
|
||||
rc = kstrtobool(str, &enabled);
|
||||
if (!rc && !enabled)
|
||||
S390_lowcore.machine_flags &= ~MACHINE_HAS_TOPOLOGY;
|
||||
return rc;
|
||||
}
|
||||
early_param("topology", topology_setup);
|
||||
|
||||
static int __init disable_vector_extension(char *str)
|
||||
{
|
||||
S390_lowcore.machine_flags &= ~MACHINE_FLAG_VX;
|
||||
@@ -372,6 +388,21 @@ static int __init disable_vector_extension(char *str)
|
||||
}
|
||||
early_param("novx", disable_vector_extension);
|
||||
|
||||
static int __init noexec_setup(char *str)
|
||||
{
|
||||
bool enabled;
|
||||
int rc;
|
||||
|
||||
rc = kstrtobool(str, &enabled);
|
||||
if (!rc && !enabled) {
|
||||
/* Disable no-execute support */
|
||||
S390_lowcore.machine_flags &= ~MACHINE_FLAG_NX;
|
||||
__ctl_clear_bit(0, 20);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
early_param("noexec", noexec_setup);
|
||||
|
||||
static int __init cad_setup(char *str)
|
||||
{
|
||||
int val;
|
||||
|
35
arch/s390/kernel/early_printk.c
Normal file
35
arch/s390/kernel/early_printk.c
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright IBM Corp. 2017
|
||||
*/
|
||||
|
||||
#include <linux/console.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/sclp.h>
|
||||
|
||||
static void sclp_early_write(struct console *con, const char *s, unsigned int len)
|
||||
{
|
||||
__sclp_early_printk(s, len);
|
||||
}
|
||||
|
||||
static struct console sclp_early_console = {
|
||||
.name = "earlysclp",
|
||||
.write = sclp_early_write,
|
||||
.flags = CON_PRINTBUFFER | CON_BOOT,
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
static int __init setup_early_printk(char *buf)
|
||||
{
|
||||
if (early_console)
|
||||
return 0;
|
||||
/* Accept only "earlyprintk" and "earlyprintk=sclp" */
|
||||
if (buf && strncmp(buf, "sclp", 4))
|
||||
return 0;
|
||||
if (!sclp.has_linemode && !sclp.has_vt220)
|
||||
return 0;
|
||||
early_console = &sclp_early_console;
|
||||
register_console(early_console);
|
||||
return 0;
|
||||
}
|
||||
early_param("earlyprintk", setup_early_printk);
|
@@ -8,8 +8,8 @@
|
||||
* Martin Peschke <peschke@fh-brandenburg.de>
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <asm/types.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/ebcdic.h>
|
||||
|
||||
/*
|
||||
|
@@ -103,8 +103,7 @@ _PIF_WORK = (_PIF_PER_TRAP)
|
||||
CHECK_STACK 1<<STACK_SHIFT,\savearea
|
||||
aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
|
||||
j 3f
|
||||
1: LAST_BREAK %r14
|
||||
UPDATE_VTIME %r14,%r15,\timer
|
||||
1: UPDATE_VTIME %r14,%r15,\timer
|
||||
2: lg %r15,__LC_ASYNC_STACK # load async stack
|
||||
3: la %r11,STACK_FRAME_OVERHEAD(%r15)
|
||||
.endm
|
||||
@@ -121,18 +120,6 @@ _PIF_WORK = (_PIF_PER_TRAP)
|
||||
mvc __LC_LAST_UPDATE_TIMER(8),\enter_timer
|
||||
.endm
|
||||
|
||||
.macro LAST_BREAK scratch
|
||||
srag \scratch,%r10,23
|
||||
#ifdef CONFIG_HAVE_MARCH_Z990_FEATURES
|
||||
jz .+10
|
||||
stg %r10,__TASK_thread+__THREAD_last_break(%r12)
|
||||
#else
|
||||
jz .+14
|
||||
lghi \scratch,__TASK_thread
|
||||
stg %r10,__THREAD_last_break(\scratch,%r12)
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro REENABLE_IRQS
|
||||
stg %r8,__LC_RETURN_PSW
|
||||
ni __LC_RETURN_PSW,0xbf
|
||||
@@ -278,15 +265,14 @@ ENTRY(system_call)
|
||||
stpt __LC_SYNC_ENTER_TIMER
|
||||
.Lsysc_stmg:
|
||||
stmg %r8,%r15,__LC_SAVE_AREA_SYNC
|
||||
lg %r10,__LC_LAST_BREAK
|
||||
lg %r12,__LC_CURRENT
|
||||
lghi %r13,__TASK_thread
|
||||
lghi %r14,_PIF_SYSCALL
|
||||
.Lsysc_per:
|
||||
lg %r15,__LC_KERNEL_STACK
|
||||
la %r11,STACK_FRAME_OVERHEAD(%r15) # pointer to pt_regs
|
||||
LAST_BREAK %r13
|
||||
.Lsysc_vtime:
|
||||
UPDATE_VTIME %r10,%r13,__LC_SYNC_ENTER_TIMER
|
||||
UPDATE_VTIME %r8,%r9,__LC_SYNC_ENTER_TIMER
|
||||
stmg %r0,%r7,__PT_R0(%r11)
|
||||
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC
|
||||
mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW
|
||||
@@ -294,12 +280,7 @@ ENTRY(system_call)
|
||||
stg %r14,__PT_FLAGS(%r11)
|
||||
.Lsysc_do_svc:
|
||||
# load address of system call table
|
||||
#ifdef CONFIG_HAVE_MARCH_Z990_FEATURES
|
||||
lg %r10,__TASK_thread+__THREAD_sysc_table(%r12)
|
||||
#else
|
||||
lghi %r13,__TASK_thread
|
||||
lg %r10,__THREAD_sysc_table(%r13,%r12)
|
||||
#endif
|
||||
llgh %r8,__PT_INT_CODE+2(%r11)
|
||||
slag %r8,%r8,2 # shift and test for svc 0
|
||||
jnz .Lsysc_nr_ok
|
||||
@@ -399,13 +380,11 @@ ENTRY(system_call)
|
||||
brasl %r14,do_signal
|
||||
TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL
|
||||
jno .Lsysc_return
|
||||
.Lsysc_do_syscall:
|
||||
lghi %r13,__TASK_thread
|
||||
lmg %r2,%r7,__PT_R2(%r11) # load svc arguments
|
||||
lghi %r8,0 # svc 0 returns -ENOSYS
|
||||
llgh %r1,__PT_INT_CODE+2(%r11) # load new svc number
|
||||
cghi %r1,NR_syscalls
|
||||
jnl .Lsysc_nr_ok # invalid svc number -> do svc 0
|
||||
slag %r8,%r1,2
|
||||
j .Lsysc_nr_ok # restart svc
|
||||
lghi %r1,0 # svc 0 returns -ENOSYS
|
||||
j .Lsysc_do_svc
|
||||
|
||||
#
|
||||
# _TIF_NOTIFY_RESUME is set, call do_notify_resume
|
||||
@@ -508,8 +487,7 @@ ENTRY(pgm_check_handler)
|
||||
1: CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC
|
||||
aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
|
||||
j 3f
|
||||
2: LAST_BREAK %r14
|
||||
UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER
|
||||
2: UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER
|
||||
lg %r15,__LC_KERNEL_STACK
|
||||
lgr %r14,%r12
|
||||
aghi %r14,__TASK_thread # pointer to thread_struct
|
||||
@@ -518,6 +496,7 @@ ENTRY(pgm_check_handler)
|
||||
jz 3f
|
||||
mvc __THREAD_trap_tdb(256,%r14),0(%r13)
|
||||
3: la %r11,STACK_FRAME_OVERHEAD(%r15)
|
||||
stg %r10,__THREAD_last_break(%r14)
|
||||
stmg %r0,%r7,__PT_R0(%r11)
|
||||
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC
|
||||
stmg %r8,%r9,__PT_PSW(%r11)
|
||||
@@ -547,6 +526,8 @@ ENTRY(pgm_check_handler)
|
||||
LOCKDEP_SYS_EXIT
|
||||
tm __PT_PSW+1(%r11),0x01 # returning to user ?
|
||||
jno .Lsysc_restore
|
||||
TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL
|
||||
jo .Lsysc_do_syscall
|
||||
j .Lsysc_tif
|
||||
|
||||
#
|
||||
@@ -564,6 +545,7 @@ ENTRY(pgm_check_handler)
|
||||
#
|
||||
.Lpgm_svcper:
|
||||
mvc __LC_RETURN_PSW(8),__LC_SVC_NEW_PSW
|
||||
lghi %r13,__TASK_thread
|
||||
larl %r14,.Lsysc_per
|
||||
stg %r14,__LC_RETURN_PSW+8
|
||||
lghi %r14,_PIF_SYSCALL | _PIF_PER_TRAP
|
||||
@@ -576,7 +558,6 @@ ENTRY(io_int_handler)
|
||||
STCK __LC_INT_CLOCK
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
stmg %r8,%r15,__LC_SAVE_AREA_ASYNC
|
||||
lg %r10,__LC_LAST_BREAK
|
||||
lg %r12,__LC_CURRENT
|
||||
larl %r13,cleanup_critical
|
||||
lmg %r8,%r9,__LC_IO_OLD_PSW
|
||||
@@ -750,7 +731,6 @@ ENTRY(ext_int_handler)
|
||||
STCK __LC_INT_CLOCK
|
||||
stpt __LC_ASYNC_ENTER_TIMER
|
||||
stmg %r8,%r15,__LC_SAVE_AREA_ASYNC
|
||||
lg %r10,__LC_LAST_BREAK
|
||||
lg %r12,__LC_CURRENT
|
||||
larl %r13,cleanup_critical
|
||||
lmg %r8,%r9,__LC_EXT_OLD_PSW
|
||||
@@ -893,7 +873,6 @@ ENTRY(mcck_int_handler)
|
||||
la %r1,4095 # revalidate r1
|
||||
spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer
|
||||
lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs
|
||||
lg %r10,__LC_LAST_BREAK
|
||||
lg %r12,__LC_CURRENT
|
||||
larl %r13,cleanup_critical
|
||||
lmg %r8,%r9,__LC_MCK_OLD_PSW
|
||||
@@ -1088,9 +1067,10 @@ cleanup_critical:
|
||||
0: # check if base register setup + TIF bit load has been done
|
||||
clg %r9,BASED(.Lcleanup_system_call_insn+16)
|
||||
jhe 0f
|
||||
# set up saved registers r10 and r12
|
||||
stg %r10,16(%r11) # r10 last break
|
||||
stg %r12,32(%r11) # r12 task struct pointer
|
||||
# set up saved register r12 task struct pointer
|
||||
stg %r12,32(%r11)
|
||||
# set up saved register r13 __TASK_thread offset
|
||||
mvc 40(8,%r11),BASED(.Lcleanup_system_call_const)
|
||||
0: # check if the user time update has been done
|
||||
clg %r9,BASED(.Lcleanup_system_call_insn+24)
|
||||
jh 0f
|
||||
@@ -1107,14 +1087,7 @@ cleanup_critical:
|
||||
stg %r15,__LC_SYSTEM_TIMER
|
||||
0: # update accounting time stamp
|
||||
mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER
|
||||
# do LAST_BREAK
|
||||
lg %r9,16(%r11)
|
||||
srag %r9,%r9,23
|
||||
jz 0f
|
||||
lgr %r9,%r12
|
||||
aghi %r9,__TASK_thread
|
||||
mvc __THREAD_last_break(8,%r9),16(%r11)
|
||||
0: # set up saved register r11
|
||||
# set up saved register r11
|
||||
lg %r15,__LC_KERNEL_STACK
|
||||
la %r9,STACK_FRAME_OVERHEAD(%r15)
|
||||
stg %r9,24(%r11) # r11 pt_regs pointer
|
||||
@@ -1136,6 +1109,8 @@ cleanup_critical:
|
||||
.quad .Lsysc_per
|
||||
.quad .Lsysc_vtime+36
|
||||
.quad .Lsysc_vtime+42
|
||||
.Lcleanup_system_call_const:
|
||||
.quad __TASK_thread
|
||||
|
||||
.Lcleanup_sysc_tif:
|
||||
larl %r9,.Lsysc_tif
|
||||
|
@@ -57,8 +57,8 @@ static ssize_t show_idle_count(struct device *dev,
|
||||
|
||||
do {
|
||||
seq = read_seqcount_begin(&idle->seqcount);
|
||||
idle_count = ACCESS_ONCE(idle->idle_count);
|
||||
if (ACCESS_ONCE(idle->clock_idle_enter))
|
||||
idle_count = READ_ONCE(idle->idle_count);
|
||||
if (READ_ONCE(idle->clock_idle_enter))
|
||||
idle_count++;
|
||||
} while (read_seqcount_retry(&idle->seqcount, seq));
|
||||
return sprintf(buf, "%llu\n", idle_count);
|
||||
@@ -75,9 +75,9 @@ static ssize_t show_idle_time(struct device *dev,
|
||||
do {
|
||||
now = get_tod_clock();
|
||||
seq = read_seqcount_begin(&idle->seqcount);
|
||||
idle_time = ACCESS_ONCE(idle->idle_time);
|
||||
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
||||
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
||||
idle_time = READ_ONCE(idle->idle_time);
|
||||
idle_enter = READ_ONCE(idle->clock_idle_enter);
|
||||
idle_exit = READ_ONCE(idle->clock_idle_exit);
|
||||
} while (read_seqcount_retry(&idle->seqcount, seq));
|
||||
idle_time += idle_enter ? ((idle_exit ? : now) - idle_enter) : 0;
|
||||
return sprintf(buf, "%llu\n", idle_time >> 12);
|
||||
@@ -93,8 +93,8 @@ u64 arch_cpu_idle_time(int cpu)
|
||||
do {
|
||||
now = get_tod_clock();
|
||||
seq = read_seqcount_begin(&idle->seqcount);
|
||||
idle_enter = ACCESS_ONCE(idle->clock_idle_enter);
|
||||
idle_exit = ACCESS_ONCE(idle->clock_idle_exit);
|
||||
idle_enter = READ_ONCE(idle->clock_idle_enter);
|
||||
idle_exit = READ_ONCE(idle->clock_idle_exit);
|
||||
} while (read_seqcount_retry(&idle->seqcount, seq));
|
||||
|
||||
return cputime_to_nsecs(idle_enter ? ((idle_exit ?: now) - idle_enter) : 0);
|
||||
|
@@ -8,7 +8,8 @@
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/reboot.h>
|
||||
@@ -1546,7 +1547,8 @@ static void dump_reipl_run(struct shutdown_trigger *trigger)
|
||||
unsigned long ipib = (unsigned long) reipl_block_actual;
|
||||
unsigned int csum;
|
||||
|
||||
csum = csum_partial(reipl_block_actual, reipl_block_actual->hdr.len, 0);
|
||||
csum = (__force unsigned int)
|
||||
csum_partial(reipl_block_actual, reipl_block_actual->hdr.len, 0);
|
||||
mem_assign_absolute(S390_lowcore.ipib, ipib);
|
||||
mem_assign_absolute(S390_lowcore.ipib_checksum, csum);
|
||||
dump_run(trigger);
|
||||
@@ -1863,7 +1865,7 @@ static int __init s390_ipl_init(void)
|
||||
{
|
||||
char str[8] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
|
||||
|
||||
sclp_get_ipl_info(&sclp_ipl_info);
|
||||
sclp_early_get_ipl_info(&sclp_ipl_info);
|
||||
/*
|
||||
* Fix loadparm: There are systems where the (SCSI) LOADPARM
|
||||
* returned by read SCP info is invalid (contains EBCDIC blanks)
|
||||
|
@@ -12,11 +12,12 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/profile.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/irq_regs.h>
|
||||
|
@@ -4,7 +4,6 @@
|
||||
* Copyright IBM Corp. 2011
|
||||
* Author(s): Jan Glauber <jang@linux.vnet.ibm.com>
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/stop_machine.h>
|
||||
#include <linux/jump_label.h>
|
||||
|
@@ -45,11 +45,17 @@ DEFINE_INSN_CACHE_OPS(dmainsn);
|
||||
|
||||
static void *alloc_dmainsn_page(void)
|
||||
{
|
||||
return (void *)__get_free_page(GFP_KERNEL | GFP_DMA);
|
||||
void *page;
|
||||
|
||||
page = (void *) __get_free_page(GFP_KERNEL | GFP_DMA);
|
||||
if (page)
|
||||
set_memory_x((unsigned long) page, 1);
|
||||
return page;
|
||||
}
|
||||
|
||||
static void free_dmainsn_page(void *page)
|
||||
{
|
||||
set_memory_nx((unsigned long) page, 1);
|
||||
free_page((unsigned long)page);
|
||||
}
|
||||
|
||||
|
@@ -45,7 +45,8 @@ void *module_alloc(unsigned long size)
|
||||
if (PAGE_ALIGN(size) > MODULES_LEN)
|
||||
return NULL;
|
||||
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
|
||||
GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE,
|
||||
GFP_KERNEL, PAGE_KERNEL_EXEC,
|
||||
0, NUMA_NO_NODE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
|
||||
|
@@ -13,7 +13,7 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/stp.h>
|
||||
|
@@ -26,7 +26,7 @@ static struct os_info os_info __page_aligned_data;
|
||||
u32 os_info_csum(struct os_info *os_info)
|
||||
{
|
||||
int size = sizeof(*os_info) - offsetof(struct os_info, version_major);
|
||||
return csum_partial(&os_info->version_major, size, 0);
|
||||
return (__force u32)csum_partial(&os_info->version_major, size, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -46,7 +46,7 @@ void os_info_entry_add(int nr, void *ptr, u64 size)
|
||||
{
|
||||
os_info.entry[nr].addr = (u64)(unsigned long)ptr;
|
||||
os_info.entry[nr].size = size;
|
||||
os_info.entry[nr].csum = csum_partial(ptr, size, 0);
|
||||
os_info.entry[nr].csum = (__force u32)csum_partial(ptr, size, 0);
|
||||
os_info.csum = os_info_csum(&os_info);
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ static void os_info_old_alloc(int nr, int align)
|
||||
msg = "copy failed";
|
||||
goto fail_free;
|
||||
}
|
||||
csum = csum_partial(buf_align, size, 0);
|
||||
csum = (__force u32)csum_partial(buf_align, size, 0);
|
||||
if (csum != os_info_old->entry[nr].csum) {
|
||||
msg = "checksum failed";
|
||||
goto fail_free;
|
||||
|
@@ -309,7 +309,7 @@ __init const struct attribute_group **cpumf_cf_event_group(void)
|
||||
default:
|
||||
model = NULL;
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
if (!model)
|
||||
goto out;
|
||||
|
@@ -23,7 +23,7 @@
|
||||
#include <linux/compat.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/init_task.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/processor.h>
|
||||
|
@@ -32,7 +32,7 @@ static bool machine_has_cpu_mhz;
|
||||
void __init cpu_detect_mhz_feature(void)
|
||||
{
|
||||
if (test_facility(34) && __ecag(ECAG_CPU_ATTRIBUTE, 0) != -1UL)
|
||||
machine_has_cpu_mhz = 1;
|
||||
machine_has_cpu_mhz = true;
|
||||
}
|
||||
|
||||
static void update_cpu_mhz(void *arg)
|
||||
@@ -92,7 +92,7 @@ static void show_cpu_summary(struct seq_file *m, void *v)
|
||||
{
|
||||
static const char *hwcap_str[] = {
|
||||
"esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp",
|
||||
"edat", "etf3eh", "highgprs", "te", "vx"
|
||||
"edat", "etf3eh", "highgprs", "te", "vx", "vxd", "vxe"
|
||||
};
|
||||
static const char * const int_hwcap_str[] = {
|
||||
"sie"
|
||||
|
@@ -1,196 +0,0 @@
|
||||
/*
|
||||
* Copyright IBM Corp. 2015
|
||||
* Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/ebcdic.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/sclp.h>
|
||||
|
||||
#define EVTYP_VT220MSG_MASK 0x00000040
|
||||
#define EVTYP_MSG_MASK 0x40000000
|
||||
|
||||
static char _sclp_work_area[4096] __aligned(PAGE_SIZE) __section(data);
|
||||
static bool have_vt220 __section(data);
|
||||
static bool have_linemode __section(data);
|
||||
|
||||
static void _sclp_wait_int(void)
|
||||
{
|
||||
unsigned long cr0, cr0_new, psw_mask, addr;
|
||||
psw_t psw_ext_save, psw_wait;
|
||||
|
||||
__ctl_store(cr0, 0, 0);
|
||||
cr0_new = cr0 | 0x200;
|
||||
__ctl_load(cr0_new, 0, 0);
|
||||
|
||||
psw_ext_save = S390_lowcore.external_new_psw;
|
||||
psw_mask = __extract_psw();
|
||||
S390_lowcore.external_new_psw.mask = psw_mask;
|
||||
psw_wait.mask = psw_mask | PSW_MASK_EXT | PSW_MASK_WAIT;
|
||||
S390_lowcore.ext_int_code = 0;
|
||||
|
||||
do {
|
||||
asm volatile(
|
||||
" larl %[addr],0f\n"
|
||||
" stg %[addr],%[psw_wait_addr]\n"
|
||||
" stg %[addr],%[psw_ext_addr]\n"
|
||||
" lpswe %[psw_wait]\n"
|
||||
"0:\n"
|
||||
: [addr] "=&d" (addr),
|
||||
[psw_wait_addr] "=Q" (psw_wait.addr),
|
||||
[psw_ext_addr] "=Q" (S390_lowcore.external_new_psw.addr)
|
||||
: [psw_wait] "Q" (psw_wait)
|
||||
: "cc", "memory");
|
||||
} while (S390_lowcore.ext_int_code != EXT_IRQ_SERVICE_SIG);
|
||||
|
||||
__ctl_load(cr0, 0, 0);
|
||||
S390_lowcore.external_new_psw = psw_ext_save;
|
||||
}
|
||||
|
||||
static int _sclp_servc(unsigned int cmd, char *sccb)
|
||||
{
|
||||
unsigned int cc;
|
||||
|
||||
do {
|
||||
asm volatile(
|
||||
" .insn rre,0xb2200000,%1,%2\n"
|
||||
" ipm %0\n"
|
||||
: "=d" (cc) : "d" (cmd), "a" (sccb)
|
||||
: "cc", "memory");
|
||||
cc >>= 28;
|
||||
if (cc == 3)
|
||||
return -EINVAL;
|
||||
_sclp_wait_int();
|
||||
} while (cc != 0);
|
||||
return (*(unsigned short *)(sccb + 6) == 0x20) ? 0 : -EIO;
|
||||
}
|
||||
|
||||
static int _sclp_setup(int disable)
|
||||
{
|
||||
static unsigned char init_sccb[] = {
|
||||
0x00, 0x1c,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x04,
|
||||
0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
unsigned int *masks;
|
||||
int rc;
|
||||
|
||||
memcpy(_sclp_work_area, init_sccb, 28);
|
||||
masks = (unsigned int *)(_sclp_work_area + 12);
|
||||
if (disable)
|
||||
memset(masks, 0, 16);
|
||||
/* SCLP write mask */
|
||||
rc = _sclp_servc(0x00780005, _sclp_work_area);
|
||||
if (rc)
|
||||
return rc;
|
||||
have_vt220 = masks[2] & EVTYP_VT220MSG_MASK;
|
||||
have_linemode = masks[2] & EVTYP_MSG_MASK;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Output multi-line text using SCLP Message interface. */
|
||||
static void _sclp_print_lm(const char *str)
|
||||
{
|
||||
static unsigned char write_head[] = {
|
||||
/* sccb header */
|
||||
0x00, 0x52, /* 0 */
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 2 */
|
||||
/* evbuf */
|
||||
0x00, 0x4a, /* 8 */
|
||||
0x02, 0x00, 0x00, 0x00, /* 10 */
|
||||
/* mdb */
|
||||
0x00, 0x44, /* 14 */
|
||||
0x00, 0x01, /* 16 */
|
||||
0xd4, 0xc4, 0xc2, 0x40, /* 18 */
|
||||
0x00, 0x00, 0x00, 0x01, /* 22 */
|
||||
/* go */
|
||||
0x00, 0x38, /* 26 */
|
||||
0x00, 0x01, /* 28 */
|
||||
0x00, 0x00, 0x00, 0x00, /* 30 */
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 34 */
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 42 */
|
||||
0x00, 0x00, 0x00, 0x00, /* 50 */
|
||||
0x00, 0x00, /* 54 */
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 56 */
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 64 */
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 72 */
|
||||
0x00, 0x00, /* 80 */
|
||||
};
|
||||
static unsigned char write_mto[] = {
|
||||
/* mto */
|
||||
0x00, 0x0a, /* 0 */
|
||||
0x00, 0x04, /* 2 */
|
||||
0x10, 0x00, /* 4 */
|
||||
0x00, 0x00, 0x00, 0x00 /* 6 */
|
||||
};
|
||||
unsigned char *ptr, ch;
|
||||
unsigned int count;
|
||||
|
||||
memcpy(_sclp_work_area, write_head, sizeof(write_head));
|
||||
ptr = _sclp_work_area + sizeof(write_head);
|
||||
do {
|
||||
memcpy(ptr, write_mto, sizeof(write_mto));
|
||||
for (count = sizeof(write_mto); (ch = *str++) != 0; count++) {
|
||||
if (ch == 0x0a)
|
||||
break;
|
||||
ptr[count] = _ascebc[ch];
|
||||
}
|
||||
/* Update length fields in mto, mdb, evbuf and sccb */
|
||||
*(unsigned short *) ptr = count;
|
||||
*(unsigned short *)(_sclp_work_area + 14) += count;
|
||||
*(unsigned short *)(_sclp_work_area + 8) += count;
|
||||
*(unsigned short *)(_sclp_work_area + 0) += count;
|
||||
ptr += count;
|
||||
} while (ch != 0);
|
||||
|
||||
/* SCLP write data */
|
||||
_sclp_servc(0x00760005, _sclp_work_area);
|
||||
}
|
||||
|
||||
/* Output multi-line text (plus a newline) using SCLP VT220
|
||||
* interface.
|
||||
*/
|
||||
static void _sclp_print_vt220(const char *str)
|
||||
{
|
||||
static unsigned char const write_head[] = {
|
||||
/* sccb header */
|
||||
0x00, 0x0e,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
/* evbuf header */
|
||||
0x00, 0x06,
|
||||
0x1a, 0x00, 0x00, 0x00,
|
||||
};
|
||||
size_t len = strlen(str);
|
||||
|
||||
if (sizeof(write_head) + len >= sizeof(_sclp_work_area))
|
||||
len = sizeof(_sclp_work_area) - sizeof(write_head) - 1;
|
||||
|
||||
memcpy(_sclp_work_area, write_head, sizeof(write_head));
|
||||
memcpy(_sclp_work_area + sizeof(write_head), str, len);
|
||||
_sclp_work_area[sizeof(write_head) + len] = '\n';
|
||||
|
||||
/* Update length fields in evbuf and sccb headers */
|
||||
*(unsigned short *)(_sclp_work_area + 8) += len + 1;
|
||||
*(unsigned short *)(_sclp_work_area + 0) += len + 1;
|
||||
|
||||
/* SCLP write data */
|
||||
(void)_sclp_servc(0x00760005, _sclp_work_area);
|
||||
}
|
||||
|
||||
/* Output one or more lines of text on the SCLP console (VT220 and /
|
||||
* or line-mode). All lines get terminated; no need for a trailing LF.
|
||||
*/
|
||||
void _sclp_print_early(const char *str)
|
||||
{
|
||||
if (_sclp_setup(0) != 0)
|
||||
return;
|
||||
if (have_linemode)
|
||||
_sclp_print_lm(str);
|
||||
if (have_vt220)
|
||||
_sclp_print_vt220(str);
|
||||
_sclp_setup(1);
|
||||
}
|
@@ -636,6 +636,8 @@ static void __init reserve_crashkernel(void)
|
||||
static void __init reserve_initrd(void)
|
||||
{
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (!INITRD_START || !INITRD_SIZE)
|
||||
return;
|
||||
initrd_start = INITRD_START;
|
||||
initrd_end = initrd_start + INITRD_SIZE;
|
||||
memblock_reserve(INITRD_START, INITRD_SIZE);
|
||||
@@ -747,7 +749,7 @@ static int __init setup_hwcaps(void)
|
||||
/*
|
||||
* Huge page support HWCAP_S390_HPAGE is bit 7.
|
||||
*/
|
||||
if (MACHINE_HAS_HPAGE)
|
||||
if (MACHINE_HAS_EDAT1)
|
||||
elf_hwcap |= HWCAP_S390_HPAGE;
|
||||
|
||||
/*
|
||||
@@ -767,8 +769,14 @@ static int __init setup_hwcaps(void)
|
||||
* can be disabled with the "novx" parameter. Use MACHINE_HAS_VX
|
||||
* instead of facility bit 129.
|
||||
*/
|
||||
if (MACHINE_HAS_VX)
|
||||
if (MACHINE_HAS_VX) {
|
||||
elf_hwcap |= HWCAP_S390_VXRS;
|
||||
if (test_facility(134))
|
||||
elf_hwcap |= HWCAP_S390_VXRS_EXT;
|
||||
if (test_facility(135))
|
||||
elf_hwcap |= HWCAP_S390_VXRS_BCD;
|
||||
}
|
||||
|
||||
get_cpu_id(&cpu_id);
|
||||
add_device_randomness(&cpu_id, sizeof(cpu_id));
|
||||
switch (cpu_id.machine) {
|
||||
@@ -820,10 +828,10 @@ 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);
|
||||
vmms = (struct sysinfo_3_2_2 *) memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
if (stsi(vmms, 3, 2, 2) == 0 && vmms->count)
|
||||
add_device_randomness(&vmms->vm, sizeof(vmms->vm[0]) * vmms->count);
|
||||
memblock_free((unsigned long) vmms, PAGE_SIZE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -20,7 +20,7 @@
|
||||
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/err.h>
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/stacktrace.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
static int __save_address(void *data, unsigned long address, int nosched)
|
||||
{
|
||||
|
@@ -196,7 +196,7 @@ pgm_check_entry:
|
||||
larl %r15,init_thread_union
|
||||
ahi %r15,1<<(PAGE_SHIFT+THREAD_SIZE_ORDER)
|
||||
larl %r2,.Lpanic_string
|
||||
larl %r3,_sclp_print_early
|
||||
larl %r3,sclp_early_printk
|
||||
lghi %r1,0
|
||||
sam31
|
||||
sigp %r1,%r0,SIGP_SET_ARCHITECTURE
|
||||
@@ -273,7 +273,7 @@ restore_registers:
|
||||
.Ldisabled_wait_31:
|
||||
.long 0x000a0000,0x00000000
|
||||
.Lpanic_string:
|
||||
.asciz "Resume not possible because suspend CPU is no longer available"
|
||||
.asciz "Resume not possible because suspend CPU is no longer available\n"
|
||||
.align 8
|
||||
.Lrestart_diag308_psw:
|
||||
.long 0x00080000,0x80000000
|
||||
|
@@ -10,7 +10,7 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/ebcdic.h>
|
||||
#include <asm/sysinfo.h>
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/param.h>
|
||||
@@ -110,7 +110,7 @@ unsigned long long monotonic_clock(void)
|
||||
}
|
||||
EXPORT_SYMBOL(monotonic_clock);
|
||||
|
||||
void tod_to_timeval(__u64 todval, struct timespec64 *xt)
|
||||
static void tod_to_timeval(__u64 todval, struct timespec64 *xt)
|
||||
{
|
||||
unsigned long long sec;
|
||||
|
||||
@@ -120,7 +120,6 @@ void tod_to_timeval(__u64 todval, struct timespec64 *xt)
|
||||
todval -= (sec * 1000000) << 12;
|
||||
xt->tv_nsec = ((todval * 1000) >> 12);
|
||||
}
|
||||
EXPORT_SYMBOL(tod_to_timeval);
|
||||
|
||||
void clock_comparator_work(void)
|
||||
{
|
||||
@@ -492,7 +491,7 @@ static void __init stp_reset(void)
|
||||
pr_warn("The real or virtual hardware system does not provide an STP interface\n");
|
||||
free_page((unsigned long) stp_page);
|
||||
stp_page = NULL;
|
||||
stp_online = 0;
|
||||
stp_online = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -38,7 +38,6 @@ static void set_topology_timer(void);
|
||||
static void topology_work_fn(struct work_struct *work);
|
||||
static struct sysinfo_15_1_x *tl_info;
|
||||
|
||||
static bool topology_enabled = true;
|
||||
static DECLARE_WORK(topology_work, topology_work_fn);
|
||||
|
||||
/*
|
||||
@@ -59,7 +58,7 @@ static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)
|
||||
cpumask_t mask;
|
||||
|
||||
cpumask_copy(&mask, cpumask_of(cpu));
|
||||
if (!topology_enabled || !MACHINE_HAS_TOPOLOGY)
|
||||
if (!MACHINE_HAS_TOPOLOGY)
|
||||
return mask;
|
||||
for (; info; info = info->next) {
|
||||
if (cpumask_test_cpu(cpu, &info->mask))
|
||||
@@ -74,7 +73,7 @@ static cpumask_t cpu_thread_map(unsigned int cpu)
|
||||
int i;
|
||||
|
||||
cpumask_copy(&mask, cpumask_of(cpu));
|
||||
if (!topology_enabled || !MACHINE_HAS_TOPOLOGY)
|
||||
if (!MACHINE_HAS_TOPOLOGY)
|
||||
return mask;
|
||||
cpu -= cpu % (smp_cpu_mtid + 1);
|
||||
for (i = 0; i <= smp_cpu_mtid; i++)
|
||||
@@ -428,12 +427,6 @@ static const struct cpumask *cpu_drawer_mask(int cpu)
|
||||
return &cpu_topology[cpu].drawer_mask;
|
||||
}
|
||||
|
||||
static int __init early_parse_topology(char *p)
|
||||
{
|
||||
return kstrtobool(p, &topology_enabled);
|
||||
}
|
||||
early_param("topology", early_parse_topology);
|
||||
|
||||
static struct sched_domain_topology_level s390_topology[] = {
|
||||
{ cpu_thread_mask, cpu_smt_flags, SD_INIT_NAME(SMT) },
|
||||
{ cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) },
|
||||
@@ -461,18 +454,16 @@ static void __init alloc_masks(struct sysinfo_15_1_x *info,
|
||||
void __init topology_init_early(void)
|
||||
{
|
||||
struct sysinfo_15_1_x *info;
|
||||
int i;
|
||||
|
||||
set_sched_topology(s390_topology);
|
||||
if (!MACHINE_HAS_TOPOLOGY)
|
||||
goto out;
|
||||
tl_info = memblock_virt_alloc(sizeof(*tl_info), PAGE_SIZE);
|
||||
tl_info = memblock_virt_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
info = tl_info;
|
||||
store_topology(info);
|
||||
pr_info("The CPU configuration topology of the machine is:");
|
||||
for (i = 0; i < TOPOLOGY_NR_MAG; i++)
|
||||
printk(KERN_CONT " %d", info->mag[i]);
|
||||
printk(KERN_CONT " / %d\n", info->mnest);
|
||||
pr_info("The CPU configuration topology of the machine is: %d %d %d %d %d %d / %d\n",
|
||||
info->mag[0], info->mag[1], info->mag[2], info->mag[3],
|
||||
info->mag[4], info->mag[5], info->mnest);
|
||||
alloc_masks(info, &socket_info, 1);
|
||||
alloc_masks(info, &book_info, 2);
|
||||
alloc_masks(info, &drawer_info, 3);
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
|
@@ -44,6 +44,7 @@ SECTIONS
|
||||
*(.gnu.warning)
|
||||
} :text = 0x0700
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_etext = .; /* End of text section */
|
||||
|
||||
NOTES :text :note
|
||||
@@ -79,7 +80,13 @@ SECTIONS
|
||||
. = ALIGN(PAGE_SIZE); /* Init code and data */
|
||||
__init_begin = .;
|
||||
|
||||
INIT_TEXT_SECTION(PAGE_SIZE)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
|
||||
VMLINUX_SYMBOL(_sinittext) = . ;
|
||||
INIT_TEXT
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
VMLINUX_SYMBOL(_einittext) = . ;
|
||||
}
|
||||
|
||||
/*
|
||||
* .exit.text is discarded at runtime, not link time,
|
||||
|
Reference in New Issue
Block a user