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