xref: /linux/arch/powerpc/platforms/pseries/hvCall.S (revision de2fe5e07d58424bc286fff3fd3c1b0bf933cd58)
1/*
2 * This file contains the generic code to perform a call to the
3 * pSeries LPAR hypervisor.
4 * NOTE: this file will go away when we move to inline this work.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11#include <asm/hvcall.h>
12#include <asm/processor.h>
13#include <asm/ppc_asm.h>
14
15#define STK_PARM(i)     (48 + ((i)-3)*8)
16
17	.text
18
19/* long plpar_hcall(unsigned long opcode,		R3
20			unsigned long arg1,		R4
21			unsigned long arg2,		R5
22			unsigned long arg3,		R6
23			unsigned long arg4,		R7
24			unsigned long *out1,		R8
25			unsigned long *out2,		R9
26			unsigned long *out3);		R10
27 */
28_GLOBAL(plpar_hcall)
29	HMT_MEDIUM
30
31	mfcr	r0
32
33	std	r8,STK_PARM(r8)(r1)	/* Save out ptrs */
34	std	r9,STK_PARM(r9)(r1)
35	std	r10,STK_PARM(r10)(r1)
36
37	stw	r0,8(r1)
38
39	HVSC				/* invoke the hypervisor */
40
41	lwz	r0,8(r1)
42
43	ld	r8,STK_PARM(r8)(r1)	/* Fetch r4-r6 ret args */
44	ld	r9,STK_PARM(r9)(r1)
45	ld	r10,STK_PARM(r10)(r1)
46	std	r4,0(r8)
47	std	r5,0(r9)
48	std	r6,0(r10)
49
50	mtcrf	0xff,r0
51	blr				/* return r3 = status */
52
53
54/* Simple interface with no output values (other than status) */
55_GLOBAL(plpar_hcall_norets)
56	HMT_MEDIUM
57
58	mfcr	r0
59	stw	r0,8(r1)
60
61	HVSC				/* invoke the hypervisor */
62
63	lwz	r0,8(r1)
64	mtcrf	0xff,r0
65	blr				/* return r3 = status */
66
67
68/* long plpar_hcall_8arg_2ret(unsigned long opcode,	R3
69			unsigned long arg1,		R4
70			unsigned long arg2,		R5
71			unsigned long arg3,		R6
72			unsigned long arg4,		R7
73			unsigned long arg5,		R8
74			unsigned long arg6,		R9
75			unsigned long arg7,		R10
76			unsigned long arg8,		112(R1)
77			unsigned long *out1);		120(R1)
78 */
79_GLOBAL(plpar_hcall_8arg_2ret)
80	HMT_MEDIUM
81
82	mfcr	r0
83	ld	r11,STK_PARM(r11)(r1)	/* put arg8 in R11 */
84	stw	r0,8(r1)
85
86	HVSC				/* invoke the hypervisor */
87
88	lwz	r0,8(r1)
89	ld	r10,STK_PARM(r12)(r1)	/* Fetch r4 ret arg */
90	std	r4,0(r10)
91	mtcrf	0xff,r0
92	blr				/* return r3 = status */
93
94
95/* long plpar_hcall_4out(unsigned long opcode,		R3
96		 	unsigned long arg1,		R4
97		 	unsigned long arg2,		R5
98		 	unsigned long arg3,		R6
99		 	unsigned long arg4,		R7
100		 	unsigned long *out1,		R8
101		 	unsigned long *out2,		R9
102		 	unsigned long *out3,		R10
103		 	unsigned long *out4);		112(R1)
104 */
105_GLOBAL(plpar_hcall_4out)
106	HMT_MEDIUM
107
108	mfcr	r0
109	stw	r0,8(r1)
110
111	std	r8,STK_PARM(r8)(r1)	/* Save out ptrs */
112	std	r9,STK_PARM(r9)(r1)
113	std	r10,STK_PARM(r10)(r1)
114
115	HVSC				/* invoke the hypervisor */
116
117	lwz	r0,8(r1)
118
119	ld	r8,STK_PARM(r8)(r1)	/* Fetch r4-r7 ret args */
120	ld	r9,STK_PARM(r9)(r1)
121	ld	r10,STK_PARM(r10)(r1)
122	ld	r11,STK_PARM(r11)(r1)
123	std	r4,0(r8)
124	std	r5,0(r9)
125	std	r6,0(r10)
126	std	r7,0(r11)
127
128	mtcrf	0xff,r0
129	blr				/* return r3 = status */
130