s390/cpufeature: Convert MACHINE_HAS_NX to cpu_has_nx()
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:
committed by
Vasily Gorbik
parent
42805261fc
commit
b49ee5b386
@@ -59,7 +59,7 @@ static void detect_facilities(void)
|
||||
page_noexec_mask = -1UL;
|
||||
segment_noexec_mask = -1UL;
|
||||
region_noexec_mask = -1UL;
|
||||
if (!test_facility(130)) {
|
||||
if (!cpu_has_nx()) {
|
||||
page_noexec_mask &= ~_PAGE_NOEXEC;
|
||||
segment_noexec_mask &= ~_SEGMENT_ENTRY_NOEXEC;
|
||||
region_noexec_mask &= ~_REGION_ENTRY_NOEXEC;
|
||||
|
||||
@@ -23,6 +23,7 @@ enum {
|
||||
int cpu_have_feature(unsigned int nr);
|
||||
|
||||
#define cpu_has_gs() test_facility(133)
|
||||
#define cpu_has_nx() test_facility(130)
|
||||
#define cpu_has_rdp() test_facility(194)
|
||||
#define cpu_has_seq_insn() test_facility(85)
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#define MACHINE_FLAG_TE BIT(11)
|
||||
#define MACHINE_FLAG_TLB_LC BIT(12)
|
||||
#define MACHINE_FLAG_TLB_GUEST BIT(14)
|
||||
#define MACHINE_FLAG_NX BIT(15)
|
||||
#define MACHINE_FLAG_SCC BIT(17)
|
||||
#define MACHINE_FLAG_PCI_MIO BIT(18)
|
||||
|
||||
@@ -88,7 +87,6 @@ extern unsigned long mio_wb_bit_mask;
|
||||
#define MACHINE_HAS_TE (get_lowcore()->machine_flags & MACHINE_FLAG_TE)
|
||||
#define MACHINE_HAS_TLB_LC (get_lowcore()->machine_flags & MACHINE_FLAG_TLB_LC)
|
||||
#define MACHINE_HAS_TLB_GUEST (get_lowcore()->machine_flags & MACHINE_FLAG_TLB_GUEST)
|
||||
#define MACHINE_HAS_NX (get_lowcore()->machine_flags & MACHINE_FLAG_NX)
|
||||
#define MACHINE_HAS_SCC (get_lowcore()->machine_flags & MACHINE_FLAG_SCC)
|
||||
#define MACHINE_HAS_PCI_MIO (get_lowcore()->machine_flags & MACHINE_FLAG_PCI_MIO)
|
||||
|
||||
|
||||
@@ -253,8 +253,6 @@ static __init void detect_machine_facilities(void)
|
||||
get_lowcore()->machine_flags |= MACHINE_FLAG_TLB_LC;
|
||||
if (test_facility(129))
|
||||
system_ctl_set_bit(0, CR0_VECTOR_BIT);
|
||||
if (test_facility(130))
|
||||
get_lowcore()->machine_flags |= MACHINE_FLAG_NX;
|
||||
if (test_facility(139) && (tod_clock_base.tod >> 63)) {
|
||||
/* Enabled signed clock comparator comparisons */
|
||||
get_lowcore()->machine_flags |= MACHINE_FLAG_SCC;
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/set_memory.h>
|
||||
#include <linux/ptdump.h>
|
||||
#include <linux/seq_file.h>
|
||||
@@ -167,7 +169,7 @@ bool ptdump_check_wx(void)
|
||||
},
|
||||
};
|
||||
|
||||
if (!MACHINE_HAS_NX)
|
||||
if (!cpu_has_nx())
|
||||
return true;
|
||||
ptdump_walk_pgd(&st.ptdump, &init_mm, NULL);
|
||||
if (st.wx_pages) {
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/mmu_context.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
@@ -366,7 +367,7 @@ void do_protection_exception(struct pt_regs *regs)
|
||||
*/
|
||||
return handle_fault_error_nolock(regs, 0);
|
||||
}
|
||||
if (unlikely(MACHINE_HAS_NX && teid.b56)) {
|
||||
if (unlikely(cpu_has_nx() && teid.b56)) {
|
||||
regs->int_parm_long = (teid.addr * PAGE_SIZE) | (regs->psw.addr & PAGE_MASK);
|
||||
return handle_fault_error_nolock(regs, SEGV_ACCERR);
|
||||
}
|
||||
|
||||
+2
-1
@@ -8,6 +8,7 @@
|
||||
* Copyright (C) 1995 Linus Torvalds
|
||||
*/
|
||||
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -117,7 +118,7 @@ void mark_rodata_ro(void)
|
||||
{
|
||||
unsigned long size = __end_ro_after_init - __start_ro_after_init;
|
||||
|
||||
if (MACHINE_HAS_NX)
|
||||
if (cpu_has_nx())
|
||||
system_ctl_set_bit(0, CR0_INSTRUCTION_EXEC_PROTECTION_BIT);
|
||||
__set_memory_ro(__start_ro_after_init, __end_ro_after_init);
|
||||
pr_info("Write protected read-only-after-init data: %luk\n", size >> 10);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* Copyright IBM Corp. 2011
|
||||
* Author(s): Jan Glauber <jang@linux.vnet.ibm.com>
|
||||
*/
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/vmalloc.h>
|
||||
@@ -373,7 +374,7 @@ int __set_memory(unsigned long addr, unsigned long numpages, unsigned long flags
|
||||
unsigned long end;
|
||||
int rc;
|
||||
|
||||
if (!MACHINE_HAS_NX)
|
||||
if (!cpu_has_nx())
|
||||
flags &= ~(SET_MEMORY_NX | SET_MEMORY_X);
|
||||
if (!flags)
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user