Chris Metcalf | 9ae0983 | 2013-08-07 16:03:08 -0400 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2013 Tilera Corporation. All Rights Reserved. |
| 3 | * |
| 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. |
| 7 | * |
| 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 |
| 12 | * more details. |
| 13 | */ |
| 14 | |
| 15 | /* |
| 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. |
| 19 | */ |
| 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> |
| 79 | #undef hv_init |
| 80 | #undef hv_install_context |
| 81 | #undef hv_sysconf |
| 82 | #undef hv_get_rtc |
| 83 | #undef hv_set_rtc |
| 84 | #undef hv_flush_asid |
| 85 | #undef hv_flush_page |
| 86 | #undef hv_flush_pages |
| 87 | #undef hv_restart |
| 88 | #undef hv_halt |
| 89 | #undef hv_power_off |
| 90 | #undef hv_inquire_physical |
| 91 | #undef hv_inquire_memory_controller |
| 92 | #undef hv_inquire_virtual |
| 93 | #undef hv_inquire_asid |
| 94 | #undef hv_nanosleep |
| 95 | #undef hv_console_read_if_ready |
| 96 | #undef hv_console_write |
| 97 | #undef hv_downcall_dispatch |
| 98 | #undef hv_inquire_topology |
| 99 | #undef hv_fs_findfile |
| 100 | #undef hv_fs_fstat |
| 101 | #undef hv_fs_pread |
| 102 | #undef hv_physaddr_read64 |
| 103 | #undef hv_physaddr_write64 |
| 104 | #undef hv_get_command_line |
| 105 | #undef hv_set_caching |
| 106 | #undef hv_bzero_page |
| 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 |
| 112 | #undef hv_dev_open |
| 113 | #undef hv_dev_close |
| 114 | #undef hv_dev_pread |
| 115 | #undef hv_dev_pwrite |
| 116 | #undef hv_dev_poll |
| 117 | #undef hv_dev_poll_cancel |
| 118 | #undef hv_dev_preada |
| 119 | #undef hv_dev_pwritea |
| 120 | #undef hv_flush_remote |
| 121 | #undef hv_console_putc |
| 122 | #undef hv_inquire_tiles |
| 123 | #undef hv_confstr |
| 124 | #undef hv_reexec |
| 125 | #undef hv_set_command_line |
| 126 | #undef hv_clear_intr |
| 127 | #undef hv_enable_intr |
| 128 | #undef hv_disable_intr |
| 129 | #undef hv_raise_intr |
| 130 | #undef hv_trigger_ipi |
| 131 | #undef hv_store_mapping |
| 132 | #undef hv_inquire_realpa |
| 133 | #undef hv_flush_all |
| 134 | #undef hv_get_ipi_pte |
| 135 | #undef hv_set_pte_super_shift |
| 136 | #undef hv_console_set_ipi |
| 137 | |
| 138 | /* |
| 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>. |
| 145 | */ |
| 146 | #define HV_WRAP0(type, name) \ |
| 147 | type name(void); \ |
| 148 | type name(void) \ |
| 149 | { \ |
| 150 | return _##name(); \ |
| 151 | } |
| 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__)) \ |
| 173 | { \ |
| 174 | return _##name(__HV_PASS##x(__VA_ARGS__)); \ |
| 175 | } |
| 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__) |
| 185 | |
| 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) |
| 191 | #if CHIP_HAS_IPI() |
| 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); |
| 194 | #else |
| 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, |
| 202 | HV_PhysAddr, pa) |
| 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, |
| 213 | unsigned long, 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, |
| 221 | int, length) |
| 222 | HV_WRAP1(HV_PhysAddrRange, hv_inquire_physical, int, idx) |
| 223 | HV_WRAP2(HV_MemoryControllerInfo, hv_inquire_memory_controller, HV_Coord, coord, |
| 224 | int, controller) |
| 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, |
| 237 | HV_PTE, access) |
| 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) |