Commit 9d68fe84 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'riscv-for-linus-5.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux

Pull RISC-V fixes from Palmer Dabbelt:
 "A handful of RISC-V related fixes:

   - avoid errors when the stack tracing code is tracing itself.

   - resurrect the memtest= kernel command line argument on RISC-V,
     which was briefly enabled during the merge window before a
     refactoring disabled it.

   - build fix and some warning cleanups"

* tag 'riscv-for-linus-5.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
  riscv: kexec: Fix W=1 build warnings
  riscv: kprobes: Fix build error when MMU=n
  riscv: Select ARCH_USE_MEMTEST
  riscv: stacktrace: fix the riscv stacktrace when CONFIG_FRAME_POINTER enabled
parents 75b9c727 bab0d47c
...@@ -34,6 +34,7 @@ config RISCV ...@@ -34,6 +34,7 @@ config RISCV
select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX
select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT
select ARCH_SUPPORTS_HUGETLBFS if MMU select ARCH_SUPPORTS_HUGETLBFS if MMU
select ARCH_USE_MEMTEST
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
select ARCH_WANT_FRAME_POINTERS select ARCH_WANT_FRAME_POINTERS
select ARCH_WANT_HUGE_PMD_SHARE if 64BIT select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
......
...@@ -42,8 +42,8 @@ struct kimage_arch { ...@@ -42,8 +42,8 @@ struct kimage_arch {
unsigned long fdt_addr; unsigned long fdt_addr;
}; };
const extern unsigned char riscv_kexec_relocate[]; extern const unsigned char riscv_kexec_relocate[];
const extern unsigned int riscv_kexec_relocate_size; extern const unsigned int riscv_kexec_relocate_size;
typedef void (*riscv_kexec_method)(unsigned long first_ind_entry, typedef void (*riscv_kexec_method)(unsigned long first_ind_entry,
unsigned long jump_addr, unsigned long jump_addr,
......
...@@ -14,8 +14,9 @@ ...@@ -14,8 +14,9 @@
#include <asm/set_memory.h> /* For set_memory_x() */ #include <asm/set_memory.h> /* For set_memory_x() */
#include <linux/compiler.h> /* For unreachable() */ #include <linux/compiler.h> /* For unreachable() */
#include <linux/cpu.h> /* For cpu_down() */ #include <linux/cpu.h> /* For cpu_down() */
#include <linux/reboot.h>
/** /*
* kexec_image_info - Print received image details * kexec_image_info - Print received image details
*/ */
static void static void
...@@ -39,7 +40,7 @@ kexec_image_info(const struct kimage *image) ...@@ -39,7 +40,7 @@ kexec_image_info(const struct kimage *image)
} }
} }
/** /*
* machine_kexec_prepare - Initialize kexec * machine_kexec_prepare - Initialize kexec
* *
* This function is called from do_kexec_load, when the user has * This function is called from do_kexec_load, when the user has
...@@ -100,7 +101,7 @@ machine_kexec_prepare(struct kimage *image) ...@@ -100,7 +101,7 @@ machine_kexec_prepare(struct kimage *image)
} }
/** /*
* machine_kexec_cleanup - Cleanup any leftovers from * machine_kexec_cleanup - Cleanup any leftovers from
* machine_kexec_prepare * machine_kexec_prepare
* *
...@@ -135,7 +136,7 @@ void machine_shutdown(void) ...@@ -135,7 +136,7 @@ void machine_shutdown(void)
#endif #endif
} }
/** /*
* machine_crash_shutdown - Prepare to kexec after a kernel crash * machine_crash_shutdown - Prepare to kexec after a kernel crash
* *
* This function is called by crash_kexec just before machine_kexec * This function is called by crash_kexec just before machine_kexec
...@@ -151,7 +152,7 @@ machine_crash_shutdown(struct pt_regs *regs) ...@@ -151,7 +152,7 @@ machine_crash_shutdown(struct pt_regs *regs)
pr_info("Starting crashdump kernel...\n"); pr_info("Starting crashdump kernel...\n");
} }
/** /*
* machine_kexec - Jump to the loaded kimage * machine_kexec - Jump to the loaded kimage
* *
* This function is called by kernel_kexec which is called by the * This function is called by kernel_kexec which is called by the
......
...@@ -84,6 +84,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) ...@@ -84,6 +84,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
return 0; return 0;
} }
#ifdef CONFIG_MMU
void *alloc_insn_page(void) void *alloc_insn_page(void)
{ {
return __vmalloc_node_range(PAGE_SIZE, 1, VMALLOC_START, VMALLOC_END, return __vmalloc_node_range(PAGE_SIZE, 1, VMALLOC_START, VMALLOC_END,
...@@ -91,6 +92,7 @@ void *alloc_insn_page(void) ...@@ -91,6 +92,7 @@ void *alloc_insn_page(void)
VM_FLUSH_RESET_PERMS, NUMA_NO_NODE, VM_FLUSH_RESET_PERMS, NUMA_NO_NODE,
__builtin_return_address(0)); __builtin_return_address(0));
} }
#endif
/* install breakpoint in text */ /* install breakpoint in text */
void __kprobes arch_arm_kprobe(struct kprobe *p) void __kprobes arch_arm_kprobe(struct kprobe *p)
......
...@@ -27,10 +27,10 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, ...@@ -27,10 +27,10 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
fp = frame_pointer(regs); fp = frame_pointer(regs);
sp = user_stack_pointer(regs); sp = user_stack_pointer(regs);
pc = instruction_pointer(regs); pc = instruction_pointer(regs);
} else if (task == NULL || task == current) { } else if (task == current) {
fp = (unsigned long)__builtin_frame_address(0); fp = (unsigned long)__builtin_frame_address(1);
sp = sp_in_global; sp = (unsigned long)__builtin_frame_address(0);
pc = (unsigned long)walk_stackframe; pc = (unsigned long)__builtin_return_address(0);
} else { } else {
/* task blocked in __switch_to */ /* task blocked in __switch_to */
fp = task->thread.s[0]; fp = task->thread.s[0];
...@@ -106,15 +106,15 @@ static bool print_trace_address(void *arg, unsigned long pc) ...@@ -106,15 +106,15 @@ static bool print_trace_address(void *arg, unsigned long pc)
return true; return true;
} }
void dump_backtrace(struct pt_regs *regs, struct task_struct *task, noinline void dump_backtrace(struct pt_regs *regs, struct task_struct *task,
const char *loglvl) const char *loglvl)
{ {
pr_cont("%sCall Trace:\n", loglvl);
walk_stackframe(task, regs, print_trace_address, (void *)loglvl); walk_stackframe(task, regs, print_trace_address, (void *)loglvl);
} }
void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl) void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl)
{ {
pr_cont("%sCall Trace:\n", loglvl);
dump_backtrace(NULL, task, loglvl); dump_backtrace(NULL, task, loglvl);
} }
...@@ -139,7 +139,7 @@ unsigned long get_wchan(struct task_struct *task) ...@@ -139,7 +139,7 @@ unsigned long get_wchan(struct task_struct *task)
#ifdef CONFIG_STACKTRACE #ifdef CONFIG_STACKTRACE
void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, noinline void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
struct task_struct *task, struct pt_regs *regs) struct task_struct *task, struct pt_regs *regs)
{ {
walk_stackframe(task, regs, consume_entry, cookie); walk_stackframe(task, regs, consume_entry, cookie);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment