| 1 |
|
| 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/interface/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 |
|
| 23 | #define CALLBACKTYPE_event 0
|
| 24 |
|
| 25 |
|
| 26 | #define CALLBACKTYPE_failsafe 1
|
| 27 |
|
| 28 |
|
| 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 |
|
| 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 |
|
| 73 | |
| 74 | * Unregister a callback.
|
| 75 | *
|
| 76 | * Not all callbacks can be unregistered. -EINVAL will be returned if
|
| 77 | * you attempt to unregister such a callback.
|
| 78 |
|
| 79 | #define CALLBACKOP_unregister 1
|
| 80 | struct callback_unregister {
|
| 81 | uint16_t type;
|
| 82 | uint16_t _unused;
|
| 83 | };
|
| 84 |
|
| 85 | #endif
|