mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 01:53:29 +02:00
s390/cpufeature: Convert MACHINE_HAS_SEQ_INSN to cpu_has_seq_insn()
Convert MACHINE_HAS_... to cpu_has_...() which uses test_facility() instead of testing the machine_flags lowcore member if the feature is present. test_facility() generates better code since it results in a static branch without accessing memory. The branch is patched via alternatives by the decompressor depending on the availability of the required facility. Reviewed-by: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
parent
4a66f273c3
commit
679b110bb6
|
|
@ -9,6 +9,8 @@
|
|||
#ifndef __ASM_S390_CPUFEATURE_H
|
||||
#define __ASM_S390_CPUFEATURE_H
|
||||
|
||||
#include <asm/facility.h>
|
||||
|
||||
enum {
|
||||
S390_CPU_FEATURE_MSA,
|
||||
S390_CPU_FEATURE_VXRS,
|
||||
|
|
@ -20,4 +22,6 @@ enum {
|
|||
|
||||
int cpu_have_feature(unsigned int nr);
|
||||
|
||||
#define cpu_has_seq_insn() test_facility(85)
|
||||
|
||||
#endif /* __ASM_S390_CPUFEATURE_H */
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
#define MACHINE_FLAG_SCC BIT(17)
|
||||
#define MACHINE_FLAG_PCI_MIO BIT(18)
|
||||
#define MACHINE_FLAG_RDP BIT(19)
|
||||
#define MACHINE_FLAG_SEQ_INSN BIT(20)
|
||||
|
||||
#define LPP_MAGIC BIT(31)
|
||||
#define LPP_PID_MASK _AC(0xffffffff, UL)
|
||||
|
|
@ -96,7 +95,6 @@ extern unsigned long mio_wb_bit_mask;
|
|||
#define MACHINE_HAS_SCC (get_lowcore()->machine_flags & MACHINE_FLAG_SCC)
|
||||
#define MACHINE_HAS_PCI_MIO (get_lowcore()->machine_flags & MACHINE_FLAG_PCI_MIO)
|
||||
#define MACHINE_HAS_RDP (get_lowcore()->machine_flags & MACHINE_FLAG_RDP)
|
||||
#define MACHINE_HAS_SEQ_INSN (get_lowcore()->machine_flags & MACHINE_FLAG_SEQ_INSN)
|
||||
|
||||
/*
|
||||
* Console mode. Override with conmode=
|
||||
|
|
|
|||
|
|
@ -269,8 +269,6 @@ static __init void detect_machine_facilities(void)
|
|||
}
|
||||
if (test_facility(194))
|
||||
get_lowcore()->machine_flags |= MACHINE_FLAG_RDP;
|
||||
if (test_facility(85))
|
||||
get_lowcore()->machine_flags |= MACHINE_FLAG_SEQ_INSN;
|
||||
}
|
||||
|
||||
static inline void save_vector_registers(void)
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kmsan-checks.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/execmem.h>
|
||||
#include <trace/syscall.h>
|
||||
|
|
@ -69,7 +70,7 @@ static const char *ftrace_shared_hotpatch_trampoline(const char **end)
|
|||
|
||||
bool ftrace_need_init_nop(void)
|
||||
{
|
||||
return !MACHINE_HAS_SEQ_INSN;
|
||||
return !cpu_has_seq_insn();
|
||||
}
|
||||
|
||||
int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec)
|
||||
|
|
@ -189,7 +190,7 @@ static int ftrace_modify_trampoline_call(struct dyn_ftrace *rec,
|
|||
int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
|
||||
unsigned long addr)
|
||||
{
|
||||
if (MACHINE_HAS_SEQ_INSN)
|
||||
if (cpu_has_seq_insn())
|
||||
return ftrace_patch_branch_insn(rec->ip, old_addr, addr);
|
||||
else
|
||||
return ftrace_modify_trampoline_call(rec, old_addr, addr);
|
||||
|
|
@ -213,8 +214,8 @@ static int ftrace_patch_branch_mask(void *addr, u16 expected, bool enable)
|
|||
int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
|
||||
unsigned long addr)
|
||||
{
|
||||
/* Expect brcl 0xf,... for the !MACHINE_HAS_SEQ_INSN case */
|
||||
if (MACHINE_HAS_SEQ_INSN)
|
||||
/* Expect brcl 0xf,... for the !cpu_has_seq_insn() case */
|
||||
if (cpu_has_seq_insn())
|
||||
return ftrace_patch_branch_insn(rec->ip, addr, 0);
|
||||
else
|
||||
return ftrace_patch_branch_mask((void *)rec->ip, 0xc0f4, false);
|
||||
|
|
@ -234,7 +235,7 @@ static int ftrace_make_trampoline_call(struct dyn_ftrace *rec, unsigned long add
|
|||
|
||||
int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||
{
|
||||
if (MACHINE_HAS_SEQ_INSN)
|
||||
if (cpu_has_seq_insn())
|
||||
return ftrace_patch_branch_insn(rec->ip, 0, addr);
|
||||
else
|
||||
return ftrace_make_trampoline_call(rec, addr);
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/stop_machine.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/extable.h>
|
||||
|
|
@ -153,7 +154,7 @@ void arch_arm_kprobe(struct kprobe *p)
|
|||
{
|
||||
struct swap_insn_args args = {.p = p, .arm_kprobe = 1};
|
||||
|
||||
if (MACHINE_HAS_SEQ_INSN) {
|
||||
if (cpu_has_seq_insn()) {
|
||||
swap_instruction(&args);
|
||||
text_poke_sync();
|
||||
} else {
|
||||
|
|
@ -166,7 +167,7 @@ void arch_disarm_kprobe(struct kprobe *p)
|
|||
{
|
||||
struct swap_insn_args args = {.p = p, .arm_kprobe = 0};
|
||||
|
||||
if (MACHINE_HAS_SEQ_INSN) {
|
||||
if (cpu_has_seq_insn()) {
|
||||
swap_instruction(&args);
|
||||
text_poke_sync();
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user