aboutsummaryrefslogtreecommitdiffstats
diff options
-rw-r--r--arch/riscv/Kconfig19
-rw-r--r--arch/riscv/include/asm/linkage.h2
-rw-r--r--arch/riscv/include/asm/purgatory.h11
-rw-r--r--arch/riscv/kernel/bugs.c12
-rw-r--r--arch/riscv/kernel/module-sections.c6
-rw-r--r--arch/riscv/kernel/pi/cmdline_early.c16
-rw-r--r--arch/riscv/kernel/setup.c11
-rw-r--r--arch/riscv/kernel/stacktrace.c2
-rw-r--r--arch/riscv/mm/ptdump.c13
-rw-r--r--arch/riscv/purgatory/purgatory.c16
-rw-r--r--tools/testing/selftests/riscv/abi/Makefile2
-rw-r--r--tools/testing/selftests/riscv/cfi/Makefile2
-rw-r--r--tools/testing/selftests/riscv/hwprobe/Makefile6
-rw-r--r--tools/testing/selftests/riscv/mm/Makefile2
-rw-r--r--tools/testing/selftests/riscv/sigreturn/Makefile2
-rw-r--r--tools/testing/selftests/riscv/vector/Makefile12
16 files changed, 77 insertions, 57 deletions
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 99297a590ac08..ac774da08ffb0 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -24,6 +24,7 @@ config RISCV
select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2
select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE
select ARCH_HAS_BINFMT_FLAT
+ select ARCH_HAS_CC_CAN_LINK
select ARCH_HAS_CURRENT_STACK_POINTER
select ARCH_HAS_DEBUG_VIRTUAL if MMU
select ARCH_HAS_DEBUG_VM_PGTABLE
@@ -151,6 +152,7 @@ config RISCV
select HAVE_ARCH_USERFAULTFD_WP if 64BIT && MMU && USERFAULTFD && RISCV_ISA_SVRSW60T59B
select HAVE_ARCH_VMAP_STACK if MMU && 64BIT
select HAVE_ASM_MODVERSIONS
+ select HAVE_BUILDTIME_MCOUNT_SORT
select HAVE_CONTEXT_TRACKING_USER
select HAVE_DEBUG_KMEMLEAK
select HAVE_DMA_CONTIGUOUS if MMU
@@ -1020,7 +1022,6 @@ choice
config RISCV_PROBE_VECTOR_UNALIGNED_ACCESS
bool "Probe speed of vector unaligned accesses"
select RISCV_VECTOR_MISALIGNED
- depends on RISCV_ISA_V
help
During boot, the kernel will run a series of tests to determine the
speed of vector unaligned accesses if they are supported. This probing
@@ -1160,7 +1161,7 @@ config RELOCATABLE
config RANDOMIZE_BASE
bool "Randomize the address of the kernel image"
- select RELOCATABLE
+ depends on RELOCATABLE
depends on MMU && 64BIT
help
Randomizes the virtual address at which the kernel image is
@@ -1350,6 +1351,20 @@ config PORTABLE
config ARCH_PROC_KCORE_TEXT
def_bool y
+config ARCH_CC_CAN_LINK
+ bool
+ default $(cc_can_link_user,-march=rv64g -mabi=lp64d) if 64BIT && FPU
+ default $(cc_can_link_user,-march=rv64g -mabi=lp64) if 64BIT
+ default $(cc_can_link_user,-march=rv32g -mabi=ilp32d) if FPU
+ default $(cc_can_link_user,-march=rv32g -mabi=ilp32)
+
+config ARCH_USERFLAGS
+ string
+ default "-march=rv64g -mabi=lp64d" if 64BIT && FPU
+ default "-march=rv64g -mabi=lp64" if 64BIT
+ default "-march=rv32g -mabi=ilp32d" if FPU
+ default "-march=rv32g -mabi=ilp32"
+
menu "Power management options"
source "kernel/power/Kconfig"
diff --git a/arch/riscv/include/asm/linkage.h b/arch/riscv/include/asm/linkage.h
index 9e88ba23cd2bc..7e0210ef4eb4d 100644
--- a/arch/riscv/include/asm/linkage.h
+++ b/arch/riscv/include/asm/linkage.h
@@ -9,4 +9,6 @@
#define __ALIGN .balign 4
#define __ALIGN_STR ".balign 4"
+#define _THIS_IP_ ({ unsigned long __ip; asm volatile("auipc %0, 0" : "=r" (__ip)); __ip; })
+
#endif /* _ASM_RISCV_LINKAGE_H */
diff --git a/arch/riscv/include/asm/purgatory.h b/arch/riscv/include/asm/purgatory.h
new file mode 100644
index 0000000000000..5a827e6752b7f
--- /dev/null
+++ b/arch/riscv/include/asm/purgatory.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_RISCV_PURGATORY_H
+#define _ASM_RISCV_PURGATORY_H
+
+#ifndef __ASSEMBLER__
+#include <linux/purgatory.h>
+
+void purgatory(void);
+#endif /* __ASSEMBLER__ */
+
+#endif /* _ASM_RISCV_PURGATORY_H */
diff --git a/arch/riscv/kernel/bugs.c b/arch/riscv/kernel/bugs.c
index 3655fe7d678cd..e5758e3f1c7ef 100644
--- a/arch/riscv/kernel/bugs.c
+++ b/arch/riscv/kernel/bugs.c
@@ -5,7 +5,7 @@
#include <linux/cpu.h>
#include <linux/device.h>
-#include <linux/sprintf.h>
+#include <linux/sysfs.h>
#include <asm/bugs.h>
#include <asm/vendor_extensions/thead.h>
@@ -46,15 +46,15 @@ ssize_t cpu_show_ghostwrite(struct device *dev, struct device_attribute *attr, c
if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR)) {
switch (ghostwrite_state) {
case UNAFFECTED:
- return sprintf(buf, "Not affected\n");
+ return sysfs_emit(buf, "Not affected\n");
case MITIGATED:
- return sprintf(buf, "Mitigation: xtheadvector disabled\n");
+ return sysfs_emit(buf, "Mitigation: xtheadvector disabled\n");
case VULNERABLE:
fallthrough;
default:
- return sprintf(buf, "Vulnerable\n");
+ return sysfs_emit(buf, "Vulnerable\n");
}
- } else {
- return sprintf(buf, "Not affected\n");
}
+
+ return sysfs_emit(buf, "Not affected\n");
}
diff --git a/arch/riscv/kernel/module-sections.c b/arch/riscv/kernel/module-sections.c
index 98eaac6f66060..b3b11b7f7ed95 100644
--- a/arch/riscv/kernel/module-sections.c
+++ b/arch/riscv/kernel/module-sections.c
@@ -56,17 +56,15 @@ unsigned long module_emit_plt_entry(struct module *mod, unsigned long val)
return (unsigned long)&plt[i];
}
-#define cmp_3way(a, b) ((a) < (b) ? -1 : (a) > (b))
-
static int cmp_rela(const void *a, const void *b)
{
const Elf_Rela *x = a, *y = b;
int i;
/* sort by type, symbol index and addend */
- i = cmp_3way(x->r_info, y->r_info);
+ i = cmp_int(x->r_info, y->r_info);
if (i == 0)
- i = cmp_3way(x->r_addend, y->r_addend);
+ i = cmp_int(x->r_addend, y->r_addend);
return i;
}
diff --git a/arch/riscv/kernel/pi/cmdline_early.c b/arch/riscv/kernel/pi/cmdline_early.c
index 389d086a07187..0afbe4077cb8f 100644
--- a/arch/riscv/kernel/pi/cmdline_early.c
+++ b/arch/riscv/kernel/pi/cmdline_early.c
@@ -12,8 +12,8 @@ static char early_cmdline[COMMAND_LINE_SIZE];
static char *get_early_cmdline(uintptr_t dtb_pa)
{
- const char *fdt_cmdline = NULL;
- unsigned int fdt_cmdline_size = 0;
+ const char *fdt_cmdline;
+ ssize_t fdt_cmdline_size = 0;
int chosen_node;
if (!IS_ENABLED(CONFIG_CMDLINE_FORCE)) {
@@ -22,18 +22,18 @@ static char *get_early_cmdline(uintptr_t dtb_pa)
fdt_cmdline = fdt_getprop((void *)dtb_pa, chosen_node,
"bootargs", NULL);
if (fdt_cmdline) {
- fdt_cmdline_size = strlen(fdt_cmdline);
- strscpy(early_cmdline, fdt_cmdline,
- COMMAND_LINE_SIZE);
+ fdt_cmdline_size = strscpy(early_cmdline, fdt_cmdline);
+ if (fdt_cmdline_size < 0)
+ return early_cmdline;
}
}
}
if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) ||
IS_ENABLED(CONFIG_CMDLINE_FORCE) ||
- fdt_cmdline_size == 0 /* CONFIG_CMDLINE_FALLBACK */) {
- strlcat(early_cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
- }
+ fdt_cmdline_size == 0 /* CONFIG_CMDLINE_FALLBACK */)
+ strscpy(early_cmdline + fdt_cmdline_size, CONFIG_CMDLINE,
+ COMMAND_LINE_SIZE - fdt_cmdline_size);
return early_cmdline;
}
diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
index c89cc272440b9..52d1d2b8f338b 100644
--- a/arch/riscv/kernel/setup.c
+++ b/arch/riscv/kernel/setup.c
@@ -71,16 +71,13 @@ static struct resource *standard_resources;
static int __init add_resource(struct resource *parent,
struct resource *res)
{
- int ret = 0;
+ int ret;
ret = insert_resource(parent, res);
- if (ret < 0) {
- pr_err("Failed to add a %s resource at %llx\n",
- res->name, (unsigned long long) res->start);
- return ret;
- }
+ if (ret < 0)
+ pr_err("Failed to add resource %s %pR\n", res->name, res);
- return 1;
+ return ret;
}
static int __init add_kernel_resources(void)
diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c
index b41b6255751cb..2692d3a06afa2 100644
--- a/arch/riscv/kernel/stacktrace.c
+++ b/arch/riscv/kernel/stacktrace.c
@@ -87,7 +87,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
} else {
fp = READ_ONCE_TASK_STACK(task, frame->fp);
pc = READ_ONCE_TASK_STACK(task, frame->ra);
- pc = ftrace_graph_ret_addr(current, &graph_idx, pc,
+ pc = ftrace_graph_ret_addr(task, &graph_idx, pc,
&frame->ra);
if (pc >= (unsigned long)handle_exception &&
pc < (unsigned long)&ret_from_exception_end) {
diff --git a/arch/riscv/mm/ptdump.c b/arch/riscv/mm/ptdump.c
index 34299c2b231f1..f4b4a9fcbbd88 100644
--- a/arch/riscv/mm/ptdump.c
+++ b/arch/riscv/mm/ptdump.c
@@ -7,6 +7,7 @@
#include <linux/init.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
+#include <linux/string.h>
#include <linux/ptdump.h>
#include <linux/pgtable.h>
@@ -213,21 +214,21 @@ static void dump_prot(struct pg_state *st)
val = st->current_prot & pte_bits[i].mask;
if (val) {
if (pte_bits[i].mask == _PAGE_SOFT)
- sprintf(s, pte_bits[i].set, val >> 8);
+ snprintf(s, sizeof(s), pte_bits[i].set, val >> 8);
#ifdef CONFIG_64BIT
else if (pte_bits[i].mask == _PAGE_MTMASK_SVPBMT) {
if (val == _PAGE_NOCACHE_SVPBMT)
- sprintf(s, pte_bits[i].set, "NC");
+ snprintf(s, sizeof(s), pte_bits[i].set, "NC");
else if (val == _PAGE_IO_SVPBMT)
- sprintf(s, pte_bits[i].set, "IO");
+ snprintf(s, sizeof(s), pte_bits[i].set, "IO");
else
- sprintf(s, pte_bits[i].set, "??");
+ snprintf(s, sizeof(s), pte_bits[i].set, "??");
}
#endif
else
- sprintf(s, "%s", pte_bits[i].set);
+ strscpy(s, pte_bits[i].set);
} else {
- sprintf(s, "%s", pte_bits[i].clear);
+ strscpy(s, pte_bits[i].clear);
}
pt_dump_seq_printf(st->seq, " %s", s);
diff --git a/arch/riscv/purgatory/purgatory.c b/arch/riscv/purgatory/purgatory.c
index bbd5cfa4d7412..3474e3abe5d78 100644
--- a/arch/riscv/purgatory/purgatory.c
+++ b/arch/riscv/purgatory/purgatory.c
@@ -8,16 +8,16 @@
*
*/
-#include <linux/purgatory.h>
#include <linux/kernel.h>
#include <linux/string.h>
+#include <asm/purgatory.h>
#include <asm/string.h>
u8 purgatory_sha256_digest[SHA256_DIGEST_SIZE] __section(".kexec-purgatory");
struct kexec_sha_region purgatory_sha_regions[KEXEC_SEGMENT_MAX] __section(".kexec-purgatory");
-static int verify_sha256_digest(void)
+static bool verify_sha256_digest(void)
{
struct kexec_sha_region *ptr, *end;
struct sha256_ctx sctx;
@@ -26,19 +26,15 @@ static int verify_sha256_digest(void)
sha256_init(&sctx);
end = purgatory_sha_regions + ARRAY_SIZE(purgatory_sha_regions);
for (ptr = purgatory_sha_regions; ptr < end; ptr++)
- sha256_update(&sctx, (uint8_t *)(ptr->start), ptr->len);
+ sha256_update(&sctx, (const u8 *)(ptr->start), ptr->len);
sha256_final(&sctx, digest);
- if (memcmp(digest, purgatory_sha256_digest, sizeof(digest)) != 0)
- return 1;
- return 0;
-}
-/* workaround for a warning with -Wmissing-prototypes */
-void purgatory(void);
+ return memcmp(digest, purgatory_sha256_digest, sizeof(digest)) == 0;
+}
void purgatory(void)
{
- if (verify_sha256_digest())
+ if (!verify_sha256_digest())
for (;;)
/* loop forever */
;
diff --git a/tools/testing/selftests/riscv/abi/Makefile b/tools/testing/selftests/riscv/abi/Makefile
index ed82ff9c664e7..041114675ad5c 100644
--- a/tools/testing/selftests/riscv/abi/Makefile
+++ b/tools/testing/selftests/riscv/abi/Makefile
@@ -7,4 +7,4 @@ TEST_GEN_PROGS := pointer_masking
include ../../lib.mk
$(OUTPUT)/pointer_masking: pointer_masking.c
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
diff --git a/tools/testing/selftests/riscv/cfi/Makefile b/tools/testing/selftests/riscv/cfi/Makefile
index 93b4738c0e2e8..418b4b5325a5c 100644
--- a/tools/testing/selftests/riscv/cfi/Makefile
+++ b/tools/testing/selftests/riscv/cfi/Makefile
@@ -16,7 +16,7 @@ ifeq ($(shell $(CC) $(CFLAGS) -nostdlib -xc /dev/null -o /dev/null > /dev/null 2
TEST_GEN_PROGS := cfitests
$(OUTPUT)/cfitests: cfitests.c shadowstack.c
- $(CC) -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^
else
$(shell echo "Toolchain doesn't support CFI, skipping CFI kselftest." >&2)
diff --git a/tools/testing/selftests/riscv/hwprobe/Makefile b/tools/testing/selftests/riscv/hwprobe/Makefile
index cec81610a5f27..71e3f26c541bf 100644
--- a/tools/testing/selftests/riscv/hwprobe/Makefile
+++ b/tools/testing/selftests/riscv/hwprobe/Makefile
@@ -9,10 +9,10 @@ TEST_GEN_PROGS := hwprobe cbo which-cpus
include ../../lib.mk
$(OUTPUT)/hwprobe: hwprobe.c sys_hwprobe.S
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
$(OUTPUT)/cbo: cbo.c sys_hwprobe.S
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
$(OUTPUT)/which-cpus: which-cpus.c sys_hwprobe.S
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
diff --git a/tools/testing/selftests/riscv/mm/Makefile b/tools/testing/selftests/riscv/mm/Makefile
index 4664ed79e20b5..24122453e3d02 100644
--- a/tools/testing/selftests/riscv/mm/Makefile
+++ b/tools/testing/selftests/riscv/mm/Makefile
@@ -12,4 +12,4 @@ TEST_PROGS := run_mmap.sh
include ../../lib.mk
$(OUTPUT)/mm: mmap_default.c mmap_bottomup.c mmap_tests.h
- $(CC) -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^
diff --git a/tools/testing/selftests/riscv/sigreturn/Makefile b/tools/testing/selftests/riscv/sigreturn/Makefile
index eb8bac9279a83..8c77508641f3a 100644
--- a/tools/testing/selftests/riscv/sigreturn/Makefile
+++ b/tools/testing/selftests/riscv/sigreturn/Makefile
@@ -9,4 +9,4 @@ TEST_GEN_PROGS := sigreturn
include ../../lib.mk
$(OUTPUT)/sigreturn: sigreturn.c
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
diff --git a/tools/testing/selftests/riscv/vector/Makefile b/tools/testing/selftests/riscv/vector/Makefile
index 326dafd739bf5..7e0017b3fb8b8 100644
--- a/tools/testing/selftests/riscv/vector/Makefile
+++ b/tools/testing/selftests/riscv/vector/Makefile
@@ -11,29 +11,29 @@ include ../../lib.mk
TEST_GEN_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(TEST_GEN_LIBS))
$(OUTPUT)/sys_hwprobe.o: ../hwprobe/sys_hwprobe.S
- $(CC) -static -c -o$@ $(CFLAGS) $^
+ $(CC) -static -c -o $@ $(CFLAGS) $^
$(OUTPUT)/v_helpers.o: v_helpers.c
- $(CC) -static -c -o$@ $(CFLAGS) $^
+ $(CC) -static -c -o $@ $(CFLAGS) $^
$(OUTPUT)/vstate_prctl: vstate_prctl.c $(OUTPUT)/sys_hwprobe.o $(OUTPUT)/v_helpers.o
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
$(OUTPUT)/vstate_exec_nolibc: vstate_exec_nolibc.c
$(CC) -nostdlib -static -include ../../../../include/nolibc/nolibc.h \
-Wall $(CFLAGS) $(LDFLAGS) $^ -o $@ -lgcc
$(OUTPUT)/v_initval: v_initval.c $(OUTPUT)/sys_hwprobe.o $(OUTPUT)/v_helpers.o
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
$(OUTPUT)/v_exec_initval_nolibc: v_exec_initval_nolibc.c
$(CC) -nostdlib -static -include ../../../../include/nolibc/nolibc.h \
-Wall $(CFLAGS) $(LDFLAGS) $^ -o $@ -lgcc
$(OUTPUT)/vstate_ptrace: vstate_ptrace.c $(OUTPUT)/sys_hwprobe.o $(OUTPUT)/v_helpers.o
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
$(OUTPUT)/validate_v_ptrace: validate_v_ptrace.c $(OUTPUT)/sys_hwprobe.o $(OUTPUT)/v_helpers.o
- $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^
+ $(CC) -static -o $@ $(CFLAGS) $(LDFLAGS) $^
EXTRA_CLEAN += $(TEST_GEN_OBJ)