diff options
Diffstat (limited to 'arch/powerpc/platforms/iseries/hvcall.S')
-rw-r--r-- | arch/powerpc/platforms/iseries/hvcall.S | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/iseries/hvcall.S b/arch/powerpc/platforms/iseries/hvcall.S new file mode 100644 index 00000000000..07ae6ad5f49 --- /dev/null +++ b/arch/powerpc/platforms/iseries/hvcall.S | |||
@@ -0,0 +1,94 @@ | |||
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 | ||