mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 11:06:41 -05:00
Merge tag 's390-6.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Alexander Gordeev: - Standardize on the __ASSEMBLER__ macro that is provided by GCC and Clang compilers and replace __ASSEMBLY__ with __ASSEMBLER__ in both uapi and non-uapi headers - Explicitly include <linux/export.h> in architecture and driver files which contain an EXPORT_SYMBOL() and remove the include from the files which do not contain the EXPORT_SYMBOL() - Use the full title of "z/Architecture Principles of Operation" manual and the name of a section where facility bits are listed - Use -D__DISABLE_EXPORTS for files in arch/s390/boot to avoid unnecessary slowing down of the build and confusing external kABI tools that process symtypes data - Print additional unrecoverable machine check information to make the root cause analysis easier - Move cmpxchg_user_key() handling to uaccess library code, since the generated code is large anyway and there is no benefit if it is inlined - Fix a problem when cmpxchg_user_key() is executing a code with a non-default key: if a system is IPL-ed with "LOAD NORMAL", and the previous system used storage keys where the fetch-protection bit was set for some pages, and the cmpxchg_user_key() is located within such page, a protection exception happens - Either the external call or emergency signal order is used to send an IPI to a remote CPU. Use the external order only, since it is at least as good and sometimes even better, than the emergency signal - In case of an early crash the early program check handler prints more or less random value of the last breaking event address, since it is not initialized properly. Copy the last breaking event address from the lowcore to pt_regs to address this - During STP synchronization check udelay() can not be used, since the first CPU modifies tod_clock_base and get_tod_clock_monotonic() might return a non-monotonic time. Instead, busy-loop on other CPUs, while the the first CPU actually handles the synchronization operation - When debugging the early kernel boot using QEMU with the -S flag and GDB attached, skip the decompressor and start directly in kernel - Rename PAI Crypto event 4210 according to z16 and z17 "z/Architecture Principles of Operation" manual - Remove the in-kernel time steering support in favour of the new s390 PTP driver, which allows the kernel clock steered more precisely - Remove a possible false-positive warning in pte_free_defer(), which could be triggered in a valid case KVM guest process is initializing * tag 's390-6.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (29 commits) s390/mm: Remove possible false-positive warning in pte_free_defer() s390/stp: Default to enabled s390/stp: Remove leap second support s390/time: Remove in-kernel time steering s390/sclp: Use monotonic clock in sclp_sync_wait() s390/smp: Use monotonic clock in smp_emergency_stop() s390/time: Use monotonic clock in get_cycles() s390/pai_crypto: Rename PAI Crypto event 4210 scripts/gdb/symbols: make lx-symbols skip the s390 decompressor s390/boot: Introduce jump_to_kernel() function s390/stp: Remove udelay from stp_sync_clock() s390/early: Copy last breaking event address to pt_regs s390/smp: Remove conditional emergency signal order code usage s390/uaccess: Merge cmpxchg_user_key() inline assemblies s390/uaccess: Prevent kprobes on cmpxchg_user_key() functions s390/uaccess: Initialize code pages executed with non-default access key s390/skey: Provide infrastructure for executing with non-default access key s390/uaccess: Make cmpxchg_user_key() library code s390/page: Add memory clobber to page_set_storage_key() s390/page: Cleanup page_set_storage_key() inline assemblies ...
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#define KMSG_COMPONENT "appldata"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched/stat.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
@@ -19,15 +19,15 @@ CC_FLAGS_MARCH_MINIMUM := -march=z10
|
||||
|
||||
KBUILD_AFLAGS := $(filter-out $(CC_FLAGS_MARCH),$(KBUILD_AFLAGS_DECOMPRESSOR))
|
||||
KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_MARCH),$(KBUILD_CFLAGS_DECOMPRESSOR))
|
||||
KBUILD_AFLAGS += $(CC_FLAGS_MARCH_MINIMUM)
|
||||
KBUILD_CFLAGS += $(CC_FLAGS_MARCH_MINIMUM)
|
||||
KBUILD_AFLAGS += $(CC_FLAGS_MARCH_MINIMUM) -D__DISABLE_EXPORTS
|
||||
KBUILD_CFLAGS += $(CC_FLAGS_MARCH_MINIMUM) -D__DISABLE_EXPORTS
|
||||
|
||||
CFLAGS_sclp_early_core.o += -I$(srctree)/drivers/s390/char
|
||||
|
||||
obj-y := head.o als.o startup.o physmem_info.o ipl_parm.o ipl_report.o vmem.o
|
||||
obj-y += string.o ebcdic.o sclp_early_core.o mem.o ipl_vmparm.o cmdline.o
|
||||
obj-y += version.o pgm_check.o ctype.o ipl_data.o relocs.o alternative.o
|
||||
obj-y += uv.o printk.o
|
||||
obj-y += uv.o printk.o trampoline.o
|
||||
obj-$(CONFIG_RANDOMIZE_BASE) += kaslr.o
|
||||
obj-y += $(if $(CONFIG_KERNEL_UNCOMPRESSED),,decompressor.o) info.o
|
||||
obj-$(CONFIG_KERNEL_ZSTD) += clz_ctz.o
|
||||
|
||||
@@ -65,7 +65,7 @@ static void facility_mismatch(void)
|
||||
boot_emerg("The Linux kernel requires more recent processor hardware\n");
|
||||
boot_emerg("Detected machine-type number: %4x\n", id.machine);
|
||||
print_missing_facilities();
|
||||
boot_emerg("See Principles of Operations for facility bits\n");
|
||||
boot_emerg("See z/Architecture Principles of Operation - Facility Indications\n");
|
||||
disabled_wait();
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
#define IPL_START 0x200
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/printk.h>
|
||||
#include <asm/physmem_info.h>
|
||||
@@ -74,6 +74,7 @@ void print_stacktrace(unsigned long sp);
|
||||
void error(char *m);
|
||||
int get_random(unsigned long limit, unsigned long *value);
|
||||
void boot_rb_dump(void);
|
||||
void __noreturn jump_to_kernel(psw_t *psw);
|
||||
|
||||
#ifndef boot_fmt
|
||||
#define boot_fmt(fmt) fmt
|
||||
@@ -121,5 +122,5 @@ static inline bool intersects(unsigned long addr0, unsigned long size0,
|
||||
{
|
||||
return addr0 + size0 > addr1 && addr1 + size1 > addr0;
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* BOOT_BOOT_H */
|
||||
|
||||
@@ -16,7 +16,9 @@ struct ipl_lowcore {
|
||||
struct ccw0 ccwpgm[2]; /* 0x0008 */
|
||||
u8 fill[56]; /* 0x0018 */
|
||||
struct ccw0 ccwpgmcc[20]; /* 0x0050 */
|
||||
u8 pad_0xf0[0x01a0-0x00f0]; /* 0x00f0 */
|
||||
u8 pad_0xf0[0x0140-0x00f0]; /* 0x00f0 */
|
||||
psw_t svc_old_psw; /* 0x0140 */
|
||||
u8 pad_0x150[0x01a0-0x0150]; /* 0x0150 */
|
||||
psw_t restart_psw; /* 0x01a0 */
|
||||
psw_t external_new_psw; /* 0x01b0 */
|
||||
psw_t svc_new_psw; /* 0x01c0 */
|
||||
@@ -75,6 +77,11 @@ static struct ipl_lowcore ipl_lowcore __used __section(".ipldata") = {
|
||||
[18] = CCW0(CCW_CMD_READ_IPL, 0x690, 0x50, CCW_FLAG_SLI | CCW_FLAG_CC),
|
||||
[19] = CCW0(CCW_CMD_READ_IPL, 0x6e0, 0x50, CCW_FLAG_SLI),
|
||||
},
|
||||
/*
|
||||
* Let the GDB's lx-symbols command find the jump_to_kernel symbol
|
||||
* without having to load decompressor symbols.
|
||||
*/
|
||||
.svc_old_psw = { .mask = 0, .addr = (unsigned long)jump_to_kernel },
|
||||
.restart_psw = { .mask = 0, .addr = IPL_START, },
|
||||
.external_new_psw = { .mask = PSW_MASK_DISABLED, .addr = __LC_EXT_NEW_PSW, },
|
||||
.svc_new_psw = { .mask = PSW_MASK_DISABLED, .addr = __LC_SVC_NEW_PSW, },
|
||||
|
||||
@@ -642,5 +642,5 @@ void startup_kernel(void)
|
||||
psw.addr = __kaslr_offset + vmlinux.entry;
|
||||
psw.mask = PSW_KERNEL_BITS;
|
||||
boot_debug("Starting kernel at: 0x%016lx\n", psw.addr);
|
||||
__load_psw(psw);
|
||||
jump_to_kernel(&psw);
|
||||
}
|
||||
|
||||
9
arch/s390/boot/trampoline.S
Normal file
9
arch/s390/boot/trampoline.S
Normal file
@@ -0,0 +1,9 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
# This function is identical to __load_psw(), but the lx-symbols GDB command
|
||||
# puts a breakpoint on it, so it needs to be kept separate.
|
||||
SYM_CODE_START(jump_to_kernel)
|
||||
lpswe 0(%r2)
|
||||
SYM_CODE_END(jump_to_kernel)
|
||||
@@ -6,6 +6,7 @@
|
||||
* Author(s): Harald Freudenberger
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/random.h>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/cpacf.h>
|
||||
#include "sha.h"
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
ALT_TYPE_SPEC << ALT_TYPE_SHIFT | \
|
||||
(facility) << ALT_DATA_SHIFT)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/stddef.h>
|
||||
@@ -183,7 +183,7 @@ static inline void apply_alternatives(struct alt_instr *start, struct alt_instr
|
||||
/* Use this macro if clobbers are needed without inputs. */
|
||||
#define ASM_NO_INPUT_CLOBBER(clobber...) : clobber
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
#else /* __ASSEMBLER__ */
|
||||
|
||||
/*
|
||||
* Issue one struct alt_instr descriptor entry (need to put it into
|
||||
@@ -233,6 +233,6 @@ static inline void apply_alternatives(struct alt_instr *start, struct alt_instr
|
||||
.popsection
|
||||
.endm
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _ASM_S390_ALTERNATIVE_H */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#ifndef _ASM_S390_ASM_CONST_H
|
||||
#define _ASM_S390_ASM_CONST_H
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#ifdef __ASSEMBLER__
|
||||
# define stringify_in_c(...) __VA_ARGS__
|
||||
#else
|
||||
/* This version of stringify will deal with commas... */
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#ifndef _ASM_S390_CPU_H
|
||||
#define _ASM_S390_CPU_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/jump_label.h>
|
||||
@@ -24,5 +24,5 @@ struct cpuid
|
||||
|
||||
DECLARE_STATIC_KEY_FALSE(cpu_has_bear);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* _ASM_S390_CPU_H */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#ifndef _ASM_S390_CPU_MF_INSN_H
|
||||
#define _ASM_S390_CPU_MF_INSN_H
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
/* Macro to generate the STCCTM instruction with a customized
|
||||
* M3 field designating the counter set.
|
||||
@@ -17,6 +17,6 @@
|
||||
.insn rsy,0xeb0000000017,\r1,\m3 & 0xf,\db2
|
||||
.endm
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
#define CR14_EXTERNAL_DAMAGE_SUBMASK BIT(CR14_EXTERNAL_DAMAGE_SUBMASK_BIT)
|
||||
#define CR14_WARNING_SUBMASK BIT(CR14_WARNING_SUBMASK_BIT)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/bug.h>
|
||||
|
||||
@@ -252,5 +252,5 @@ union ctlreg15 {
|
||||
};
|
||||
};
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* __ASM_S390_CTLREG_H */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#ifndef _ASM_S390_DWARF_H
|
||||
#define _ASM_S390_DWARF_H
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
#define CFI_STARTPROC .cfi_startproc
|
||||
#define CFI_ENDPROC .cfi_endproc
|
||||
@@ -33,6 +33,6 @@
|
||||
.cfi_sections .eh_frame, .debug_frame
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _ASM_S390_DWARF_H */
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
#ifndef _ASM_S390X_DCSS_H
|
||||
#define _ASM_S390X_DCSS_H
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/*
|
||||
* DCSS segment is defined as a contiguous range of pages using DEFSEG command.
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#error only <asm/fpu-insn.h> can be included directly
|
||||
#endif
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
/* Macros to generate vector instruction byte code */
|
||||
|
||||
@@ -750,5 +750,5 @@
|
||||
MRXBOPC 0, 0x77, v1, v2, v3
|
||||
.endm
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* __ASM_S390_FPU_INSN_ASM_H */
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
#include <asm/fpu-insn-asm.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/instrumented.h>
|
||||
#include <asm/asm-extable.h>
|
||||
@@ -475,5 +475,5 @@ static __always_inline void fpu_vzero(u8 v)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* __ASM_S390_FPU_INSN_H */
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#define ARCH_SUPPORTS_FTRACE_OPS 1
|
||||
#define MCOUNT_INSN_SIZE 6
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
static __always_inline unsigned long return_address(unsigned int n)
|
||||
@@ -134,7 +134,7 @@ void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
|
||||
struct ftrace_ops *op, struct ftrace_regs *fregs);
|
||||
#define ftrace_graph_func ftrace_graph_func
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#define EXT_IRQ_CP_SERVICE 0x2603
|
||||
#define EXT_IRQ_IUCV 0x4000
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/percpu.h>
|
||||
@@ -120,6 +120,6 @@ void irq_subclass_unregister(enum irq_subclass subclass);
|
||||
|
||||
#define irq_canonicalize(irq) (irq)
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _ASM_IRQ_H */
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#define HAVE_JUMP_LABEL_BATCH
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/stringify.h>
|
||||
@@ -51,5 +51,5 @@ static __always_inline bool arch_static_branch_jump(struct static_key *key, bool
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#define LOWCORE_ALT_ADDRESS _AC(0x70000, UL)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
struct pgm_tdb {
|
||||
u64 data[32];
|
||||
@@ -237,7 +237,7 @@ static inline void set_prefix(__u32 address)
|
||||
asm volatile("spx %0" : : "Q" (address) : "memory");
|
||||
}
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
#else /* __ASSEMBLER__ */
|
||||
|
||||
.macro GET_LC reg
|
||||
ALTERNATIVE "lghi \reg,0", \
|
||||
@@ -251,5 +251,5 @@ static inline void set_prefix(__u32 address)
|
||||
ALT_FEATURE(MFEATURE_LOWCORE)
|
||||
.endm
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* _ASM_S390_LOWCORE_H */
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define MFEATURE_LPAR 9
|
||||
#define MFEATURE_DIAG288 10
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <asm/alternative.h>
|
||||
@@ -100,5 +100,5 @@ DEFINE_MACHINE_HAS_FEATURE(lpar, MFEATURE_LPAR)
|
||||
#define machine_is_kvm machine_has_kvm
|
||||
#define machine_is_lpar machine_has_lpar
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* __ASM_S390_MACHINE_H */
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
#ifndef S390_MEM_ENCRYPT_H__
|
||||
#define S390_MEM_ENCRYPT_H__
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
int set_memory_encrypted(unsigned long vaddr, int numpages);
|
||||
int set_memory_decrypted(unsigned long vaddr, int numpages);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* S390_MEM_ENCRYPT_H__ */
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#define MCCK_CODE_FC_VALID BIT(63 - 43)
|
||||
#define MCCK_CODE_CPU_TIMER_VALID BIT(63 - 46)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
union mci {
|
||||
unsigned long val;
|
||||
@@ -104,5 +104,5 @@ void nmi_free_mcesa(u64 *mcesad);
|
||||
void s390_handle_mcck(void);
|
||||
void s390_do_machine_check(struct pt_regs *regs);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* _ASM_S390_NMI_H */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#ifndef _ASM_S390_EXPOLINE_H
|
||||
#define _ASM_S390_EXPOLINE_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/facility.h>
|
||||
@@ -42,6 +42,6 @@ void __s390_indirect_jump_r13(void);
|
||||
void __s390_indirect_jump_r14(void);
|
||||
void __s390_indirect_jump_r15(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _ASM_S390_EXPOLINE_H */
|
||||
|
||||
@@ -3,9 +3,10 @@
|
||||
#define _ASM_S390_NOSPEC_ASM_H
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/dwarf.h>
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
#ifdef CC_USING_EXPOLINE
|
||||
|
||||
@@ -128,6 +129,6 @@
|
||||
.endm
|
||||
#endif /* CC_USING_EXPOLINE */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _ASM_S390_NOSPEC_ASM_H */
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
|
||||
|
||||
#include <asm/setup.h>
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
void __storage_key_init_range(unsigned long start, unsigned long end);
|
||||
|
||||
@@ -130,11 +130,19 @@ typedef pte_t *pgtable_t;
|
||||
static inline void page_set_storage_key(unsigned long addr,
|
||||
unsigned char skey, int mapped)
|
||||
{
|
||||
if (!mapped)
|
||||
asm volatile(".insn rrf,0xb22b0000,%0,%1,8,0"
|
||||
: : "d" (skey), "a" (addr));
|
||||
else
|
||||
asm volatile("sske %0,%1" : : "d" (skey), "a" (addr));
|
||||
if (!mapped) {
|
||||
asm volatile(
|
||||
" .insn rrf,0xb22b0000,%[skey],%[addr],8,0"
|
||||
:
|
||||
: [skey] "d" (skey), [addr] "a" (addr)
|
||||
: "memory");
|
||||
} else {
|
||||
asm volatile(
|
||||
" sske %[skey],%[addr]"
|
||||
:
|
||||
: [skey] "d" (skey), [addr] "a" (addr)
|
||||
: "memory");
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned char page_get_storage_key(unsigned long addr)
|
||||
@@ -274,7 +282,7 @@ static inline unsigned long virt_to_pfn(const void *kaddr)
|
||||
|
||||
#define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_NON_EXEC
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* !__ASSEMBLER__ */
|
||||
|
||||
#include <asm-generic/memory_model.h>
|
||||
#include <asm-generic/getorder.h>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
#define RESTART_FLAG_CTLREGS _AC(1 << 0, U)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/linkage.h>
|
||||
@@ -418,6 +418,6 @@ static __always_inline void bpon(void)
|
||||
);
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* __ASM_S390_PROCESSOR_H */
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
PSW_DEFAULT_KEY | PSW_MASK_BASE | PSW_MASK_MCHECK | \
|
||||
PSW_MASK_PSTATE | PSW_ASC_PRIMARY)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
struct psw_bits {
|
||||
unsigned long : 1;
|
||||
@@ -292,5 +292,5 @@ static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
|
||||
regs->gprs[2] = rc;
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* _S390_PTRACE_H */
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
#ifndef _S390_PURGATORY_H_
|
||||
#define _S390_PURGATORY_H_
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/purgatory.h>
|
||||
|
||||
int verify_sha256_digest(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* _S390_PURGATORY_H_ */
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#define SCLP_ERRNOTIFY_AQ_INFO_LOG 2
|
||||
#define SCLP_ERRNOTIFY_AQ_OPTICS_DATA 3
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
#include <linux/uio.h>
|
||||
#include <asm/chpid.h>
|
||||
#include <asm/cpu.h>
|
||||
@@ -199,5 +199,5 @@ static inline int sclp_get_core_info(struct sclp_core_info *info, int early)
|
||||
return _sclp_get_core_info(info);
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* _ASM_S390_SCLP_H */
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
#define LEGACY_COMMAND_LINE_SIZE 896
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/types.h>
|
||||
@@ -41,6 +41,8 @@ struct parmarea {
|
||||
char command_line[COMMAND_LINE_SIZE]; /* 0x10480 */
|
||||
};
|
||||
|
||||
extern char arch_hw_string[128];
|
||||
|
||||
extern struct parmarea parmarea;
|
||||
|
||||
extern unsigned int zlib_dfltcc_support;
|
||||
@@ -100,5 +102,5 @@ static __always_inline u32 gen_lpswe(unsigned long addr)
|
||||
BUILD_BUG_ON(addr > 0xfff);
|
||||
return 0xb2b20000 | addr;
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* _ASM_S390_SETUP_H */
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
#define SIGP_STATUS_INCORRECT_STATE 0x00000200UL
|
||||
#define SIGP_STATUS_NOT_RUNNING 0x00000400UL
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <asm/asm.h>
|
||||
|
||||
@@ -68,6 +68,6 @@ static inline int __pcpu_sigp(u16 addr, u8 order, unsigned long parm,
|
||||
return cc;
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* __S390_ASM_SIGP_H */
|
||||
|
||||
32
arch/s390/include/asm/skey.h
Normal file
32
arch/s390/include/asm/skey.h
Normal file
@@ -0,0 +1,32 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ASM_SKEY_H
|
||||
#define __ASM_SKEY_H
|
||||
|
||||
#include <asm/rwonce.h>
|
||||
|
||||
struct skey_region {
|
||||
unsigned long start;
|
||||
unsigned long end;
|
||||
};
|
||||
|
||||
#define SKEY_REGION(_start, _end) \
|
||||
stringify_in_c(.section .skey_region,"a";) \
|
||||
stringify_in_c(.balign 8;) \
|
||||
stringify_in_c(.quad (_start);) \
|
||||
stringify_in_c(.quad (_end);) \
|
||||
stringify_in_c(.previous)
|
||||
|
||||
extern int skey_regions_initialized;
|
||||
extern struct skey_region __skey_region_start[];
|
||||
extern struct skey_region __skey_region_end[];
|
||||
|
||||
void __skey_regions_initialize(void);
|
||||
|
||||
static inline void skey_regions_initialize(void)
|
||||
{
|
||||
if (READ_ONCE(skey_regions_initialized))
|
||||
return;
|
||||
__skey_regions_initialize();
|
||||
}
|
||||
|
||||
#endif /* __ASM_SKEY_H */
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
#define STACK_INIT_OFFSET (THREAD_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/*
|
||||
* low level task data that entry.S needs immediate access to
|
||||
|
||||
@@ -196,13 +196,6 @@ static inline unsigned long get_tod_clock_fast(void)
|
||||
asm volatile("stckf %0" : "=Q" (clk) : : "cc");
|
||||
return clk;
|
||||
}
|
||||
|
||||
static inline cycles_t get_cycles(void)
|
||||
{
|
||||
return (cycles_t) get_tod_clock() >> 2;
|
||||
}
|
||||
#define get_cycles get_cycles
|
||||
|
||||
int get_phys_clock(unsigned long *clock);
|
||||
void init_cpu_timer(void);
|
||||
|
||||
@@ -230,6 +223,12 @@ static inline unsigned long get_tod_clock_monotonic(void)
|
||||
return tod;
|
||||
}
|
||||
|
||||
static inline cycles_t get_cycles(void)
|
||||
{
|
||||
return (cycles_t)get_tod_clock_monotonic() >> 2;
|
||||
}
|
||||
#define get_cycles get_cycles
|
||||
|
||||
/**
|
||||
* tod_to_ns - convert a TOD format value to nanoseconds
|
||||
* @todval: to be converted TOD format value
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <uapi/asm/schid.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/* I/O-Interruption Code as stored by TEST PENDING INTERRUPTION (TPI). */
|
||||
struct tpi_info {
|
||||
@@ -32,6 +32,6 @@ struct tpi_adapter_info {
|
||||
u32 :27;
|
||||
} __packed __aligned(4);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _ASM_S390_TPI_H */
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
#include <uapi/asm/types.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
union register_pair {
|
||||
unsigned __int128 pair;
|
||||
@@ -15,5 +15,5 @@ union register_pair {
|
||||
};
|
||||
};
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
#endif /* _ASM_S390_TYPES_H */
|
||||
|
||||
@@ -473,188 +473,30 @@ do { \
|
||||
|
||||
void __cmpxchg_user_key_called_with_bad_pointer(void);
|
||||
|
||||
#define CMPXCHG_USER_KEY_MAX_LOOPS 128
|
||||
int __cmpxchg_user_key1(unsigned long address, unsigned char *uval,
|
||||
unsigned char old, unsigned char new, unsigned long key);
|
||||
int __cmpxchg_user_key2(unsigned long address, unsigned short *uval,
|
||||
unsigned short old, unsigned short new, unsigned long key);
|
||||
int __cmpxchg_user_key4(unsigned long address, unsigned int *uval,
|
||||
unsigned int old, unsigned int new, unsigned long key);
|
||||
int __cmpxchg_user_key8(unsigned long address, unsigned long *uval,
|
||||
unsigned long old, unsigned long new, unsigned long key);
|
||||
int __cmpxchg_user_key16(unsigned long address, __uint128_t *uval,
|
||||
__uint128_t old, __uint128_t new, unsigned long key);
|
||||
|
||||
static __always_inline int __cmpxchg_user_key(unsigned long address, void *uval,
|
||||
__uint128_t old, __uint128_t new,
|
||||
unsigned long key, int size)
|
||||
static __always_inline int _cmpxchg_user_key(unsigned long address, void *uval,
|
||||
__uint128_t old, __uint128_t new,
|
||||
unsigned long key, int size)
|
||||
{
|
||||
bool sacf_flag;
|
||||
int rc = 0;
|
||||
|
||||
switch (size) {
|
||||
case 1: {
|
||||
unsigned int prev, shift, mask, _old, _new;
|
||||
unsigned long count;
|
||||
|
||||
shift = (3 ^ (address & 3)) << 3;
|
||||
address ^= address & 3;
|
||||
_old = ((unsigned int)old & 0xff) << shift;
|
||||
_new = ((unsigned int)new & 0xff) << shift;
|
||||
mask = ~(0xff << shift);
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
" spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
" llill %[count],%[max_loops]\n"
|
||||
"0: l %[prev],%[address]\n"
|
||||
"1: nr %[prev],%[mask]\n"
|
||||
" xilf %[mask],0xffffffff\n"
|
||||
" or %[new],%[prev]\n"
|
||||
" or %[prev],%[tmp]\n"
|
||||
"2: lr %[tmp],%[prev]\n"
|
||||
"3: cs %[prev],%[new],%[address]\n"
|
||||
"4: jnl 5f\n"
|
||||
" xr %[tmp],%[prev]\n"
|
||||
" xr %[new],%[tmp]\n"
|
||||
" nr %[tmp],%[mask]\n"
|
||||
" jnz 5f\n"
|
||||
" brct %[count],2b\n"
|
||||
"5: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
EX_TABLE_UA_LOAD_REG(0b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(1b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(3b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(4b, 5b, %[rc], %[prev])
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "=&d" (prev),
|
||||
[address] "+Q" (*(int *)address),
|
||||
[tmp] "+&d" (_old),
|
||||
[new] "+&d" (_new),
|
||||
[mask] "+&d" (mask),
|
||||
[count] "=a" (count)
|
||||
: [key] "%[count]" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY),
|
||||
[max_loops] "J" (CMPXCHG_USER_KEY_MAX_LOOPS)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*(unsigned char *)uval = prev >> shift;
|
||||
if (!count)
|
||||
rc = -EAGAIN;
|
||||
return rc;
|
||||
case 1: return __cmpxchg_user_key1(address, uval, old, new, key);
|
||||
case 2: return __cmpxchg_user_key2(address, uval, old, new, key);
|
||||
case 4: return __cmpxchg_user_key4(address, uval, old, new, key);
|
||||
case 8: return __cmpxchg_user_key8(address, uval, old, new, key);
|
||||
case 16: return __cmpxchg_user_key16(address, uval, old, new, key);
|
||||
default: __cmpxchg_user_key_called_with_bad_pointer();
|
||||
}
|
||||
case 2: {
|
||||
unsigned int prev, shift, mask, _old, _new;
|
||||
unsigned long count;
|
||||
|
||||
shift = (2 ^ (address & 2)) << 3;
|
||||
address ^= address & 2;
|
||||
_old = ((unsigned int)old & 0xffff) << shift;
|
||||
_new = ((unsigned int)new & 0xffff) << shift;
|
||||
mask = ~(0xffff << shift);
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
" spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
" llill %[count],%[max_loops]\n"
|
||||
"0: l %[prev],%[address]\n"
|
||||
"1: nr %[prev],%[mask]\n"
|
||||
" xilf %[mask],0xffffffff\n"
|
||||
" or %[new],%[prev]\n"
|
||||
" or %[prev],%[tmp]\n"
|
||||
"2: lr %[tmp],%[prev]\n"
|
||||
"3: cs %[prev],%[new],%[address]\n"
|
||||
"4: jnl 5f\n"
|
||||
" xr %[tmp],%[prev]\n"
|
||||
" xr %[new],%[tmp]\n"
|
||||
" nr %[tmp],%[mask]\n"
|
||||
" jnz 5f\n"
|
||||
" brct %[count],2b\n"
|
||||
"5: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
EX_TABLE_UA_LOAD_REG(0b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(1b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(3b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(4b, 5b, %[rc], %[prev])
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "=&d" (prev),
|
||||
[address] "+Q" (*(int *)address),
|
||||
[tmp] "+&d" (_old),
|
||||
[new] "+&d" (_new),
|
||||
[mask] "+&d" (mask),
|
||||
[count] "=a" (count)
|
||||
: [key] "%[count]" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY),
|
||||
[max_loops] "J" (CMPXCHG_USER_KEY_MAX_LOOPS)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*(unsigned short *)uval = prev >> shift;
|
||||
if (!count)
|
||||
rc = -EAGAIN;
|
||||
return rc;
|
||||
}
|
||||
case 4: {
|
||||
unsigned int prev = old;
|
||||
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
" spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
"0: cs %[prev],%[new],%[address]\n"
|
||||
"1: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
EX_TABLE_UA_LOAD_REG(0b, 1b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(1b, 1b, %[rc], %[prev])
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "+&d" (prev),
|
||||
[address] "+Q" (*(int *)address)
|
||||
: [new] "d" ((unsigned int)new),
|
||||
[key] "a" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*(unsigned int *)uval = prev;
|
||||
return rc;
|
||||
}
|
||||
case 8: {
|
||||
unsigned long prev = old;
|
||||
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
" spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
"0: csg %[prev],%[new],%[address]\n"
|
||||
"1: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
EX_TABLE_UA_LOAD_REG(0b, 1b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(1b, 1b, %[rc], %[prev])
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "+&d" (prev),
|
||||
[address] "+QS" (*(long *)address)
|
||||
: [new] "d" ((unsigned long)new),
|
||||
[key] "a" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*(unsigned long *)uval = prev;
|
||||
return rc;
|
||||
}
|
||||
case 16: {
|
||||
__uint128_t prev = old;
|
||||
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
" spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
"0: cdsg %[prev],%[new],%[address]\n"
|
||||
"1: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
EX_TABLE_UA_LOAD_REGPAIR(0b, 1b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REGPAIR(1b, 1b, %[rc], %[prev])
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "+&d" (prev),
|
||||
[address] "+QS" (*(__int128_t *)address)
|
||||
: [new] "d" (new),
|
||||
[key] "a" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*(__uint128_t *)uval = prev;
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
__cmpxchg_user_key_called_with_bad_pointer();
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -686,8 +528,8 @@ static __always_inline int __cmpxchg_user_key(unsigned long address, void *uval,
|
||||
BUILD_BUG_ON(sizeof(*(__ptr)) != sizeof(*(__uval))); \
|
||||
might_fault(); \
|
||||
__chk_user_ptr(__ptr); \
|
||||
__cmpxchg_user_key((unsigned long)(__ptr), (void *)(__uval), \
|
||||
(old), (new), (key), sizeof(*(__ptr))); \
|
||||
_cmpxchg_user_key((unsigned long)(__ptr), (void *)(__uval), \
|
||||
(old), (new), (key), sizeof(*(__ptr))); \
|
||||
})
|
||||
|
||||
#endif /* __S390_UACCESS_H */
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
|
||||
#include <vdso/datapage.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
int vdso_getcpu_init(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#define __VDSO_PAGES 4
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#ifndef __ASM_VDSO_GETRANDOM_H
|
||||
#define __ASM_VDSO_GETRANDOM_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <vdso/datapage.h>
|
||||
#include <asm/vdso/vsyscall.h>
|
||||
@@ -23,6 +23,6 @@ static __always_inline ssize_t getrandom_syscall(void *buffer, size_t len, unsig
|
||||
return syscall3(__NR_getrandom, (long)buffer, (long)len, (long)flags);
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* !__ASSEMBLER__ */
|
||||
|
||||
#endif /* __ASM_VDSO_GETRANDOM_H */
|
||||
|
||||
@@ -16,13 +16,7 @@
|
||||
|
||||
static inline u64 __arch_get_hw_counter(s32 clock_mode, const struct vdso_time_data *vd)
|
||||
{
|
||||
u64 adj, now;
|
||||
|
||||
now = get_tod_clock();
|
||||
adj = vd->arch_data.tod_steering_end - now;
|
||||
if (unlikely((s64) adj > 0))
|
||||
now += (vd->arch_data.tod_steering_delta < 0) ? (adj >> 15) : -(adj >> 15);
|
||||
return now;
|
||||
return get_tod_clock() - vd->arch_data.tod_delta;
|
||||
}
|
||||
|
||||
static __always_inline
|
||||
|
||||
@@ -5,8 +5,7 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
struct arch_vdso_time_data {
|
||||
__s64 tod_steering_delta;
|
||||
__u64 tod_steering_end;
|
||||
__s64 tod_delta;
|
||||
};
|
||||
|
||||
#endif /* __S390_ASM_VDSO_TIME_DATA_H */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#ifndef __ASM_VDSO_VSYSCALL_H
|
||||
#define __ASM_VDSO_VSYSCALL_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/hrtimer.h>
|
||||
#include <vdso/datapage.h>
|
||||
@@ -11,6 +11,6 @@
|
||||
/* The asm-generic header needs to be included after the definitions above */
|
||||
#include <asm-generic/vdso/vsyscall.h>
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* !__ASSEMBLER__ */
|
||||
|
||||
#endif /* __ASM_VDSO_VSYSCALL_H */
|
||||
|
||||
@@ -242,7 +242,8 @@
|
||||
#define PTRACE_OLDSETOPTIONS 21
|
||||
#define PTRACE_SYSEMU 31
|
||||
#define PTRACE_SYSEMU_SINGLESTEP 32
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -450,6 +451,6 @@ struct user_regs_struct {
|
||||
unsigned long ieee_instruction_pointer; /* obsolete, always 0 */
|
||||
};
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _UAPI_S390_PTRACE_H */
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
struct subchannel_id {
|
||||
__u32 cssid : 8;
|
||||
@@ -15,6 +15,6 @@ struct subchannel_id {
|
||||
__u32 sch_no : 16;
|
||||
} __attribute__ ((packed, aligned(4)));
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _UAPIASM_SCHID_H */
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include <asm-generic/int-ll64.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
typedef unsigned long addr_t;
|
||||
typedef __signed__ long saddr_t;
|
||||
@@ -25,6 +25,6 @@ typedef struct {
|
||||
};
|
||||
} __attribute__((packed, aligned(4))) __vector128;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* _UAPI_S390_TYPES_H */
|
||||
|
||||
@@ -41,7 +41,7 @@ obj-y += processor.o syscall.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o
|
||||
obj-y += debug.o irq.o ipl.o dis.o vdso.o cpufeature.o
|
||||
obj-y += sysinfo.o lgr.o os_info.o ctlreg.o
|
||||
obj-y += runtime_instr.o cache.o fpu.o dumpstack.o guarded_storage.o sthyi.o
|
||||
obj-y += entry.o reipl.o kdebugfs.o alternative.o
|
||||
obj-y += entry.o reipl.o kdebugfs.o alternative.o skey.o
|
||||
obj-y += nospec-branch.o ipl_vmparm.o machine_kexec_reloc.o unwind_bc.o
|
||||
obj-y += smp.o text_amode31.o stacktrace.o abs_lowcore.o facility.o uv.o wti.o
|
||||
obj-y += diag/
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/bug.h>
|
||||
#include <asm/machine.h>
|
||||
#include <asm/elf.h>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include <linux/irqflags.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
||||
@@ -105,6 +105,8 @@ static inline void strim_all(char *str)
|
||||
}
|
||||
}
|
||||
|
||||
char arch_hw_string[128];
|
||||
|
||||
static noinline __init void setup_arch_string(void)
|
||||
{
|
||||
struct sysinfo_1_1_1 *mach = (struct sysinfo_1_1_1 *)&sysinfo_page;
|
||||
@@ -131,6 +133,7 @@ static noinline __init void setup_arch_string(void)
|
||||
machine_is_vm() ? "z/VM" :
|
||||
machine_is_kvm() ? "KVM" : "unknown");
|
||||
}
|
||||
sprintf(arch_hw_string, "HW: %s (%s)", mstr, hvstr);
|
||||
dump_stack_set_arch_desc("%s (%s)", mstr, hvstr);
|
||||
}
|
||||
|
||||
@@ -154,6 +157,7 @@ void __init __do_early_pgm_check(struct pt_regs *regs)
|
||||
|
||||
regs->int_code = lc->pgm_int_code;
|
||||
regs->int_parm_long = lc->trans_exc_code;
|
||||
regs->last_break = lc->pgm_last_break;
|
||||
ip = __rewind_psw(regs->psw, regs->int_code >> 16);
|
||||
|
||||
/* Monitor Event? Might be a warning */
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* Copyright IBM Corp. 2023
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <asm/facility.h>
|
||||
|
||||
unsigned int stfle_size(void)
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
* Copyright IBM Corp. 2015
|
||||
* Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
@@ -21,7 +22,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/ctlreg.h>
|
||||
#include <asm/fpu.h>
|
||||
@@ -116,18 +116,82 @@ static __always_inline char *u64_to_hex(char *dest, u64 val)
|
||||
return dest;
|
||||
}
|
||||
|
||||
static notrace void nmi_print_info(void)
|
||||
{
|
||||
struct lowcore *lc = get_lowcore();
|
||||
char message[100];
|
||||
char *ptr;
|
||||
int i;
|
||||
|
||||
ptr = nmi_puts(message, "Unrecoverable machine check, code: ");
|
||||
ptr = u64_to_hex(ptr, lc->mcck_interruption_code);
|
||||
ptr = nmi_puts(ptr, "\n");
|
||||
sclp_emergency_printk(message);
|
||||
|
||||
ptr = nmi_puts(message, init_utsname()->release);
|
||||
ptr = nmi_puts(ptr, "\n");
|
||||
sclp_emergency_printk(message);
|
||||
|
||||
ptr = nmi_puts(message, arch_hw_string);
|
||||
ptr = nmi_puts(ptr, "\n");
|
||||
sclp_emergency_printk(message);
|
||||
|
||||
ptr = nmi_puts(message, "PSW: ");
|
||||
ptr = u64_to_hex(ptr, lc->mcck_old_psw.mask);
|
||||
ptr = nmi_puts(ptr, " ");
|
||||
ptr = u64_to_hex(ptr, lc->mcck_old_psw.addr);
|
||||
ptr = nmi_puts(ptr, " PFX: ");
|
||||
ptr = u64_to_hex(ptr, (u64)get_lowcore());
|
||||
ptr = nmi_puts(ptr, "\n");
|
||||
sclp_emergency_printk(message);
|
||||
|
||||
ptr = nmi_puts(message, "LBA: ");
|
||||
ptr = u64_to_hex(ptr, lc->last_break_save_area);
|
||||
ptr = nmi_puts(ptr, " EDC: ");
|
||||
ptr = u64_to_hex(ptr, lc->external_damage_code);
|
||||
ptr = nmi_puts(ptr, " FSA: ");
|
||||
ptr = u64_to_hex(ptr, lc->failing_storage_address);
|
||||
ptr = nmi_puts(ptr, "\n");
|
||||
sclp_emergency_printk(message);
|
||||
|
||||
ptr = nmi_puts(message, "CRS:\n");
|
||||
sclp_emergency_printk(message);
|
||||
ptr = message;
|
||||
for (i = 0; i < 16; i++) {
|
||||
ptr = u64_to_hex(ptr, lc->cregs_save_area[i].val);
|
||||
ptr = nmi_puts(ptr, " ");
|
||||
if ((i + 1) % 4 == 0) {
|
||||
ptr = nmi_puts(ptr, "\n");
|
||||
sclp_emergency_printk(message);
|
||||
ptr = message;
|
||||
}
|
||||
}
|
||||
|
||||
ptr = nmi_puts(message, "GPRS:\n");
|
||||
sclp_emergency_printk(message);
|
||||
ptr = message;
|
||||
for (i = 0; i < 16; i++) {
|
||||
ptr = u64_to_hex(ptr, lc->gpregs_save_area[i]);
|
||||
ptr = nmi_puts(ptr, " ");
|
||||
if ((i + 1) % 4 == 0) {
|
||||
ptr = nmi_puts(ptr, "\n");
|
||||
sclp_emergency_printk(message);
|
||||
ptr = message;
|
||||
}
|
||||
}
|
||||
|
||||
ptr = nmi_puts(message, "System stopped\n");
|
||||
sclp_emergency_printk(message);
|
||||
}
|
||||
|
||||
static notrace void s390_handle_damage(void)
|
||||
{
|
||||
struct lowcore *lc = get_lowcore();
|
||||
union ctlreg0 cr0, cr0_new;
|
||||
char message[100];
|
||||
psw_t psw_save;
|
||||
char *ptr;
|
||||
|
||||
smp_emergency_stop();
|
||||
diag_amode31_ops.diag308_reset();
|
||||
ptr = nmi_puts(message, "System stopped due to unrecoverable machine check, code: 0x");
|
||||
u64_to_hex(ptr, lc->mcck_interruption_code);
|
||||
|
||||
/*
|
||||
* Disable low address protection and make machine check new PSW a
|
||||
@@ -141,7 +205,7 @@ static notrace void s390_handle_damage(void)
|
||||
psw_bits(lc->mcck_new_psw).io = 0;
|
||||
psw_bits(lc->mcck_new_psw).ext = 0;
|
||||
psw_bits(lc->mcck_new_psw).wait = 1;
|
||||
sclp_emergency_printk(message);
|
||||
nmi_print_info();
|
||||
|
||||
/*
|
||||
* Restore machine check new PSW and control register 0 to original
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/pid.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/moduleparam.h>
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <asm/ctlreg.h>
|
||||
@@ -696,7 +695,7 @@ static const char * const paicrypt_ctrnames[] = {
|
||||
[111] = "PCC_COMPUTE_LAST_BLOCK_CMAC_USING_AES_256",
|
||||
[112] = "PCC_COMPUTE_LAST_BLOCK_CMAC_USING_ENCRYPTED_AES_128",
|
||||
[113] = "PCC_COMPUTE_LAST_BLOCK_CMAC_USING_ENCRYPTED_AES_192",
|
||||
[114] = "PCC_COMPUTE_LAST_BLOCK_CMAC_USING_ENCRYPTED_AES_256A",
|
||||
[114] = "PCC_COMPUTE_LAST_BLOCK_CMAC_USING_ENCRYPTED_AES_256",
|
||||
[115] = "PCC_COMPUTE_XTS_PARAMETER_USING_AES_128",
|
||||
[116] = "PCC_COMPUTE_XTS_PARAMETER_USING_AES_256",
|
||||
[117] = "PCC_COMPUTE_XTS_PARAMETER_USING_ENCRYPTED_AES_128",
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <asm/ctlreg.h>
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include <linux/compat.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/init_task.h>
|
||||
#include <linux/entry-common.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
48
arch/s390/kernel/skey.c
Normal file
48
arch/s390/kernel/skey.c
Normal file
@@ -0,0 +1,48 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <asm/rwonce.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/skey.h>
|
||||
|
||||
int skey_regions_initialized;
|
||||
|
||||
static inline unsigned long load_real_address(unsigned long address)
|
||||
{
|
||||
unsigned long real;
|
||||
|
||||
asm volatile(
|
||||
" lra %[real],0(%[address])\n"
|
||||
: [real] "=d" (real)
|
||||
: [address] "a" (address)
|
||||
: "cc");
|
||||
return real;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize storage keys of registered memory regions with the
|
||||
* default key. This is useful for code which is executed with a
|
||||
* non-default access key.
|
||||
*/
|
||||
void __skey_regions_initialize(void)
|
||||
{
|
||||
unsigned long address, real;
|
||||
struct skey_region *r, *end;
|
||||
|
||||
r = __skey_region_start;
|
||||
end = __skey_region_end;
|
||||
while (r < end) {
|
||||
address = r->start & PAGE_MASK;
|
||||
do {
|
||||
real = load_real_address(address);
|
||||
page_set_storage_key(real, PAGE_DEFAULT_KEY, 1);
|
||||
address += PAGE_SIZE;
|
||||
} while (address < r->end);
|
||||
r++;
|
||||
}
|
||||
/*
|
||||
* Make sure storage keys are initialized before
|
||||
* skey_regions_initialized is changed.
|
||||
*/
|
||||
barrier();
|
||||
WRITE_ONCE(skey_regions_initialized, 1);
|
||||
}
|
||||
@@ -175,13 +175,10 @@ static struct pcpu *pcpu_find_address(const struct cpumask *mask, u16 address)
|
||||
|
||||
static void pcpu_ec_call(struct pcpu *pcpu, int ec_bit)
|
||||
{
|
||||
int order;
|
||||
|
||||
if (test_and_set_bit(ec_bit, &pcpu->ec_mask))
|
||||
return;
|
||||
order = pcpu_running(pcpu) ? SIGP_EXTERNAL_CALL : SIGP_EMERGENCY_SIGNAL;
|
||||
pcpu->ec_clk = get_tod_clock_fast();
|
||||
pcpu_sigp_retry(pcpu, order, 0);
|
||||
pcpu_sigp_retry(pcpu, SIGP_EXTERNAL_CALL, 0);
|
||||
}
|
||||
|
||||
static int pcpu_alloc_lowcore(struct pcpu *pcpu, int cpu)
|
||||
@@ -433,16 +430,16 @@ void notrace smp_emergency_stop(void)
|
||||
cpumask_copy(&cpumask, cpu_online_mask);
|
||||
cpumask_clear_cpu(smp_processor_id(), &cpumask);
|
||||
|
||||
end = get_tod_clock() + (1000000UL << 12);
|
||||
end = get_tod_clock_monotonic() + (1000000UL << 12);
|
||||
for_each_cpu(cpu, &cpumask) {
|
||||
struct pcpu *pcpu = per_cpu_ptr(&pcpu_devices, cpu);
|
||||
set_bit(ec_stop_cpu, &pcpu->ec_mask);
|
||||
while (__pcpu_sigp(pcpu->address, SIGP_EMERGENCY_SIGNAL,
|
||||
0, NULL) == SIGP_CC_BUSY &&
|
||||
get_tod_clock() < end)
|
||||
get_tod_clock_monotonic() < end)
|
||||
cpu_relax();
|
||||
}
|
||||
while (get_tod_clock() < end) {
|
||||
while (get_tod_clock_monotonic() < end) {
|
||||
for_each_cpu(cpu, &cpumask)
|
||||
if (pcpu_stopped(per_cpu_ptr(&pcpu_devices, cpu)))
|
||||
cpumask_clear_cpu(cpu, &cpumask);
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
* Copyright IBM Corp. 2016
|
||||
* Author(s): Janosch Frank <frankja@linux.vnet.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
@@ -69,8 +69,6 @@ unsigned char ptff_function_mask[16];
|
||||
|
||||
static unsigned long lpar_offset;
|
||||
static unsigned long initial_leap_seconds;
|
||||
static unsigned long tod_steering_end;
|
||||
static long tod_steering_delta;
|
||||
|
||||
/*
|
||||
* Get time offsets with PTFF
|
||||
@@ -80,9 +78,7 @@ void __init time_early_init(void)
|
||||
struct ptff_qto qto;
|
||||
struct ptff_qui qui;
|
||||
|
||||
/* Initialize TOD steering parameters */
|
||||
tod_steering_end = tod_clock_base.tod;
|
||||
vdso_k_time_data->arch_data.tod_steering_end = tod_steering_end;
|
||||
vdso_k_time_data->arch_data.tod_delta = tod_clock_base.tod;
|
||||
|
||||
if (!test_facility(28))
|
||||
return;
|
||||
@@ -226,21 +222,7 @@ void __init read_persistent_wall_and_boot_offset(struct timespec64 *wall_time,
|
||||
|
||||
static u64 read_tod_clock(struct clocksource *cs)
|
||||
{
|
||||
unsigned long now, adj;
|
||||
|
||||
preempt_disable(); /* protect from changes to steering parameters */
|
||||
now = get_tod_clock();
|
||||
adj = tod_steering_end - now;
|
||||
if (unlikely((s64) adj > 0))
|
||||
/*
|
||||
* manually steer by 1 cycle every 2^16 cycles. This
|
||||
* corresponds to shifting the tod delta by 15. 1s is
|
||||
* therefore steered in ~9h. The adjust will decrease
|
||||
* over time, until it finally reaches 0.
|
||||
*/
|
||||
now += (tod_steering_delta < 0) ? (adj >> 15) : -(adj >> 15);
|
||||
preempt_enable();
|
||||
return now;
|
||||
return get_tod_clock_monotonic();
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_tod = {
|
||||
@@ -369,26 +351,11 @@ static inline int check_sync_clock(void)
|
||||
*/
|
||||
static void clock_sync_global(long delta)
|
||||
{
|
||||
unsigned long now, adj;
|
||||
struct ptff_qto qto;
|
||||
|
||||
/* Fixup the monotonic sched clock. */
|
||||
tod_clock_base.eitod += delta;
|
||||
/* Adjust TOD steering parameters. */
|
||||
now = get_tod_clock();
|
||||
adj = tod_steering_end - now;
|
||||
if (unlikely((s64) adj >= 0))
|
||||
/* Calculate how much of the old adjustment is left. */
|
||||
tod_steering_delta = (tod_steering_delta < 0) ?
|
||||
-(adj >> 15) : (adj >> 15);
|
||||
tod_steering_delta += delta;
|
||||
if ((abs(tod_steering_delta) >> 48) != 0)
|
||||
panic("TOD clock sync offset %li is too large to drift\n",
|
||||
tod_steering_delta);
|
||||
tod_steering_end = now + (abs(tod_steering_delta) << 15);
|
||||
vdso_k_time_data->arch_data.tod_steering_end = tod_steering_end;
|
||||
vdso_k_time_data->arch_data.tod_steering_delta = tod_steering_delta;
|
||||
|
||||
vdso_k_time_data->arch_data.tod_delta = tod_clock_base.tod;
|
||||
/* Update LPAR offset. */
|
||||
if (ptff_query(PTFF_QTO) && ptff(&qto, sizeof(qto), PTFF_QTO) == 0)
|
||||
lpar_offset = qto.tod_epoch_difference;
|
||||
@@ -430,7 +397,7 @@ struct clock_sync_data {
|
||||
/*
|
||||
* Server Time Protocol (STP) code.
|
||||
*/
|
||||
static bool stp_online;
|
||||
static bool stp_online = true;
|
||||
static struct stp_sstpi stp_info;
|
||||
static void *stp_page;
|
||||
|
||||
@@ -456,7 +423,6 @@ static void __init stp_reset(void)
|
||||
if (rc == 0)
|
||||
set_bit(CLOCK_SYNC_HAS_STP, &clock_sync_flags);
|
||||
else if (stp_online) {
|
||||
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 = false;
|
||||
@@ -580,7 +546,7 @@ static int stp_sync_clock(void *data)
|
||||
atomic_dec(&sync->cpus);
|
||||
/* Wait for in_sync to be set. */
|
||||
while (READ_ONCE(sync->in_sync) == 0)
|
||||
__udelay(1);
|
||||
;
|
||||
}
|
||||
if (sync->in_sync != 1)
|
||||
/* Didn't work. Clear per-cpu in sync bit again. */
|
||||
@@ -591,81 +557,6 @@ static int stp_sync_clock(void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stp_clear_leap(void)
|
||||
{
|
||||
struct __kernel_timex txc;
|
||||
int ret;
|
||||
|
||||
memset(&txc, 0, sizeof(txc));
|
||||
|
||||
ret = do_adjtimex(&txc);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
txc.modes = ADJ_STATUS;
|
||||
txc.status &= ~(STA_INS|STA_DEL);
|
||||
return do_adjtimex(&txc);
|
||||
}
|
||||
|
||||
static void stp_check_leap(void)
|
||||
{
|
||||
struct stp_stzi stzi;
|
||||
struct stp_lsoib *lsoib = &stzi.lsoib;
|
||||
struct __kernel_timex txc;
|
||||
int64_t timediff;
|
||||
int leapdiff, ret;
|
||||
|
||||
if (!stp_info.lu || !check_sync_clock()) {
|
||||
/*
|
||||
* Either a scheduled leap second was removed by the operator,
|
||||
* or STP is out of sync. In both cases, clear the leap second
|
||||
* kernel flags.
|
||||
*/
|
||||
if (stp_clear_leap() < 0)
|
||||
pr_err("failed to clear leap second flags\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (chsc_stzi(stp_page, &stzi, sizeof(stzi))) {
|
||||
pr_err("stzi failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
timediff = tod_to_ns(lsoib->nlsout - get_tod_clock()) / NSEC_PER_SEC;
|
||||
leapdiff = lsoib->nlso - lsoib->also;
|
||||
|
||||
if (leapdiff != 1 && leapdiff != -1) {
|
||||
pr_err("Cannot schedule %d leap seconds\n", leapdiff);
|
||||
return;
|
||||
}
|
||||
|
||||
if (timediff < 0) {
|
||||
if (stp_clear_leap() < 0)
|
||||
pr_err("failed to clear leap second flags\n");
|
||||
} else if (timediff < 7200) {
|
||||
memset(&txc, 0, sizeof(txc));
|
||||
ret = do_adjtimex(&txc);
|
||||
if (ret < 0)
|
||||
return;
|
||||
|
||||
txc.modes = ADJ_STATUS;
|
||||
if (leapdiff > 0)
|
||||
txc.status |= STA_INS;
|
||||
else
|
||||
txc.status |= STA_DEL;
|
||||
ret = do_adjtimex(&txc);
|
||||
if (ret < 0)
|
||||
pr_err("failed to set leap second flags\n");
|
||||
/* arm Timer to clear leap second flags */
|
||||
mod_timer(&stp_timer, jiffies + secs_to_jiffies(14400));
|
||||
} else {
|
||||
/* The day the leap second is scheduled for hasn't been reached. Retry
|
||||
* in one hour.
|
||||
*/
|
||||
mod_timer(&stp_timer, jiffies + secs_to_jiffies(3600));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* STP work. Check for the STP state and take over the clock
|
||||
* synchronization if the STP clock source is usable.
|
||||
@@ -707,8 +598,6 @@ static void stp_work_fn(struct work_struct *work)
|
||||
* Retry after a second.
|
||||
*/
|
||||
mod_timer(&stp_timer, jiffies + msecs_to_jiffies(MSEC_PER_SEC));
|
||||
else if (stp_info.lu)
|
||||
stp_check_leap();
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&stp_mutex);
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/task.h>
|
||||
#include <linux/sched/task_stack.h>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#define KMSG_COMPONENT "prot_virt"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
@@ -71,6 +71,13 @@ SECTIONS
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__end_ro_after_init = .;
|
||||
|
||||
. = ALIGN(8);
|
||||
.skey_region_table : {
|
||||
__skey_region_start = .;
|
||||
KEEP(*(.skey_region))
|
||||
__skey_region_end = .;
|
||||
}
|
||||
|
||||
.data.rel.ro : {
|
||||
*(.data.rel.ro .data.rel.ro.*)
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mmu_context.h>
|
||||
#include <linux/nospec.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/hrtimer.h>
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
* Copyright IBM Corp. 2019, 2020
|
||||
* Author(s): Janosch Frank <frankja@linux.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/kvm.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/minmax.h>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/processor.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/timex.h>
|
||||
|
||||
@@ -8,11 +8,13 @@
|
||||
* Gerald Schaefer (gerald.schaefer@de.ibm.com)
|
||||
*/
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/ctlreg.h>
|
||||
#include <asm/skey.h>
|
||||
|
||||
#ifdef CONFIG_DEBUG_ENTRY
|
||||
void debug_user_asce(int exit)
|
||||
@@ -145,3 +147,189 @@ unsigned long _copy_to_user_key(void __user *to, const void *from,
|
||||
return raw_copy_to_user_key(to, from, n, key);
|
||||
}
|
||||
EXPORT_SYMBOL(_copy_to_user_key);
|
||||
|
||||
#define CMPXCHG_USER_KEY_MAX_LOOPS 128
|
||||
|
||||
static nokprobe_inline int __cmpxchg_user_key_small(unsigned long address, unsigned int *uval,
|
||||
unsigned int old, unsigned int new,
|
||||
unsigned int mask, unsigned long key)
|
||||
{
|
||||
unsigned long count;
|
||||
unsigned int prev;
|
||||
bool sacf_flag;
|
||||
int rc = 0;
|
||||
|
||||
skey_regions_initialize();
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
"20: spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
" llill %[count],%[max_loops]\n"
|
||||
"0: l %[prev],%[address]\n"
|
||||
"1: nr %[prev],%[mask]\n"
|
||||
" xilf %[mask],0xffffffff\n"
|
||||
" or %[new],%[prev]\n"
|
||||
" or %[prev],%[tmp]\n"
|
||||
"2: lr %[tmp],%[prev]\n"
|
||||
"3: cs %[prev],%[new],%[address]\n"
|
||||
"4: jnl 5f\n"
|
||||
" xr %[tmp],%[prev]\n"
|
||||
" xr %[new],%[tmp]\n"
|
||||
" nr %[tmp],%[mask]\n"
|
||||
" jnz 5f\n"
|
||||
" brct %[count],2b\n"
|
||||
"5: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
"21:\n"
|
||||
EX_TABLE_UA_LOAD_REG(0b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(1b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(3b, 5b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(4b, 5b, %[rc], %[prev])
|
||||
SKEY_REGION(20b, 21b)
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "=&d" (prev),
|
||||
[address] "+Q" (*(int *)address),
|
||||
[tmp] "+&d" (old),
|
||||
[new] "+&d" (new),
|
||||
[mask] "+&d" (mask),
|
||||
[count] "=a" (count)
|
||||
: [key] "%[count]" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY),
|
||||
[max_loops] "J" (CMPXCHG_USER_KEY_MAX_LOOPS)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*uval = prev;
|
||||
if (!count)
|
||||
rc = -EAGAIN;
|
||||
return rc;
|
||||
}
|
||||
|
||||
int __kprobes __cmpxchg_user_key1(unsigned long address, unsigned char *uval,
|
||||
unsigned char old, unsigned char new, unsigned long key)
|
||||
{
|
||||
unsigned int prev, shift, mask, _old, _new;
|
||||
int rc;
|
||||
|
||||
shift = (3 ^ (address & 3)) << 3;
|
||||
address ^= address & 3;
|
||||
_old = (unsigned int)old << shift;
|
||||
_new = (unsigned int)new << shift;
|
||||
mask = ~(0xff << shift);
|
||||
rc = __cmpxchg_user_key_small(address, &prev, _old, _new, mask, key);
|
||||
*uval = prev >> shift;
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(__cmpxchg_user_key1);
|
||||
|
||||
int __kprobes __cmpxchg_user_key2(unsigned long address, unsigned short *uval,
|
||||
unsigned short old, unsigned short new, unsigned long key)
|
||||
{
|
||||
unsigned int prev, shift, mask, _old, _new;
|
||||
int rc;
|
||||
|
||||
shift = (2 ^ (address & 2)) << 3;
|
||||
address ^= address & 2;
|
||||
_old = (unsigned int)old << shift;
|
||||
_new = (unsigned int)new << shift;
|
||||
mask = ~(0xffff << shift);
|
||||
rc = __cmpxchg_user_key_small(address, &prev, _old, _new, mask, key);
|
||||
*uval = prev >> shift;
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(__cmpxchg_user_key2);
|
||||
|
||||
int __kprobes __cmpxchg_user_key4(unsigned long address, unsigned int *uval,
|
||||
unsigned int old, unsigned int new, unsigned long key)
|
||||
{
|
||||
unsigned int prev = old;
|
||||
bool sacf_flag;
|
||||
int rc = 0;
|
||||
|
||||
skey_regions_initialize();
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
"20: spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
"0: cs %[prev],%[new],%[address]\n"
|
||||
"1: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
"21:\n"
|
||||
EX_TABLE_UA_LOAD_REG(0b, 1b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(1b, 1b, %[rc], %[prev])
|
||||
SKEY_REGION(20b, 21b)
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "+&d" (prev),
|
||||
[address] "+Q" (*(int *)address)
|
||||
: [new] "d" (new),
|
||||
[key] "a" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*uval = prev;
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(__cmpxchg_user_key4);
|
||||
|
||||
int __kprobes __cmpxchg_user_key8(unsigned long address, unsigned long *uval,
|
||||
unsigned long old, unsigned long new, unsigned long key)
|
||||
{
|
||||
unsigned long prev = old;
|
||||
bool sacf_flag;
|
||||
int rc = 0;
|
||||
|
||||
skey_regions_initialize();
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
"20: spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
"0: csg %[prev],%[new],%[address]\n"
|
||||
"1: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
"21:\n"
|
||||
EX_TABLE_UA_LOAD_REG(0b, 1b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REG(1b, 1b, %[rc], %[prev])
|
||||
SKEY_REGION(20b, 21b)
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "+&d" (prev),
|
||||
[address] "+QS" (*(long *)address)
|
||||
: [new] "d" (new),
|
||||
[key] "a" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*uval = prev;
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(__cmpxchg_user_key8);
|
||||
|
||||
int __kprobes __cmpxchg_user_key16(unsigned long address, __uint128_t *uval,
|
||||
__uint128_t old, __uint128_t new, unsigned long key)
|
||||
{
|
||||
__uint128_t prev = old;
|
||||
bool sacf_flag;
|
||||
int rc = 0;
|
||||
|
||||
skey_regions_initialize();
|
||||
sacf_flag = enable_sacf_uaccess();
|
||||
asm_inline volatile(
|
||||
"20: spka 0(%[key])\n"
|
||||
" sacf 256\n"
|
||||
"0: cdsg %[prev],%[new],%[address]\n"
|
||||
"1: sacf 768\n"
|
||||
" spka %[default_key]\n"
|
||||
"21:\n"
|
||||
EX_TABLE_UA_LOAD_REGPAIR(0b, 1b, %[rc], %[prev])
|
||||
EX_TABLE_UA_LOAD_REGPAIR(1b, 1b, %[rc], %[prev])
|
||||
SKEY_REGION(20b, 21b)
|
||||
: [rc] "+&d" (rc),
|
||||
[prev] "+&d" (prev),
|
||||
[address] "+QS" (*(__int128_t *)address)
|
||||
: [new] "d" (new),
|
||||
[key] "a" (key << 4),
|
||||
[default_key] "J" (PAGE_DEFAULT_KEY)
|
||||
: "memory", "cc");
|
||||
disable_sacf_uaccess(sacf_flag);
|
||||
*uval = prev;
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(__cmpxchg_user_key16);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pagewalk.h>
|
||||
#include <linux/swap.h>
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
*
|
||||
* Copyright IBM Corp. 2007, 2025
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/mmap_lock.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
@@ -173,11 +173,6 @@ void pte_free_defer(struct mm_struct *mm, pgtable_t pgtable)
|
||||
struct ptdesc *ptdesc = virt_to_ptdesc(pgtable);
|
||||
|
||||
call_rcu(&ptdesc->pt_rcu_head, pte_free_now);
|
||||
/*
|
||||
* THPs are not allowed for KVM guests. Warn if pgste ever reaches here.
|
||||
* Turn to the generic pte_free_defer() version once gmap is removed.
|
||||
*/
|
||||
WARN_ON_ONCE(mm_has_pgste(mm));
|
||||
}
|
||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
#ifndef __ARCH_S390_NET_BPF_JIT_H
|
||||
#define __ARCH_S390_NET_BPF_JIT_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/filter.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
/*
|
||||
* Stackframe layout (packed stack):
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/jump_label.h>
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
* Copyright (C) IBM Corp. 2022. All rights reserved.
|
||||
* Author(s): Pierre Morel <pmorel@linux.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
struct zpci_kvm_hook zpci_kvm_hook;
|
||||
EXPORT_SYMBOL_GPL(zpci_kvm_hook);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
* Copyright IBM Corp. 1999, 2009
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
* Author(s): Stefan Weinhuber <wein@de.ibm.com>
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/blkpg.h>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
* Copyright IBM Corp. 2003, 2009
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/panic_notifier.h>
|
||||
@@ -719,7 +720,7 @@ sclp_sync_wait(void)
|
||||
timeout = 0;
|
||||
if (timer_pending(&sclp_request_timer)) {
|
||||
/* Get timeout TOD value */
|
||||
timeout = get_tod_clock_fast() +
|
||||
timeout = get_tod_clock_monotonic() +
|
||||
sclp_tod_from_jiffies(sclp_request_timer.expires -
|
||||
jiffies);
|
||||
}
|
||||
@@ -739,7 +740,7 @@ sclp_sync_wait(void)
|
||||
/* Loop until driver state indicates finished request */
|
||||
while (sclp_running_state != sclp_running_state_idle) {
|
||||
/* Check for expired request timer */
|
||||
if (get_tod_clock_fast() > timeout && timer_delete(&sclp_request_timer))
|
||||
if (get_tod_clock_monotonic() > timeout && timer_delete(&sclp_request_timer))
|
||||
sclp_request_timer.function(&sclp_request_timer);
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#define KMSG_COMPONENT "sclp_early"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <asm/ctlreg.h>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#define KMSG_COMPONENT "sclp_ocf"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/stat.h>
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/async.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/pgalloc.h>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define KMSG_COMPONENT "tape_34xx"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bio.h>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define KMSG_COMPONENT "tape_3590"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define KMSG_COMPONENT "tape"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "tape_class.h"
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#define KMSG_COMPONENT "tape"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h> // for kernel parameters
|
||||
#include <linux/kmod.h> // for requesting modules
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#define KMSG_COMPONENT "tape"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/bio.h>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user