1 /* SPDX-License-Identifier: MIT */ 2 /****************************************************************************** 3 * callback.h 4 * 5 * Register guest OS callbacks with Xen. 6 * 7 * Copyright (c) 2006, Ian Campbell 8 */ 9 10 #ifndef __XEN_PUBLIC_CALLBACK_H__ 11 #define __XEN_PUBLIC_CALLBACK_H__ 12 13 #include "xen.h" 14 15 /* 16 * Prototype for this hypercall is: 17 * long callback_op(int cmd, void *extra_args) 18 * @cmd == CALLBACKOP_??? (callback operation). 19 * @extra_args == Operation-specific extra arguments (NULL if none). 20 */ 21 22 /* x86: Callback for event delivery. */ 23 #define CALLBACKTYPE_event 0 24 25 /* x86: Failsafe callback when guest state cannot be restored by Xen. */ 26 #define CALLBACKTYPE_failsafe 1 27 28 /* x86/64 hypervisor: Syscall by 64-bit guest app ('64-on-64-on-64'). */ 29 #define CALLBACKTYPE_syscall 2 30 31 /* 32 * x86/32 hypervisor: Only available on x86/32 when supervisor_mode_kernel 33 * feature is enabled. Do not use this callback type in new code. 34 */ 35 #define CALLBACKTYPE_sysenter_deprecated 3 36 37 /* x86: Callback for NMI delivery. */ 38 #define CALLBACKTYPE_nmi 4 39 40 /* 41 * x86: sysenter is only available as follows: 42 * - 32-bit hypervisor: with the supervisor_mode_kernel feature enabled 43 * - 64-bit hypervisor: 32-bit guest applications on Intel CPUs 44 * ('32-on-32-on-64', '32-on-64-on-64') 45 * [nb. also 64-bit guest applications on Intel CPUs 46 * ('64-on-64-on-64'), but syscall is preferred] 47 */ 48 #define CALLBACKTYPE_sysenter 5 49 50 /* 51 * x86/64 hypervisor: Syscall by 32-bit guest app on AMD CPUs 52 * ('32-on-32-on-64', '32-on-64-on-64') 53 */ 54 #define CALLBACKTYPE_syscall32 7 55 56 /* 57 * Disable event deliver during callback? This flag is ignored for event and 58 * NMI callbacks: event delivery is unconditionally disabled. 59 */ 60 #define _CALLBACKF_mask_events 0 61 #define CALLBACKF_mask_events (1U << _CALLBACKF_mask_events) 62 63 /* 64 * Register a callback. 65 */ 66 #define CALLBACKOP_register 0 67 struct callback_register { 68 uint16_t type; 69 uint16_t flags; 70 xen_callback_t address; 71 }; 72 typedef struct callback_register callback_register_t; 73 DEFINE_XEN_GUEST_HANDLE(callback_register_t); 74 75 /* 76 * Unregister a callback. 77 * 78 * Not all callbacks can be unregistered. -EINVAL will be returned if 79 * you attempt to unregister such a callback. 80 */ 81 #define CALLBACKOP_unregister 1 82 struct callback_unregister { 83 uint16_t type; 84 uint16_t _unused; 85 }; 86 typedef struct callback_unregister callback_unregister_t; 87 DEFINE_XEN_GUEST_HANDLE(callback_unregister_t); 88 89 #if __XEN_INTERFACE_VERSION__ < 0x00030207 90 #undef CALLBACKTYPE_sysenter 91 #define CALLBACKTYPE_sysenter CALLBACKTYPE_sysenter_deprecated 92 #endif 93 94 #endif /* __XEN_PUBLIC_CALLBACK_H__ */ 95 96 /* 97 * Local variables: 98 * mode: C 99 * c-file-style: "BSD" 100 * c-basic-offset: 4 101 * tab-width: 4 102 * indent-tabs-mode: nil 103 * End: 104 */ 105