1ca379b83SPekka Enberg #include <kvm/util.h> 2ca379b83SPekka Enberg #include <kvm/kvm-cmd.h> 32a24f96dSSasha Levin #include <kvm/builtin-debug.h> 46c757e71SSasha Levin #include <kvm/kvm.h> 5c9cba791SPekka Enberg #include <kvm/parse-options.h> 6*4b1addaeSSasha Levin #include <kvm/kvm-ipc.h> 76c757e71SSasha Levin 86c757e71SSasha Levin #include <stdio.h> 96c757e71SSasha Levin #include <string.h> 106c757e71SSasha Levin #include <signal.h> 11ca379b83SPekka Enberg 128d7b77f6SSasha Levin static bool all; 13*4b1addaeSSasha Levin static int instance; 148d7b77f6SSasha Levin static const char *instance_name; 158d7b77f6SSasha Levin 16*4b1addaeSSasha Levin struct debug_cmd { 17*4b1addaeSSasha Levin u32 type; 18*4b1addaeSSasha Levin u32 len; 19*4b1addaeSSasha Levin }; 20*4b1addaeSSasha Levin 21c9cba791SPekka Enberg static const char * const debug_usage[] = { 22*4b1addaeSSasha Levin "kvm debug [--all] [-n name]", 23c9cba791SPekka Enberg NULL 24c9cba791SPekka Enberg }; 25c9cba791SPekka Enberg 26c9cba791SPekka Enberg static const struct option debug_options[] = { 278d7b77f6SSasha Levin OPT_GROUP("General options:"), 288d7b77f6SSasha Levin OPT_BOOLEAN('a', "all", &all, "Debug all instances"), 298d7b77f6SSasha Levin OPT_STRING('n', "name", &instance_name, "name", "Instance name"), 30c9cba791SPekka Enberg OPT_END() 31c9cba791SPekka Enberg }; 32c9cba791SPekka Enberg 338d7b77f6SSasha Levin static void parse_debug_options(int argc, const char **argv) 348d7b77f6SSasha Levin { 358d7b77f6SSasha Levin while (argc != 0) { 368d7b77f6SSasha Levin argc = parse_options(argc, argv, debug_options, debug_usage, 378d7b77f6SSasha Levin PARSE_OPT_STOP_AT_NON_OPTION); 388d7b77f6SSasha Levin if (argc != 0) 398d7b77f6SSasha Levin kvm_debug_help(); 408d7b77f6SSasha Levin } 418d7b77f6SSasha Levin } 428d7b77f6SSasha Levin 430725673aSSasha Levin void kvm_debug_help(void) 440725673aSSasha Levin { 450725673aSSasha Levin usage_with_options(debug_usage, debug_options); 460725673aSSasha Levin } 470725673aSSasha Levin 48*4b1addaeSSasha Levin static int do_debug(const char *name, int sock) 4924e7dbbaSSasha Levin { 50*4b1addaeSSasha Levin struct debug_cmd cmd = {KVM_IPC_DEBUG, 0}; 51*4b1addaeSSasha Levin int r; 52*4b1addaeSSasha Levin 53*4b1addaeSSasha Levin r = write(sock, &cmd, sizeof(cmd)); 54*4b1addaeSSasha Levin if (r < 0) 55*4b1addaeSSasha Levin return r; 56*4b1addaeSSasha Levin 57*4b1addaeSSasha Levin return 0; 5824e7dbbaSSasha Levin } 5924e7dbbaSSasha Levin 60ca379b83SPekka Enberg int kvm_cmd_debug(int argc, const char **argv, const char *prefix) 61ca379b83SPekka Enberg { 628d7b77f6SSasha Levin parse_debug_options(argc, argv); 636c757e71SSasha Levin 648d7b77f6SSasha Levin if (all) 658d7b77f6SSasha Levin return kvm__enumerate_instances(do_debug); 668d7b77f6SSasha Levin 678d7b77f6SSasha Levin if (instance_name == NULL && 68*4b1addaeSSasha Levin instance == 0) 690725673aSSasha Levin kvm_debug_help(); 706c757e71SSasha Levin 718d7b77f6SSasha Levin if (instance_name) 72*4b1addaeSSasha Levin instance = kvm__get_sock_by_instance(instance_name); 7324e7dbbaSSasha Levin 74*4b1addaeSSasha Levin if (instance <= 0) 758d7b77f6SSasha Levin die("Failed locating instance"); 766c757e71SSasha Levin 77*4b1addaeSSasha Levin return do_debug(instance_name, instance); 78ca379b83SPekka Enberg } 79