Commit 6ff6f86b authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm

Pull ARM updates from Russell King:

 - Generalise byte swapping assembly

 - Update debug addresses for STI

 - Validate start of physical memory with DTB

 - Do not clear SCTLR.nTLSMD in decompressor

 - amba/locomo/sa1111 devices remove method return type is void

 - address markers for KASAN in page table dump

* tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm:
  ARM: 9065/1: OABI compat: fix build when EPOLL is not enabled
  ARM: 9055/1: mailbox: arm_mhuv2: make remove callback return void
  amba: Make use of bus_type functions
  amba: Make the remove callback return void
  vfio: platform: simplify device removal
  amba: reorder functions
  amba: Fix resource leak for drivers without .remove
  ARM: 9054/1: arch/arm/mm/mmu.c: Remove duplicate header
  ARM: 9053/1: arm/mm/ptdump:Add address markers for KASAN regions
  ARM: 9051/1: vdso: remove unneded extra-y addition
  ARM: 9050/1: Kconfig: Select ARCH_HAVE_NMI_SAFE_CMPXCHG where possible
  ARM: 9049/1: locomo: make locomo bus's remove callback return void
  ARM: 9048/1: sa1111: make sa1111 bus's remove callback return void
  ARM: 9047/1: smp: remove unused variable
  ARM: 9046/1: decompressor: Do not clear SCTLR.nTLSMD for ARMv7+ cores
  ARM: 9045/1: uncompress: Validate start of physical memory against passed DTB
  ARM: 9042/1: debug: no uncompress debugging while semihosting
  ARM: 9041/1: sti LL_UART: add STiH418 SBC UART0 support
  ARM: 9040/1: use DEBUG_UART_PHYS and DEBUG_UART_VIRT for sti LL_UART
  ARM: 9039/1: assembler: generalize byte swapping macro into rev_l
parents 4aa36444 90e53c5e
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ config ARM
	select ARCH_HAS_TEARDOWN_DMA_OPS if MMU
	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
	select ARCH_HAVE_CUSTOM_GPIO_H
	select ARCH_HAVE_NMI_SAFE_CMPXCHG if CPU_V7 || CPU_V7M || CPU_V6K
	select ARCH_HAS_GCOV_PROFILE_ALL
	select ARCH_KEEP_MEMBLOCK
	select ARCH_MIGHT_HAVE_PC_PARPORT
@@ -1856,9 +1857,10 @@ config AUTO_ZRELADDR
	help
	  ZRELADDR is the physical address where the decompressed kernel
	  image will be placed. If AUTO_ZRELADDR is selected, the address
	  will be determined at run-time by masking the current IP with
	  0xf8000000. This assumes the zImage being placed in the first 128MB
	  from start of memory.
	  will be determined at run-time, either by masking the current IP
	  with 0xf8000000, or, if invalid, from the DTB passed in r2.
	  This assumes the zImage being placed in the first 128MB from
	  start of memory.

config EFI_STUB
	bool
+28 −12
Original line number Diff line number Diff line
@@ -1158,10 +1158,9 @@ choice
		  Say Y here if you want kernel low-level debugging support
		  on ST SPEAr13xx based platforms.

	config STIH41X_DEBUG_ASC2
	config DEBUG_STIH41X_ASC2
		bool "Use StiH415/416 ASC2 UART for low-level debug"
		depends on ARCH_STI
		select DEBUG_STI_UART
		help
		  Say Y here if you want kernel low-level debugging support
		  on STiH415/416 based platforms like b2000, which has
@@ -1169,10 +1168,9 @@ choice

		  If unsure, say N.

	config STIH41X_DEBUG_SBC_ASC1
	config DEBUG_STIH41X_SBC_ASC1
		bool "Use StiH415/416 SBC ASC1 UART for low-level debug"
		depends on ARCH_STI
		select DEBUG_STI_UART
		help
		  Say Y here if you want kernel low-level debugging support
		  on STiH415/416 based platforms like b2020. which has
@@ -1180,6 +1178,16 @@ choice

		  If unsure, say N.

	config DEBUG_STIH418_SBC_ASC0
		bool "Use StiH418 SBC ASC0 UART for low-level debug"
		depends on ARCH_STI
		help
		  Say Y here if you want kernel low-level debugging support
		  on STiH418 based platforms which has default UART wired
		  up to SBC ASC0.

		  If unsure, say N.

	config STM32F4_DEBUG_UART
		bool "Use STM32F4 UART for low-level debug"
		depends on MACH_STM32F429 || MACH_STM32F469
@@ -1484,10 +1492,6 @@ config DEBUG_TEGRA_UART
	bool
	depends on ARCH_TEGRA

config DEBUG_STI_UART
	bool
	depends on ARCH_STI

config DEBUG_STM32_UART
	bool
	depends on ARCH_STM32
@@ -1546,7 +1550,9 @@ config DEBUG_LL_INCLUDE
	default "debug/renesas-scif.S" if DEBUG_RMOBILE_SCIFA4
	default "debug/s3c24xx.S" if DEBUG_S3C24XX_UART || DEBUG_S3C64XX_UART
	default "debug/s5pv210.S" if DEBUG_S5PV210_UART
	default "debug/sti.S" if DEBUG_STI_UART
	default "debug/sti.S" if DEBUG_STIH41X_ASC2
	default "debug/sti.S" if DEBUG_STIH41X_SBC_ASC1
	default "debug/sti.S" if DEBUG_STIH418_SBC_ASC0
	default "debug/stm32.S" if DEBUG_STM32_UART
	default "debug/tegra.S" if DEBUG_TEGRA_UART
	default "debug/ux500.S" if DEBUG_UX500_UART
@@ -1579,6 +1585,7 @@ config DEBUG_UART_PHYS
	default 0x02531000 if DEBUG_KEYSTONE_UART1
	default 0x03010fe0 if ARCH_RPC
	default 0x07000000 if DEBUG_SUN9I_UART0
	default 0x09530000 if DEBUG_STIH418_SBC_ASC0
	default 0x10009000 if DEBUG_REALVIEW_STD_PORT || \
				DEBUG_VEXPRESS_UART0_CA9
	default 0x1010c000 if DEBUG_REALVIEW_PB1176_PORT
@@ -1671,7 +1678,9 @@ config DEBUG_UART_PHYS
	default 0xfc00c000 if DEBUG_AT91_SAMA5D4_USART3
	default 0xfcb00000 if DEBUG_HI3620_UART
	default 0xfd883000 if DEBUG_ALPINE_UART0
	default 0xfe531000 if DEBUG_STIH41X_SBC_ASC1
	default 0xfe800000 if ARCH_IOP32X
	default 0xfed32000 if DEBUG_STIH41X_ASC2
	default 0xff690000 if DEBUG_RK32_UART2
	default 0xffc02000 if DEBUG_SOCFPGA_UART0
	default 0xffc02100 if DEBUG_SOCFPGA_ARRIA10_UART1
@@ -1699,7 +1708,9 @@ config DEBUG_UART_PHYS
		DEBUG_S3C64XX_UART || \
		DEBUG_BCM63XX_UART || DEBUG_ASM9260_UART || \
		DEBUG_DIGICOLOR_UA0 || \
		DEBUG_AT91_UART || DEBUG_STM32_UART
		DEBUG_AT91_UART || DEBUG_STM32_UART || \
		DEBUG_STIH41X_ASC2 || DEBUG_STIH41X_SBC_ASC1 || \
		DEBUG_STIH418_SBC_ASC0

config DEBUG_UART_VIRT
	hex "Virtual base address of debug UART"
@@ -1744,6 +1755,7 @@ config DEBUG_UART_VIRT
	default 0xf8090000 if DEBUG_VEXPRESS_UART0_RS1
	default 0xf8ffee00 if DEBUG_AT91_SAM9263_DBGU
	default 0xf8fff200 if DEBUG_AT91_RM9200_DBGU
	default 0xf9530000 if DEBUG_STIH418_SBC_ASC0
	default 0xf9e09000 if DEBUG_AM33XXUART1
	default 0xfa020000 if DEBUG_OMAP4UART3 || DEBUG_TI81XXUART1
	default 0xfa022000 if DEBUG_TI81XXUART2
@@ -1762,7 +1774,9 @@ config DEBUG_UART_VIRT
	default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT
	default 0xfcfe8600 if DEBUG_BCM63XX_UART
	default 0xfd000000 if DEBUG_SPEAR3XX || DEBUG_SPEAR13XX
	default 0xfd531000 if DEBUG_STIH41X_SBC_ASC1
	default 0xfd883000 if DEBUG_ALPINE_UART0
	default 0xfdd32000 if DEBUG_STIH41X_ASC2
	default 0xfe010000 if STM32MP1_DEBUG_UART
	default 0xfe017000 if DEBUG_MMP_UART2
	default 0xfe018000 if DEBUG_MMP_UART3
@@ -1803,7 +1817,9 @@ config DEBUG_UART_VIRT
		DEBUG_S3C64XX_UART || \
		DEBUG_BCM63XX_UART || DEBUG_ASM9260_UART || \
		DEBUG_DIGICOLOR_UA0 || \
		DEBUG_AT91_UART || DEBUG_STM32_UART
		DEBUG_AT91_UART || DEBUG_STM32_UART || \
		DEBUG_STIH41X_ASC2 || DEBUG_STIH41X_SBC_ASC1 || \
		DEBUG_STIH418_SBC_ASC0

config DEBUG_UART_8250_SHIFT
	int "Register offset shift for the 8250 debug UART"
@@ -1837,7 +1853,7 @@ config DEBUG_UNCOMPRESS
	depends on ARCH_MULTIPLATFORM || PLAT_SAMSUNG || ARM_SINGLE_ARMV7M
	depends on DEBUG_LL && !DEBUG_OMAP2PLUS_UART && \
		     (!DEBUG_TEGRA_UART || !ZBOOT_ROM) && \
		     !DEBUG_BRCMSTB_UART
		     !DEBUG_BRCMSTB_UART && !DEBUG_SEMIHOSTING
	help
	  This option influences the normal decompressor output for
	  multiplatform kernels.  Normally, multiplatform kernels disable
+4 −1
Original line number Diff line number Diff line
@@ -87,10 +87,13 @@ libfdt_objs := fdt_rw.o fdt_ro.o fdt_wip.o fdt.o
ifeq ($(CONFIG_ARM_ATAG_DTB_COMPAT),y)
OBJS	+= $(libfdt_objs) atags_to_fdt.o
endif
ifeq ($(CONFIG_USE_OF),y)
OBJS	+= $(libfdt_objs) fdt_check_mem_start.o
endif

# -fstack-protector-strong triggers protection checks in this code,
# but it is being used too early to link to meaningful stack_chk logic.
$(foreach o, $(libfdt_objs) atags_to_fdt.o, \
$(foreach o, $(libfdt_objs) atags_to_fdt.o fdt_check_mem_start.o, \
	$(eval CFLAGS_$(o) := -I $(srctree)/scripts/dtc/libfdt -fno-stack-protector))

# These were previously generated C files. When you are building the kernel
+131 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only

#include <linux/kernel.h>
#include <linux/libfdt.h>
#include <linux/sizes.h>

static const void *get_prop(const void *fdt, const char *node_path,
			    const char *property, int minlen)
{
	const void *prop;
	int offset, len;

	offset = fdt_path_offset(fdt, node_path);
	if (offset < 0)
		return NULL;

	prop = fdt_getprop(fdt, offset, property, &len);
	if (!prop || len < minlen)
		return NULL;

	return prop;
}

static uint32_t get_cells(const void *fdt, const char *name)
{
	const fdt32_t *prop = get_prop(fdt, "/", name, sizeof(fdt32_t));

	if (!prop) {
		/* default */
		return 1;
	}

	return fdt32_ld(prop);
}

static uint64_t get_val(const fdt32_t *cells, uint32_t ncells)
{
	uint64_t r;

	r = fdt32_ld(cells);
	if (ncells > 1)
		r = (r << 32) | fdt32_ld(cells + 1);

	return r;
}

/*
 * Check the start of physical memory
 *
 * Traditionally, the start address of physical memory is obtained by masking
 * the program counter.  However, this does require that this address is a
 * multiple of 128 MiB, precluding booting Linux on platforms where this
 * requirement is not fulfilled.
 * Hence validate the calculated address against the memory information in the
 * DTB, and, if out-of-range, replace it by the real start address.
 * To preserve backwards compatibility (systems reserving a block of memory
 * at the start of physical memory, kdump, ...), the traditional method is
 * always used if it yields a valid address.
 *
 * Return value: start address of physical memory to use
 */
uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)
{
	uint32_t addr_cells, size_cells, base;
	uint32_t fdt_mem_start = 0xffffffff;
	const fdt32_t *reg, *endp;
	uint64_t size, end;
	const char *type;
	int offset, len;

	if (!fdt)
		return mem_start;

	if (fdt_magic(fdt) != FDT_MAGIC)
		return mem_start;

	/* There may be multiple cells on LPAE platforms */
	addr_cells = get_cells(fdt, "#address-cells");
	size_cells = get_cells(fdt, "#size-cells");
	if (addr_cells > 2 || size_cells > 2)
		return mem_start;

	/* Walk all memory nodes and regions */
	for (offset = fdt_next_node(fdt, -1, NULL); offset >= 0;
	     offset = fdt_next_node(fdt, offset, NULL)) {
		type = fdt_getprop(fdt, offset, "device_type", NULL);
		if (!type || strcmp(type, "memory"))
			continue;

		reg = fdt_getprop(fdt, offset, "linux,usable-memory", &len);
		if (!reg)
			reg = fdt_getprop(fdt, offset, "reg", &len);
		if (!reg)
			continue;

		for (endp = reg + (len / sizeof(fdt32_t));
		     endp - reg >= addr_cells + size_cells;
		     reg += addr_cells + size_cells) {
			size = get_val(reg + addr_cells, size_cells);
			if (!size)
				continue;

			if (addr_cells > 1 && fdt32_ld(reg)) {
				/* Outside 32-bit address space, skipping */
				continue;
			}

			base = fdt32_ld(reg + addr_cells - 1);
			end = base + size;
			if (mem_start >= base && mem_start < end) {
				/* Calculated address is valid, use it */
				return mem_start;
			}

			if (base < fdt_mem_start)
				fdt_mem_start = base;
		}
	}

	if (fdt_mem_start == 0xffffffff) {
		/* No usable memory found, falling back to default */
		return mem_start;
	}

	/*
	 * The calculated address is not usable.
	 * Use the lowest usable physical memory address from the DTB instead,
	 * and make sure this is a multiple of 2 MiB for phys/virt patching.
	 */
	return round_up(fdt_mem_start, SZ_2M);
}
+36 −9
Original line number Diff line number Diff line
@@ -174,10 +174,7 @@
		.macro	be32tocpu, val, tmp
#ifndef __ARMEB__
		/* convert to little endian */
		eor	\tmp, \val, \val, ror #16
		bic	\tmp, \tmp, #0x00ff0000
		mov	\val, \val, ror #8
		eor	\val, \val, \tmp, lsr #8
		rev_l	\val, \tmp
#endif
		.endm

@@ -282,10 +279,40 @@ not_angel:
		 * are already placing their zImage in (eg) the top 64MB
		 * of this range.
		 */
		mov	r4, pc
		and	r4, r4, #0xf8000000
		mov	r0, pc
		and	r0, r0, #0xf8000000
#ifdef CONFIG_USE_OF
		adr	r1, LC1
#ifdef CONFIG_ARM_APPENDED_DTB
		/*
		 * Look for an appended DTB.  If found, we cannot use it to
		 * validate the calculated start of physical memory, as its
		 * memory nodes may need to be augmented by ATAGS stored at
		 * an offset from the same start of physical memory.
		 */
		ldr	r2, [r1, #4]	@ get &_edata
		add	r2, r2, r1	@ relocate it
		ldr	r2, [r2]	@ get DTB signature
		ldr	r3, =OF_DT_MAGIC
		cmp	r2, r3		@ do we have a DTB there?
		beq	1f		@ if yes, skip validation
#endif /* CONFIG_ARM_APPENDED_DTB */

		/*
		 * Make sure we have some stack before calling C code.
		 * No GOT fixup has occurred yet, but none of the code we're
		 * about to call uses any global variables.
		 */
		ldr	sp, [r1]	@ get stack location
		add	sp, sp, r1	@ apply relocation

		/* Validate calculated start against passed DTB */
		mov	r1, r8
		bl	fdt_check_mem_start
1:
#endif /* CONFIG_USE_OF */
		/* Determine final kernel image address. */
		add	r4, r4, #TEXT_OFFSET
		add	r4, r0, #TEXT_OFFSET
#else
		ldr	r4, =zreladdr
#endif
@@ -1164,9 +1191,9 @@ __armv4_mmu_cache_off:
__armv7_mmu_cache_off:
		mrc	p15, 0, r0, c1, c0
#ifdef CONFIG_MMU
		bic	r0, r0, #0x000d
		bic	r0, r0, #0x0005
#else
		bic	r0, r0, #0x000c
		bic	r0, r0, #0x0004
#endif
		mcr	p15, 0, r0, c1, c0	@ turn MMU and cache off
		mov	r0, #0
Loading