mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
Merge tag 'riscv-for-linus-6.18-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux
Pull RISC-V fixes from Paul Walmsley: - A fix to disable KASAN checks while walking a non-current task's stackframe (following x86) - A fix for a kvrealloc()-related memory leak in module_frob_arch_sections() - Two replacements of strcpy() with strscpy() - A change to use the RISC-V .insn assembler directive when possible to assemble instructions from hex opcodes - Some low-impact fixes in the ptdump code and kprobes test code * tag 'riscv-for-linus-6.18-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: cpuidle: riscv-sbi: Replace deprecated strcpy in sbi_cpuidle_init_cpu riscv: KGDB: Replace deprecated strcpy in kgdb_arch_handle_qxfer_pkt riscv: asm: use .insn for making custom instructions riscv: tests: Make RISCV_KPROBES_KUNIT tristate riscv: tests: Rename kprobes_test_riscv to kprobes_riscv riscv: Fix memory leak in module_frob_arch_sections() riscv: ptdump: use seq_puts() in pt_dump_seq_puts() macro riscv: stacktrace: Disable KASAN checks for non-current tasks
This commit is contained in:
@@ -12,6 +12,12 @@
|
||||
#define __ASM_STR(x) #x
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AS_HAS_INSN
|
||||
#define ASM_INSN_I(__x) ".insn " __x
|
||||
#else
|
||||
#define ASM_INSN_I(__x) ".4byte " __x
|
||||
#endif
|
||||
|
||||
#if __riscv_xlen == 64
|
||||
#define __REG_SEL(a, b) __ASM_STR(a)
|
||||
#elif __riscv_xlen == 32
|
||||
|
||||
@@ -256,10 +256,10 @@
|
||||
INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(3), \
|
||||
SIMM12((offset) & 0xfe0), RS1(base))
|
||||
|
||||
#define RISCV_PAUSE ".4byte 0x100000f"
|
||||
#define ZAWRS_WRS_NTO ".4byte 0x00d00073"
|
||||
#define ZAWRS_WRS_STO ".4byte 0x01d00073"
|
||||
#define RISCV_NOP4 ".4byte 0x00000013"
|
||||
#define RISCV_PAUSE ASM_INSN_I("0x100000f")
|
||||
#define ZAWRS_WRS_NTO ASM_INSN_I("0x00d00073")
|
||||
#define ZAWRS_WRS_STO ASM_INSN_I("0x01d00073")
|
||||
#define RISCV_NOP4 ASM_INSN_I("0x00000013")
|
||||
|
||||
#define RISCV_INSN_NOP4 _AC(0x00000013, U)
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@ extern struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_mips;
|
||||
* allowing any subsequent instructions to fetch.
|
||||
*/
|
||||
|
||||
#define MIPS_PAUSE ".4byte 0x00501013\n\t"
|
||||
#define MIPS_EHB ".4byte 0x00301013\n\t"
|
||||
#define MIPS_IHB ".4byte 0x00101013\n\t"
|
||||
#define MIPS_PAUSE ASM_INSN_I("0x00501013\n\t")
|
||||
#define MIPS_EHB ASM_INSN_I("0x00301013\n\t")
|
||||
#define MIPS_IHB ASM_INSN_I("0x00101013\n\t")
|
||||
|
||||
#endif // _ASM_RISCV_VENDOR_EXTENSIONS_MIPS_H
|
||||
|
||||
@@ -265,10 +265,10 @@ void kgdb_arch_handle_qxfer_pkt(char *remcom_in_buffer,
|
||||
{
|
||||
if (!strncmp(remcom_in_buffer, gdb_xfer_read_target,
|
||||
sizeof(gdb_xfer_read_target)))
|
||||
strcpy(remcom_out_buffer, riscv_gdb_stub_target_desc);
|
||||
strscpy(remcom_out_buffer, riscv_gdb_stub_target_desc, BUFMAX);
|
||||
else if (!strncmp(remcom_in_buffer, gdb_xfer_read_cpuxml,
|
||||
sizeof(gdb_xfer_read_cpuxml)))
|
||||
strcpy(remcom_out_buffer, riscv_gdb_stub_cpuxml);
|
||||
strscpy(remcom_out_buffer, riscv_gdb_stub_cpuxml, BUFMAX);
|
||||
}
|
||||
|
||||
static inline void kgdb_arch_update_addr(struct pt_regs *regs,
|
||||
|
||||
@@ -119,6 +119,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
||||
unsigned int num_plts = 0;
|
||||
unsigned int num_gots = 0;
|
||||
Elf_Rela *scratch = NULL;
|
||||
Elf_Rela *new_scratch;
|
||||
size_t scratch_size = 0;
|
||||
int i;
|
||||
|
||||
@@ -168,9 +169,12 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
||||
scratch_size_needed = (num_scratch_relas + num_relas) * sizeof(*scratch);
|
||||
if (scratch_size_needed > scratch_size) {
|
||||
scratch_size = scratch_size_needed;
|
||||
scratch = kvrealloc(scratch, scratch_size, GFP_KERNEL);
|
||||
if (!scratch)
|
||||
new_scratch = kvrealloc(scratch, scratch_size, GFP_KERNEL);
|
||||
if (!new_scratch) {
|
||||
kvfree(scratch);
|
||||
return -ENOMEM;
|
||||
}
|
||||
scratch = new_scratch;
|
||||
}
|
||||
|
||||
for (size_t j = 0; j < num_relas; j++)
|
||||
|
||||
@@ -16,6 +16,22 @@
|
||||
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
|
||||
/*
|
||||
* This disables KASAN checking when reading a value from another task's stack,
|
||||
* since the other task could be running on another CPU and could have poisoned
|
||||
* the stack in the meantime.
|
||||
*/
|
||||
#define READ_ONCE_TASK_STACK(task, x) \
|
||||
({ \
|
||||
unsigned long val; \
|
||||
unsigned long addr = x; \
|
||||
if ((task) == current) \
|
||||
val = READ_ONCE(addr); \
|
||||
else \
|
||||
val = READ_ONCE_NOCHECK(addr); \
|
||||
val; \
|
||||
})
|
||||
|
||||
extern asmlinkage void handle_exception(void);
|
||||
extern unsigned long ret_from_exception_end;
|
||||
|
||||
@@ -69,8 +85,9 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
||||
fp = frame->ra;
|
||||
pc = regs->ra;
|
||||
} else {
|
||||
fp = frame->fp;
|
||||
pc = ftrace_graph_ret_addr(current, &graph_idx, frame->ra,
|
||||
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,
|
||||
&frame->ra);
|
||||
if (pc >= (unsigned long)handle_exception &&
|
||||
pc < (unsigned long)&ret_from_exception_end) {
|
||||
|
||||
@@ -31,7 +31,7 @@ config RISCV_MODULE_LINKING_KUNIT
|
||||
If unsure, say N.
|
||||
|
||||
config RISCV_KPROBES_KUNIT
|
||||
bool "KUnit test for riscv kprobes" if !KUNIT_ALL_TESTS
|
||||
tristate "KUnit test for riscv kprobes" if !KUNIT_ALL_TESTS
|
||||
depends on KUNIT
|
||||
depends on KPROBES
|
||||
default KUNIT_ALL_TESTS
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
obj-y += test-kprobes.o test-kprobes-asm.o
|
||||
obj-$(CONFIG_RISCV_KPROBES_KUNIT) += kprobes_riscv_kunit.o
|
||||
|
||||
kprobes_riscv_kunit-objs := test-kprobes.o test-kprobes-asm.o
|
||||
|
||||
@@ -49,8 +49,11 @@ static struct kunit_case kprobes_testcases[] = {
|
||||
};
|
||||
|
||||
static struct kunit_suite kprobes_test_suite = {
|
||||
.name = "kprobes_test_riscv",
|
||||
.name = "kprobes_riscv",
|
||||
.test_cases = kprobes_testcases,
|
||||
};
|
||||
|
||||
kunit_test_suites(&kprobes_test_suite);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("KUnit test for riscv kprobes");
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#define pt_dump_seq_puts(m, fmt) \
|
||||
({ \
|
||||
if (m) \
|
||||
seq_printf(m, fmt); \
|
||||
seq_puts(m, fmt); \
|
||||
})
|
||||
|
||||
/*
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_domain.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
@@ -303,8 +304,8 @@ static int sbi_cpuidle_init_cpu(struct device *dev, int cpu)
|
||||
drv->states[0].exit_latency = 1;
|
||||
drv->states[0].target_residency = 1;
|
||||
drv->states[0].power_usage = UINT_MAX;
|
||||
strcpy(drv->states[0].name, "WFI");
|
||||
strcpy(drv->states[0].desc, "RISC-V WFI");
|
||||
strscpy(drv->states[0].name, "WFI");
|
||||
strscpy(drv->states[0].desc, "RISC-V WFI");
|
||||
|
||||
/*
|
||||
* If no DT idle states are detected (ret == 0) let the driver
|
||||
|
||||
Reference in New Issue
Block a user