1/*
2 * This file contains the code to perform calls to the
3 * iSeries LPAR hypervisor
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version
8 * 2 of the License, or (at your option) any later version.
9 */
10
11#include <asm/ppc_asm.h>
12#include <asm/processor.h>
13#include <asm/ptrace.h>		/* XXX for STACK_FRAME_OVERHEAD */
14
15	.text
16
17/*
18 * Hypervisor call
19 *
20 * Invoke the iSeries hypervisor via the System Call instruction
21 * Parameters are passed to this routine in registers r3 - r10
22 *
23 * r3 contains the HV function to be called
24 * r4-r10 contain the operands to the hypervisor function
25 *
26 */
27
28_GLOBAL(HvCall)
29_GLOBAL(HvCall0)
30_GLOBAL(HvCall1)
31_GLOBAL(HvCall2)
32_GLOBAL(HvCall3)
33_GLOBAL(HvCall4)
34_GLOBAL(HvCall5)
35_GLOBAL(HvCall6)
36_GLOBAL(HvCall7)
37
38
39	mfcr	r0
40	std	r0,-8(r1)
41	stdu	r1,-(STACK_FRAME_OVERHEAD+16)(r1)
42
43	/* r0 = 0xffffffffffffffff indicates a hypervisor call */
44
45	li	r0,-1
46
47	/* Invoke the hypervisor */
48
49	sc
50
51	ld	r1,0(r1)
52	ld	r0,-8(r1)
53	mtcrf	0xff,r0
54
55	/*  return to caller, return value in r3 */
56
57	blr
58
59_GLOBAL(HvCall0Ret16)
60_GLOBAL(HvCall1Ret16)
61_GLOBAL(HvCall2Ret16)
62_GLOBAL(HvCall3Ret16)
63_GLOBAL(HvCall4Ret16)
64_GLOBAL(HvCall5Ret16)
65_GLOBAL(HvCall6Ret16)
66_GLOBAL(HvCall7Ret16)
67
68	mfcr	r0
69	std	r0,-8(r1)
70	std	r31,-16(r1)
71	stdu	r1,-(STACK_FRAME_OVERHEAD+32)(r1)
72
73	mr	r31,r4
74	li	r0,-1
75	mr	r4,r5
76	mr	r5,r6
77	mr	r6,r7
78	mr	r7,r8
79	mr	r8,r9
80	mr	r9,r10
81
82	sc
83
84	std	r3,0(r31)
85	std	r4,8(r31)
86
87	mr	r3,r5
88
89	ld	r1,0(r1)
90	ld	r0,-8(r1)
91	mtcrf	0xff,r0
92	ld	r31,-16(r1)
93
94	blr
95