Commit 0b6684ba authored by Linus Torvalds's avatar Linus Torvalds

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

Pull RISC-V fixes from Palmer Dabbelt:

 - avoid dereferencing a null task pointer while walking the stack

 - fix the memory size in the HiFive Unleashed device tree

 - disable stack protectors when randstruct is enabled, which results in
   non-deterministic offsets during module builds

 - a pair of fixes to avoid relying on a constant physical memory base
   for the non-XIP builds

* tag 'riscv-for-linus-5.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
  Revert "riscv: Remove CONFIG_PHYS_RAM_BASE_FIXED"
  riscv: Get rid of CONFIG_PHYS_RAM_BASE in kernel physical address conversion
  riscv: Disable STACKPROTECTOR_PER_TASK if GCC_PLUGIN_RANDSTRUCT is enabled
  riscv: dts: fix memory size for the SiFive HiFive Unmatched
  riscv: stacktrace: Fix NULL pointer dereference
parents 4972bb90 867432be
...@@ -492,10 +492,16 @@ config CC_HAVE_STACKPROTECTOR_TLS ...@@ -492,10 +492,16 @@ config CC_HAVE_STACKPROTECTOR_TLS
config STACKPROTECTOR_PER_TASK config STACKPROTECTOR_PER_TASK
def_bool y def_bool y
depends on !GCC_PLUGIN_RANDSTRUCT
depends on STACKPROTECTOR && CC_HAVE_STACKPROTECTOR_TLS depends on STACKPROTECTOR && CC_HAVE_STACKPROTECTOR_TLS
config PHYS_RAM_BASE_FIXED
bool "Explicitly specified physical RAM address"
default n
config PHYS_RAM_BASE config PHYS_RAM_BASE
hex "Platform Physical RAM address" hex "Platform Physical RAM address"
depends on PHYS_RAM_BASE_FIXED
default "0x80000000" default "0x80000000"
help help
This is the physical address of RAM in the system. It has to be This is the physical address of RAM in the system. It has to be
...@@ -508,6 +514,7 @@ config XIP_KERNEL ...@@ -508,6 +514,7 @@ config XIP_KERNEL
# This prevents XIP from being enabled by all{yes,mod}config, which # This prevents XIP from being enabled by all{yes,mod}config, which
# fail to build since XIP doesn't support large kernels. # fail to build since XIP doesn't support large kernels.
depends on !COMPILE_TEST depends on !COMPILE_TEST
select PHYS_RAM_BASE_FIXED
help help
Execute-In-Place allows the kernel to run from non-volatile storage Execute-In-Place allows the kernel to run from non-volatile storage
directly addressable by the CPU, such as NOR flash. This saves RAM directly addressable by the CPU, such as NOR flash. This saves RAM
......
...@@ -24,7 +24,7 @@ cpus { ...@@ -24,7 +24,7 @@ cpus {
memory@80000000 { memory@80000000 {
device_type = "memory"; device_type = "memory";
reg = <0x0 0x80000000 0x2 0x00000000>; reg = <0x0 0x80000000 0x4 0x00000000>;
}; };
soc { soc {
......
...@@ -103,6 +103,7 @@ struct kernel_mapping { ...@@ -103,6 +103,7 @@ struct kernel_mapping {
}; };
extern struct kernel_mapping kernel_map; extern struct kernel_mapping kernel_map;
extern phys_addr_t phys_ram_base;
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
#define is_kernel_mapping(x) \ #define is_kernel_mapping(x) \
...@@ -113,9 +114,9 @@ extern struct kernel_mapping kernel_map; ...@@ -113,9 +114,9 @@ extern struct kernel_mapping kernel_map;
#define linear_mapping_pa_to_va(x) ((void *)((unsigned long)(x) + kernel_map.va_pa_offset)) #define linear_mapping_pa_to_va(x) ((void *)((unsigned long)(x) + kernel_map.va_pa_offset))
#define kernel_mapping_pa_to_va(y) ({ \ #define kernel_mapping_pa_to_va(y) ({ \
unsigned long _y = y; \ unsigned long _y = y; \
(_y >= CONFIG_PHYS_RAM_BASE) ? \ (IS_ENABLED(CONFIG_XIP_KERNEL) && _y < phys_ram_base) ? \
(void *)((unsigned long)(_y) + kernel_map.va_kernel_pa_offset + XIP_OFFSET) : \ (void *)((unsigned long)(_y) + kernel_map.va_kernel_xip_pa_offset) : \
(void *)((unsigned long)(_y) + kernel_map.va_kernel_xip_pa_offset); \ (void *)((unsigned long)(_y) + kernel_map.va_kernel_pa_offset + XIP_OFFSET); \
}) })
#define __pa_to_va_nodebug(x) linear_mapping_pa_to_va(x) #define __pa_to_va_nodebug(x) linear_mapping_pa_to_va(x)
......
...@@ -27,7 +27,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, ...@@ -27,7 +27,7 @@ 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 == current) { } else if (task == NULL || task == current) {
fp = (unsigned long)__builtin_frame_address(1); fp = (unsigned long)__builtin_frame_address(1);
sp = (unsigned long)__builtin_frame_address(0); sp = (unsigned long)__builtin_frame_address(0);
pc = (unsigned long)__builtin_return_address(0); pc = (unsigned long)__builtin_return_address(0);
......
...@@ -36,6 +36,9 @@ EXPORT_SYMBOL(kernel_map); ...@@ -36,6 +36,9 @@ EXPORT_SYMBOL(kernel_map);
#define kernel_map (*(struct kernel_mapping *)XIP_FIXUP(&kernel_map)) #define kernel_map (*(struct kernel_mapping *)XIP_FIXUP(&kernel_map))
#endif #endif
phys_addr_t phys_ram_base __ro_after_init;
EXPORT_SYMBOL(phys_ram_base);
#ifdef CONFIG_XIP_KERNEL #ifdef CONFIG_XIP_KERNEL
extern char _xiprom[], _exiprom[]; extern char _xiprom[], _exiprom[];
#endif #endif
...@@ -160,7 +163,7 @@ static void __init setup_bootmem(void) ...@@ -160,7 +163,7 @@ static void __init setup_bootmem(void)
phys_addr_t vmlinux_end = __pa_symbol(&_end); phys_addr_t vmlinux_end = __pa_symbol(&_end);
phys_addr_t vmlinux_start = __pa_symbol(&_start); phys_addr_t vmlinux_start = __pa_symbol(&_start);
phys_addr_t __maybe_unused max_mapped_addr; phys_addr_t __maybe_unused max_mapped_addr;
phys_addr_t dram_end; phys_addr_t phys_ram_end;
#ifdef CONFIG_XIP_KERNEL #ifdef CONFIG_XIP_KERNEL
vmlinux_start = __pa_symbol(&_sdata); vmlinux_start = __pa_symbol(&_sdata);
...@@ -181,9 +184,12 @@ static void __init setup_bootmem(void) ...@@ -181,9 +184,12 @@ static void __init setup_bootmem(void)
#endif #endif
memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start); memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start);
dram_end = memblock_end_of_DRAM();
phys_ram_end = memblock_end_of_DRAM();
#ifndef CONFIG_64BIT #ifndef CONFIG_64BIT
#ifndef CONFIG_XIP_KERNEL
phys_ram_base = memblock_start_of_DRAM();
#endif
/* /*
* memblock allocator is not aware of the fact that last 4K bytes of * memblock allocator is not aware of the fact that last 4K bytes of
* the addressable memory can not be mapped because of IS_ERR_VALUE * the addressable memory can not be mapped because of IS_ERR_VALUE
...@@ -194,12 +200,12 @@ static void __init setup_bootmem(void) ...@@ -194,12 +200,12 @@ static void __init setup_bootmem(void)
* be done in create_kernel_page_table. * be done in create_kernel_page_table.
*/ */
max_mapped_addr = __pa(~(ulong)0); max_mapped_addr = __pa(~(ulong)0);
if (max_mapped_addr == (dram_end - 1)) if (max_mapped_addr == (phys_ram_end - 1))
memblock_set_current_limit(max_mapped_addr - 4096); memblock_set_current_limit(max_mapped_addr - 4096);
#endif #endif
min_low_pfn = PFN_UP(memblock_start_of_DRAM()); min_low_pfn = PFN_UP(phys_ram_base);
max_low_pfn = max_pfn = PFN_DOWN(dram_end); max_low_pfn = max_pfn = PFN_DOWN(phys_ram_end);
dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn)); dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn));
set_max_mapnr(max_low_pfn - ARCH_PFN_OFFSET); set_max_mapnr(max_low_pfn - ARCH_PFN_OFFSET);
...@@ -558,6 +564,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) ...@@ -558,6 +564,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
kernel_map.xiprom = (uintptr_t)CONFIG_XIP_PHYS_ADDR; kernel_map.xiprom = (uintptr_t)CONFIG_XIP_PHYS_ADDR;
kernel_map.xiprom_sz = (uintptr_t)(&_exiprom) - (uintptr_t)(&_xiprom); kernel_map.xiprom_sz = (uintptr_t)(&_exiprom) - (uintptr_t)(&_xiprom);
phys_ram_base = CONFIG_PHYS_RAM_BASE;
kernel_map.phys_addr = (uintptr_t)CONFIG_PHYS_RAM_BASE; kernel_map.phys_addr = (uintptr_t)CONFIG_PHYS_RAM_BASE;
kernel_map.size = (uintptr_t)(&_end) - (uintptr_t)(&_sdata); kernel_map.size = (uintptr_t)(&_end) - (uintptr_t)(&_sdata);
......
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