1 /*
2  * Copyright 2009-2017 Citrix Ltd and other contributors
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published
6  * by the Free Software Foundation; version 2.1 only. with the special
7  * exception on linking described in file LICENSE.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  */
14 
15 #ifndef XL_H
16 #define XL_H
17 
18 #include <assert.h>
19 
20 #include <xentoollog.h>
21 
22 struct cmd_spec {
23     const char *cmd_name;
24     int (*cmd_impl)(int argc, char **argv);
25     int can_dryrun;
26     int modifies;
27     const char *cmd_desc;
28     const char *cmd_usage;
29     const char *cmd_option;
30 };
31 
32 struct domain_create {
33     int debug;
34     int daemonize;
35     int monitor; /* handle guest reboots etc */
36     int paused;
37     int quiet;
38     int vnc;
39     int vncautopass;
40     int console_autoconnect;
41     int checkpointed_stream;
42     int ignore_global_affinity_masks;
43     const char *config_file;
44     char *extra_config; /* extra config string */
45     const char *restore_file;
46     char *colo_proxy_script;
47     bool userspace_colo_proxy;
48     int migrate_fd; /* -1 means none */
49     int send_back_fd; /* -1 means none */
50     char **migration_domname_r; /* from malloc */
51 };
52 
53 int create_domain(struct domain_create *dom_info);
54 
55 
56 static const char savefileheader_magic[32]=
57     "Xen saved domain, xl format\n \0 \r";
58 
59 #ifndef LIBXL_HAVE_NO_SUSPEND_RESUME
60 static const char migrate_receiver_banner[]=
61     "xl migration receiver ready, send binary domain data.\n";
62 static const char migrate_receiver_ready[]=
63     "domain received, ready to unpause";
64 static const char migrate_permission_to_go[]=
65     "domain is yours, you are cleared to unpause";
66 static const char migrate_report[]=
67     "my copy unpause results are as follows";
68 #endif
69 
70   /* followed by one byte:
71    *     0: everything went well, domain is running
72    *            next thing is we all exit
73    * non-0: things went badly
74    *            next thing should be a migrate_permission_to_go
75    *            from target to source
76    */
77 
78 #define XL_MANDATORY_FLAG_JSON (1U << 0) /* config data is in JSON format */
79 #define XL_MANDATORY_FLAG_STREAMv2 (1U << 1) /* stream is v2 */
80 #define XL_MANDATORY_FLAG_ALL  (XL_MANDATORY_FLAG_JSON |        \
81                                 XL_MANDATORY_FLAG_STREAMv2)
82 
83 struct save_file_header {
84     char magic[32]; /* savefileheader_magic */
85     /* All uint32_ts are in domain's byte order. */
86     uint32_t byteorder; /* SAVEFILE_BYTEORDER_VALUE */
87     uint32_t mandatory_flags; /* unknown flags => reject restore */
88     uint32_t optional_flags; /* unknown flags => reject restore */
89     uint32_t optional_data_len; /* skip, or skip tail, if not understood */
90 };
91 
92 /* Optional data, in order:
93  *   4 bytes uint32_t  config file size
94  *   n bytes           config file in Unix text file format
95  */
96 
97 #define SAVEFILE_BYTEORDER_VALUE ((uint32_t)0x01020304UL)
98 
99 void save_domain_core_begin(uint32_t domid,
100                             int preserve_domid,
101                             const char *override_config_file,
102                             uint8_t **config_data_r,
103                             int *config_len_r);
104 void save_domain_core_writeconfig(int fd, const char *source,
105                                   const uint8_t *config_data, int config_len);
106 
107 /*
108  * The xl process should always return either EXIT_SUCCESS or
109  * EXIT_FAILURE. main_* functions, implementing the various xl
110  * commands, can be treated as main() as if they are returning
111  * a process exit status and not a function return value.
112  */
113 
114 int main_vcpulist(int argc, char **argv);
115 int main_info(int argc, char **argv);
116 int main_sharing(int argc, char **argv);
117 int main_cd_eject(int argc, char **argv);
118 int main_cd_insert(int argc, char **argv);
119 int main_console(int argc, char **argv);
120 int main_vncviewer(int argc, char **argv);
121 int main_pcilist(int argc, char **argv);
122 int main_pcidetach(int argc, char **argv);
123 int main_pciattach(int argc, char **argv);
124 int main_pciassignable_add(int argc, char **argv);
125 int main_pciassignable_remove(int argc, char **argv);
126 int main_pciassignable_list(int argc, char **argv);
127 #ifndef LIBXL_HAVE_NO_SUSPEND_RESUME
128 int main_restore(int argc, char **argv);
129 int main_migrate_receive(int argc, char **argv);
130 int main_save(int argc, char **argv);
131 int main_migrate(int argc, char **argv);
132 #endif
133 int main_dump_core(int argc, char **argv);
134 int main_pause(int argc, char **argv);
135 int main_unpause(int argc, char **argv);
136 int main_destroy(int argc, char **argv);
137 int main_shutdown(int argc, char **argv);
138 int main_reboot(int argc, char **argv);
139 int main_list(int argc, char **argv);
140 int main_vm_list(int argc, char **argv);
141 #ifdef LIBXL_HAVE_DT_OVERLAY
142 int main_dt_overlay(int argc, char **argv);
143 #endif
144 int main_create(int argc, char **argv);
145 int main_config_update(int argc, char **argv);
146 int main_button_press(int argc, char **argv);
147 int main_vcpupin(int argc, char **argv);
148 int main_vcpuset(int argc, char **argv);
149 int main_memmax(int argc, char **argv);
150 int main_memset(int argc, char **argv);
151 int main_sched_credit(int argc, char **argv);
152 int main_sched_credit2(int argc, char **argv);
153 int main_sched_rtds(int argc, char **argv);
154 int main_domid(int argc, char **argv);
155 int main_domname(int argc, char **argv);
156 int main_rename(int argc, char **argv);
157 int main_trigger(int argc, char **argv);
158 int main_sysrq(int argc, char **argv);
159 int main_debug_keys(int argc, char **argv);
160 int main_set_parameters(int argc, char **argv);
161 int main_dmesg(int argc, char **argv);
162 int main_top(int argc, char **argv);
163 int main_networkattach(int argc, char **argv);
164 int main_networklist(int argc, char **argv);
165 int main_networkdetach(int argc, char **argv);
166 int main_channellist(int argc, char **argv);
167 int main_blockattach(int argc, char **argv);
168 int main_blocklist(int argc, char **argv);
169 int main_blockdetach(int argc, char **argv);
170 int main_vtpmattach(int argc, char **argv);
171 int main_vtpmlist(int argc, char **argv);
172 int main_vtpmdetach(int argc, char **argv);
173 int main_vdisplattach(int argc, char **argv);
174 int main_vdispllist(int argc, char **argv);
175 int main_vdispldetach(int argc, char **argv);
176 int main_vsndattach(int argc, char **argv);
177 int main_vsndlist(int argc, char **argv);
178 int main_vsnddetach(int argc, char **argv);
179 int main_vkbattach(int argc, char **argv);
180 int main_vkblist(int argc, char **argv);
181 int main_vkbdetach(int argc, char **argv);
182 int main_usbctrl_attach(int argc, char **argv);
183 int main_usbctrl_detach(int argc, char **argv);
184 int main_usbdev_attach(int argc, char **argv);
185 int main_usbdev_detach(int argc, char **argv);
186 int main_usblist(int argc, char **argv);
187 int main_uptime(int argc, char **argv);
188 int main_claims(int argc, char **argv);
189 int main_network2attach(int argc, char **argv);
190 int main_network2list(int argc, char **argv);
191 int main_network2detach(int argc, char **argv);
192 int main_cpupoolcreate(int argc, char **argv);
193 int main_cpupoollist(int argc, char **argv);
194 int main_cpupooldestroy(int argc, char **argv);
195 int main_cpupoolrename(int argc, char **argv);
196 int main_cpupoolcpuadd(int argc, char **argv);
197 int main_cpupoolcpuremove(int argc, char **argv);
198 int main_cpupoolmigrate(int argc, char **argv);
199 int main_cpupoolnumasplit(int argc, char **argv);
200 int main_getenforce(int argc, char **argv);
201 int main_setenforce(int argc, char **argv);
202 int main_loadpolicy(int argc, char **argv);
203 #ifndef LIBXL_HAVE_NO_SUSPEND_RESUME
204 int main_remus(int argc, char **argv);
205 #endif
206 int main_devd(int argc, char **argv);
207 #if defined(__i386__) || defined(__x86_64__)
208 int main_psr_hwinfo(int argc, char **argv);
209 int main_psr_cmt_attach(int argc, char **argv);
210 int main_psr_cmt_detach(int argc, char **argv);
211 int main_psr_cmt_show(int argc, char **argv);
212 int main_psr_cat_cbm_set(int argc, char **argv);
213 int main_psr_cat_show(int argc, char **argv);
214 int main_psr_mba_set(int argc, char **argv);
215 int main_psr_mba_show(int argc, char **argv);
216 #endif
217 int main_qemu_monitor_command(int argc, char **argv);
218 
219 void help(const char *command);
220 
221 extern const char *common_domname;
222 extern const struct cmd_spec cmd_table[];
223 extern const int cmdtable_len;
224 /* Look up a command in the table, allowing unambiguous truncation */
225 const struct cmd_spec *cmdtable_lookup(const char *s);
226 
227 extern libxl_ctx *ctx;
228 extern xentoollog_logger_stdiostream *logger;
229 extern int logfile;
230 
231 void xl_ctx_alloc(void);
232 
233 /* child processes */
234 
235 typedef struct {
236     /* every struct like this must be in XLCHILD_LIST */
237     pid_t pid; /* 0: not in use */
238     int reaped; /* valid iff pid!=0 */
239     int status; /* valid iff reaped */
240     const char *description; /* valid iff pid!=0 */
241 } xlchild;
242 
243 typedef enum {
244     child_console, child_waitdaemon, child_migration, child_vncviewer,
245     child_max
246 } xlchildnum;
247 
248 extern xlchild children[child_max];
249 
250 pid_t xl_fork(xlchildnum, const char *description);
251     /* like fork, but prints and dies if it fails */
252 void postfork(void); /* needed only if we aren't going to exec right away */
253 
254 /* Handles EINTR.  Clears out the xlchild so it can be reused. */
255 pid_t xl_waitpid(xlchildnum, int *status, int flags);
256 
257 int xl_child_pid(xlchildnum); /* returns 0 if child struct is not in use */
258 
259 void xl_report_child_exitstatus(xentoollog_level level,
260                                 xlchildnum child, pid_t pid, int status);
261     /* like libxl_report_child_exitstatus, but uses children[].description */
262 
263 int child_report(xlchildnum child);
264     /* waits and expects child to exit status 0.
265      * otherwise, logs and returns ERROR_FAIL */
266 
267 /* global options */
268 extern int autoballoon;
269 extern int run_hotplug_scripts;
270 extern int dryrun_only;
271 extern int claim_mode;
272 extern bool progress_use_cr;
273 extern bool timestamps;
274 extern xentoollog_level minmsglevel;
275 #define minmsglevel_default XTL_PROGRESS
276 extern char *lockfile;
277 extern char *default_vifscript;
278 extern char *default_bridge;
279 extern char *default_gatewaydev;
280 extern char *default_vifbackend;
281 extern char *default_remus_netbufscript;
282 extern char *default_colo_proxy_script;
283 extern char *blkdev_start;
284 extern int max_grant_frames;
285 extern int max_maptrack_frames;
286 extern int max_grant_version;
287 extern libxl_bitmap global_vm_affinity_mask;
288 extern libxl_bitmap global_hvm_affinity_mask;
289 extern libxl_bitmap global_pv_affinity_mask;
290 extern libxl_domid domid_policy;
291 extern libxl_defbool bootloader_restrict;
292 
293 enum output_format {
294     OUTPUT_FORMAT_JSON,
295     OUTPUT_FORMAT_SXP,
296 };
297 extern enum output_format default_output_format;
298 
299 typedef enum {
300     DOMAIN_RESTART_NONE = 0,     /* No domain restart */
301     DOMAIN_RESTART_NORMAL,       /* Domain should be restarted */
302     DOMAIN_RESTART_RENAME,       /* Domain should be renamed and restarted */
303     DOMAIN_RESTART_SOFT_RESET,   /* Soft reset should be performed */
304 } domain_restart_type;
305 
306 extern void printf_info_sexp(int domid, libxl_domain_config *d_config, FILE *fh);
307 extern void apply_global_affinity_masks(libxl_domain_type type,
308                                         libxl_bitmap *vcpu_affinity_array,
309                                         unsigned int size);
310 
311 #define XL_GLOBAL_CONFIG XEN_CONFIG_DIR "/xl.conf"
312 #define XL_LOCK_FILE XEN_LOCK_DIR "/xl"
313 
314 #endif /* XL_H */
315 
316 /*
317  * Local variables:
318  * mode: C
319  * c-basic-offset: 4
320  * indent-tabs-mode: nil
321  * End:
322  */
323