Commit 812da4d3 authored by Linus Torvalds's avatar Linus Torvalds

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

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

   - fix the SBI remote fence numbers for hypervisor fences, which had
     been transcribed in the wrong order in Linux. These fences are only
     used with the KVM patches applied.

   - fix a whole host of build warnings, these should have no functional
     change.

   - fix init_resources() to prevent an off-by-one error from causing an
     out-of-bounds array reference. This was manifesting during boot on
     vexriscv.

   - ensure the KASAN mappings are visible before proceeding to use
     them"

* tag 'riscv-for-linus-5.12-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
  riscv: Correct SPARSEMEM configuration
  RISC-V: kasan: Declare kasan_shallow_populate() static
  riscv: Ensure page table writes are flushed when initializing KASAN vmalloc
  RISC-V: Fix out-of-bounds accesses in init_resources()
  riscv: Fix compilation error with Canaan SoC
  ftrace: Fix spelling mistake "disabed" -> "disabled"
  riscv: fix bugon.cocci warnings
  riscv: process: Fix no prototype for arch_dup_task_struct
  riscv: ftrace: Use ftrace_get_regs helper
  riscv: process: Fix no prototype for show_regs
  riscv: syscall_table: Reduce W=1 compilation warnings noise
  riscv: time: Fix no prototype for time_init
  riscv: ptrace: Fix no prototype warnings
  riscv: sbi: Fix comment of __sbi_set_timer_v01
  riscv: irq: Fix no prototype warning
  riscv: traps: Fix no prototype warnings
  RISC-V: correct enum sbi_ext_rfence_fid
parents bfdc4aa9 a5406a7f
...@@ -9,7 +9,7 @@ int arch_check_ftrace_location(struct kprobe *p) ...@@ -9,7 +9,7 @@ int arch_check_ftrace_location(struct kprobe *p)
return 0; return 0;
} }
/* Ftrace callback handler for kprobes -- called under preepmt disabed */ /* Ftrace callback handler for kprobes -- called under preepmt disabled */
void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
struct ftrace_ops *ops, struct ftrace_regs *fregs) struct ftrace_ops *ops, struct ftrace_regs *fregs)
{ {
......
...@@ -93,7 +93,6 @@ config RISCV ...@@ -93,7 +93,6 @@ config RISCV
select PCI_MSI if PCI select PCI_MSI if PCI
select RISCV_INTC select RISCV_INTC
select RISCV_TIMER if RISCV_SBI select RISCV_TIMER if RISCV_SBI
select SPARSEMEM_STATIC if 32BIT
select SPARSE_IRQ select SPARSE_IRQ
select SYSCTL_EXCEPTION_TRACE select SYSCTL_EXCEPTION_TRACE
select THREAD_INFO_IN_TASK select THREAD_INFO_IN_TASK
...@@ -154,7 +153,8 @@ config ARCH_FLATMEM_ENABLE ...@@ -154,7 +153,8 @@ config ARCH_FLATMEM_ENABLE
config ARCH_SPARSEMEM_ENABLE config ARCH_SPARSEMEM_ENABLE
def_bool y def_bool y
depends on MMU depends on MMU
select SPARSEMEM_VMEMMAP_ENABLE select SPARSEMEM_STATIC if 32BIT && SPARSMEM
select SPARSEMEM_VMEMMAP_ENABLE if 64BIT
config ARCH_SELECT_MEMORY_MODEL config ARCH_SELECT_MEMORY_MODEL
def_bool ARCH_SPARSEMEM_ENABLE def_bool ARCH_SPARSEMEM_ENABLE
......
...@@ -31,6 +31,8 @@ config SOC_CANAAN ...@@ -31,6 +31,8 @@ config SOC_CANAAN
select SIFIVE_PLIC select SIFIVE_PLIC
select ARCH_HAS_RESET_CONTROLLER select ARCH_HAS_RESET_CONTROLLER
select PINCTRL select PINCTRL
select COMMON_CLK
select COMMON_CLK_K210
help help
This enables support for Canaan Kendryte K210 SoC platform hardware. This enables support for Canaan Kendryte K210 SoC platform hardware.
......
...@@ -9,4 +9,20 @@ long long __lshrti3(long long a, int b); ...@@ -9,4 +9,20 @@ long long __lshrti3(long long a, int b);
long long __ashrti3(long long a, int b); long long __ashrti3(long long a, int b);
long long __ashlti3(long long a, int b); long long __ashlti3(long long a, int b);
#define DECLARE_DO_ERROR_INFO(name) asmlinkage void name(struct pt_regs *regs)
DECLARE_DO_ERROR_INFO(do_trap_unknown);
DECLARE_DO_ERROR_INFO(do_trap_insn_misaligned);
DECLARE_DO_ERROR_INFO(do_trap_insn_fault);
DECLARE_DO_ERROR_INFO(do_trap_insn_illegal);
DECLARE_DO_ERROR_INFO(do_trap_load_fault);
DECLARE_DO_ERROR_INFO(do_trap_load_misaligned);
DECLARE_DO_ERROR_INFO(do_trap_store_misaligned);
DECLARE_DO_ERROR_INFO(do_trap_store_fault);
DECLARE_DO_ERROR_INFO(do_trap_ecall_u);
DECLARE_DO_ERROR_INFO(do_trap_ecall_s);
DECLARE_DO_ERROR_INFO(do_trap_ecall_m);
DECLARE_DO_ERROR_INFO(do_trap_break);
#endif /* _ASM_RISCV_PROTOTYPES_H */ #endif /* _ASM_RISCV_PROTOTYPES_H */
...@@ -12,4 +12,6 @@ ...@@ -12,4 +12,6 @@
#include <asm-generic/irq.h> #include <asm-generic/irq.h>
extern void __init init_IRQ(void);
#endif /* _ASM_RISCV_IRQ_H */ #endif /* _ASM_RISCV_IRQ_H */
...@@ -71,6 +71,7 @@ int riscv_of_processor_hartid(struct device_node *node); ...@@ -71,6 +71,7 @@ int riscv_of_processor_hartid(struct device_node *node);
int riscv_of_parent_hartid(struct device_node *node); int riscv_of_parent_hartid(struct device_node *node);
extern void riscv_fill_hwcap(void); extern void riscv_fill_hwcap(void);
extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
...@@ -119,6 +119,11 @@ extern int regs_query_register_offset(const char *name); ...@@ -119,6 +119,11 @@ extern int regs_query_register_offset(const char *name);
extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
unsigned int n); unsigned int n);
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
unsigned long frame_pointer);
int do_syscall_trace_enter(struct pt_regs *regs);
void do_syscall_trace_exit(struct pt_regs *regs);
/** /**
* regs_get_register() - get register value from its offset * regs_get_register() - get register value from its offset
* @regs: pt_regs from which register value is gotten * @regs: pt_regs from which register value is gotten
......
...@@ -51,10 +51,10 @@ enum sbi_ext_rfence_fid { ...@@ -51,10 +51,10 @@ enum sbi_ext_rfence_fid {
SBI_EXT_RFENCE_REMOTE_FENCE_I = 0, SBI_EXT_RFENCE_REMOTE_FENCE_I = 0,
SBI_EXT_RFENCE_REMOTE_SFENCE_VMA, SBI_EXT_RFENCE_REMOTE_SFENCE_VMA,
SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID, SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID,
SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA,
SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID, SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID,
SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA, SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA,
SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID, SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID,
SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA,
}; };
enum sbi_ext_hsm_fid { enum sbi_ext_hsm_fid {
......
...@@ -88,4 +88,6 @@ static inline int read_current_timer(unsigned long *timer_val) ...@@ -88,4 +88,6 @@ static inline int read_current_timer(unsigned long *timer_val)
return 0; return 0;
} }
extern void time_init(void);
#endif /* _ASM_RISCV_TIMEX_H */ #endif /* _ASM_RISCV_TIMEX_H */
...@@ -8,6 +8,7 @@ CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE) ...@@ -8,6 +8,7 @@ CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE)
CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
endif endif
CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,)
extra-y += head.o extra-y += head.o
extra-y += vmlinux.lds extra-y += vmlinux.lds
......
...@@ -2,39 +2,41 @@ ...@@ -2,39 +2,41 @@
#include <linux/kprobes.h> #include <linux/kprobes.h>
/* Ftrace callback handler for kprobes -- called under preepmt disabed */ /* Ftrace callback handler for kprobes -- called under preepmt disabled */
void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
struct ftrace_ops *ops, struct ftrace_regs *regs) struct ftrace_ops *ops, struct ftrace_regs *fregs)
{ {
struct kprobe *p; struct kprobe *p;
struct pt_regs *regs;
struct kprobe_ctlblk *kcb; struct kprobe_ctlblk *kcb;
p = get_kprobe((kprobe_opcode_t *)ip); p = get_kprobe((kprobe_opcode_t *)ip);
if (unlikely(!p) || kprobe_disabled(p)) if (unlikely(!p) || kprobe_disabled(p))
return; return;
regs = ftrace_get_regs(fregs);
kcb = get_kprobe_ctlblk(); kcb = get_kprobe_ctlblk();
if (kprobe_running()) { if (kprobe_running()) {
kprobes_inc_nmissed_count(p); kprobes_inc_nmissed_count(p);
} else { } else {
unsigned long orig_ip = instruction_pointer(&(regs->regs)); unsigned long orig_ip = instruction_pointer(regs);
instruction_pointer_set(&(regs->regs), ip); instruction_pointer_set(regs, ip);
__this_cpu_write(current_kprobe, p); __this_cpu_write(current_kprobe, p);
kcb->kprobe_status = KPROBE_HIT_ACTIVE; kcb->kprobe_status = KPROBE_HIT_ACTIVE;
if (!p->pre_handler || !p->pre_handler(p, &(regs->regs))) { if (!p->pre_handler || !p->pre_handler(p, regs)) {
/* /*
* Emulate singlestep (and also recover regs->pc) * Emulate singlestep (and also recover regs->pc)
* as if there is a nop * as if there is a nop
*/ */
instruction_pointer_set(&(regs->regs), instruction_pointer_set(regs,
(unsigned long)p->addr + MCOUNT_INSN_SIZE); (unsigned long)p->addr + MCOUNT_INSN_SIZE);
if (unlikely(p->post_handler)) { if (unlikely(p->post_handler)) {
kcb->kprobe_status = KPROBE_HIT_SSDONE; kcb->kprobe_status = KPROBE_HIT_SSDONE;
p->post_handler(p, &(regs->regs), 0); p->post_handler(p, regs, 0);
} }
instruction_pointer_set(&(regs->regs), orig_ip); instruction_pointer_set(regs, orig_ip);
} }
/* /*
......
...@@ -256,8 +256,7 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr) ...@@ -256,8 +256,7 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr)
* normal page fault. * normal page fault.
*/ */
regs->epc = (unsigned long) cur->addr; regs->epc = (unsigned long) cur->addr;
if (!instruction_pointer(regs)) BUG_ON(!instruction_pointer(regs));
BUG();
if (kcb->kprobe_status == KPROBE_REENTER) if (kcb->kprobe_status == KPROBE_REENTER)
restore_previous_kprobe(kcb); restore_previous_kprobe(kcb);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/sched/debug.h>
#include <linux/sched/task_stack.h> #include <linux/sched/task_stack.h>
#include <linux/tick.h> #include <linux/tick.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
......
...@@ -116,7 +116,7 @@ void sbi_clear_ipi(void) ...@@ -116,7 +116,7 @@ void sbi_clear_ipi(void)
EXPORT_SYMBOL(sbi_clear_ipi); EXPORT_SYMBOL(sbi_clear_ipi);
/** /**
* sbi_set_timer_v01() - Program the timer for next timer event. * __sbi_set_timer_v01() - Program the timer for next timer event.
* @stime_value: The value after which next timer event should fire. * @stime_value: The value after which next timer event should fire.
* *
* Return: None * Return: None
......
...@@ -147,7 +147,8 @@ static void __init init_resources(void) ...@@ -147,7 +147,8 @@ static void __init init_resources(void)
bss_res.end = __pa_symbol(__bss_stop) - 1; bss_res.end = __pa_symbol(__bss_stop) - 1;
bss_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; bss_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
mem_res_sz = (memblock.memory.cnt + memblock.reserved.cnt) * sizeof(*mem_res); /* + 1 as memblock_alloc() might increase memblock.reserved.cnt */
mem_res_sz = (memblock.memory.cnt + memblock.reserved.cnt + 1) * sizeof(*mem_res);
mem_res = memblock_alloc(mem_res_sz, SMP_CACHE_BYTES); mem_res = memblock_alloc(mem_res_sz, SMP_CACHE_BYTES);
if (!mem_res) if (!mem_res)
panic("%s: Failed to allocate %zu bytes\n", __func__, mem_res_sz); panic("%s: Failed to allocate %zu bytes\n", __func__, mem_res_sz);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <asm/sbi.h> #include <asm/sbi.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/timex.h>
unsigned long riscv_timebase; unsigned long riscv_timebase;
EXPORT_SYMBOL_GPL(riscv_timebase); EXPORT_SYMBOL_GPL(riscv_timebase);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <asm/asm-prototypes.h>
#include <asm/bug.h> #include <asm/bug.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
......
...@@ -155,7 +155,7 @@ static void __init kasan_populate(void *start, void *end) ...@@ -155,7 +155,7 @@ static void __init kasan_populate(void *start, void *end)
memset(start, KASAN_SHADOW_INIT, end - start); memset(start, KASAN_SHADOW_INIT, end - start);
} }
void __init kasan_shallow_populate(void *start, void *end) static void __init kasan_shallow_populate(void *start, void *end)
{ {
unsigned long vaddr = (unsigned long)start & PAGE_MASK; unsigned long vaddr = (unsigned long)start & PAGE_MASK;
unsigned long vend = PAGE_ALIGN((unsigned long)end); unsigned long vend = PAGE_ALIGN((unsigned long)end);
...@@ -187,6 +187,8 @@ void __init kasan_shallow_populate(void *start, void *end) ...@@ -187,6 +187,8 @@ void __init kasan_shallow_populate(void *start, void *end)
} }
vaddr += PAGE_SIZE; vaddr += PAGE_SIZE;
} }
local_flush_tlb_all();
} }
void __init kasan_init(void) void __init kasan_init(void)
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include "common.h" #include "common.h"
/* Ftrace callback handler for kprobes -- called under preepmt disabed */ /* Ftrace callback handler for kprobes -- called under preepmt disabled */
void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
struct ftrace_ops *ops, struct ftrace_regs *fregs) struct ftrace_ops *ops, struct ftrace_regs *fregs)
{ {
......
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