mirror of
https://github.com/torvalds/linux.git
synced 2025-04-11 04:53:02 +00:00

Follow the patterns of the other architectures that use GENERIC_CPU_VULNERABILITIES for riscv to introduce the ghostwrite vulnerability and mitigation. The mitigation is to disable all vector which is accomplished by clearing the bit from the cpufeature field. Ghostwrite only affects thead c9xx CPUs that impelment xtheadvector, so the vulerability will only be mitigated on these CPUs. Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> Tested-by: Yangyu Chen <cyy@cyyself.name> Link: https://lore.kernel.org/r/20241113-xtheadvector-v11-14-236c22791ef9@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
61 lines
1.4 KiB
C
61 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 2024 Rivos Inc.
|
|
*/
|
|
|
|
#include <linux/cpu.h>
|
|
#include <linux/device.h>
|
|
#include <linux/sprintf.h>
|
|
|
|
#include <asm/bugs.h>
|
|
#include <asm/vendor_extensions/thead.h>
|
|
|
|
static enum mitigation_state ghostwrite_state;
|
|
|
|
void ghostwrite_set_vulnerable(void)
|
|
{
|
|
ghostwrite_state = VULNERABLE;
|
|
}
|
|
|
|
/*
|
|
* Vendor extension alternatives will use the value set at the time of boot
|
|
* alternative patching, thus this must be called before boot alternatives are
|
|
* patched (and after extension probing) to be effective.
|
|
*
|
|
* Returns true if mitgated, false otherwise.
|
|
*/
|
|
bool ghostwrite_enable_mitigation(void)
|
|
{
|
|
if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR) &&
|
|
ghostwrite_state == VULNERABLE && !cpu_mitigations_off()) {
|
|
disable_xtheadvector();
|
|
ghostwrite_state = MITIGATED;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
enum mitigation_state ghostwrite_get_state(void)
|
|
{
|
|
return ghostwrite_state;
|
|
}
|
|
|
|
ssize_t cpu_show_ghostwrite(struct device *dev, struct device_attribute *attr, char *buf)
|
|
{
|
|
if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR)) {
|
|
switch (ghostwrite_state) {
|
|
case UNAFFECTED:
|
|
return sprintf(buf, "Not affected\n");
|
|
case MITIGATED:
|
|
return sprintf(buf, "Mitigation: xtheadvector disabled\n");
|
|
case VULNERABLE:
|
|
fallthrough;
|
|
default:
|
|
return sprintf(buf, "Vulnerable\n");
|
|
}
|
|
} else {
|
|
return sprintf(buf, "Not affected\n");
|
|
}
|
|
}
|