/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (c) 2016 IBM Corporation. */ #include "ppc_asm.h" #include "../include/asm/opal-api.h" .text .globl opal_kentry opal_kentry: /* r3 is the fdt ptr */ mtctr r4 li r4, 0 li r5, 0 li r6, 0 li r7, 0 LOAD_REG_ADDR(r11, opal) ld r8,0(r11) ld r9,8(r11) bctr #define OPAL_CALL(name, token) \ .globl name; \ name: \ li r0, token; \ b opal_call; opal_call: mflr r11 std r11,16(r1) mfcr r12 stw r12,8(r1) mr r13,r2 /* Set opal return address */ LOAD_REG_ADDR(r11, opal_return) mtlr r11 mfmsr r12 /* switch to BE when we enter OPAL */ li r11,MSR_LE andc r12,r12,r11 mtspr SPRN_HSRR1,r12 /* load the opal call entry point and base */ LOAD_REG_ADDR(r11, opal) ld r12,8(r11) ld r2,0(r11) mtspr SPRN_HSRR0,r12 hrfid opal_return: FIXUP_ENDIAN mr r2,r13; lwz r11,8(r1); ld r12,16(r1) mtcr r11; mtlr r12 blr OPAL_CALL(opal_console_write, OPAL_CONSOLE_WRITE); OPAL_CALL(opal_console_read, OPAL_CONSOLE_READ); OPAL_CALL(opal_console_write_buffer_space, OPAL_CONSOLE_WRITE_BUFFER_SPACE); OPAL_CALL(opal_poll_events, OPAL_POLL_EVENTS); OPAL_CALL(opal_console_flush, OPAL_CONSOLE_FLUSH);