[Skiboot] [PATCH v3 21/29] asm/head: move opal entry token check into C

Nicholas Piggin npiggin at gmail.com
Wed Nov 29 16:36:59 AEDT 2017


Move opal_check_token from asm to C.

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

diff --git a/asm/head.S b/asm/head.S
index a786ba126..68a4e7b87 100644
--- a/asm/head.S
+++ b/asm/head.S
@@ -964,7 +964,7 @@ opal_entry:
 	LOAD_ADDR_FROM_TOC(%r12, reboot_in_progress)
 	lbz	%r12,0(%r12)
 	cmpwi	%r12,0
-	bne	3f
+	bne	2f
 
 	/* Check entry */
 	mr	%r3,%r1
@@ -986,13 +986,9 @@ opal_entry:
 	 * function pointer. Also check the token.
 	 * For ELFv2 ABI, the local entry point is used so no need for r12.
 	 */
-	cmpldi	%r0,OPAL_LAST
-	bgt-	2f
 	sldi	%r0,%r0,3
 	LOAD_ADDR_FROM_TOC(%r12, opal_branch_table)
 	ldx	%r0,%r12,%r0
-	cmpldi	%r0,0
-	beq-	2f
 	mtctr	%r0
 
 	/* Jump ! */
@@ -1007,12 +1003,7 @@ opal_entry:
 	ld	%r1,STACK_GPR1(%r1)
 	blr
 
-2:	/* Bad token */
-	ld	%r3,STACK_GPR0(%r1)
-	bl	opal_bad_token
-	b	1b
-
-3:	/* Reboot in progress, reject all calls */
+2:	/* Reboot in progress, reject all calls */
 	li	%r3,OPAL_BUSY
 	b	1b
 
diff --git a/core/opal.c b/core/opal.c
index 5143692d8..4d5282791 100644
--- a/core/opal.c
+++ b/core/opal.c
@@ -118,15 +118,20 @@ static void opal_trace_entry(struct stack_frame *eframe __unused)
 #endif
 }
 
+static int64_t opal_check_token(uint64_t token);
+
 /* Called from head.S, thus no prototype */
 int64_t opal_entry_check(struct stack_frame *eframe);
 
-int64_t __attrconst opal_entry_check(struct stack_frame *eframe)
+int64_t opal_entry_check(struct stack_frame *eframe)
 {
 	uint64_t token = eframe->gpr[0];
 
 	opal_trace_entry(eframe);
 
+	if (!opal_check_token(token))
+		return opal_bad_token(token);
+
 	return OPAL_SUCCESS;
 }
 
-- 
2.15.0



More information about the Skiboot mailing list