[Skiboot] [PATCH 07/16] move opal_branch_table, opal_num_args to .rodata section

Nicholas Piggin npiggin at gmail.com
Mon Apr 27 21:08:04 AEST 2020


.head is for code and data which must reside at a fixed low address,
mainly entry points.

These are moved into .rodata. Despite being modified at runtime, this
facilitates these tables being write-protected in a later patch.

Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
---
 asm/head.S  |  7 -------
 asm/misc.S  | 10 ++++++++++
 core/opal.c | 12 ++++++------
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/asm/head.S b/asm/head.S
index 6a167e564..450fb71f1 100644
--- a/asm/head.S
+++ b/asm/head.S
@@ -299,13 +299,6 @@ exception_entry_foo:
 	b	.
 
 	.= EXCEPTION_VECTORS_END
-	/* This is the OPAL branch table. It's populated at boot time
-	 * with function pointers to the various OPAL functions from
-	 * the content of the .opal_table section, indexed by Token.
-	 */
-.global opal_branch_table
-opal_branch_table:
-	.space	8 * (OPAL_LAST + 1)
 
 /* Stores the offset we were started from.  Used later on if we want to
  * read any unrelocated code/data such as the built-in kernel image
diff --git a/asm/misc.S b/asm/misc.S
index 10c1d1463..b016e6405 100644
--- a/asm/misc.S
+++ b/asm/misc.S
@@ -9,9 +9,19 @@
 #include <asm-offsets.h>
 #include <processor.h>
 #include <stack.h>
+#include <opal-api.h>
 
 #define OLD_BINUTILS 1
 
+	.section ".rodata"
+	/* This is the OPAL branch table. It's populated at boot time
+	 * with function pointers to the various OPAL functions from
+	 * the content of the .opal_table section, indexed by Token.
+	 */
+.global opal_branch_table
+opal_branch_table:
+	.space	8 * (OPAL_LAST + 1)
+
 	.section ".text","ax"
 	.balign	0x10
 
diff --git a/core/opal.c b/core/opal.c
index 64fdfe62a..46518c445 100644
--- a/core/opal.c
+++ b/core/opal.c
@@ -28,10 +28,10 @@
 uint64_t opal_pending_events;
 
 /* OPAL dispatch table defined in head.S */
-extern uint64_t opal_branch_table[];
+extern const uint64_t opal_branch_table[];
 
 /* Number of args expected for each call. */
-static u8 opal_num_args[OPAL_LAST+1];
+static const u8 opal_num_args[OPAL_LAST+1];
 
 /* OPAL anchor node */
 struct dt_node *opal_node;
@@ -53,8 +53,8 @@ void opal_table_init(void)
 	prlog(PR_DEBUG, "OPAL table: %p .. %p, branch table: %p\n",
 	      s, e, opal_branch_table);
 	while(s < e) {
-		opal_branch_table[s->token] = function_entry_address(s->func);
-		opal_num_args[s->token] = s->nargs;
+		((uint64_t *)opal_branch_table)[s->token] = function_entry_address(s->func);
+		((u8 *)opal_num_args)[s->token] = s->nargs;
 		s++;
 	}
 }
@@ -321,8 +321,8 @@ void __opal_register(uint64_t token, void *func, unsigned int nargs)
 {
 	assert(token <= OPAL_LAST);
 
-	opal_branch_table[token] = function_entry_address(func);
-	opal_num_args[token] = nargs;
+	((uint64_t *)opal_branch_table)[token] = function_entry_address(func);
+	((u8 *)opal_num_args)[token] = nargs;
 }
 
 /*
-- 
2.23.0



More information about the Skiboot mailing list