s390/cpufeature: rework to allow more than only hwcap bits
Rework cpufeature implementation to allow for various cpu feature indications, which is not only limited to hwcap bits. This is achieved by adding a sequential list of cpu feature numbers, where each of them is mapped to an entry which indicates what this number is about. Each entry contains a type member, which indicates what feature name space to look into (e.g. hwcap, or cpu facility). If wanted this allows also to automatically load modules only in e.g. z/VM configurations. Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Steffen Eiden <seiden@linux.ibm.com> Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com> Link: https://lore.kernel.org/r/20220713125644.16121-2-seiden@linux.ibm.com Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
This commit is contained in:
parent
693714b900
commit
0a5f9b382c
|
@ -1049,7 +1049,7 @@ out_err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, aes_s390_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, aes_s390_init);
|
||||
module_exit(aes_s390_fini);
|
||||
|
||||
MODULE_ALIAS_CRYPTO("aes-all");
|
||||
|
|
|
@ -121,7 +121,7 @@ static void __exit chacha_mod_fini(void)
|
|||
crypto_unregister_skciphers(chacha_algs, ARRAY_SIZE(chacha_algs));
|
||||
}
|
||||
|
||||
module_cpu_feature_match(VXRS, chacha_mod_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_VXRS, chacha_mod_init);
|
||||
module_exit(chacha_mod_fini);
|
||||
|
||||
MODULE_DESCRIPTION("ChaCha20 stream cipher");
|
||||
|
|
|
@ -298,7 +298,7 @@ static void __exit crc_vx_mod_exit(void)
|
|||
crypto_unregister_shashes(crc32_vx_algs, ARRAY_SIZE(crc32_vx_algs));
|
||||
}
|
||||
|
||||
module_cpu_feature_match(VXRS, crc_vx_mod_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_VXRS, crc_vx_mod_init);
|
||||
module_exit(crc_vx_mod_exit);
|
||||
|
||||
MODULE_AUTHOR("Hendrik Brueckner <brueckner@linux.vnet.ibm.com>");
|
||||
|
|
|
@ -492,7 +492,7 @@ out_err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, des_s390_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, des_s390_init);
|
||||
module_exit(des_s390_exit);
|
||||
|
||||
MODULE_ALIAS_CRYPTO("des");
|
||||
|
|
|
@ -145,7 +145,7 @@ static void __exit ghash_mod_exit(void)
|
|||
crypto_unregister_shash(&ghash_alg);
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, ghash_mod_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, ghash_mod_init);
|
||||
module_exit(ghash_mod_exit);
|
||||
|
||||
MODULE_ALIAS_CRYPTO("ghash");
|
||||
|
|
|
@ -907,5 +907,5 @@ static void __exit prng_exit(void)
|
|||
}
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, prng_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, prng_init);
|
||||
module_exit(prng_exit);
|
||||
|
|
|
@ -95,7 +95,7 @@ static void __exit sha1_s390_fini(void)
|
|||
crypto_unregister_shash(&alg);
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, sha1_s390_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, sha1_s390_init);
|
||||
module_exit(sha1_s390_fini);
|
||||
|
||||
MODULE_ALIAS_CRYPTO("sha1");
|
||||
|
|
|
@ -134,7 +134,7 @@ static void __exit sha256_s390_fini(void)
|
|||
crypto_unregister_shash(&sha256_alg);
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, sha256_s390_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, sha256_s390_init);
|
||||
module_exit(sha256_s390_fini);
|
||||
|
||||
MODULE_ALIAS_CRYPTO("sha256");
|
||||
|
|
|
@ -137,7 +137,7 @@ static void __exit sha3_256_s390_fini(void)
|
|||
crypto_unregister_shash(&sha3_256_alg);
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, sha3_256_s390_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, sha3_256_s390_init);
|
||||
module_exit(sha3_256_s390_fini);
|
||||
|
||||
MODULE_ALIAS_CRYPTO("sha3-256");
|
||||
|
|
|
@ -147,7 +147,7 @@ static void __exit fini(void)
|
|||
crypto_unregister_shash(&sha3_384_alg);
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, init);
|
||||
module_exit(fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -142,7 +142,7 @@ static void __exit fini(void)
|
|||
crypto_unregister_shash(&sha384_alg);
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, init);
|
||||
module_exit(fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -2,28 +2,20 @@
|
|||
/*
|
||||
* Module interface for CPU features
|
||||
*
|
||||
* Copyright IBM Corp. 2015
|
||||
* Copyright IBM Corp. 2015, 2022
|
||||
* Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef __ASM_S390_CPUFEATURE_H
|
||||
#define __ASM_S390_CPUFEATURE_H
|
||||
|
||||
#include <asm/elf.h>
|
||||
enum {
|
||||
S390_CPU_FEATURE_MSA,
|
||||
S390_CPU_FEATURE_VXRS,
|
||||
MAX_CPU_FEATURES
|
||||
};
|
||||
|
||||
/* Hardware features on Linux on z Systems are indicated by facility bits that
|
||||
* are mapped to the so-called machine flags. Particular machine flags are
|
||||
* then used to define ELF hardware capabilities; most notably hardware flags
|
||||
* that are essential for user space / glibc.
|
||||
*
|
||||
* Restrict the set of exposed CPU features to ELF hardware capabilities for
|
||||
* now. Additional machine flags can be indicated by values larger than
|
||||
* MAX_ELF_HWCAP_FEATURES.
|
||||
*/
|
||||
#define MAX_ELF_HWCAP_FEATURES (8 * sizeof(elf_hwcap))
|
||||
#define MAX_CPU_FEATURES MAX_ELF_HWCAP_FEATURES
|
||||
|
||||
#define cpu_feature(feat) ilog2(HWCAP_ ## feat)
|
||||
#define cpu_feature(feature) (feature)
|
||||
|
||||
int cpu_have_feature(unsigned int nr);
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ CFLAGS_unwind_bc.o += -fno-optimize-sibling-calls
|
|||
|
||||
obj-y := traps.o time.o process.o earlypgm.o early.o setup.o idle.o vtime.o
|
||||
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 diag.o vdso.o
|
||||
obj-y += debug.o irq.o ipl.o dis.o diag.o vdso.o cpufeature.o
|
||||
obj-y += sysinfo.o lgr.o os_info.o machine_kexec.o
|
||||
obj-y += runtime_instr.o cache.o fpu.o dumpstack.o guarded_storage.o sthyi.o
|
||||
obj-y += entry.o reipl.o relocate_kernel.o kdebugfs.o alternative.o
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright IBM Corp. 2022
|
||||
*/
|
||||
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/bug.h>
|
||||
#include <asm/elf.h>
|
||||
|
||||
enum {
|
||||
TYPE_HWCAP,
|
||||
};
|
||||
|
||||
struct s390_cpu_feature {
|
||||
unsigned int type : 4;
|
||||
unsigned int num : 28;
|
||||
};
|
||||
|
||||
static struct s390_cpu_feature s390_cpu_features[MAX_CPU_FEATURES] = {
|
||||
[S390_CPU_FEATURE_MSA] = {.type = TYPE_HWCAP, .num = HWCAP_NR_MSA},
|
||||
[S390_CPU_FEATURE_VXRS] = {.type = TYPE_HWCAP, .num = HWCAP_NR_VXRS},
|
||||
};
|
||||
|
||||
/*
|
||||
* cpu_have_feature - Test CPU features on module initialization
|
||||
*/
|
||||
int cpu_have_feature(unsigned int num)
|
||||
{
|
||||
struct s390_cpu_feature *feature;
|
||||
|
||||
if (WARN_ON_ONCE(num >= MAX_CPU_FEATURES))
|
||||
return 0;
|
||||
feature = &s390_cpu_features[num];
|
||||
switch (feature->type) {
|
||||
case TYPE_HWCAP:
|
||||
return !!(elf_hwcap & BIT(feature->num));
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(cpu_have_feature);
|
|
@ -8,7 +8,6 @@
|
|||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/stop_machine.h>
|
||||
#include <linux/cpufeature.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/random.h>
|
||||
|
@ -96,15 +95,6 @@ void cpu_init(void)
|
|||
enter_lazy_tlb(&init_mm, current);
|
||||
}
|
||||
|
||||
/*
|
||||
* cpu_have_feature - Test CPU features on module initialization
|
||||
*/
|
||||
int cpu_have_feature(unsigned int num)
|
||||
{
|
||||
return elf_hwcap & (1UL << num);
|
||||
}
|
||||
EXPORT_SYMBOL(cpu_have_feature);
|
||||
|
||||
static void show_facilities(struct seq_file *m)
|
||||
{
|
||||
unsigned int bit;
|
||||
|
|
|
@ -261,5 +261,5 @@ static void __exit trng_exit(void)
|
|||
trng_debug_exit();
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, trng_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, trng_init);
|
||||
module_exit(trng_exit);
|
||||
|
|
|
@ -2115,5 +2115,5 @@ static void __exit pkey_exit(void)
|
|||
pkey_debug_exit();
|
||||
}
|
||||
|
||||
module_cpu_feature_match(MSA, pkey_init);
|
||||
module_cpu_feature_match(S390_CPU_FEATURE_MSA, pkey_init);
|
||||
module_exit(pkey_exit);
|
||||
|
|
Loading…
Reference in New Issue