diff options
-rw-r--r-- | asm/head.S | 13 | ||||
-rw-r--r-- | core/opal.c | 7 |
2 files changed, 8 insertions, 12 deletions
@@ -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; } |