Am 01.07.22 um 12:02 schrieb Steffen Eiden:
This patch adds a hardware capability for the Ultravisor.
This capability will be present if facility 158 is enabled.
Signed-off-by: Steffen Eiden <seiden@xxxxxxxxxxxxx>
---
arch/s390/include/asm/elf.h | 2 ++
arch/s390/kernel/processor.c | 5 +++++
2 files changed, 7 insertions(+)
diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h
index 70a30ae258b7..3a5e89ce4fd0 100644
--- a/arch/s390/include/asm/elf.h
+++ b/arch/s390/include/asm/elf.h
@@ -115,6 +115,7 @@ enum {
HWCAP_NR_NNPA = 20,
HWCAP_NR_PCI_MIO = 21,
HWCAP_NR_SIE = 22,
+ HWCAP_NR_UV = 23,
HWCAP_NR_MAX
};
question for Heiko, Vasily, Alexander. This certainly works.
An alternative implementation would be to separate module_cpu_feature_match
from HWCAP. (so uv would not be shown in /proc/cpuinfo and it would be
seen in the aux vector). I would imagine that we might have more drivers
in the future that depend on a facility but this facility is not really
useful for userspace to know.
See arch/s390/include/asm/cpufeature.h
* 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.
Any preference from your side?
@@ -142,6 +143,7 @@ enum {
#define HWCAP_NNPA BIT(HWCAP_NR_NNPA)
#define HWCAP_PCI_MIO BIT(HWCAP_NR_PCI_MIO)
#define HWCAP_SIE BIT(HWCAP_NR_SIE)
+#define HWCAP_UV BIT(HWCAP_NR_UV)
/*
* These are used to set parameters in the core dumps.
diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c
index aa0e0e7fc773..80ccd57a2b00 100644
--- a/arch/s390/kernel/processor.c
+++ b/arch/s390/kernel/processor.c
@@ -141,6 +141,7 @@ static void show_cpu_summary(struct seq_file *m, void *v)
[HWCAP_NR_NNPA] = "nnpa",
[HWCAP_NR_PCI_MIO] = "pcimio",
[HWCAP_NR_SIE] = "sie",
+ [HWCAP_NR_UV] = "uv",
};
int i, cpu;
@@ -249,6 +250,10 @@ static int __init setup_hwcaps(void)
if (sclp.has_sief2)
elf_hwcap |= HWCAP_SIE;
+ /* ultravisor-call (secure execution) */
+ if (test_facility(158))
+ elf_hwcap |= HWCAP_UV;
+
return 0;
}
arch_initcall(setup_hwcaps);