Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tile: provide traceability for hypervisor calls

This change adds infrastructure (CONFIG_TILE_HVGLUE_TRACE) that
provides C code wrappers for the calls the kernel makes to the Tilera
hypervisor. This allows standard kernel infrastructure like FTRACE to
be able to instrument hypervisor calls.

To allow direct calls to the true API, we export their names with a
leading underscore as well. This is important for the few contexts
where we need to make hypervisor calls without touching the stack.

As part of this change, we also switch from creating the symbols
with linker magic to creating them with assembler magic. This lets
us provide a symbol type and generally make them appear more as symbols
and less as just random values in the Elf namespace.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>

+368 -76
+8
arch/tile/Kconfig.debug
··· 24 24 size and build time noticeably. Such flags are often 25 25 helpful if the main use of debug info is line number info. 26 26 27 + config TILE_HVGLUE_TRACE 28 + bool "Provide wrapper functions for hypervisor ABI calls" 29 + default n 30 + help 31 + Provide wrapper functions for the hypervisor ABI calls 32 + defined in arch/tile/kernel/hvglue.S. This allows tracing 33 + mechanisms, etc., to have visibility into those calls. 34 + 27 35 endmenu
+2 -1
arch/tile/kernel/Makefile
··· 3 3 # 4 4 5 5 extra-y := vmlinux.lds head_$(BITS).o 6 - obj-y := backtrace.o entry.o irq.o messaging.o \ 6 + obj-y := backtrace.o entry.o hvglue.o irq.o messaging.o \ 7 7 pci-dma.o proc.o process.o ptrace.o reboot.o \ 8 8 setup.o signal.o single_step.o stack.o sys.o \ 9 9 sysfs.o time.o traps.o unaligned.o vdso.o \ ··· 21 21 obj-$(CONFIG_PCI) += pci.o 22 22 endif 23 23 obj-$(CONFIG_TILE_USB) += usb.o 24 + obj-$(CONFIG_TILE_HVGLUE_TRACE) += hvglue_trace.o 24 25 25 26 obj-y += vdso/
+4 -4
arch/tile/kernel/head_32.S
··· 39 39 } 40 40 { 41 41 moveli r0, _HV_VERSION_OLD_HV_INIT 42 - jal hv_init 42 + jal _hv_init 43 43 } 44 44 /* Get a reasonable default ASID in r0 */ 45 45 { 46 46 move r0, zero 47 - jal hv_inquire_asid 47 + jal _hv_inquire_asid 48 48 } 49 49 /* Install the default page table */ 50 50 { ··· 73 73 } 74 74 { 75 75 auli lr, lr, ha16(1f) 76 - j hv_install_context 76 + j _hv_install_context 77 77 } 78 78 1: 79 79 80 80 /* Get our processor number and save it away in SAVE_K_0. */ 81 - jal hv_inquire_topology 81 + jal _hv_inquire_topology 82 82 mulll_uu r4, r1, r2 /* r1 == y, r2 == width */ 83 83 add r4, r4, r0 /* r0 == x, so r4 == cpu == y*width + x */ 84 84
+4 -4
arch/tile/kernel/head_64.S
··· 55 55 movei r2, TILE_CHIP_REV 56 56 movei r3, KERNEL_PL 57 57 } 58 - jal hv_init 58 + jal _hv_init 59 59 /* Get a reasonable default ASID in r0 */ 60 60 { 61 61 move r0, zero 62 - jal hv_inquire_asid 62 + jal _hv_inquire_asid 63 63 } 64 64 65 65 /* ··· 130 130 } 131 131 { 132 132 moveli r3, CTX_PAGE_FLAG 133 - j hv_install_context 133 + j _hv_install_context 134 134 } 135 135 1: 136 136 ··· 141 141 mtspr SPR_INTERRUPT_VECTOR_BASE_K, r0 142 142 143 143 /* Get our processor number and save it away in SAVE_K_0. */ 144 - jal hv_inquire_topology 144 + jal _hv_inquire_topology 145 145 { 146 146 GET_FIRST_INT(r5, r1) /* r5 = width */ 147 147 GET_SECOND_INT(r4, r0) /* r4 = y */
+74
arch/tile/kernel/hvglue.S
··· 1 + /* Hypervisor call vector addresses; see <hv/hypervisor.h> */ 2 + .macro gensym sym, val, size 3 + .org \val 4 + .global _\sym 5 + .type _\sym,function 6 + _\sym: 7 + .size _\sym,\size 8 + #ifndef CONFIG_TILE_HVGLUE_TRACE 9 + .globl \sym 10 + .set \sym,_\sym 11 + #endif 12 + .endm 13 + 14 + .section .hvglue,"x",@nobits 15 + .align 8 16 + gensym hv_init, 0x20, 32 17 + gensym hv_install_context, 0x40, 32 18 + gensym hv_sysconf, 0x60, 32 19 + gensym hv_get_rtc, 0x80, 32 20 + gensym hv_set_rtc, 0xa0, 32 21 + gensym hv_flush_asid, 0xc0, 32 22 + gensym hv_flush_page, 0xe0, 32 23 + gensym hv_flush_pages, 0x100, 32 24 + gensym hv_restart, 0x120, 32 25 + gensym hv_halt, 0x140, 32 26 + gensym hv_power_off, 0x160, 32 27 + gensym hv_inquire_physical, 0x180, 32 28 + gensym hv_inquire_memory_controller, 0x1a0, 32 29 + gensym hv_inquire_virtual, 0x1c0, 32 30 + gensym hv_inquire_asid, 0x1e0, 32 31 + gensym hv_nanosleep, 0x200, 32 32 + gensym hv_console_read_if_ready, 0x220, 32 33 + gensym hv_console_write, 0x240, 32 34 + gensym hv_downcall_dispatch, 0x260, 32 35 + gensym hv_inquire_topology, 0x280, 32 36 + gensym hv_fs_findfile, 0x2a0, 32 37 + gensym hv_fs_fstat, 0x2c0, 32 38 + gensym hv_fs_pread, 0x2e0, 32 39 + gensym hv_physaddr_read64, 0x300, 32 40 + gensym hv_physaddr_write64, 0x320, 32 41 + gensym hv_get_command_line, 0x340, 32 42 + gensym hv_set_caching, 0x360, 32 43 + gensym hv_bzero_page, 0x380, 32 44 + gensym hv_register_message_state, 0x3a0, 32 45 + gensym hv_send_message, 0x3c0, 32 46 + gensym hv_receive_message, 0x3e0, 32 47 + gensym hv_inquire_context, 0x400, 32 48 + gensym hv_start_all_tiles, 0x420, 32 49 + gensym hv_dev_open, 0x440, 32 50 + gensym hv_dev_close, 0x460, 32 51 + gensym hv_dev_pread, 0x480, 32 52 + gensym hv_dev_pwrite, 0x4a0, 32 53 + gensym hv_dev_poll, 0x4c0, 32 54 + gensym hv_dev_poll_cancel, 0x4e0, 32 55 + gensym hv_dev_preada, 0x500, 32 56 + gensym hv_dev_pwritea, 0x520, 32 57 + gensym hv_flush_remote, 0x540, 32 58 + gensym hv_console_putc, 0x560, 32 59 + gensym hv_inquire_tiles, 0x580, 32 60 + gensym hv_confstr, 0x5a0, 32 61 + gensym hv_reexec, 0x5c0, 32 62 + gensym hv_set_command_line, 0x5e0, 32 63 + gensym hv_clear_intr, 0x600, 32 64 + gensym hv_enable_intr, 0x620, 32 65 + gensym hv_disable_intr, 0x640, 32 66 + gensym hv_raise_intr, 0x660, 32 67 + gensym hv_trigger_ipi, 0x680, 32 68 + gensym hv_store_mapping, 0x6a0, 32 69 + gensym hv_inquire_realpa, 0x6c0, 32 70 + gensym hv_flush_all, 0x6e0, 32 71 + gensym hv_get_ipi_pte, 0x700, 32 72 + gensym hv_set_pte_super_shift, 0x720, 32 73 + gensym hv_console_set_ipi, 0x7e0, 32 74 + gensym hv_glue_internals, 0x800, 30720
-60
arch/tile/kernel/hvglue.lds
··· 1 - /* Hypervisor call vector addresses; see <hv/hypervisor.h> */ 2 - hv_init = TEXT_OFFSET + 0x10020; 3 - hv_install_context = TEXT_OFFSET + 0x10040; 4 - hv_sysconf = TEXT_OFFSET + 0x10060; 5 - hv_get_rtc = TEXT_OFFSET + 0x10080; 6 - hv_set_rtc = TEXT_OFFSET + 0x100a0; 7 - hv_flush_asid = TEXT_OFFSET + 0x100c0; 8 - hv_flush_page = TEXT_OFFSET + 0x100e0; 9 - hv_flush_pages = TEXT_OFFSET + 0x10100; 10 - hv_restart = TEXT_OFFSET + 0x10120; 11 - hv_halt = TEXT_OFFSET + 0x10140; 12 - hv_power_off = TEXT_OFFSET + 0x10160; 13 - hv_inquire_physical = TEXT_OFFSET + 0x10180; 14 - hv_inquire_memory_controller = TEXT_OFFSET + 0x101a0; 15 - hv_inquire_virtual = TEXT_OFFSET + 0x101c0; 16 - hv_inquire_asid = TEXT_OFFSET + 0x101e0; 17 - hv_nanosleep = TEXT_OFFSET + 0x10200; 18 - hv_console_read_if_ready = TEXT_OFFSET + 0x10220; 19 - hv_console_write = TEXT_OFFSET + 0x10240; 20 - hv_downcall_dispatch = TEXT_OFFSET + 0x10260; 21 - hv_inquire_topology = TEXT_OFFSET + 0x10280; 22 - hv_fs_findfile = TEXT_OFFSET + 0x102a0; 23 - hv_fs_fstat = TEXT_OFFSET + 0x102c0; 24 - hv_fs_pread = TEXT_OFFSET + 0x102e0; 25 - hv_physaddr_read64 = TEXT_OFFSET + 0x10300; 26 - hv_physaddr_write64 = TEXT_OFFSET + 0x10320; 27 - hv_get_command_line = TEXT_OFFSET + 0x10340; 28 - hv_set_caching = TEXT_OFFSET + 0x10360; 29 - hv_bzero_page = TEXT_OFFSET + 0x10380; 30 - hv_register_message_state = TEXT_OFFSET + 0x103a0; 31 - hv_send_message = TEXT_OFFSET + 0x103c0; 32 - hv_receive_message = TEXT_OFFSET + 0x103e0; 33 - hv_inquire_context = TEXT_OFFSET + 0x10400; 34 - hv_start_all_tiles = TEXT_OFFSET + 0x10420; 35 - hv_dev_open = TEXT_OFFSET + 0x10440; 36 - hv_dev_close = TEXT_OFFSET + 0x10460; 37 - hv_dev_pread = TEXT_OFFSET + 0x10480; 38 - hv_dev_pwrite = TEXT_OFFSET + 0x104a0; 39 - hv_dev_poll = TEXT_OFFSET + 0x104c0; 40 - hv_dev_poll_cancel = TEXT_OFFSET + 0x104e0; 41 - hv_dev_preada = TEXT_OFFSET + 0x10500; 42 - hv_dev_pwritea = TEXT_OFFSET + 0x10520; 43 - hv_flush_remote = TEXT_OFFSET + 0x10540; 44 - hv_console_putc = TEXT_OFFSET + 0x10560; 45 - hv_inquire_tiles = TEXT_OFFSET + 0x10580; 46 - hv_confstr = TEXT_OFFSET + 0x105a0; 47 - hv_reexec = TEXT_OFFSET + 0x105c0; 48 - hv_set_command_line = TEXT_OFFSET + 0x105e0; 49 - hv_clear_intr = TEXT_OFFSET + 0x10600; 50 - hv_enable_intr = TEXT_OFFSET + 0x10620; 51 - hv_disable_intr = TEXT_OFFSET + 0x10640; 52 - hv_raise_intr = TEXT_OFFSET + 0x10660; 53 - hv_trigger_ipi = TEXT_OFFSET + 0x10680; 54 - hv_store_mapping = TEXT_OFFSET + 0x106a0; 55 - hv_inquire_realpa = TEXT_OFFSET + 0x106c0; 56 - hv_flush_all = TEXT_OFFSET + 0x106e0; 57 - hv_get_ipi_pte = TEXT_OFFSET + 0x10700; 58 - hv_set_pte_super_shift = TEXT_OFFSET + 0x10720; 59 - hv_console_set_ipi = TEXT_OFFSET + 0x107e0; 60 - hv_glue_internals = TEXT_OFFSET + 0x10800;
+266
arch/tile/kernel/hvglue_trace.c
··· 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)
+1 -1
arch/tile/kernel/intvec_32.S
··· 758 758 .macro dc_dispatch vecnum, vecname 759 759 .org (\vecnum << 8) 760 760 intvec_\vecname: 761 - j hv_downcall_dispatch 761 + j _hv_downcall_dispatch 762 762 ENDPROC(intvec_\vecname) 763 763 .endm 764 764
+1 -1
arch/tile/kernel/intvec_64.S
··· 772 772 .macro dc_dispatch vecnum, vecname 773 773 .org (\vecnum << 8) 774 774 intvec_\vecname: 775 - j hv_downcall_dispatch 775 + j _hv_downcall_dispatch 776 776 ENDPROC(intvec_\vecname) 777 777 .endm 778 778
+4 -1
arch/tile/kernel/vmlinux.lds.S
··· 31 31 } :intrpt1 =0 32 32 33 33 /* Hypervisor call vectors */ 34 - #include "hvglue.lds" 34 + . = ALIGN(0x10000); 35 + .hvglue : AT (ADDR(.hvglue) - LOAD_OFFSET) { 36 + *(.hvglue) 37 + } :NONE 35 38 36 39 /* Now the real code */ 37 40 . = ALIGN(0x20000);
+2 -2
arch/tile/mm/migrate_32.S
··· 136 136 move r8, zero /* asids */ 137 137 move r9, zero /* asidcount */ 138 138 } 139 - jal hv_flush_remote 139 + jal _hv_flush_remote 140 140 bnz r0, .Ldone 141 141 142 142 /* Now install the new page table. */ ··· 152 152 move r4, r_asid 153 153 moveli r5, HV_CTX_DIRECTIO | CTX_PAGE_FLAG 154 154 } 155 - jal hv_install_context 155 + jal _hv_install_context 156 156 bnz r0, .Ldone 157 157 158 158 /* Finally, flush the TLB. */
+2 -2
arch/tile/mm/migrate_64.S
··· 123 123 } 124 124 { 125 125 move r8, zero /* asidcount */ 126 - jal hv_flush_remote 126 + jal _hv_flush_remote 127 127 } 128 128 bnez r0, 1f 129 129 ··· 136 136 move r2, r_asid 137 137 moveli r3, HV_CTX_DIRECTIO | CTX_PAGE_FLAG 138 138 } 139 - jal hv_install_context 139 + jal _hv_install_context 140 140 bnez r0, 1f 141 141 142 142 /* Finally, flush the TLB. */