1 | /* |
2 | * Permission to use, copy, modify, and/or distribute this software for any |
3 | * purpose with or without fee is hereby granted, provided that the above |
4 | * copyright notice and this permission notice appear in all copies. |
5 | * |
6 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
7 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
8 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
9 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
10 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
11 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
12 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
13 | * |
14 | * Copyright (C) 2019 Intel Corporation |
15 | */ |
16 | #ifndef _UAPI_LINUX_UM_TIMETRAVEL_H |
17 | #define _UAPI_LINUX_UM_TIMETRAVEL_H |
18 | #include <linux/types.h> |
19 | |
20 | /** |
21 | * struct um_timetravel_msg - UM time travel message |
22 | * |
23 | * This is the basic message type, going in both directions. |
24 | * |
25 | * This is the message passed between the host (user-mode Linux instance) |
26 | * and the calendar (the application on the other side of the socket) in |
27 | * order to implement common scheduling. |
28 | * |
29 | * Whenever UML has an event it will request runtime for it from the |
30 | * calendar, and then wait for its turn until it can run, etc. Note |
31 | * that it will only ever request the single next runtime, i.e. multiple |
32 | * REQUEST messages override each other. |
33 | */ |
34 | struct um_timetravel_msg { |
35 | /** |
36 | * @op: operation value from &enum um_timetravel_ops |
37 | */ |
38 | __u32 op; |
39 | |
40 | /** |
41 | * @seq: sequence number for the message - shall be reflected in |
42 | * the ACK response, and should be checked while processing |
43 | * the response to see if it matches |
44 | */ |
45 | __u32 seq; |
46 | |
47 | /** |
48 | * @time: time in nanoseconds |
49 | */ |
50 | __u64 time; |
51 | }; |
52 | |
53 | /** |
54 | * enum um_timetravel_ops - Operation codes |
55 | */ |
56 | enum um_timetravel_ops { |
57 | /** |
58 | * @UM_TIMETRAVEL_ACK: response (ACK) to any previous message, |
59 | * this usually doesn't carry any data in the 'time' field |
60 | * unless otherwise specified below |
61 | */ |
62 | UM_TIMETRAVEL_ACK = 0, |
63 | |
64 | /** |
65 | * @UM_TIMETRAVEL_START: initialize the connection, the time |
66 | * field contains an (arbitrary) ID to possibly be able |
67 | * to distinguish the connections. |
68 | */ |
69 | UM_TIMETRAVEL_START = 1, |
70 | |
71 | /** |
72 | * @UM_TIMETRAVEL_REQUEST: request to run at the given time |
73 | * (host -> calendar) |
74 | */ |
75 | UM_TIMETRAVEL_REQUEST = 2, |
76 | |
77 | /** |
78 | * @UM_TIMETRAVEL_WAIT: Indicate waiting for the previously requested |
79 | * runtime, new requests may be made while waiting (e.g. due to |
80 | * interrupts); the time field is ignored. The calendar must process |
81 | * this message and later send a %UM_TIMETRAVEL_RUN message when |
82 | * the host can run again. |
83 | * (host -> calendar) |
84 | */ |
85 | UM_TIMETRAVEL_WAIT = 3, |
86 | |
87 | /** |
88 | * @UM_TIMETRAVEL_GET: return the current time from the calendar in the |
89 | * ACK message, the time in the request message is ignored |
90 | * (host -> calendar) |
91 | */ |
92 | UM_TIMETRAVEL_GET = 4, |
93 | |
94 | /** |
95 | * @UM_TIMETRAVEL_UPDATE: time update to the calendar, must be sent e.g. |
96 | * before kicking an interrupt to another calendar |
97 | * (host -> calendar) |
98 | */ |
99 | UM_TIMETRAVEL_UPDATE = 5, |
100 | |
101 | /** |
102 | * @UM_TIMETRAVEL_RUN: run time request granted, current time is in |
103 | * the time field |
104 | * (calendar -> host) |
105 | */ |
106 | UM_TIMETRAVEL_RUN = 6, |
107 | |
108 | /** |
109 | * @UM_TIMETRAVEL_FREE_UNTIL: Enable free-running until the given time, |
110 | * this is a message from the calendar telling the host that it can |
111 | * freely do its own scheduling for anything before the indicated |
112 | * time. |
113 | * Note that if a calendar sends this message once, the host may |
114 | * assume that it will also do so in the future, if it implements |
115 | * wraparound semantics for the time field. |
116 | * (calendar -> host) |
117 | */ |
118 | UM_TIMETRAVEL_FREE_UNTIL = 7, |
119 | |
120 | /** |
121 | * @UM_TIMETRAVEL_GET_TOD: Return time of day, typically used once at |
122 | * boot by the virtual machines to get a synchronized time from |
123 | * the simulation. |
124 | */ |
125 | UM_TIMETRAVEL_GET_TOD = 8, |
126 | }; |
127 | |
128 | #endif /* _UAPI_LINUX_UM_TIMETRAVEL_H */ |
129 | |