linux/arch/powerpc/boot/opal-calls.S
Nicholas Piggin dab3b8f4fd powerpc/64: asm use consistent global variable declaration and access
Use helper macros to access global variables, and place them in .data
sections rather than in .toc. Putting addresses in TOC is not required
because the kernel is linked with a single TOC.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220926034057.2360083-3-npiggin@gmail.com
2022-09-28 19:22:12 +10:00

68 lines
1.2 KiB
ArmAsm

/* 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);