/* * Copyright (c) 2016 IBM Corporation. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #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 ld r11,opal@got(r2) 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 */ ld r11,opal_return@got(r2) 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 */ ld r11,opal@got(r2) 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);