2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
16 * Pull in the hypervisor header so we declare all the ABI functions
17 * with the underscore versions, then undef the names so that we can
18 * provide our own wrapper versions.
20 #define hv_init _hv_init
21 #define hv_install_context _hv_install_context
22 #define hv_sysconf _hv_sysconf
23 #define hv_get_rtc _hv_get_rtc
24 #define hv_set_rtc _hv_set_rtc
25 #define hv_flush_asid _hv_flush_asid
26 #define hv_flush_page _hv_flush_page
27 #define hv_flush_pages _hv_flush_pages
28 #define hv_restart _hv_restart
29 #define hv_halt _hv_halt
30 #define hv_power_off _hv_power_off
31 #define hv_inquire_physical _hv_inquire_physical
32 #define hv_inquire_memory_controller _hv_inquire_memory_controller
33 #define hv_inquire_virtual _hv_inquire_virtual
34 #define hv_inquire_asid _hv_inquire_asid
35 #define hv_nanosleep _hv_nanosleep
36 #define hv_console_read_if_ready _hv_console_read_if_ready
37 #define hv_console_write _hv_console_write
38 #define hv_downcall_dispatch _hv_downcall_dispatch
39 #define hv_inquire_topology _hv_inquire_topology
40 #define hv_fs_findfile _hv_fs_findfile
41 #define hv_fs_fstat _hv_fs_fstat
42 #define hv_fs_pread _hv_fs_pread
43 #define hv_physaddr_read64 _hv_physaddr_read64
44 #define hv_physaddr_write64 _hv_physaddr_write64
45 #define hv_get_command_line _hv_get_command_line
46 #define hv_set_caching _hv_set_caching
47 #define hv_bzero_page _hv_bzero_page
48 #define hv_register_message_state _hv_register_message_state
49 #define hv_send_message _hv_send_message
50 #define hv_receive_message _hv_receive_message
51 #define hv_inquire_context _hv_inquire_context
52 #define hv_start_all_tiles _hv_start_all_tiles
53 #define hv_dev_open _hv_dev_open
54 #define hv_dev_close _hv_dev_close
55 #define hv_dev_pread _hv_dev_pread
56 #define hv_dev_pwrite _hv_dev_pwrite
57 #define hv_dev_poll _hv_dev_poll
58 #define hv_dev_poll_cancel _hv_dev_poll_cancel
59 #define hv_dev_preada _hv_dev_preada
60 #define hv_dev_pwritea _hv_dev_pwritea
61 #define hv_flush_remote _hv_flush_remote
62 #define hv_console_putc _hv_console_putc
63 #define hv_inquire_tiles _hv_inquire_tiles
64 #define hv_confstr _hv_confstr
65 #define hv_reexec _hv_reexec
66 #define hv_set_command_line _hv_set_command_line
67 #define hv_clear_intr _hv_clear_intr
68 #define hv_enable_intr _hv_enable_intr
69 #define hv_disable_intr _hv_disable_intr
70 #define hv_raise_intr _hv_raise_intr
71 #define hv_trigger_ipi _hv_trigger_ipi
72 #define hv_store_mapping _hv_store_mapping
73 #define hv_inquire_realpa _hv_inquire_realpa
74 #define hv_flush_all _hv_flush_all
75 #define hv_get_ipi_pte _hv_get_ipi_pte
76 #define hv_set_pte_super_shift _hv_set_pte_super_shift
77 #define hv_console_set_ipi _hv_console_set_ipi
78 #include <hv/hypervisor.h>
80 #undef hv_install_context
90 #undef hv_inquire_physical
91 #undef hv_inquire_memory_controller
92 #undef hv_inquire_virtual
93 #undef hv_inquire_asid
95 #undef hv_console_read_if_ready
96 #undef hv_console_write
97 #undef hv_downcall_dispatch
98 #undef hv_inquire_topology
102 #undef hv_physaddr_read64
103 #undef hv_physaddr_write64
104 #undef hv_get_command_line
105 #undef hv_set_caching
107 #undef hv_register_message_state
108 #undef hv_send_message
109 #undef hv_receive_message
110 #undef hv_inquire_context
111 #undef hv_start_all_tiles
117 #undef hv_dev_poll_cancel
119 #undef hv_dev_pwritea
120 #undef hv_flush_remote
121 #undef hv_console_putc
122 #undef hv_inquire_tiles
125 #undef hv_set_command_line
127 #undef hv_enable_intr
128 #undef hv_disable_intr
130 #undef hv_trigger_ipi
131 #undef hv_store_mapping
132 #undef hv_inquire_realpa
134 #undef hv_get_ipi_pte
135 #undef hv_set_pte_super_shift
136 #undef hv_console_set_ipi
139 * Provide macros based on <linux/syscalls.h> to provide a wrapper
140 * function that invokes the same function with an underscore prefix.
141 * We can't use the existing __SC_xxx macros because we need to
142 * support up to nine arguments rather than up to six, and also this
143 * way the file stands alone from possible changes in the
144 * implementation of <linux/syscalls.h>.
146 #define HV_WRAP0(type, name) \
152 #define __HV_DECL1(t1, a1) t1 a1
153 #define __HV_DECL2(t2, a2, ...) t2 a2, __HV_DECL1(__VA_ARGS__)
154 #define __HV_DECL3(t3, a3, ...) t3 a3, __HV_DECL2(__VA_ARGS__)
155 #define __HV_DECL4(t4, a4, ...) t4 a4, __HV_DECL3(__VA_ARGS__)
156 #define __HV_DECL5(t5, a5, ...) t5 a5, __HV_DECL4(__VA_ARGS__)
157 #define __HV_DECL6(t6, a6, ...) t6 a6, __HV_DECL5(__VA_ARGS__)
158 #define __HV_DECL7(t7, a7, ...) t7 a7, __HV_DECL6(__VA_ARGS__)
159 #define __HV_DECL8(t8, a8, ...) t8 a8, __HV_DECL7(__VA_ARGS__)
160 #define __HV_DECL9(t9, a9, ...) t9 a9, __HV_DECL8(__VA_ARGS__)
161 #define __HV_PASS1(t1, a1) a1
162 #define __HV_PASS2(t2, a2, ...) a2, __HV_PASS1(__VA_ARGS__)
163 #define __HV_PASS3(t3, a3, ...) a3, __HV_PASS2(__VA_ARGS__)
164 #define __HV_PASS4(t4, a4, ...) a4, __HV_PASS3(__VA_ARGS__)
165 #define __HV_PASS5(t5, a5, ...) a5, __HV_PASS4(__VA_ARGS__)
166 #define __HV_PASS6(t6, a6, ...) a6, __HV_PASS5(__VA_ARGS__)
167 #define __HV_PASS7(t7, a7, ...) a7, __HV_PASS6(__VA_ARGS__)
168 #define __HV_PASS8(t8, a8, ...) a8, __HV_PASS7(__VA_ARGS__)
169 #define __HV_PASS9(t9, a9, ...) a9, __HV_PASS8(__VA_ARGS__)
170 #define HV_WRAPx(x, type, name, ...) \
171 type name(__HV_DECL##x(__VA_ARGS__)); \
172 type name(__HV_DECL##x(__VA_ARGS__)) \
174 return _##name(__HV_PASS##x(__VA_ARGS__)); \
176 #define HV_WRAP1(type, name, ...) HV_WRAPx(1, type, name, __VA_ARGS__)
177 #define HV_WRAP2(type, name, ...) HV_WRAPx(2, type, name, __VA_ARGS__)
178 #define HV_WRAP3(type, name, ...) HV_WRAPx(3, type, name, __VA_ARGS__)
179 #define HV_WRAP4(type, name, ...) HV_WRAPx(4, type, name, __VA_ARGS__)
180 #define HV_WRAP5(type, name, ...) HV_WRAPx(5, type, name, __VA_ARGS__)
181 #define HV_WRAP6(type, name, ...) HV_WRAPx(6, type, name, __VA_ARGS__)
182 #define HV_WRAP7(type, name, ...) HV_WRAPx(7, type, name, __VA_ARGS__)
183 #define HV_WRAP8(type, name, ...) HV_WRAPx(8, type, name, __VA_ARGS__)
184 #define HV_WRAP9(type, name, ...) HV_WRAPx(9, type, name, __VA_ARGS__)
186 /* List all the hypervisor API functions. */
187 HV_WRAP4(void, hv_init
, HV_VersionNumber
, interface_version_number
,
188 int, chip_num
, int, chip_rev_num
, int, client_pl
)
189 HV_WRAP1(long, hv_sysconf
, HV_SysconfQuery
, query
)
190 HV_WRAP3(int, hv_confstr
, HV_ConfstrQuery
, query
, HV_VirtAddr
, buf
, int, len
)
192 HV_WRAP3(int, hv_get_ipi_pte
, HV_Coord
, tile
, int, pl
, HV_PTE
*, pte
)
193 HV_WRAP3(int, hv_console_set_ipi
, int, ipi
, int, event
, HV_Coord
, coord
);
195 HV_WRAP1(void, hv_enable_intr
, HV_IntrMask
, enab_mask
)
196 HV_WRAP1(void, hv_disable_intr
, HV_IntrMask
, disab_mask
)
197 HV_WRAP1(void, hv_clear_intr
, HV_IntrMask
, clear_mask
)
198 HV_WRAP1(void, hv_raise_intr
, HV_IntrMask
, raise_mask
)
199 HV_WRAP2(HV_Errno
, hv_trigger_ipi
, HV_Coord
, tile
, int, interrupt
)
200 #endif /* !CHIP_HAS_IPI() */
201 HV_WRAP3(int, hv_store_mapping
, HV_VirtAddr
, va
, unsigned int, len
,
203 HV_WRAP2(HV_PhysAddr
, hv_inquire_realpa
, HV_PhysAddr
, cpa
, unsigned int, len
)
204 HV_WRAP0(HV_RTCTime
, hv_get_rtc
)
205 HV_WRAP1(void, hv_set_rtc
, HV_RTCTime
, time
)
206 HV_WRAP4(int, hv_install_context
, HV_PhysAddr
, page_table
, HV_PTE
, access
,
207 HV_ASID
, asid
, __hv32
, flags
)
208 HV_WRAP2(int, hv_set_pte_super_shift
, int, level
, int, log2_count
)
209 HV_WRAP0(HV_Context
, hv_inquire_context
)
210 HV_WRAP1(int, hv_flush_asid
, HV_ASID
, asid
)
211 HV_WRAP2(int, hv_flush_page
, HV_VirtAddr
, address
, HV_PageSize
, page_size
)
212 HV_WRAP3(int, hv_flush_pages
, HV_VirtAddr
, start
, HV_PageSize
, page_size
,
214 HV_WRAP1(int, hv_flush_all
, int, preserve_global
)
215 HV_WRAP2(void, hv_restart
, HV_VirtAddr
, cmd
, HV_VirtAddr
, args
)
216 HV_WRAP0(void, hv_halt
)
217 HV_WRAP0(void, hv_power_off
)
218 HV_WRAP1(int, hv_reexec
, HV_PhysAddr
, entry
)
219 HV_WRAP0(HV_Topology
, hv_inquire_topology
)
220 HV_WRAP3(HV_Errno
, hv_inquire_tiles
, HV_InqTileSet
, set
, HV_VirtAddr
, cpumask
,
222 HV_WRAP1(HV_PhysAddrRange
, hv_inquire_physical
, int, idx
)
223 HV_WRAP2(HV_MemoryControllerInfo
, hv_inquire_memory_controller
, HV_Coord
, coord
,
225 HV_WRAP1(HV_VirtAddrRange
, hv_inquire_virtual
, int, idx
)
226 HV_WRAP1(HV_ASIDRange
, hv_inquire_asid
, int, idx
)
227 HV_WRAP1(void, hv_nanosleep
, int, nanosecs
)
228 HV_WRAP0(int, hv_console_read_if_ready
)
229 HV_WRAP1(void, hv_console_putc
, int, byte
)
230 HV_WRAP2(int, hv_console_write
, HV_VirtAddr
, bytes
, int, len
)
231 HV_WRAP0(void, hv_downcall_dispatch
)
232 HV_WRAP1(int, hv_fs_findfile
, HV_VirtAddr
, filename
)
233 HV_WRAP1(HV_FS_StatInfo
, hv_fs_fstat
, int, inode
)
234 HV_WRAP4(int, hv_fs_pread
, int, inode
, HV_VirtAddr
, buf
,
235 int, length
, int, offset
)
236 HV_WRAP2(unsigned long long, hv_physaddr_read64
, HV_PhysAddr
, addr
,
238 HV_WRAP3(void, hv_physaddr_write64
, HV_PhysAddr
, addr
, HV_PTE
, access
,
239 unsigned long long, val
)
240 HV_WRAP2(int, hv_get_command_line
, HV_VirtAddr
, buf
, int, length
)
241 HV_WRAP2(HV_Errno
, hv_set_command_line
, HV_VirtAddr
, buf
, int, length
)
242 HV_WRAP1(void, hv_set_caching
, unsigned long, bitmask
)
243 HV_WRAP2(void, hv_bzero_page
, HV_VirtAddr
, va
, unsigned int, size
)
244 HV_WRAP1(HV_Errno
, hv_register_message_state
, HV_MsgState
*, msgstate
)
245 HV_WRAP4(int, hv_send_message
, HV_Recipient
*, recips
, int, nrecip
,
246 HV_VirtAddr
, buf
, int, buflen
)
247 HV_WRAP3(HV_RcvMsgInfo
, hv_receive_message
, HV_MsgState
, msgstate
,
248 HV_VirtAddr
, buf
, int, buflen
)
249 HV_WRAP0(void, hv_start_all_tiles
)
250 HV_WRAP2(int, hv_dev_open
, HV_VirtAddr
, name
, __hv32
, flags
)
251 HV_WRAP1(int, hv_dev_close
, int, devhdl
)
252 HV_WRAP5(int, hv_dev_pread
, int, devhdl
, __hv32
, flags
, HV_VirtAddr
, va
,
253 __hv32
, len
, __hv64
, offset
)
254 HV_WRAP5(int, hv_dev_pwrite
, int, devhdl
, __hv32
, flags
, HV_VirtAddr
, va
,
255 __hv32
, len
, __hv64
, offset
)
256 HV_WRAP3(int, hv_dev_poll
, int, devhdl
, __hv32
, events
, HV_IntArg
, intarg
)
257 HV_WRAP1(int, hv_dev_poll_cancel
, int, devhdl
)
258 HV_WRAP6(int, hv_dev_preada
, int, devhdl
, __hv32
, flags
, __hv32
, sgl_len
,
259 HV_SGL
*, sglp
, __hv64
, offset
, HV_IntArg
, intarg
)
260 HV_WRAP6(int, hv_dev_pwritea
, int, devhdl
, __hv32
, flags
, __hv32
, sgl_len
,
261 HV_SGL
*, sglp
, __hv64
, offset
, HV_IntArg
, intarg
)
262 HV_WRAP9(int, hv_flush_remote
, HV_PhysAddr
, cache_pa
,
263 unsigned long, cache_control
, unsigned long*, cache_cpumask
,
264 HV_VirtAddr
, tlb_va
, unsigned long, tlb_length
,
265 unsigned long, tlb_pgsize
, unsigned long*, tlb_cpumask
,
266 HV_Remote_ASID
*, asids
, int, asidcount
)