xref: /kvm-unit-tests/lib/ppc64/opal-calls.S (revision d4c8e725478d05179b23be44fc61357a92da4912)
1610c5a9cSNicholas Piggin/* SPDX-License-Identifier: GPL-2.0-or-later */
2610c5a9cSNicholas Piggin/*
3610c5a9cSNicholas Piggin * Copyright (c) 2016 IBM Corporation.
4610c5a9cSNicholas Piggin */
5610c5a9cSNicholas Piggin
6610c5a9cSNicholas Piggin#include <asm/ppc_asm.h>
7610c5a9cSNicholas Piggin
8610c5a9cSNicholas Piggin	.text
9610c5a9cSNicholas Piggin	.globl opal_call
10610c5a9cSNicholas Pigginopal_call:
11610c5a9cSNicholas Piggin	mr	r0,r3
12610c5a9cSNicholas Piggin	mr	r3,r4
13610c5a9cSNicholas Piggin	mr	r4,r5
14610c5a9cSNicholas Piggin	mr	r5,r6
15610c5a9cSNicholas Piggin	mr	r6,r7
16610c5a9cSNicholas Piggin	mflr	r11
17610c5a9cSNicholas Piggin	std	r11,16(r1)
18610c5a9cSNicholas Piggin	mfcr	r12
19610c5a9cSNicholas Piggin	stw	r12,8(r1)
20610c5a9cSNicholas Piggin	std	r2,-8(r1) /* use redzone */
21610c5a9cSNicholas Piggin
22610c5a9cSNicholas Piggin	/* Set opal return address */
23610c5a9cSNicholas Piggin	LOAD_REG_ADDR(r11, opal_return)
24610c5a9cSNicholas Piggin	mtlr	r11
25610c5a9cSNicholas Piggin	mfmsr	r12
26610c5a9cSNicholas Piggin	std	r12,-16(r1) /* use redzone */
27610c5a9cSNicholas Piggin
28*d4c8e725SNicholas Piggin	/* switch to BE and real-mode when we enter OPAL */
29*d4c8e725SNicholas Piggin	li	r11,(1 << MSR_LE_BIT) | MSR_IR | MSR_DR
30610c5a9cSNicholas Piggin	ori	r11,r11,(1 << MSR_EE_BIT)
31610c5a9cSNicholas Piggin	andc	r12,r12,r11
32610c5a9cSNicholas Piggin	mtspr	SPR_HSRR1,r12
33610c5a9cSNicholas Piggin
34610c5a9cSNicholas Piggin	/* load the opal call entry point and base */
35610c5a9cSNicholas Piggin	LOAD_REG_ADDR(r11, opal)
36610c5a9cSNicholas Piggin	ld	r12,8(r11)
37610c5a9cSNicholas Piggin	ld	r2,0(r11)
38610c5a9cSNicholas Piggin	mtspr	SPR_HSRR0,r12
39610c5a9cSNicholas Piggin	hrfid
40610c5a9cSNicholas Piggin
41610c5a9cSNicholas Pigginopal_return:
42610c5a9cSNicholas Piggin	FIXUP_ENDIAN
43610c5a9cSNicholas Piggin	ld	r12,-16(r1) /* use redzone */
44610c5a9cSNicholas Piggin	mtmsrd	r12
45610c5a9cSNicholas Piggin	ld	r2,-8(r1) /* use redzone */
46610c5a9cSNicholas Piggin	lwz	r11,8(r1);
47610c5a9cSNicholas Piggin	ld	r12,16(r1)
48610c5a9cSNicholas Piggin	mtcr	r11;
49610c5a9cSNicholas Piggin	mtlr	r12
50610c5a9cSNicholas Piggin	blr
51