Subversion Repositories HelenOS

Rev

Rev 3743 | Rev 3783 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3743 rimsky 1
/*
2
 * Copyright (c) 2008 Pavel Rimsky
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28
 
29
/** @addtogroup sparc64
30
 * @{
31
 */
32
/**
33
 * @file
34
 * @brief   Macros, constants and functions needed to perform a call to the
35
 *      hypervisor API. For details and terminology see this document:
36
 *      UltraSPARC Virtual Machine Specification (The Hypervisor API
37
 *      specification for Logical Domains).
38
 *
39
 */
40
 
41
#ifndef KERN_sparc64_sun4v_HYPERCALL_H_
42
#define KERN_sparc64_sun4v_HYPERCALL_H_
43
 
44
/* SW trap numbers for hyperfast traps */
45
#define FAST_TRAP       0x80
46
#define MMU_MAP_ADDR        0x83
47
#define MMU_UNMAP_ADDR      0x84
48
 
49
/* function codes for fast traps */
50
#define MACH_DESC       0x01
51
#define CPU_START       0x10
52
#define CPU_STOP        0x11
53
#define CPU_YIELD       0x12
54
#define CPU_MYID        0x16
55
#define CPU_STATE       0x17
56
#define CPU_SET_RTBA        0x18
57
#define CPU_GET_RTBA        0x19
58
#define MMU_TSB_CTX0        0x20
59
#define MMU_TSB_CTXNON0     0x21
60
#define MMU_DEMAP_PAGE      0x22
61
#define MMU_DEMAP_CTX       0x23
62
#define MMU_DEMAP_ALL       0x24
63
#define MMU_MAP_PERM_ADDR   0x25
64
#define MMU_FAULT_AREA_CONF 0x26
65
#define MMU_ENABLE      0x27
66
#define MMU_UNMAP_PERM_ADDR 0x28
67
#define MMU_TSB_CTX0_INFO   0x29
68
#define MMU_TSB_CTXNON0_INFO    0x2a
69
#define MMU_FAULT_AREA_INFO 0x2b
70
#define CPU_MONDO_SEND      0x42
71
#define CONS_GETCHAR        0x60
72
#define CONS_PUTCHAR        0x61
73
 
3770 rimsky 74
 
75
/* return codes */
76
#define EOK     0   /**< Successful return */
77
#define ENOCPU      1   /**< Invalid CPU id */
78
#define ENORADDR    2   /**< Invalid real address */
79
#define ENOINTR     3   /**< Invalid interrupt id */
80
#define EBADPGSZ    4   /**< Invalid pagesize encoding */
81
#define EBADTSB     5   /**< Invalid TSB description */
82
#define EINVAL      6   /**< Invalid argument */
83
#define EBADTRAP    7   /**< Invalid function number */
84
#define EBADALIGN   8   /**< Invalid address alignment */
85
#define EWOULDBLOCK 9   /**< Cannot complete operation without blocking */
86
#define ENOACCESS   10  /**< No access to specified resource */
87
#define EIO     11  /**< I/O Error */
88
#define ECPUERROR   12  /**< CPU is in error state */
89
#define ENOTSUPPORTED   13  /**< Function not supported */
90
#define ENOMAP      14  /**< No mapping found */
91
#define ETOOMANY    15  /**< Too many items specified / limit reached */
92
#define ECHANNEL    16  /**< Invalid LDC channel */
93
#define EBUSY       17  /**< Operation failed as resource is otherwise busy */
94
 
95
 
3743 rimsky 96
/**
97
 * Performs a hyperfast hypervisor API call from the assembly language code.
98
 * Expects the registers %o1-%o4 are properly filled with the arguments of the
99
 * call.
100
 *
101
 * @param function_number   hyperfast call function number
102
 */
103
#define __HYPERCALL_FAST(function_number) \
104
    set function_number, %o5; \
105
    ta FAST_TRAP;
106
 
107
/**
108
 * Performs a fast hypervisor API call from the assembly language code.
109
 * Expects the registers %o1-%o4 are properly filled with the arguments of the
110
 * call.
111
 *
112
 * @param sw_trap_number    software trap number
113
 */
114
#define __HYPERCALL_HYPERFAST(sw_trap_number) \
115
    ta (sw_trap_number);
116
 
117
 
118
#ifndef __ASM__
119
 
120
/*
121
 * Macros to be used from the C-language code; __hypercall_fastN performs
122
 * a fast hypervisor API call taking exactly N arguments.
123
 */
124
 
125
#define __hypercall_fast0(function_number) \
126
    __hypercall_fast(0, 0, 0, 0, 0, function_number)
127
#define __hypercall_fast1(function_number, p1) \
128
    __hypercall_fast(p1, 0, 0, 0, 0, function_number)
129
#define __hypercall_fast2(function_number, p1, p2) \
130
    __hypercall_fast(p1, p2, 0, 0, 0, function_number)
131
#define __hypercall_fast3(function_number, p1, p2, p3) \
132
    __hypercall_fast(p1, p2, p3, 0, 0, function_number)
133
#define __hypercall_fast4(function_number, p1, p2, p3, p4) \
134
    __hypercall_fast(p1, p2, p3, p4, 0, function_number)
135
#define __hypercall_fast5(function_number, p1, p2, p3, p4, p5) \
136
    __hypercall_fast(p1, p2, p3, p4, p5, function_number)
137
 
138
/**
3770 rimsky 139
 * Performs a fast hypervisor API call which can returns a value.
3743 rimsky 140
 *
141
 * @param p1            the 1st argument of the hypervisor API call
142
 * @param p2            the 2nd argument of the hypervisor API call
143
 * @param p3            the 3rd argument of the hypervisor API call
144
 * @param p4            the 4th argument of the hypervisor API call
145
 * @param p5            the 5th argument of the hypervisor API call
146
 * @param function_number   function number of the call
3770 rimsky 147
 * @param ret1          pointer to an address where the return value
148
 *              of the hypercall should be saved, or NULL
149
 * @return          error status
3743 rimsky 150
 */
151
static inline uint64_t
3770 rimsky 152
__hypercall_fast_ret1(const uint64_t p1, const uint64_t p2, const uint64_t p3,
153
    const uint64_t p4, const uint64_t p5, const uint64_t function_number,
154
    uint64_t * const ret1)
3743 rimsky 155
{
156
    register uint64_t a6 asm("o5") = function_number;
157
    register uint64_t a1 asm("o0") = p1;
158
    register uint64_t a2 asm("o1") = p2;
159
    register uint64_t a3 asm("o2") = p3;
160
    register uint64_t a4 asm("o3") = p4;
161
    register uint64_t a5 asm("o4") = p5;
162
 
163
    asm volatile (
164
        "ta %7\n"
165
        : "=r" (a1)
166
        : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6),
167
          "i" (FAST_TRAP)
168
        : "memory"
169
    );
170
 
3770 rimsky 171
    if (ret1 != NULL)
172
        *ret1 = a2;
3743 rimsky 173
    return a1;
174
}
175
 
176
/**
3770 rimsky 177
 * Performs a fast hypervisor API call which return no value except for the
178
 * error status.
179
 *
180
 * @param p1            the 1st argument of the hypervisor API call
181
 * @param p2            the 2nd argument of the hypervisor API call
182
 * @param p3            the 3rd argument of the hypervisor API call
183
 * @param p4            the 4th argument of the hypervisor API call
184
 * @param p5            the 5th argument of the hypervisor API call
185
 * @param function_number   function number of the call
186
 * @return          error status
187
 */
188
static inline uint64_t
189
__hypercall_fast(const uint64_t p1, const uint64_t p2, const uint64_t p3,
190
    const uint64_t p4, const uint64_t p5, const uint64_t function_number)
191
{
192
    return __hypercall_fast_ret1(p1, p2, p3, p4, p5, function_number,
193
                     NULL);
194
}
195
 
196
/**
3743 rimsky 197
 * Performs a hyperfast hypervisor API call.
198
 *
199
 * @param p1            the 1st argument of the hypervisor API call
200
 * @param p2            the 2nd argument of the hypervisor API call
201
 * @param p3            the 3rd argument of the hypervisor API call
202
 * @param p4            the 4th argument of the hypervisor API call
203
 * @param p5            the 5th argument of the hypervisor API call
204
 * @param sw_trap_number    software trap number
205
 */
206
static inline uint64_t
207
__hypercall_hyperfast(const uint64_t p1, const uint64_t p2, const uint64_t p3,
208
    const uint64_t p4, const uint64_t p5, const uint64_t sw_trap_number)
209
{
210
    register uint64_t a1 asm("o0") = p1;
211
    register uint64_t a2 asm("o1") = p2;
212
    register uint64_t a3 asm("o2") = p3;
213
    register uint64_t a4 asm("o3") = p4;
214
    register uint64_t a5 asm("o4") = p5;
215
 
216
    asm volatile (
217
        "ta %6\n"
218
        : "=r" (a1)
219
        : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5),
220
          "i" (sw_trap_number)
221
        : "memory"
222
    );
223
 
224
    return a1;
225
}
226
 
227
#endif /* ASM */
228
 
229
#endif
230
 
231
/** @}
232
 */