All of lore.kernel.org
 help / color / mirror / Atom feed
* (no subject)
@ 2018-05-31  4:33 Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 01/11] powerpc/prom_init: Make of_workarounds static Benjamin Herrenschmidt
                   ` (10 more replies)
  0 siblings, 11 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

prom_init is a rather "special" bit of code. Run once when booting
from Open Firmware as pretty much the very first thing we do, it
will perform all communications with OF before it gets killed and
extract the device-tree for the kernel use. It will then re-enter
the kernel at its main entry point but this time with an FDT.

Future secure VM support will require that entry to happen in the
form of a call to the Ultravisor, which will check the integrity
of the kernel image.

Thus it's critical that prom_init doesn't actually write to the
portions of the kernel potentially being checked, or if it does,
undoes it.

This series is a set of a cleanup and a first step in that direction.

All of prom_init static (it shares no globals with the rest of the
kernel appart from some rodata stuff) are moved to a separate ELF
section placed in .bss if they are writeable, or .rodata if not.

We can later move that section elsewhere if necessary or re-clear
the .bss before entering the kernel.

prom_init already takes care of restoring relocs to their original
state.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [RFC PATCH 01/11] powerpc/prom_init: Make of_workarounds static
  2018-05-31  4:33 Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-10-12 13:56   ` Michael Ellerman
  2018-10-15  4:00   ` [RFC,01/11] " Michael Ellerman
  2018-05-31  4:33 ` [RFC PATCH 02/11] powerpc/prom_init: Make "fake_elf" const Benjamin Herrenschmidt
                   ` (9 subsequent siblings)
  10 siblings, 2 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

It's not used anywhere else

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index f9d6befb55a6..d6f52cc141c3 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -88,7 +88,7 @@
 #define OF_WORKAROUNDS	0
 #else
 #define OF_WORKAROUNDS	of_workarounds
-int of_workarounds;
+static int of_workarounds __promdata;
 #endif
 
 #define OF_WA_CLAIM	1	/* do phys/virt claim separately, then map */
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 02/11] powerpc/prom_init: Make "fake_elf" const
  2018-05-31  4:33 Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 01/11] powerpc/prom_init: Make of_workarounds static Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-10-15  4:00   ` [RFC,02/11] " Michael Ellerman
  2018-05-31  4:33 ` [RFC PATCH 03/11] powerpc/prom_init: Make "default_colors" const Benjamin Herrenschmidt
                   ` (8 subsequent siblings)
  10 siblings, 1 reply; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

It is never modified

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index d6f52cc141c3..158f9ece064e 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -897,7 +897,7 @@ struct ibm_arch_vec __cacheline_aligned ibm_architecture_vec = {
 
 /* Old method - ELF header with PT_NOTE sections only works on BE */
 #ifdef __BIG_ENDIAN__
-static struct fake_elf {
+static const struct fake_elf {
 	Elf32_Ehdr	elfhdr;
 	Elf32_Phdr	phdr[2];
 	struct chrpnote {
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 03/11] powerpc/prom_init: Make "default_colors" const
  2018-05-31  4:33 Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 01/11] powerpc/prom_init: Make of_workarounds static Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 02/11] powerpc/prom_init: Make "fake_elf" const Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-10-15  4:00   ` [RFC,03/11] " Michael Ellerman
  2018-05-31  4:33 ` [RFC PATCH 04/11] powerpc/prom_init: Replace __initdata with __prombss when applicable Benjamin Herrenschmidt
                   ` (7 subsequent siblings)
  10 siblings, 1 reply; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

It's never modified either

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index 158f9ece064e..860d2dbb6634 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -2173,7 +2173,7 @@ static void __init prom_check_displays(void)
 	ihandle ih;
 	int i;
 
-	static unsigned char default_colors[] = {
+	static const unsigned char default_colors[] = {
 		0x00, 0x00, 0x00,
 		0x00, 0x00, 0xaa,
 		0x00, 0xaa, 0x00,
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 04/11] powerpc/prom_init: Replace __initdata with __prombss when applicable
  2018-05-31  4:33 Benjamin Herrenschmidt
                   ` (2 preceding siblings ...)
  2018-05-31  4:33 ` [RFC PATCH 03/11] powerpc/prom_init: Make "default_colors" const Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 05/11] powerpc/prom_init: Remove support for OPAL v2 Benjamin Herrenschmidt
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

This replaces all occurrences of __initdata for uninitialized
data with a new __prombss

Currently __promdata is defined to be __initdata but we'll
eventually change that.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 55 +++++++++++++++++----------------
 1 file changed, 29 insertions(+), 26 deletions(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index 860d2dbb6634..d60feccf4b27 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -49,6 +49,9 @@
 
 #include <linux/linux_logo.h>
 
+/* All of prom_init bss lives here */
+#define __prombss __initdata
+
 /*
  * Eventually bump that one up
  */
@@ -88,7 +91,7 @@
 #define OF_WORKAROUNDS	0
 #else
 #define OF_WORKAROUNDS	of_workarounds
-static int of_workarounds __promdata;
+static int of_workarounds __prombss;
 #endif
 
 #define OF_WA_CLAIM	1	/* do phys/virt claim separately, then map */
@@ -149,26 +152,26 @@ extern void copy_and_flush(unsigned long dest, unsigned long src,
 			   unsigned long size, unsigned long offset);
 
 /* prom structure */
-static struct prom_t __initdata prom;
+static struct prom_t __prombss prom;
 
-static unsigned long prom_entry __initdata;
+static unsigned long __prombss prom_entry;
 
 #define PROM_SCRATCH_SIZE 256
 
-static char __initdata of_stdout_device[256];
-static char __initdata prom_scratch[PROM_SCRATCH_SIZE];
+static char __prombss of_stdout_device[256];
+static char __prombss prom_scratch[PROM_SCRATCH_SIZE];
 
-static unsigned long __initdata dt_header_start;
-static unsigned long __initdata dt_struct_start, dt_struct_end;
-static unsigned long __initdata dt_string_start, dt_string_end;
+static unsigned long __prombss dt_header_start;
+static unsigned long __prombss dt_struct_start, dt_struct_end;
+static unsigned long __prombss dt_string_start, dt_string_end;
 
-static unsigned long __initdata prom_initrd_start, prom_initrd_end;
+static unsigned long __prombss prom_initrd_start, prom_initrd_end;
 
 #ifdef CONFIG_PPC64
-static int __initdata prom_iommu_force_on;
-static int __initdata prom_iommu_off;
-static unsigned long __initdata prom_tce_alloc_start;
-static unsigned long __initdata prom_tce_alloc_end;
+static int __prombss prom_iommu_force_on;
+static int __prombss prom_iommu_off;
+static unsigned long __prombss prom_tce_alloc_start;
+static unsigned long __prombss prom_tce_alloc_end;
 #endif
 
 static bool prom_radix_disable __initdata = !IS_ENABLED(CONFIG_PPC_RADIX_MMU_DEFAULT);
@@ -191,22 +194,22 @@ struct platform_support {
 #define PLATFORM_GENERIC	0x0500
 #define PLATFORM_OPAL		0x0600
 
-static int __initdata of_platform;
+static int __prombss of_platform;
 
-static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
+static char __prombss prom_cmd_line[COMMAND_LINE_SIZE];
 
-static unsigned long __initdata prom_memory_limit;
+static unsigned long __prombss prom_memory_limit;
 
-static unsigned long __initdata alloc_top;
-static unsigned long __initdata alloc_top_high;
-static unsigned long __initdata alloc_bottom;
-static unsigned long __initdata rmo_top;
-static unsigned long __initdata ram_top;
+static unsigned long __prombss alloc_top;
+static unsigned long __prombss alloc_top_high;
+static unsigned long __prombss alloc_bottom;
+static unsigned long __prombss rmo_top;
+static unsigned long __prombss ram_top;
 
-static struct mem_map_entry __initdata mem_reserve_map[MEM_RESERVE_MAP_SIZE];
-static int __initdata mem_reserve_cnt;
+static struct mem_map_entry __prombss mem_reserve_map[MEM_RESERVE_MAP_SIZE];
+static int __prombss mem_reserve_cnt;
 
-static cell_t __initdata regbuf[1024];
+static cell_t __prombss regbuf[1024];
 
 static bool rtas_has_query_cpu_stopped;
 
@@ -1534,8 +1537,8 @@ static void __init prom_close_stdin(void)
 #ifdef CONFIG_PPC_POWERNV
 
 #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
-static u64 __initdata prom_opal_base;
-static u64 __initdata prom_opal_entry;
+static u64 __prombss prom_opal_base;
+static u64 __prombss prom_opal_entry;
 #endif
 
 /*
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 05/11] powerpc/prom_init: Remove support for OPAL v2
  2018-05-31  4:33 Benjamin Herrenschmidt
                   ` (3 preceding siblings ...)
  2018-05-31  4:33 ` [RFC PATCH 04/11] powerpc/prom_init: Replace __initdata with __prombss when applicable Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 06/11] powerpc/prom_init: Move prom_radix_disable to __prombss Benjamin Herrenschmidt
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

We removed support for running under any OPAL version
earlier than v3 in 2015 (they never saw the light of day
anyway), but we kept some leftovers of this support in
prom_init.c, so let's take it out.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 147 +++-----------------------------
 1 file changed, 10 insertions(+), 137 deletions(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index d60feccf4b27..7c3d285750ad 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -44,7 +44,6 @@
 #include <asm/btext.h>
 #include <asm/sections.h>
 #include <asm/machdep.h>
-#include <asm/opal.h>
 #include <asm/asm-prototypes.h>
 
 #include <linux/linux_logo.h>
@@ -192,7 +191,6 @@ struct platform_support {
 #define PLATFORM_LPAR		0x0001
 #define PLATFORM_POWERMAC	0x0400
 #define PLATFORM_GENERIC	0x0500
-#define PLATFORM_OPAL		0x0600
 
 static int __prombss of_platform;
 
@@ -659,7 +657,7 @@ static void __init early_cmdline_parse(void)
 		prom_debug("Radix disabled from cmdline\n");
 }
 
-#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
+#ifdef CONFIG_PPC_PSERIES
 /*
  * The architecture vector has an array of PVR mask/value pairs,
  * followed by # option vectors - 1, followed by the option vectors.
@@ -1203,7 +1201,7 @@ static void __init prom_send_capabilities(void)
 	}
 #endif /* __BIG_ENDIAN__ */
 }
-#endif /* #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */
+#endif /* CONFIG_PPC_PSERIES */
 
 /*
  * Memory allocation strategy... our layout is normally:
@@ -1534,88 +1532,6 @@ static void __init prom_close_stdin(void)
 	}
 }
 
-#ifdef CONFIG_PPC_POWERNV
-
-#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
-static u64 __prombss prom_opal_base;
-static u64 __prombss prom_opal_entry;
-#endif
-
-/*
- * Allocate room for and instantiate OPAL
- */
-static void __init prom_instantiate_opal(void)
-{
-	phandle opal_node;
-	ihandle opal_inst;
-	u64 base, entry;
-	u64 size = 0, align = 0x10000;
-	__be64 val64;
-	u32 rets[2];
-
-	prom_debug("prom_instantiate_opal: start...\n");
-
-	opal_node = call_prom("finddevice", 1, 1, ADDR("/ibm,opal"));
-	prom_debug("opal_node: %x\n", opal_node);
-	if (!PHANDLE_VALID(opal_node))
-		return;
-
-	val64 = 0;
-	prom_getprop(opal_node, "opal-runtime-size", &val64, sizeof(val64));
-	size = be64_to_cpu(val64);
-	if (size == 0)
-		return;
-	val64 = 0;
-	prom_getprop(opal_node, "opal-runtime-alignment", &val64,sizeof(val64));
-	align = be64_to_cpu(val64);
-
-	base = alloc_down(size, align, 0);
-	if (base == 0) {
-		prom_printf("OPAL allocation failed !\n");
-		return;
-	}
-
-	opal_inst = call_prom("open", 1, 1, ADDR("/ibm,opal"));
-	if (!IHANDLE_VALID(opal_inst)) {
-		prom_printf("opening opal package failed (%x)\n", opal_inst);
-		return;
-	}
-
-	prom_printf("instantiating opal at 0x%x...", base);
-
-	if (call_prom_ret("call-method", 4, 3, rets,
-			  ADDR("load-opal-runtime"),
-			  opal_inst,
-			  base >> 32, base & 0xffffffff) != 0
-	    || (rets[0] == 0 && rets[1] == 0)) {
-		prom_printf(" failed\n");
-		return;
-	}
-	entry = (((u64)rets[0]) << 32) | rets[1];
-
-	prom_printf(" done\n");
-
-	reserve_mem(base, size);
-
-	prom_debug("opal base     = 0x%x\n", base);
-	prom_debug("opal align    = 0x%x\n", align);
-	prom_debug("opal entry    = 0x%x\n", entry);
-	prom_debug("opal size     = 0x%x\n", (long)size);
-
-	prom_setprop(opal_node, "/ibm,opal", "opal-base-address",
-		     &base, sizeof(base));
-	prom_setprop(opal_node, "/ibm,opal", "opal-entry-address",
-		     &entry, sizeof(entry));
-
-#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
-	prom_opal_base = base;
-	prom_opal_entry = entry;
-#endif
-	prom_debug("prom_instantiate_opal: end...\n");
-}
-
-#endif /* CONFIG_PPC_POWERNV */
-
 /*
  * Allocate room for and instantiate RTAS
  */
@@ -2124,10 +2040,6 @@ static int __init prom_find_machine_type(void)
 		}
 	}
 #ifdef CONFIG_PPC64
-	/* Try to detect OPAL */
-	if (PHANDLE_VALID(call_prom("finddevice", 1, 1, ADDR("/ibm,opal"))))
-		return PLATFORM_OPAL;
-
 	/* Try to figure out if it's an IBM pSeries or any other
 	 * PAPR compliant platform. We assume it is if :
 	 *  - /device_type is "chrp" (please, do NOT use that for future
@@ -2373,7 +2285,7 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
 	unsigned long soff;
 	unsigned char *valp;
 	static char pname[MAX_PROPERTY_NAME];
-	int l, room, has_phandle = 0;
+	int l, room;
 
 	dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
 
@@ -2450,26 +2362,6 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
 		valp = make_room(mem_start, mem_end, l, 4);
 		call_prom("getprop", 4, 1, node, pname, valp, l);
 		*mem_start = _ALIGN(*mem_start, 4);
-
-		if (!strcmp(pname, "phandle"))
-			has_phandle = 1;
-	}
-
-	/* Add a "linux,phandle" property if no "phandle" property already
-	 * existed (can happen with OPAL)
-	 */
-	if (!has_phandle) {
-		soff = dt_find_string("linux,phandle");
-		if (soff == 0)
-			prom_printf("WARNING: Can't find string index for"
-				    " <linux-phandle> node %s\n", path);
-		else {
-			dt_push_token(OF_DT_PROP, mem_start, mem_end);
-			dt_push_token(4, mem_start, mem_end);
-			dt_push_token(soff, mem_start, mem_end);
-			valp = make_room(mem_start, mem_end, 4, 4);
-			*(__be32 *)valp = cpu_to_be32(node);
-		}
 	}
 
 	/* do all our children */
@@ -3146,7 +3038,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
 	 */
 	early_cmdline_parse();
 
-#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
+#ifdef CONFIG_PPC_PSERIES
 	/*
 	 * On pSeries, inform the firmware about our capabilities
 	 */
@@ -3190,15 +3082,9 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
 	 * On non-powermacs, try to instantiate RTAS. PowerMacs don't
 	 * have a usable RTAS implementation.
 	 */
-	if (of_platform != PLATFORM_POWERMAC &&
-	    of_platform != PLATFORM_OPAL)
+	if (of_platform != PLATFORM_POWERMAC)
 		prom_instantiate_rtas();
 
-#ifdef CONFIG_PPC_POWERNV
-	if (of_platform == PLATFORM_OPAL)
-		prom_instantiate_opal();
-#endif /* CONFIG_PPC_POWERNV */
-
 #ifdef CONFIG_PPC64
 	/* instantiate sml */
 	prom_instantiate_sml();
@@ -3211,8 +3097,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
 	 *
 	 * (This must be done after instanciating RTAS)
 	 */
-	if (of_platform != PLATFORM_POWERMAC &&
-	    of_platform != PLATFORM_OPAL)
+	if (of_platform != PLATFORM_POWERMAC)
 		prom_hold_cpus();
 
 	/*
@@ -3256,11 +3141,9 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
 	/*
 	 * in case stdin is USB and still active on IBM machines...
 	 * Unfortunately quiesce crashes on some powermacs if we have
-	 * closed stdin already (in particular the powerbook 101). It
-	 * appears that the OPAL version of OFW doesn't like it either.
+	 * closed stdin already (in particular the powerbook 101).
 	 */
-	if (of_platform != PLATFORM_POWERMAC &&
-	    of_platform != PLATFORM_OPAL)
+	if (of_platform != PLATFORM_POWERMAC)
 		prom_close_stdin();
 
 	/*
@@ -3277,25 +3160,15 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
 	 */
 	hdr = dt_header_start;
 
-	/* Don't print anything after quiesce under OPAL, it crashes OFW */
-	if (of_platform != PLATFORM_OPAL) {
-		prom_printf("Booting Linux via __start() @ 0x%lx ...\n", kbase);
-		prom_debug("->dt_header_start=0x%x\n", hdr);
-	}
+	prom_printf("Booting Linux via __start() @ 0x%lx ...\n", kbase);
+	prom_debug("->dt_header_start=0x%x\n", hdr);
 
 #ifdef CONFIG_PPC32
 	reloc_got2(-offset);
 #else
 	unreloc_toc();
 #endif
-
-#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
-	/* OPAL early debug gets the OPAL base & entry in r8 and r9 */
-	__start(hdr, kbase, 0, 0, 0,
-		prom_opal_base, prom_opal_entry);
-#else
 	__start(hdr, kbase, 0, 0, 0, 0, 0);
-#endif
 
 	return 0;
 }
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 06/11] powerpc/prom_init: Move prom_radix_disable to __prombss
  2018-05-31  4:33 Benjamin Herrenschmidt
                   ` (4 preceding siblings ...)
  2018-05-31  4:33 ` [RFC PATCH 05/11] powerpc/prom_init: Remove support for OPAL v2 Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 07/11] powerpc/prom_init: Move ibm_arch_vec " Benjamin Herrenschmidt
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

Initialize it dynamically instead of statically

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index 7c3d285750ad..6a7549f64e28 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -173,7 +173,9 @@ static unsigned long __prombss prom_tce_alloc_start;
 static unsigned long __prombss prom_tce_alloc_end;
 #endif
 
-static bool prom_radix_disable __initdata = !IS_ENABLED(CONFIG_PPC_RADIX_MMU_DEFAULT);
+#ifdef CONFIG_PPC_PSERIES
+static bool prom_radix_disable __prombss;
+#endif
 
 struct platform_support {
 	bool hash_mmu;
@@ -640,6 +642,8 @@ static void __init early_cmdline_parse(void)
 #endif
 	}
 
+#ifdef CONFIG_PPC_PSERIES
+	prom_radix_disable = !IS_ENABLED(CONFIG_PPC_RADIX_MMU_DEFAULT);
 	opt = strstr(prom_cmd_line, "disable_radix");
 	if (opt) {
 		opt += 13;
@@ -655,6 +659,7 @@ static void __init early_cmdline_parse(void)
 	}
 	if (prom_radix_disable)
 		prom_debug("Radix disabled from cmdline\n");
+#endif /* CONFIG_PPC_PSERIES */
 }
 
 #ifdef CONFIG_PPC_PSERIES
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 07/11] powerpc/prom_init: Move ibm_arch_vec to __prombss
  2018-05-31  4:33 Benjamin Herrenschmidt
                   ` (5 preceding siblings ...)
  2018-05-31  4:33 ` [RFC PATCH 06/11] powerpc/prom_init: Move prom_radix_disable to __prombss Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 08/11] powerpc/prom_init: Move const structures to __initconst Benjamin Herrenschmidt
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

Make the existing initialized definition constant and copy
it to a __prombss copy

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index 6a7549f64e28..8bb6740e3262 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -763,7 +763,7 @@ struct ibm_arch_vec {
 	struct option_vector6 vec6;
 } __packed;
 
-struct ibm_arch_vec __cacheline_aligned ibm_architecture_vec = {
+static const struct ibm_arch_vec ibm_architecture_vec_template = {
 	.pvrs = {
 		{
 			.mask = cpu_to_be32(0xfffe0000), /* POWER5/POWER5+ */
@@ -901,6 +901,8 @@ struct ibm_arch_vec __cacheline_aligned ibm_architecture_vec = {
 	},
 };
 
+static struct ibm_arch_vec __prombss ibm_architecture_vec  ____cacheline_aligned;
+
 /* Old method - ELF header with PT_NOTE sections only works on BE */
 #ifdef __BIG_ENDIAN__
 static const struct fake_elf {
@@ -1110,6 +1112,10 @@ static void __init prom_check_platform_support(void)
 	};
 	int prop_len = prom_getproplen(prom.chosen,
 				       "ibm,arch-vec-5-platform-support");
+
+	/* First copy the architecture vec template */
+	ibm_architecture_vec = ibm_architecture_vec_template;
+
 	if (prop_len > 1) {
 		int i;
 		u8 vec[prop_len];
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 08/11] powerpc/prom_init: Move const structures to __initconst
  2018-05-31  4:33 Benjamin Herrenschmidt
                   ` (6 preceding siblings ...)
  2018-05-31  4:33 ` [RFC PATCH 07/11] powerpc/prom_init: Move ibm_arch_vec " Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 09/11] powerpc/prom_init: Move a few remaining statics to appropriate sections Benjamin Herrenschmidt
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

As they are no longer used past the end of prom_init

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index 8bb6740e3262..67df2758a4e2 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -763,7 +763,7 @@ struct ibm_arch_vec {
 	struct option_vector6 vec6;
 } __packed;
 
-static const struct ibm_arch_vec ibm_architecture_vec_template = {
+static const struct ibm_arch_vec ibm_architecture_vec_template __initconst = {
 	.pvrs = {
 		{
 			.mask = cpu_to_be32(0xfffe0000), /* POWER5/POWER5+ */
@@ -938,7 +938,7 @@ static const struct fake_elf {
 			u32	ignore_me;
 		} rpadesc;
 	} rpanote;
-} fake_elf = {
+} fake_elf __initconst = {
 	.elfhdr = {
 		.e_ident = { 0x7f, 'E', 'L', 'F',
 			     ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
@@ -2099,7 +2099,7 @@ static void __init prom_check_displays(void)
 	ihandle ih;
 	int i;
 
-	static const unsigned char default_colors[] = {
+	static const unsigned char default_colors[] __initconst = {
 		0x00, 0x00, 0x00,
 		0x00, 0x00, 0xaa,
 		0x00, 0xaa, 0x00,
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 09/11] powerpc/prom_init: Move a few remaining statics to appropriate sections
  2018-05-31  4:33 Benjamin Herrenschmidt
                   ` (7 preceding siblings ...)
  2018-05-31  4:33 ` [RFC PATCH 08/11] powerpc/prom_init: Move const structures to __initconst Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 10/11] powerpc/prom_init: Move __prombss to it's own section and store it in .bss Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 11/11] powerpc: Check prom_init for disallowed sections Benjamin Herrenschmidt
  10 siblings, 0 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index 67df2758a4e2..f54177a84dbc 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -174,7 +174,7 @@ static unsigned long __prombss prom_tce_alloc_end;
 #endif
 
 #ifdef CONFIG_PPC_PSERIES
-static bool prom_radix_disable __prombss;
+static bool __prombss prom_radix_disable;
 #endif
 
 struct platform_support {
@@ -211,7 +211,7 @@ static int __prombss mem_reserve_cnt;
 
 static cell_t __prombss regbuf[1024];
 
-static bool rtas_has_query_cpu_stopped;
+static bool  __prombss rtas_has_query_cpu_stopped;
 
 
 /*
@@ -500,8 +500,8 @@ static void add_string(char **str, const char *q)
 
 static char *tohex(unsigned int x)
 {
-	static char digits[] = "0123456789abcdef";
-	static char result[9];
+	static const char digits[] __initconst = "0123456789abcdef";
+	static char result[9] __prombss;
 	int i;
 
 	result[8] = 0;
@@ -2295,7 +2295,7 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
 	char *namep, *prev_name, *sstart, *p, *ep, *lp, *path;
 	unsigned long soff;
 	unsigned char *valp;
-	static char pname[MAX_PROPERTY_NAME];
+	static char pname[MAX_PROPERTY_NAME] __prombss;
 	int l, room;
 
 	dt_push_token(OF_DT_BEGIN_NODE, mem_start, mem_end);
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 10/11] powerpc/prom_init: Move __prombss to it's own section and store it in .bss
  2018-05-31  4:33 Benjamin Herrenschmidt
                   ` (8 preceding siblings ...)
  2018-05-31  4:33 ` [RFC PATCH 09/11] powerpc/prom_init: Move a few remaining statics to appropriate sections Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  2018-05-31  4:33 ` [RFC PATCH 11/11] powerpc: Check prom_init for disallowed sections Benjamin Herrenschmidt
  10 siblings, 0 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

This makes __prombss its own section, and for now store
it in .bss.

This will give us the ability later to store it elsewhere
and/or free it after boot (it's about 8KB).

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init.c   | 2 +-
 arch/powerpc/kernel/vmlinux.lds.S | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index f54177a84dbc..8c39f6bb8ee3 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -49,7 +49,7 @@
 #include <linux/linux_logo.h>
 
 /* All of prom_init bss lives here */
-#define __prombss __initdata
+#define __prombss __section(.bss.prominit)
 
 /*
  * Eventually bump that one up
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
index b8d82678f8b4..c3254d978e34 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -4,6 +4,9 @@
 #else
 #define PROVIDE32(x)	PROVIDE(x)
 #endif
+
+#define BSS_FIRST_SECTIONS *(.bss.prominit)
+
 #include <asm/page.h>
 #include <asm-generic/vmlinux.lds.h>
 #include <asm/cache.h>
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [RFC PATCH 11/11] powerpc: Check prom_init for disallowed sections
  2018-05-31  4:33 Benjamin Herrenschmidt
                   ` (9 preceding siblings ...)
  2018-05-31  4:33 ` [RFC PATCH 10/11] powerpc/prom_init: Move __prombss to it's own section and store it in .bss Benjamin Herrenschmidt
@ 2018-05-31  4:33 ` Benjamin Herrenschmidt
  10 siblings, 0 replies; 16+ messages in thread
From: Benjamin Herrenschmidt @ 2018-05-31  4:33 UTC (permalink / raw)
  To: linuxppc-dev

prom_init.c must not modify the kernel image outside
of the .bss.prominit section. Thus make sure that
prom_init.o doesn't have anything in any of these:

	.data
	.bss
	.init.data

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/kernel/prom_init_check.sh | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh
index acb6b9226352..667df97d2595 100644
--- a/arch/powerpc/kernel/prom_init_check.sh
+++ b/arch/powerpc/kernel/prom_init_check.sh
@@ -28,6 +28,18 @@ OBJ="$2"
 
 ERROR=0
 
+function check_section()
+{
+    file=$1
+    section=$2
+    size=$(objdump -h -j $section $file 2>/dev/null | awk "\$2 == \"$section\" {print \$3}")
+    size=${size:-0}
+    if [ $size -ne 0 ]; then
+	ERROR=1
+	echo "Error: Section $section not empty in prom_init.c" >&2
+    fi
+}
+
 for UNDEF in $($NM -u $OBJ | awk '{print $2}')
 do
 	# On 64-bit nm gives us the function descriptors, which have
@@ -66,4 +78,8 @@ do
 	fi
 done
 
+check_section $OBJ .data
+check_section $OBJ .bss
+check_section $OBJ .init.data
+
 exit $ERROR
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [RFC PATCH 01/11] powerpc/prom_init: Make of_workarounds static
  2018-05-31  4:33 ` [RFC PATCH 01/11] powerpc/prom_init: Make of_workarounds static Benjamin Herrenschmidt
@ 2018-10-12 13:56   ` Michael Ellerman
  2018-10-15  4:00   ` [RFC,01/11] " Michael Ellerman
  1 sibling, 0 replies; 16+ messages in thread
From: Michael Ellerman @ 2018-10-12 13:56 UTC (permalink / raw)
  To: RFC.PATCH.00/11, prom_init.cleanups.and.sanitization, linuxppc-dev

Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:

> It's not used anywhere else
>
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
>  arch/powerpc/kernel/prom_init.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
> index f9d6befb55a6..d6f52cc141c3 100644
> --- a/arch/powerpc/kernel/prom_init.c
> +++ b/arch/powerpc/kernel/prom_init.c
> @@ -88,7 +88,7 @@
>  #define OF_WORKAROUNDS	0
>  #else
>  #define OF_WORKAROUNDS	of_workarounds
> -int of_workarounds;
> +static int of_workarounds __promdata;

I don't have __promdata:

  arch/powerpc/kernel/prom_init.c:90:27: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__promdata’
   static int of_workarounds __promdata;
                             ^~~~~~~~~~
  arch/powerpc/kernel/prom_init.c: In function ‘prom_claim’:
  arch/powerpc/kernel/prom_init.c:89:24: error: ‘of_workarounds’ undeclared (first use in this function); did you mean ‘of_irq_workarounds’?
   #define OF_WORKAROUNDS of_workarounds
                          ^
  arch/powerpc/kernel/prom_init.c:438:21: note: in expansion of macro ‘OF_WORKAROUNDS’
    if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) {
                       ^~~~~~~~~~~~~~
  arch/powerpc/kernel/prom_init.c:89:24: note: each undeclared identifier is reported only once for each function it appears in
   #define OF_WORKAROUNDS of_workarounds
                          ^
  arch/powerpc/kernel/prom_init.c:438:21: note: in expansion of macro ‘OF_WORKAROUNDS’
    if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) {
                       ^~~~~~~~~~~~~~
  arch/powerpc/kernel/prom_init.c: In function ‘prom_setprop’:
  arch/powerpc/kernel/prom_init.c:89:24: error: ‘of_workarounds’ undeclared (first use in this function); did you mean ‘of_irq_workarounds’?
   #define OF_WORKAROUNDS of_workarounds
                          ^
  arch/powerpc/kernel/prom_init.c:544:8: note: in expansion of macro ‘OF_WORKAROUNDS’
    if (!(OF_WORKAROUNDS & OF_WA_LONGTRAIL))
          ^~~~~~~~~~~~~~
  arch/powerpc/kernel/prom_init.c: In function ‘prom_find_mmu’:
  arch/powerpc/kernel/prom_init.c:2072:3: error: ‘of_workarounds’ undeclared (first use in this function); did you mean ‘of_irq_workarounds’?
     of_workarounds = OF_WA_CLAIM;
     ^~~~~~~~~~~~~~
     of_irq_workarounds

cheers

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [RFC,01/11] powerpc/prom_init: Make of_workarounds static
  2018-05-31  4:33 ` [RFC PATCH 01/11] powerpc/prom_init: Make of_workarounds static Benjamin Herrenschmidt
  2018-10-12 13:56   ` Michael Ellerman
@ 2018-10-15  4:00   ` Michael Ellerman
  1 sibling, 0 replies; 16+ messages in thread
From: Michael Ellerman @ 2018-10-15  4:00 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev

On Thu, 2018-05-31 at 04:33:39 UTC, Benjamin Herrenschmidt wrote:
> It's not used anywhere else
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/3bad719b495467a7e7023c5b26f0f5

cheers

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [RFC,02/11] powerpc/prom_init: Make "fake_elf" const
  2018-05-31  4:33 ` [RFC PATCH 02/11] powerpc/prom_init: Make "fake_elf" const Benjamin Herrenschmidt
@ 2018-10-15  4:00   ` Michael Ellerman
  0 siblings, 0 replies; 16+ messages in thread
From: Michael Ellerman @ 2018-10-15  4:00 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev

On Thu, 2018-05-31 at 04:33:40 UTC, Benjamin Herrenschmidt wrote:
> It is never modified
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/30c69ca0486fd73f2e5d40096ee68b

cheers

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [RFC,03/11] powerpc/prom_init: Make "default_colors" const
  2018-05-31  4:33 ` [RFC PATCH 03/11] powerpc/prom_init: Make "default_colors" const Benjamin Herrenschmidt
@ 2018-10-15  4:00   ` Michael Ellerman
  0 siblings, 0 replies; 16+ messages in thread
From: Michael Ellerman @ 2018-10-15  4:00 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev

On Thu, 2018-05-31 at 04:33:41 UTC, Benjamin Herrenschmidt wrote:
> It's never modified either
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/7f995d3ba6f2bfbe274f5a012f5b54

cheers

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2018-10-15  4:07 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-31  4:33 Benjamin Herrenschmidt
2018-05-31  4:33 ` [RFC PATCH 01/11] powerpc/prom_init: Make of_workarounds static Benjamin Herrenschmidt
2018-10-12 13:56   ` Michael Ellerman
2018-10-15  4:00   ` [RFC,01/11] " Michael Ellerman
2018-05-31  4:33 ` [RFC PATCH 02/11] powerpc/prom_init: Make "fake_elf" const Benjamin Herrenschmidt
2018-10-15  4:00   ` [RFC,02/11] " Michael Ellerman
2018-05-31  4:33 ` [RFC PATCH 03/11] powerpc/prom_init: Make "default_colors" const Benjamin Herrenschmidt
2018-10-15  4:00   ` [RFC,03/11] " Michael Ellerman
2018-05-31  4:33 ` [RFC PATCH 04/11] powerpc/prom_init: Replace __initdata with __prombss when applicable Benjamin Herrenschmidt
2018-05-31  4:33 ` [RFC PATCH 05/11] powerpc/prom_init: Remove support for OPAL v2 Benjamin Herrenschmidt
2018-05-31  4:33 ` [RFC PATCH 06/11] powerpc/prom_init: Move prom_radix_disable to __prombss Benjamin Herrenschmidt
2018-05-31  4:33 ` [RFC PATCH 07/11] powerpc/prom_init: Move ibm_arch_vec " Benjamin Herrenschmidt
2018-05-31  4:33 ` [RFC PATCH 08/11] powerpc/prom_init: Move const structures to __initconst Benjamin Herrenschmidt
2018-05-31  4:33 ` [RFC PATCH 09/11] powerpc/prom_init: Move a few remaining statics to appropriate sections Benjamin Herrenschmidt
2018-05-31  4:33 ` [RFC PATCH 10/11] powerpc/prom_init: Move __prombss to it's own section and store it in .bss Benjamin Herrenschmidt
2018-05-31  4:33 ` [RFC PATCH 11/11] powerpc: Check prom_init for disallowed sections Benjamin Herrenschmidt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.