Subversion Repositories HelenOS

Rev

Rev 3770 | Go to most recent revision | Details | 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
 
74
/**
75
 * Performs a hyperfast hypervisor API call from the assembly language code.
76
 * Expects the registers %o1-%o4 are properly filled with the arguments of the
77
 * call.
78
 *
79
 * @param function_number   hyperfast call function number
80
 */
81
#define __HYPERCALL_FAST(function_number) \
82
    set function_number, %o5; \
83
    ta FAST_TRAP;
84
 
85
/**
86
 * Performs a fast hypervisor API call from the assembly language code.
87
 * Expects the registers %o1-%o4 are properly filled with the arguments of the
88
 * call.
89
 *
90
 * @param sw_trap_number    software trap number
91
 */
92
#define __HYPERCALL_HYPERFAST(sw_trap_number) \
93
    ta (sw_trap_number);
94
 
95
 
96
#ifndef __ASM__
97
 
98
/*
99
 * Macros to be used from the C-language code; __hypercall_fastN performs
100
 * a fast hypervisor API call taking exactly N arguments.
101
 */
102
 
103
#define __hypercall_fast0(function_number) \
104
    __hypercall_fast(0, 0, 0, 0, 0, function_number)
105
#define __hypercall_fast1(function_number, p1) \
106
    __hypercall_fast(p1, 0, 0, 0, 0, function_number)
107
#define __hypercall_fast2(function_number, p1, p2) \
108
    __hypercall_fast(p1, p2, 0, 0, 0, function_number)
109
#define __hypercall_fast3(function_number, p1, p2, p3) \
110
    __hypercall_fast(p1, p2, p3, 0, 0, function_number)
111
#define __hypercall_fast4(function_number, p1, p2, p3, p4) \
112
    __hypercall_fast(p1, p2, p3, p4, 0, function_number)
113
#define __hypercall_fast5(function_number, p1, p2, p3, p4, p5) \
114
    __hypercall_fast(p1, p2, p3, p4, p5, function_number)
115
 
116
/**
117
 * Performs a fast hypervisor API call.
118
 *
119
 * @param p1            the 1st argument of the hypervisor API call
120
 * @param p2            the 2nd argument of the hypervisor API call
121
 * @param p3            the 3rd argument of the hypervisor API call
122
 * @param p4            the 4th argument of the hypervisor API call
123
 * @param p5            the 5th argument of the hypervisor API call
124
 * @param function_number   function number of the call
125
 */
126
static inline uint64_t
127
__hypercall_fast(const uint64_t p1, const uint64_t p2, const uint64_t p3,
128
    const uint64_t p4, const uint64_t p5, const uint64_t function_number)
129
{
130
    register uint64_t a6 asm("o5") = function_number;
131
    register uint64_t a1 asm("o0") = p1;
132
    register uint64_t a2 asm("o1") = p2;
133
    register uint64_t a3 asm("o2") = p3;
134
    register uint64_t a4 asm("o3") = p4;
135
    register uint64_t a5 asm("o4") = p5;
136
 
137
    asm volatile (
138
        "ta %7\n"
139
        : "=r" (a1)
140
        : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6),
141
          "i" (FAST_TRAP)
142
        : "memory"
143
    );
144
 
145
    return a1;
146
}
147
 
148
/**
149
 * Performs a hyperfast hypervisor API call.
150
 *
151
 * @param p1            the 1st argument of the hypervisor API call
152
 * @param p2            the 2nd argument of the hypervisor API call
153
 * @param p3            the 3rd argument of the hypervisor API call
154
 * @param p4            the 4th argument of the hypervisor API call
155
 * @param p5            the 5th argument of the hypervisor API call
156
 * @param sw_trap_number    software trap number
157
 */
158
static inline uint64_t
159
__hypercall_hyperfast(const uint64_t p1, const uint64_t p2, const uint64_t p3,
160
    const uint64_t p4, const uint64_t p5, const uint64_t sw_trap_number)
161
{
162
    register uint64_t a1 asm("o0") = p1;
163
    register uint64_t a2 asm("o1") = p2;
164
    register uint64_t a3 asm("o2") = p3;
165
    register uint64_t a4 asm("o3") = p4;
166
    register uint64_t a5 asm("o4") = p5;
167
 
168
    asm volatile (
169
        "ta %6\n"
170
        : "=r" (a1)
171
        : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5),
172
          "i" (sw_trap_number)
173
        : "memory"
174
    );
175
 
176
    return a1;
177
}
178
 
179
#endif /* ASM */
180
 
181
#endif
182
 
183
/** @}
184
 */