xref: /kvm-unit-tests/lib/ppc64/opal-calls.S (revision 610c5a9c11fc1e8fe936925b8a4975015ffe4b5e)
1*610c5a9cSNicholas Piggin/* SPDX-License-Identifier: GPL-2.0-or-later */
2*610c5a9cSNicholas Piggin/*
3*610c5a9cSNicholas Piggin * Copyright (c) 2016 IBM Corporation.
4*610c5a9cSNicholas Piggin */
5*610c5a9cSNicholas Piggin
6*610c5a9cSNicholas Piggin#include <asm/ppc_asm.h>
7*610c5a9cSNicholas Piggin
8*610c5a9cSNicholas Piggin	.text
9*610c5a9cSNicholas Piggin	.globl opal_call
10*610c5a9cSNicholas Pigginopal_call:
11*610c5a9cSNicholas Piggin	mr	r0,r3
12*610c5a9cSNicholas Piggin	mr	r3,r4
13*610c5a9cSNicholas Piggin	mr	r4,r5
14*610c5a9cSNicholas Piggin	mr	r5,r6
15*610c5a9cSNicholas Piggin	mr	r6,r7
16*610c5a9cSNicholas Piggin	mflr	r11
17*610c5a9cSNicholas Piggin	std	r11,16(r1)
18*610c5a9cSNicholas Piggin	mfcr	r12
19*610c5a9cSNicholas Piggin	stw	r12,8(r1)
20*610c5a9cSNicholas Piggin	std	r2,-8(r1) /* use redzone */
21*610c5a9cSNicholas Piggin
22*610c5a9cSNicholas Piggin	/* Set opal return address */
23*610c5a9cSNicholas Piggin	LOAD_REG_ADDR(r11, opal_return)
24*610c5a9cSNicholas Piggin	mtlr	r11
25*610c5a9cSNicholas Piggin	mfmsr	r12
26*610c5a9cSNicholas Piggin	std	r12,-16(r1) /* use redzone */
27*610c5a9cSNicholas Piggin
28*610c5a9cSNicholas Piggin	/* switch to BE when we enter OPAL */
29*610c5a9cSNicholas Piggin	li	r11,(1 << MSR_LE_BIT)
30*610c5a9cSNicholas Piggin	ori	r11,r11,(1 << MSR_EE_BIT)
31*610c5a9cSNicholas Piggin	andc	r12,r12,r11
32*610c5a9cSNicholas Piggin	mtspr	SPR_HSRR1,r12
33*610c5a9cSNicholas Piggin
34*610c5a9cSNicholas Piggin	/* load the opal call entry point and base */
35*610c5a9cSNicholas Piggin	LOAD_REG_ADDR(r11, opal)
36*610c5a9cSNicholas Piggin	ld	r12,8(r11)
37*610c5a9cSNicholas Piggin	ld	r2,0(r11)
38*610c5a9cSNicholas Piggin	mtspr	SPR_HSRR0,r12
39*610c5a9cSNicholas Piggin	hrfid
40*610c5a9cSNicholas Piggin
41*610c5a9cSNicholas Pigginopal_return:
42*610c5a9cSNicholas Piggin	FIXUP_ENDIAN
43*610c5a9cSNicholas Piggin	ld	r12,-16(r1) /* use redzone */
44*610c5a9cSNicholas Piggin	mtmsrd	r12
45*610c5a9cSNicholas Piggin	ld	r2,-8(r1) /* use redzone */
46*610c5a9cSNicholas Piggin	lwz	r11,8(r1);
47*610c5a9cSNicholas Piggin	ld	r12,16(r1)
48*610c5a9cSNicholas Piggin	mtcr	r11;
49*610c5a9cSNicholas Piggin	mtlr	r12
50*610c5a9cSNicholas Piggin	blr
51