aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/head.S13
-rw-r--r--core/opal.c7
2 files changed, 8 insertions, 12 deletions
diff --git a/asm/head.S b/asm/head.S
index a786ba1..68a4e7b 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 5143692..4d52827 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;
}