Blame main.c

Packit Service 501009
/* main.c - core analysis suite
Packit Service 501009
 *
Packit Service 501009
 * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
Packit Service 501009
 * Copyright (C) 2002-2019 David Anderson
Packit Service 501009
 * Copyright (C) 2002-2019 Red Hat, Inc. All rights reserved.
Packit Service 501009
 *
Packit Service 501009
 * This program is free software; you can redistribute it and/or modify
Packit Service 501009
 * it under the terms of the GNU General Public License as published by
Packit Service 501009
 * the Free Software Foundation; either version 2 of the License, or
Packit Service 501009
 * (at your option) any later version.
Packit Service 501009
 *
Packit Service 501009
 * This program is distributed in the hope that it will be useful,
Packit Service 501009
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 501009
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 501009
 * GNU General Public License for more details.
Packit Service 501009
 */
Packit Service 501009
Packit Service 501009
#include "defs.h"
Packit Service 501009
#include "xen_hyper_defs.h"
Packit Service 501009
#include <curses.h>
Packit Service 501009
#include <getopt.h>
Packit Service 501009
#include <sys/prctl.h>
Packit Service 501009
Packit Service 501009
static void setup_environment(int, char **);
Packit Service 501009
static int is_external_command(void);
Packit Service 501009
static int is_builtin_command(void);
Packit Service 501009
static int is_input_file(void);
Packit Service 501009
static void check_xen_hyper(void);
Packit Service 501009
static void show_untrusted_files(void);
Packit Service 501009
static void get_osrelease(char *);
Packit Service 501009
static void get_log(char *);
Packit Service 501009
Packit Service 501009
static struct option long_options[] = {
Packit Service 501009
        {"memory_module", required_argument, 0, 0},
Packit Service 501009
        {"memory_device", required_argument, 0, 0},
Packit Service 501009
        {"no_kallsyms", 0, 0, 0},
Packit Service 501009
        {"no_modules", 0, 0, 0},
Packit Service 501009
        {"help", optional_argument, 0, 'h'},
Packit Service 501009
	{"no_data_debug", 0, 0, 0},
Packit Service 501009
	{"no_crashrc", 0, 0, 0},
Packit Service 501009
	{"no_kmem_cache", 0, 0, 0},
Packit Service 501009
	{"kmem_cache_delay", 0, 0, 0},
Packit Service 501009
	{"readnow", 0, 0, 0},
Packit Service 501009
	{"smp", 0, 0, 0},
Packit Service 501009
	{"machdep", required_argument, 0, 0},
Packit Service 501009
	{"version", 0, 0, 0},
Packit Service 501009
	{"buildinfo", 0, 0, 0},
Packit Service 501009
        {"cpus", required_argument, 0, 0},
Packit Service 501009
        {"no_ikconfig", 0, 0, 0},
Packit Service 501009
        {"hyper", 0, 0, 0},
Packit Service 501009
	{"p2m_mfn", required_argument, 0, 0},
Packit Service 501009
	{"xen_phys_start", required_argument, 0, 0},
Packit Service 501009
	{"zero_excluded", 0, 0, 0},
Packit Service 501009
	{"no_panic", 0, 0, 0},
Packit Service 501009
        {"more", 0, 0, 0},
Packit Service 501009
        {"less", 0, 0, 0},
Packit Service 501009
        {"CRASHPAGER", 0, 0, 0},
Packit Service 501009
        {"no_scroll", 0, 0, 0},
Packit Service 501009
        {"reloc", required_argument, 0, 0},
Packit Service 501009
	{"kaslr", required_argument, 0, 0},
Packit Service 501009
	{"active", 0, 0, 0},
Packit Service 501009
	{"minimal", 0, 0, 0},
Packit Service 501009
	{"mod", required_argument, 0, 0},
Packit Service 501009
	{"kvmhost", required_argument, 0, 0},
Packit Service 501009
	{"kvmio", required_argument, 0, 0},
Packit Service 501009
	{"no_elf_notes", 0, 0, 0},
Packit Service 501009
	{"osrelease", required_argument, 0, 0},
Packit Service 501009
	{"log", required_argument, 0, 0},
Packit Service 501009
	{"hex", 0, 0, 0},
Packit Service 501009
	{"dec", 0, 0, 0},
Packit Service 501009
	{"no_strip", 0, 0, 0},
Packit Service 501009
	{"hash", required_argument, 0, 0},
Packit Service 501009
	{"offline", required_argument, 0, 0},
Packit Service 501009
	{"src", required_argument, 0, 0},
Packit Service 501009
        {0, 0, 0, 0}
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
int
Packit Service 501009
main(int argc, char **argv)
Packit Service 501009
{
Packit Service 501009
	int i, c, option_index;
Packit Service 501009
	char *tmpname;
Packit Service 501009
Packit Service 501009
	setup_environment(argc, argv);
Packit Service 501009
Packit Service 501009
	/* 
Packit Service 501009
	 *  Get and verify command line options.
Packit Service 501009
	 */
Packit Service 501009
	opterr = 0;
Packit Service 501009
	optind = 0;
Packit Service 501009
	while((c = getopt_long(argc, argv, "Lkgh::e:i:sSvc:d:tfp:m:xo:",
Packit Service 501009
       		long_options, &option_index)) != -1) {
Packit Service 501009
		switch (c)
Packit Service 501009
		{
Packit Service 501009
		case 0:
Packit Service 501009
		        if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "memory_module")) 
Packit Service 501009
				pc->memory_module = optarg;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "memory_device")) 
Packit Service 501009
				pc->memory_device = optarg;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "no_kallsyms")) 
Packit Service 501009
				kt->flags |= NO_KALLSYMS;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "no_modules")) 
Packit Service 501009
				kt->flags |= NO_MODULE_ACCESS;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "no_ikconfig")) 
Packit Service 501009
				kt->flags |= NO_IKCONFIG;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "no_data_debug")) 
Packit Service 501009
				pc->flags &= ~DATADEBUG;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "no_kmem_cache")) 
Packit Service 501009
				vt->flags |= KMEM_CACHE_UNAVAIL;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "kmem_cache_delay")) 
Packit Service 501009
				vt->flags |= KMEM_CACHE_DELAY;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "readnow")) 
Packit Service 501009
				pc->flags |= READNOW;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "smp")) 
Packit Service 501009
				kt->flags |= SMP;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "machdep")) {
Packit Service 501009
				for (i = 0; i < MAX_MACHDEP_ARGS; i++) {
Packit Service 501009
					if (machdep->cmdline_args[i])
Packit Service 501009
						continue;
Packit Service 501009
					machdep->cmdline_args[i] = optarg;
Packit Service 501009
					break;
Packit Service 501009
				}
Packit Service 501009
				if (i == MAX_MACHDEP_ARGS)
Packit Service 501009
					error(INFO, "option ignored: %s\n",
Packit Service 501009
						optarg);
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "version")) { 
Packit Service 501009
				pc->flags |= VERSION_QUERY;
Packit Service 501009
                        	display_version();
Packit Service 501009
                        	display_gdb_banner();
Packit Service 501009
                        	clean_exit(0);
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, 
Packit Service 501009
			    "buildinfo")) {
Packit Service 501009
				dump_build_data();
Packit Service 501009
				clean_exit(0);
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "cpus")) 
Packit Service 501009
				kt->cpus_override = optarg;
Packit Service 501009
Packit Service 501009
			else if (STREQ(long_options[option_index].name, "hyper"))
Packit Service 501009
				pc->flags |= XEN_HYPER;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "p2m_mfn")) 
Packit Service 501009
				xen_kdump_p2m_mfn(optarg);
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "xen_phys_start")) 
Packit Service 501009
				set_xen_phys_start(optarg);
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "zero_excluded")) 
Packit Service 501009
				*diskdump_flags |= ZERO_EXCLUDED;
Packit Service 501009
Packit Service 501009
			else if (STREQ(long_options[option_index].name, "no_elf_notes")) {
Packit Service 501009
				if (machine_type("X86") || machine_type("X86_64"))
Packit Service 501009
					*diskdump_flags |= NO_ELF_NOTES;
Packit Service 501009
				else
Packit Service 501009
					error(INFO,
Packit Service 501009
					      "--no_elf_notes is only applicable to "
Packit Service 501009
					      "the X86 and X86_64 architectures.\n");
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "no_panic")) 
Packit Service 501009
				tt->flags |= PANIC_TASK_NOT_FOUND;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "no_strip")) 
Packit Service 501009
				st->flags |= NO_STRIP;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "more")) {
Packit Service 501009
				if ((pc->scroll_command != SCROLL_NONE) &&
Packit Service 501009
				    file_exists("/bin/more", NULL))
Packit Service 501009
					pc->scroll_command = SCROLL_MORE;
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "less")) {
Packit Service 501009
				if ((pc->scroll_command != SCROLL_NONE) &&
Packit Service 501009
				    file_exists("/usr/bin/less", NULL))
Packit Service 501009
					pc->scroll_command = SCROLL_LESS;
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "CRASHPAGER")) {
Packit Service 501009
				if ((pc->scroll_command != SCROLL_NONE) && 
Packit Service 501009
				    CRASHPAGER_valid())
Packit Service 501009
					pc->scroll_command = SCROLL_CRASHPAGER;
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "no_scroll"))
Packit Service 501009
				 pc->flags &= ~SCROLL;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "no_crashrc"))
Packit Service 501009
				pc->flags |= NOCRASHRC;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "active"))
Packit Service 501009
				tt->flags |= ACTIVE_ONLY;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "mod"))
Packit Service 501009
				kt->module_tree = optarg;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "hash")) {
Packit Service 501009
				if (!calculate(optarg, &pc->nr_hash_queues, NULL, 0)) {
Packit Service 501009
					error(INFO, "invalid --hash argument: %s\n",
Packit Service 501009
						optarg);
Packit Service 501009
				}
Packit Service 501009
			} else if (STREQ(long_options[option_index].name, "kaslr")) {
Packit Service 501009
				if (!machine_type("X86_64") &&
Packit Service 501009
				    !machine_type("ARM64") && !machine_type("X86") &&
Packit Service 501009
				    !machine_type("S390X"))
Packit Service 501009
					error(INFO, "--kaslr not valid "
Packit Service 501009
						"with this machine type.\n");
Packit Service 501009
				else if (STREQ(optarg, "auto"))
Packit Service 501009
					kt->flags2 |= (RELOC_AUTO|KASLR);
Packit Service 501009
				else {
Packit Service 501009
					if (!calculate(optarg, &kt->relocate,
Packit Service 501009
							NULL, 0)) {
Packit Service 501009
						error(INFO,
Packit Service 501009
						    "invalid --kaslr argument: %s\n",
Packit Service 501009
						    optarg);
Packit Service 501009
						program_usage(SHORT_FORM);
Packit Service 501009
					}
Packit Service 501009
					kt->relocate *= -1;
Packit Service 501009
					kt->flags |= RELOC_SET;
Packit Service 501009
					kt->flags2 |= KASLR;
Packit Service 501009
				}
Packit Service 501009
Packit Service 501009
			} else if (STREQ(long_options[option_index].name, "reloc")) {
Packit Service 501009
				if (!calculate(optarg, &kt->relocate, NULL, 0)) {
Packit Service 501009
					error(INFO, "invalid --reloc argument: %s\n",
Packit Service 501009
						optarg);
Packit Service 501009
					program_usage(SHORT_FORM);
Packit Service 501009
				}
Packit Service 501009
				kt->flags |= RELOC_SET;
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
			else if (STREQ(long_options[option_index].name, "minimal")) 
Packit Service 501009
				pc->flags |= MINIMAL_MODE;
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "kvmhost"))
Packit Service 501009
				set_kvmhost_type(optarg);
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "kvmio"))
Packit Service 501009
				set_kvm_iohole(optarg);
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "osrelease")) {
Packit Service 501009
				pc->flags2 |= GET_OSRELEASE;
Packit Service 501009
				get_osrelease(optarg);
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
		        else if (STREQ(long_options[option_index].name, "log")) {
Packit Service 501009
				pc->flags2 |= GET_LOG;
Packit Service 501009
				get_log(optarg);
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
			else if (STREQ(long_options[option_index].name, "hex")) {
Packit Service 501009
				pc->flags2 |= RADIX_OVERRIDE;
Packit Service 501009
				pc->output_radix = 16;
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
			else if (STREQ(long_options[option_index].name, "dec")) {
Packit Service 501009
				pc->flags2 |= RADIX_OVERRIDE;
Packit Service 501009
				pc->output_radix = 10;
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
			else if (STREQ(long_options[option_index].name, "offline")) {
Packit Service 501009
				if (STREQ(optarg, "show"))
Packit Service 501009
					pc->flags2 &= ~OFFLINE_HIDE;
Packit Service 501009
				else if (STREQ(optarg, "hide"))
Packit Service 501009
					pc->flags2 |= OFFLINE_HIDE;
Packit Service 501009
				else {
Packit Service 501009
					error(INFO, "invalid --offline argument: %s\n", optarg);
Packit Service 501009
					program_usage(SHORT_FORM);
Packit Service 501009
				}
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
			else if (STREQ(long_options[option_index].name, "src"))
Packit Service 501009
				kt->source_tree = optarg;
Packit Service 501009
Packit Service 501009
			else {
Packit Service 501009
				error(INFO, "internal error: option %s unhandled\n",
Packit Service 501009
					long_options[option_index].name);
Packit Service 501009
				program_usage(SHORT_FORM);
Packit Service 501009
			}
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'f':
Packit Service 501009
			st->flags |= FORCE_DEBUGINFO;
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'g':
Packit Service 501009
			pc->flags |= KERNEL_DEBUG_QUERY;
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'h':
Packit Service 501009
			/* note: long_getopt's handling of optional arguments is weak.
Packit Service 501009
			 * To it, an optional argument must be part of the same argument
Packit Service 501009
			 * as the flag itself (eg. --help=commands or -hcommands).
Packit Service 501009
			 * We want to accept "--help commands" or "-h commands".
Packit Service 501009
			 * So we must do that part ourselves.
Packit Service 501009
			 */
Packit Service 501009
			if (optarg != NULL)
Packit Service 501009
				cmd_usage(optarg, COMPLETE_HELP|PIPE_TO_SCROLL|MUST_HELP);
Packit Service 501009
			else if (argv[optind] != NULL && argv[optind][0] != '-')
Packit Service 501009
				cmd_usage(argv[optind++], COMPLETE_HELP|PIPE_TO_SCROLL|MUST_HELP);
Packit Service 501009
			else
Packit Service 501009
				program_usage(LONG_FORM);
Packit Service 501009
			clean_exit(0);
Packit Service 501009
			
Packit Service 501009
		case 'k':
Packit Service 501009
			pc->flags |= KERNTYPES;
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'e':
Packit Service 501009
			if (STREQ(optarg, "vi"))
Packit Service 501009
				pc->editing_mode = "vi";
Packit Service 501009
			else if (STREQ(optarg, "emacs"))
Packit Service 501009
				pc->editing_mode = "emacs";
Packit Service 501009
			else
Packit Service 501009
				fprintf(fp, "invalid edit mode: %s\n", optarg);	
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 't':
Packit Service 501009
			kt->flags2 |= GET_TIMESTAMP;
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'i':
Packit Service 501009
			pc->input_file = optarg;
Packit Service 501009
			pc->flags |= CMDLINE_IFILE;
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'v':
Packit Service 501009
			pc->flags |= VERSION_QUERY;
Packit Service 501009
			display_version();
Packit Service 501009
			display_gdb_banner();
Packit Service 501009
			clean_exit(0);
Packit Service 501009
Packit Service 501009
		case 's':
Packit Service 501009
			pc->flags |= SILENT;
Packit Service 501009
			pc->flags &= ~SCROLL;
Packit Service 501009
//   			pc->scroll_command = SCROLL_NONE;   (why?)
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'L':
Packit Service 501009
			if (mlockall(MCL_CURRENT|MCL_FUTURE) == -1)
Packit Service 501009
				perror("mlockall");
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'S':
Packit Service 501009
			if (is_system_map("/boot/System.map")) {
Packit Service 501009
                                pc->system_map = "/boot/System.map";
Packit Service 501009
                                pc->flags |= (SYSMAP|SYSMAP_ARG);
Packit Service 501009
			}
Packit Service 501009
			break;	
Packit Service 501009
Packit Service 501009
		case 'c':
Packit Service 501009
			create_console_device(optarg);
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'd': 
Packit Service 501009
			pc->debug = atol(optarg);
Packit Service 501009
			set_lkcd_debug(pc->debug);
Packit Service 501009
			set_vas_debug(pc->debug);
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'p':
Packit Service 501009
			force_page_size(optarg);
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'm':
Packit Service 501009
			for (i = 0; i < MAX_MACHDEP_ARGS; i++) {
Packit Service 501009
				if (machdep->cmdline_args[i])
Packit Service 501009
					continue;
Packit Service 501009
				machdep->cmdline_args[i] = optarg;
Packit Service 501009
				break;
Packit Service 501009
			}
Packit Service 501009
			if (i == MAX_MACHDEP_ARGS)
Packit Service 501009
				error(INFO, "option ignored: %s\n",
Packit Service 501009
					optarg);
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'x':
Packit Service 501009
			pc->flags |= PRELOAD_EXTENSIONS;
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		case 'o':
Packit Service 501009
			ramdump_elf_output_file(optarg);
Packit Service 501009
			break;
Packit Service 501009
Packit Service 501009
		default:
Packit Service 501009
			error(INFO, "invalid option: %s\n",
Packit Service 501009
				argv[optind-1]);
Packit Service 501009
			program_usage(SHORT_FORM);
Packit Service 501009
		}
Packit Service 501009
	}
Packit Service 501009
	opterr = 1;
Packit Service 501009
Packit Service 501009
	display_version();
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Take the kernel and dumpfile arguments in either order.
Packit Service 501009
	 */
Packit Service 501009
	while (argv[optind]) {
Packit Service 501009
Packit Service 501009
		if (is_ramdump(argv[optind])) {
Packit Service 501009
			if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
				error(INFO,
Packit Service 501009
					"too many dumpfile arguments\n");
Packit Service 501009
					program_usage(SHORT_FORM);
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
			if (ACTIVE()) {
Packit Service 501009
				pc->flags |= LIVE_RAMDUMP;
Packit Service 501009
				pc->readmem = read_ramdump;
Packit Service 501009
				pc->writemem = NULL;
Packit Service 501009
				optind++;
Packit Service 501009
				continue;
Packit Service 501009
			}
Packit Service 501009
Packit Service 501009
			pc->dumpfile = ramdump_to_elf();
Packit Service 501009
			if (is_kdump(pc->dumpfile, KDUMP_LOCAL)) {
Packit Service 501009
				pc->flags |= KDUMP;
Packit Service 501009
				if (is_ramdump_image())
Packit Service 501009
					pc->readmem = read_ramdump;
Packit Service 501009
				else
Packit Service 501009
					pc->readmem = read_kdump;
Packit Service 501009
				pc->writemem = NULL;
Packit Service 501009
			} else {
Packit Service 501009
				error(INFO, "malformed ELF file: %s\n",
Packit Service 501009
					pc->dumpfile);
Packit Service 501009
				program_usage(SHORT_FORM);
Packit Service 501009
			}
Packit Service 501009
			optind++;
Packit Service 501009
			continue;
Packit Service 501009
		}
Packit Service 501009
Packit Service 501009
		if (is_remote_daemon(argv[optind])) {
Packit Service 501009
                	if (pc->flags & DUMPFILE_TYPES) {
Packit Service 501009
				error(INFO, 
Packit Service 501009
				      "too many dumpfile/memory arguments\n");
Packit Service 501009
				program_usage(SHORT_FORM);
Packit Service 501009
			}
Packit Service 501009
			pc->flags2 |= REMOTE_DAEMON;
Packit Service 501009
			optind++;
Packit Service 501009
			continue;
Packit Service 501009
		}
Packit Service 501009
Packit Service 501009
		if (STREQ(argv[optind], "/dev/crash")) {
Packit Service 501009
			pc->memory_device = argv[optind];
Packit Service 501009
			optind++;
Packit Service 501009
			continue;
Packit Service 501009
		}
Packit Service 501009
Packit Service 501009
		if (!file_exists(argv[optind], NULL)) {
Packit Service 501009
			error(INFO, "%s: %s\n", argv[optind], strerror(ENOENT));
Packit Service 501009
			program_usage(SHORT_FORM);
Packit Service 501009
		} else if (is_directory(argv[optind])) {
Packit Service 501009
			error(INFO, "%s: not a supported file format\n", 
Packit Service 501009
				argv[optind]);
Packit Service 501009
			program_usage(SHORT_FORM);
Packit Service 501009
		} else if (!is_readable(argv[optind])) 
Packit Service 501009
			program_usage(SHORT_FORM);
Packit Service 501009
Packit Service 501009
		if (is_kernel(argv[optind])) {
Packit Service 501009
			if (pc->namelist || pc->server_namelist) {
Packit Service 501009
				if (!select_namelist(argv[optind])) {
Packit Service 501009
                               		error(INFO, 
Packit Service 501009
					    "too many namelist arguments\n");
Packit Service 501009
                               		program_usage(SHORT_FORM);
Packit Service 501009
				}
Packit Service 501009
			} else
Packit Service 501009
				pc->namelist = argv[optind];
Packit Service 501009
Packit Service 501009
		} else if (is_compressed_kernel(argv[optind], &tmpname)) {
Packit Service 501009
			if (pc->namelist) {
Packit Service 501009
				if (!select_namelist(tmpname)) {
Packit Service 501009
					error(INFO, 
Packit Service 501009
					    "too many namelist arguments\n");
Packit Service 501009
					program_usage(SHORT_FORM);
Packit Service 501009
				}
Packit Service 501009
				if (pc->namelist_debug == tmpname) {
Packit Service 501009
					pc->namelist_debug_orig = argv[optind];
Packit Service 501009
				} else {
Packit Service 501009
					pc->namelist_debug_orig = pc->namelist_orig;
Packit Service 501009
					pc->namelist_orig = argv[optind];
Packit Service 501009
				}
Packit Service 501009
			} else {
Packit Service 501009
				pc->namelist = tmpname;
Packit Service 501009
				pc->namelist_orig = argv[optind];
Packit Service 501009
			}
Packit Service 501009
			pc->cleanup = NULL;
Packit Service 501009
Packit Service 501009
		} else if (!(pc->flags & KERNEL_DEBUG_QUERY)) {
Packit Service 501009
Packit Service 501009
			if (is_flattened_format(argv[optind]))
Packit Service 501009
				pc->flags2 |= FLAT;
Packit Service 501009
Packit Service 501009
			if (STREQ(argv[optind], "/dev/mem")) {
Packit Service 501009
                        	if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
                                	error(INFO, 
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                	program_usage(SHORT_FORM);
Packit Service 501009
                        	}
Packit Service 501009
				pc->flags |= DEVMEM;
Packit Service 501009
				pc->dumpfile = NULL;
Packit Service 501009
				pc->readmem = read_dev_mem;
Packit Service 501009
				pc->writemem = write_dev_mem;
Packit Service 501009
				pc->live_memsrc = argv[optind];
Packit Service 501009
Packit Service 501009
			} else if (is_proc_kcore(argv[optind], KCORE_LOCAL)) {
Packit Service 501009
				if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
					error(INFO, 
Packit Service 501009
					    "too many dumpfile arguments\n");
Packit Service 501009
					program_usage(SHORT_FORM);
Packit Service 501009
				}
Packit Service 501009
				pc->flags |= PROC_KCORE;
Packit Service 501009
				pc->dumpfile = NULL;
Packit Service 501009
				pc->readmem = read_proc_kcore;
Packit Service 501009
				pc->writemem = write_proc_kcore;
Packit Service 501009
				pc->live_memsrc = argv[optind];
Packit Service 501009
Packit Service 501009
			} else if (is_netdump(argv[optind], NETDUMP_LOCAL)) {
Packit Service 501009
                                if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
                                pc->flags |= NETDUMP;
Packit Service 501009
                                pc->dumpfile = argv[optind];
Packit Service 501009
Packit Service 501009
				if (is_sadump_xen()) {
Packit Service 501009
					pc->readmem = read_kdump;
Packit Service 501009
					pc->writemem = write_kdump;
Packit Service 501009
				} else {
Packit Service 501009
					pc->readmem = read_netdump;
Packit Service 501009
					pc->writemem = write_netdump;
Packit Service 501009
				}
Packit Service 501009
Packit Service 501009
                        } else if (is_kdump(argv[optind], KDUMP_LOCAL)) {
Packit Service 501009
                                if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
                                pc->flags |= KDUMP;
Packit Service 501009
                                pc->dumpfile = argv[optind];
Packit Service 501009
                                pc->readmem = read_kdump;
Packit Service 501009
                                pc->writemem = write_kdump;
Packit Service 501009
Packit Service 501009
                        } else if (is_kvmdump(argv[optind])) {
Packit Service 501009
                                if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
                                pc->flags |= KVMDUMP;
Packit Service 501009
                                pc->dumpfile = argv[optind];
Packit Service 501009
                                pc->readmem = read_kvmdump;
Packit Service 501009
                                pc->writemem = write_kvmdump;
Packit Service 501009
Packit Service 501009
			} else if (is_kvmdump_mapfile(argv[optind])) {
Packit Service 501009
				if (pc->kvmdump_mapfile) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many KVM map file arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
				}
Packit Service 501009
				pc->kvmdump_mapfile = argv[optind];
Packit Service 501009
                                
Packit Service 501009
                        } else if (is_xendump(argv[optind])) {
Packit Service 501009
                                if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
                                pc->flags |= XENDUMP;
Packit Service 501009
                                pc->dumpfile = argv[optind];
Packit Service 501009
                                pc->readmem = read_xendump;
Packit Service 501009
                                pc->writemem = write_xendump;
Packit Service 501009
Packit Service 501009
                        } else if (is_system_map(argv[optind])) {
Packit Service 501009
                                pc->system_map = argv[optind];
Packit Service 501009
                                pc->flags |= (SYSMAP|SYSMAP_ARG);
Packit Service 501009
Packit Service 501009
			} else if (is_diskdump(argv[optind])) {
Packit Service 501009
                                if ((pc->flags & MEMORY_SOURCES) &&
Packit Service 501009
                                    (!dumpfile_is_split())) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
                                pc->flags |= DISKDUMP;
Packit Service 501009
                                pc->dumpfile = argv[optind];
Packit Service 501009
                                pc->readmem = read_diskdump;
Packit Service 501009
                                pc->writemem = write_diskdump;
Packit Service 501009
Packit Service 501009
			} else if (is_lkcd_compressed_dump(argv[optind])) {
Packit Service 501009
				if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
                                pc->flags |= LKCD;
Packit Service 501009
                                pc->dumpfile = argv[optind];
Packit Service 501009
				pc->readmem = read_lkcd_dumpfile;
Packit Service 501009
				pc->writemem = write_lkcd_dumpfile;
Packit Service 501009
Packit Service 501009
			} else if (is_mclx_compressed_dump(argv[optind])) {
Packit Service 501009
				if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
					error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
				pc->flags |= MCLXCD;
Packit Service 501009
				pc->dumpfile = argv[optind];
Packit Service 501009
				pc->readmem = read_mclx_dumpfile;
Packit Service 501009
				pc->writemem = write_mclx_dumpfile;
Packit Service 501009
Packit Service 501009
                        } else if (is_s390_dump(argv[optind])) {
Packit Service 501009
                                if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
                                pc->flags |= S390D;
Packit Service 501009
                                pc->dumpfile = argv[optind];
Packit Service 501009
                                pc->readmem = read_s390_dumpfile;
Packit Service 501009
                                pc->writemem = write_s390_dumpfile;
Packit Service 501009
Packit Service 501009
			} else if (is_sadump(argv[optind])) {
Packit Service 501009
				if ((pc->flags & MEMORY_SOURCES) &&
Packit Service 501009
				    !sadump_is_diskset()) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
				}
Packit Service 501009
				pc->flags |= SADUMP;
Packit Service 501009
				pc->dumpfile = argv[optind];
Packit Service 501009
				pc->readmem = read_sadump;
Packit Service 501009
				pc->writemem = write_sadump;
Packit Service 501009
Packit Service 501009
			} else if (is_vmware_vmss(argv[optind])) {
Packit Service 501009
                                if (pc->flags & MEMORY_SOURCES) {
Packit Service 501009
                                        error(INFO,
Packit Service 501009
                                            "too many dumpfile arguments\n");
Packit Service 501009
                                        program_usage(SHORT_FORM);
Packit Service 501009
                                }
Packit Service 501009
				pc->flags |= VMWARE_VMSS;
Packit Service 501009
				pc->dumpfile = argv[optind];
Packit Service 501009
				pc->readmem = read_vmware_vmss;
Packit Service 501009
				pc->writemem = write_vmware_vmss;
Packit Service 501009
Packit Service 501009
			} else { 
Packit Service 501009
				error(INFO, 
Packit Service 501009
				    "%s: not a supported file format\n",
Packit Service 501009
					argv[optind]);
Packit Service 501009
				program_usage(SHORT_FORM);
Packit Service 501009
			}
Packit Service 501009
		}
Packit Service 501009
		optind++;
Packit Service 501009
	}
Packit Service 501009
	
Packit Service 501009
	check_xen_hyper();
Packit Service 501009
Packit Service 501009
        if (setjmp(pc->main_loop_env))
Packit Service 501009
                clean_exit(1);
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Initialize various subsystems.
Packit Service 501009
	 */
Packit Service 501009
	fd_init();
Packit Service 501009
	buf_init();
Packit Service 501009
        cmdline_init();
Packit Service 501009
        mem_init();
Packit Service 501009
       	hq_init();
Packit Service 501009
	machdep_init(PRE_SYMTAB);
Packit Service 501009
        symtab_init();
Packit Service 501009
	paravirt_init();
Packit Service 501009
	machdep_init(PRE_GDB);
Packit Service 501009
        datatype_init();
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  gdb_main_loop() modifies "command_loop_hook" to point to the 
Packit Service 501009
         *  main_loop() function below, and then calls gdb's main() function.
Packit Service 501009
         *  After gdb initializes itself, it calls back to main_loop().
Packit Service 501009
	 */
Packit Service 501009
	gdb_main_loop(argc, argv);   
Packit Service 501009
Packit Service 501009
	clean_exit(0);
Packit Service 501009
	exit(0); 
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  This routine is called from above, but also will be re-entered
Packit Service 501009
 *  as part of gdb's SIGINT handling.  Since GDB_INIT and RUNTIME 
Packit Service 501009
 *  will be set on re-entrancy, the initialization routines won't 
Packit Service 501009
 *  be called.  This can be avoided by always making gdb ignore SIGINT.
Packit Service 501009
 */
Packit Service 501009
void
Packit Service 501009
main_loop(void)
Packit Service 501009
{
Packit Service 501009
	if (pc->flags2 & ERASEINFO_DATA)
Packit Service 501009
		error(WARNING, "\n%s:\n         "
Packit Service 501009
		    "Kernel data has been erased from this dumpfile.  This may "
Packit Service 501009
		    "cause\n         the crash session to fail entirely, may "
Packit Service 501009
                    "cause commands to fail,\n         or may result in "
Packit Service 501009
		    "unpredictable\n         runtime behavior.\n",
Packit Service 501009
			pc->dumpfile);
Packit Service 501009
Packit Service 501009
	if (pc->flags2 & INCOMPLETE_DUMP) {
Packit Service 501009
		error(WARNING, "\n%s:\n         "
Packit Service 501009
		    "This dumpfile is incomplete.  This may cause the crash session"
Packit Service 501009
		    "\n         to fail entirely, may cause commands to fail, or may"
Packit Service 501009
		    " result in\n         unpredictable runtime behavior.\n",
Packit Service 501009
			pc->dumpfile);
Packit Service 501009
		if (!(*diskdump_flags & ZERO_EXCLUDED))
Packit Service 501009
			fprintf(fp,
Packit Service 501009
			    "   NOTE: This dumpfile may be analyzed with the --zero_excluded command\n"
Packit Service 501009
			    "         line option, in which case any read requests from missing pages\n"
Packit Service 501009
			    "         will return zero-filled memory.\n");
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	if (pc->flags2 & EXCLUDED_VMEMMAP) {
Packit Service 501009
		error(WARNING, "\n%s:\n         "
Packit Service 501009
		    "This dumpfile is incomplete because the page structures associated\n"
Packit Service 501009
                    "         with excluded pages may also be excluded.  This may cause the crash\n"
Packit Service 501009
		    "         session to fail entirely, may cause commands to fail (most notably\n"
Packit Service 501009
		    "         the \"kmem\" command), or may result in unpredictable runtime behavior.\n",
Packit Service 501009
			pc->dumpfile);
Packit Service 501009
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
        if (!(pc->flags & GDB_INIT)) {
Packit Service 501009
		gdb_session_init();
Packit Service 501009
		machdep_init(POST_RELOC);
Packit Service 501009
		show_untrusted_files();
Packit Service 501009
		kdump_backup_region_init();
Packit Service 501009
		if (XEN_HYPER_MODE()) {
Packit Service 501009
#ifdef XEN_HYPERVISOR_ARCH
Packit Service 501009
			machdep_init(POST_GDB);
Packit Service 501009
			xen_hyper_init();
Packit Service 501009
			machdep_init(POST_INIT);
Packit Service 501009
#else
Packit Service 501009
        		error(FATAL, XEN_HYPERVISOR_NOT_SUPPORTED);
Packit Service 501009
#endif
Packit Service 501009
		} else if (!(pc->flags & MINIMAL_MODE)) {
Packit Service 501009
			read_in_kernel_config(IKCFG_INIT);
Packit Service 501009
			kernel_init();
Packit Service 501009
			machdep_init(POST_GDB);
Packit Service 501009
        		vm_init();
Packit Service 501009
			machdep_init(POST_VM);
Packit Service 501009
        		module_init();
Packit Service 501009
        		help_init();
Packit Service 501009
        		task_init();
Packit Service 501009
        		vfs_init();
Packit Service 501009
			net_init();
Packit Service 501009
			dev_init();
Packit Service 501009
			machdep_init(POST_INIT);
Packit Service 501009
		}
Packit Service 501009
	} else
Packit Service 501009
		SIGACTION(SIGINT, restart, &pc->sigaction, NULL);
Packit Service 501009
Packit Service 501009
        /*
Packit Service 501009
         *  Display system statistics and current context.
Packit Service 501009
         */
Packit Service 501009
        if (!(pc->flags & SILENT) && !(pc->flags & RUNTIME)) {
Packit Service 501009
		if (XEN_HYPER_MODE()) {
Packit Service 501009
#ifdef XEN_HYPERVISOR_ARCH
Packit Service 501009
			xen_hyper_display_sys_stats();
Packit Service 501009
			xen_hyper_show_vcpu_context(XEN_HYPER_VCPU_LAST_CONTEXT());
Packit Service 501009
                	fprintf(fp, "\n");
Packit Service 501009
#else
Packit Service 501009
        		error(FATAL, XEN_HYPERVISOR_NOT_SUPPORTED);
Packit Service 501009
#endif
Packit Service 501009
		} else if (!(pc->flags & MINIMAL_MODE)) {
Packit Service 501009
			display_sys_stats();
Packit Service 501009
			show_context(CURRENT_CONTEXT());
Packit Service 501009
                	fprintf(fp, "\n");
Packit Service 501009
		}
Packit Service 501009
        }
Packit Service 501009
Packit Service 501009
	if (pc->flags & MINIMAL_MODE)
Packit Service 501009
            error(NOTE, 
Packit Service 501009
		"minimal mode commands: log, dis, rd, sym, eval, set, extend and exit\n\n");
Packit Service 501009
Packit Service 501009
        pc->flags |= RUNTIME;
Packit Service 501009
Packit Service 501009
	if (pc->flags & PRELOAD_EXTENSIONS)
Packit Service 501009
		preload_extensions();
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Return here if a non-recoverable error occurs
Packit Service 501009
	 *  during command execution.
Packit Service 501009
	 */
Packit Service 501009
	if (setjmp(pc->main_loop_env)) {
Packit Service 501009
		;
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  process_command_line() reads, parses and stores input command lines
Packit Service 501009
	 *  in the global args[] array.  exec_command() figures out what to 
Packit Service 501009
         *  do with the parsed line.
Packit Service 501009
	 */
Packit Service 501009
	while (TRUE) {
Packit Service 501009
		process_command_line();
Packit Service 501009
		exec_command();
Packit Service 501009
	}
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Most of the time args[0] simply contains the name string of a command
Packit Service 501009
 *  found in the global command_table[].  Special consideration is done for 
Packit Service 501009
 *  dealing with input files, "known" external commands, and built-in commands.
Packit Service 501009
 *  If none of the above apply, the args[0] string is checked against the
Packit Service 501009
 *  known list of structure, union and typedef names, and if found, passed
Packit Service 501009
 *  on to cmd_struct(), cmd_union() or cmd_whatis().
Packit Service 501009
 */
Packit Service 501009
void
Packit Service 501009
exec_command(void)
Packit Service 501009
{
Packit Service 501009
	struct command_table_entry *ct;
Packit Service 501009
	struct args_input_file args_ifile;
Packit Service 501009
Packit Service 501009
        if (args[0] && (args[0][0] == '\\') && args[0][1]) {
Packit Service 501009
		shift_string_left(args[0], 1);
Packit Service 501009
                shift_string_left(pc->orig_line, 1);
Packit Service 501009
		pc->curcmd_flags |= NO_MODIFY;
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
reattempt:
Packit Service 501009
	if (!args[0])
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
	optind = argerrs = 0;
Packit Service 501009
Packit Service 501009
	if ((ct = get_command_table_entry(args[0]))) {
Packit Service 501009
                if (ct->flags & REFRESH_TASK_TABLE) {
Packit Service 501009
			if (XEN_HYPER_MODE()) {
Packit Service 501009
#ifdef XEN_HYPERVISOR_ARCH
Packit Service 501009
				xen_hyper_refresh_domain_context_space();
Packit Service 501009
				xen_hyper_refresh_vcpu_context_space();
Packit Service 501009
#else
Packit Service 501009
        			error(FATAL, XEN_HYPERVISOR_NOT_SUPPORTED);
Packit Service 501009
#endif
Packit Service 501009
			} else if (!(pc->flags & MINIMAL_MODE)) {
Packit Service 501009
				tt->refresh_task_table();
Packit Service 501009
				sort_context_array();
Packit Service 501009
				sort_tgid_array();	
Packit Service 501009
			}
Packit Service 501009
		}
Packit Service 501009
                if (!STREQ(pc->curcmd, pc->program_name))
Packit Service 501009
                        pc->lastcmd = pc->curcmd;
Packit Service 501009
                pc->curcmd = ct->name;
Packit Service 501009
		pc->cmdgencur++;
Packit Service 501009
Packit Service 501009
		if (is_args_input_file(ct, &args_ifile))
Packit Service 501009
			exec_args_input_file(ct, &args_ifile);
Packit Service 501009
		else
Packit Service 501009
			(*ct->func)();
Packit Service 501009
Packit Service 501009
                pc->lastcmd = pc->curcmd;
Packit Service 501009
                pc->curcmd = pc->program_name;
Packit Service 501009
                return;
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	if (is_input_file())
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
	if (is_external_command())
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
	if (is_builtin_command())
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
        if (is_datatype_command()) 
Packit Service 501009
                goto reattempt;
Packit Service 501009
Packit Service 501009
	if (STRNEQ(args[0], "#") || STRNEQ(args[0], "//"))
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
	if (!(pc->flags & MINIMAL_MODE) &&
Packit Service 501009
	    is_gdb_command(TRUE, FAULT_ON_ERROR)) 
Packit Service 501009
		goto reattempt;
Packit Service 501009
Packit Service 501009
	if (REMOTE() && remote_execute())
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
	pc->curcmd = pc->program_name;
Packit Service 501009
Packit Service 501009
	if (pc->flags & MINIMAL_MODE)
Packit Service 501009
		error(INFO, 
Packit Service 501009
		    "%s: command not available in minimal mode\n"
Packit Service 501009
		    "NOTE: minimal mode commands: log, dis, rd, sym, eval, set, extend and exit\n",
Packit Service 501009
			args[0]);
Packit Service 501009
	else
Packit Service 501009
		error(INFO, "command not found: %s\n", args[0]);
Packit Service 501009
Packit Service 501009
	if (pc->curcmd_flags & REPEAT)
Packit Service 501009
		pc->curcmd_flags &= ~REPEAT;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Find the command_table structure associated with a command name.
Packit Service 501009
 */
Packit Service 501009
struct command_table_entry *
Packit Service 501009
get_command_table_entry(char *name)
Packit Service 501009
{       
Packit Service 501009
	int i;
Packit Service 501009
        struct command_table_entry *cp;
Packit Service 501009
        struct extension_table *ext;
Packit Service 501009
Packit Service 501009
	if (pc->flags2 & GDB_CMD_MODE) {
Packit Service 501009
		if (STREQ(name, "crash")) {
Packit Service 501009
			if (argcnt == 1)
Packit Service 501009
				error(FATAL, 
Packit Service 501009
				    "a crash command must follow "
Packit Service 501009
				    "the \"crash\" directive\n");
Packit Service 501009
			for (i = 1; i <= argcnt; i++)
Packit Service 501009
				args[i-1] = args[i];
Packit Service 501009
			argcnt--;
Packit Service 501009
			name = args[0];
Packit Service 501009
		} else
Packit Service 501009
			name = "gdb";
Packit Service 501009
	}
Packit Service 501009
	
Packit Service 501009
	for (cp = pc->cmd_table; cp->name; cp++) {
Packit Service 501009
                if (STREQ(cp->name, name)) {
Packit Service 501009
			if (!(pc->flags & MINIMAL_MODE) || (cp->flags & MINIMAL))
Packit Service 501009
				return cp;
Packit Service 501009
			else
Packit Service 501009
				return NULL;
Packit Service 501009
		}
Packit Service 501009
        }
Packit Service 501009
                
Packit Service 501009
        for (ext = extension_table; ext; ext = ext->next) {
Packit Service 501009
                for (cp = ext->command_table; cp->name; cp++) {
Packit Service 501009
                        if (STREQ(cp->name, name)) {
Packit Service 501009
				if (!(pc->flags & MINIMAL_MODE) || (cp->flags & MINIMAL))
Packit Service 501009
					return cp;
Packit Service 501009
				else
Packit Service 501009
					return NULL;
Packit Service 501009
			}
Packit Service 501009
                }
Packit Service 501009
        }       
Packit Service 501009
Packit Service 501009
        return NULL;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
Packit Service 501009
static int
Packit Service 501009
is_input_file(void)
Packit Service 501009
{
Packit Service 501009
        if (STREQ(args[0], "<")) {
Packit Service 501009
                exec_input_file();
Packit Service 501009
                return TRUE;
Packit Service 501009
        }
Packit Service 501009
Packit Service 501009
	return FALSE;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
static int
Packit Service 501009
is_builtin_command(void)
Packit Service 501009
{
Packit Service 501009
	int i;
Packit Service 501009
	struct remote_file remote_file, *rfp;
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  cmd_test() is used strictly for debugging -- but not advertised
Packit Service 501009
	 *  in the help menu.
Packit Service 501009
	 */ 
Packit Service 501009
        if (STREQ(args[0], "test")) {
Packit Service 501009
		pc->curcmd = "test";
Packit Service 501009
                cmd_test();
Packit Service 501009
                return TRUE;
Packit Service 501009
        }
Packit Service 501009
Packit Service 501009
        if (STREQ(args[0], "save")) {
Packit Service 501009
		pc->curcmd = "save";
Packit Service 501009
		rfp = &remote_file;
Packit Service 501009
		BZERO(rfp, sizeof(struct remote_file));
Packit Service 501009
		rfp->flags |= REMOTE_VERBOSE;
Packit Service 501009
		for (i = 1; i < argcnt; i++) {
Packit Service 501009
			rfp->filename = args[i];
Packit Service 501009
			get_remote_file(rfp); 
Packit Service 501009
		}
Packit Service 501009
		return TRUE;
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	return FALSE;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Pure laziness -- to avoid having to type the exclamation point at the
Packit Service 501009
 *  beginning of the line.
Packit Service 501009
 */
Packit Service 501009
static int
Packit Service 501009
is_external_command(void)
Packit Service 501009
{
Packit Service 501009
	int i;
Packit Service 501009
	char *cmd;
Packit Service 501009
	char command[BUFSIZE];
Packit Service 501009
Packit Service 501009
	cmd = args[0];
Packit Service 501009
Packit Service 501009
        if (STREQ(cmd, "vi") ||
Packit Service 501009
            STREQ(cmd, "pwd") ||
Packit Service 501009
            STREQ(cmd, "grep") ||
Packit Service 501009
            STREQ(cmd, "cat") ||
Packit Service 501009
            STREQ(cmd, "more") ||
Packit Service 501009
            STREQ(cmd, "less") ||
Packit Service 501009
	    STREQ(cmd, "echo") ||
Packit Service 501009
            STREQ(cmd, "ls")) {
Packit Service 501009
                sprintf(command, "%s", cmd);
Packit Service 501009
                for (i = 1; i < argcnt; i++) {
Packit Service 501009
                        strcat(command, " ");
Packit Service 501009
			if (strstr(args[i], " ")) {
Packit Service 501009
				strcat(command, "\"");
Packit Service 501009
                        	strcat(command, args[i]);
Packit Service 501009
				strcat(command, "\"");
Packit Service 501009
			}
Packit Service 501009
			else
Packit Service 501009
                        	strcat(command, args[i]);
Packit Service 501009
                }
Packit Service 501009
                if (system(command) == -1)
Packit Service 501009
			perror(command);
Packit Service 501009
                return TRUE;
Packit Service 501009
        }
Packit Service 501009
Packit Service 501009
	return FALSE;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
void
Packit Service 501009
cmd_quit(void)
Packit Service 501009
{
Packit Service 501009
	if (REMOTE())
Packit Service 501009
		remote_exit();
Packit Service 501009
Packit Service 501009
	clean_exit(0);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
void
Packit Service 501009
cmd_mach(void)
Packit Service 501009
{
Packit Service 501009
	machdep->cmd_mach();
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
Packit Service 501009
static void
Packit Service 501009
setup_environment(int argc, char **argv)
Packit Service 501009
{
Packit Service 501009
	int i;
Packit Service 501009
	char *p1;
Packit Service 501009
	char buf[BUFSIZE];
Packit Service 501009
	char homerc[BUFSIZE];
Packit Service 501009
	char localrc[BUFSIZE];
Packit Service 501009
	FILE *afp;
Packit Service 501009
	char *program;
Packit Service 501009
Packit Service 501009
	program = argv[0];
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Program output typically goes via "fprintf(fp, ...)", but the 
Packit Service 501009
	 *  contents of fp are modified on the fly to handle redirection
Packit Service 501009
	 *  to pipes or output files.
Packit Service 501009
	 */
Packit Service 501009
	fp = stdout;
Packit Service 501009
Packit Service 501009
	if (!set_error("default")) {
Packit Service 501009
		fprintf(stderr, "crash: cannot malloc error() path string\n");
Packit Service 501009
		clean_exit(1);
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Start populating the program_context structure.  It's used so
Packit Service 501009
	 *  frequently that "pc" has been declared globally to point to the
Packit Service 501009
	 *  "program_context" structure.
Packit Service 501009
	 */
Packit Service 501009
        pc->program_name = (char *)basename(program);
Packit Service 501009
	pc->program_path = program;
Packit Service 501009
        pc->program_version = build_version;
Packit Service 501009
	pc->program_pid = (ulong)getpid();
Packit Service 501009
        pc->curcmd = pc->program_name;
Packit Service 501009
        pc->flags = (HASH|SCROLL);
Packit Service 501009
	pc->flags |= DATADEBUG;          /* default until unnecessary */
Packit Service 501009
	pc->flags2 |= REDZONE;
Packit Service 501009
	pc->confd = -2;
Packit Service 501009
	pc->machine_type = MACHINE_TYPE;
Packit Service 501009
	if (file_exists("/dev/mem", NULL)) {     /* defaults until argv[] is parsed */
Packit Service 501009
		pc->readmem = read_dev_mem;
Packit Service 501009
		pc->writemem = write_dev_mem;
Packit Service 501009
	} else if (file_exists("/proc/kcore", NULL)) {
Packit Service 501009
		pc->readmem = read_proc_kcore;
Packit Service 501009
		pc->writemem = write_proc_kcore;
Packit Service 501009
	}
Packit Service 501009
	pc->read_vmcoreinfo = no_vmcoreinfo;
Packit Service 501009
	pc->memory_module = NULL;
Packit Service 501009
	pc->memory_device = MEMORY_DRIVER_DEVICE;
Packit Service 501009
	machdep->bits = sizeof(long) * 8;
Packit Service 501009
	machdep->verify_paddr = generic_verify_paddr;
Packit Service 501009
	machdep->get_kvaddr_ranges = generic_get_kvaddr_ranges;
Packit Service 501009
	machdep->is_page_ptr = generic_is_page_ptr;
Packit Service 501009
	pc->redhat_debug_loc = DEFAULT_REDHAT_DEBUG_LOCATION;
Packit Service 501009
	pc->cmdgencur = 0;
Packit Service 501009
	pc->cmd_table = linux_command_table;
Packit Service 501009
	kt->BUG_bytes = -1;
Packit Service 501009
	kt->flags |= PRE_KERNEL_INIT;
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Set up to perform a clean_exit() upon parent death.
Packit Service 501009
	 */
Packit Service 501009
	SIGACTION(SIGUSR2, restart, &pc->sigaction, NULL);
Packit Service 501009
	prctl(PR_SET_PDEATHSIG, SIGUSR2);
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Get gdb version before initializing it since this might be one 
Packit Service 501009
         *  of the short-hand commands that need it without running gdb.
Packit Service 501009
	 */
Packit Service 501009
	get_gdb_version();
Packit Service 501009
Packit Service 501009
	/* 
Packit Service 501009
	 *  Set up the default scrolling behavior for terminal output.
Packit Service 501009
	 */
Packit Service 501009
	if (isatty(fileno(stdout))) {
Packit Service 501009
		if (CRASHPAGER_valid()) {
Packit Service 501009
			pc->flags |= SCROLL;
Packit Service 501009
			pc->scroll_command = SCROLL_CRASHPAGER;
Packit Service 501009
		} else if (file_exists("/usr/bin/less", NULL)) {
Packit Service 501009
			pc->flags |= SCROLL;
Packit Service 501009
			pc->scroll_command = SCROLL_LESS;
Packit Service 501009
		} else if (file_exists("/bin/more", NULL)) {
Packit Service 501009
			pc->flags |= SCROLL;
Packit Service 501009
			pc->scroll_command = SCROLL_MORE;
Packit Service 501009
		} else {
Packit Service 501009
                	pc->scroll_command = SCROLL_NONE;
Packit Service 501009
                	pc->flags &= ~SCROLL;
Packit Service 501009
        	}
Packit Service 501009
	} 
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Setup the readline command line editing mode based upon the 
Packit Service 501009
	 *  following order:
Packit Service 501009
	 *
Packit Service 501009
	 *   (1) EDITOR environment variable
Packit Service 501009
         *   (2) overridden by any .crashrc entry: "set vi" or "set emacs"
Packit Service 501009
         *   (3) RL_VI_MODE if not set anywhere else
Packit Service 501009
	 */
Packit Service 501009
Packit Service 501009
	pc->flags |= READLINE;
Packit Service 501009
	pc->editing_mode = "no_mode";
Packit Service 501009
Packit Service 501009
	if ((p1 = getenv("EDITOR"))) {
Packit Service 501009
		if (strstr(p1, "vi"))
Packit Service 501009
			pc->editing_mode = "vi";
Packit Service 501009
		if (strstr(p1, "emacs"))
Packit Service 501009
			pc->editing_mode = "emacs";
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Resolve $HOME .rc file first, then the one in the local directory.
Packit Service 501009
         *  Note that only "set" and "alias" commands are done at this time.
Packit Service 501009
	 */
Packit Service 501009
	for (i = 1; i < argc; i++)
Packit Service 501009
		if (STREQ(argv[i], "--no_crashrc"))
Packit Service 501009
			pc->flags |= NOCRASHRC; 
Packit Service 501009
Packit Service 501009
	alias_init(NULL);
Packit Service 501009
Packit Service 501009
	if ((p1 = getenv("HOME"))) {
Packit Service 501009
		if ((pc->home = (char *)malloc(strlen(p1)+1)) == NULL) {
Packit Service 501009
                        error(INFO, "home directory malloc: %s\n",
Packit Service 501009
                                strerror(errno));
Packit Service 501009
			pc->home = "(unknown)";
Packit Service 501009
		} else
Packit Service 501009
			strcpy(pc->home, p1);
Packit Service 501009
	        sprintf(homerc, "%s/.%src", pc->home, pc->program_name);
Packit Service 501009
	        if (!(pc->flags & NOCRASHRC) && file_exists(homerc, NULL)) {
Packit Service 501009
	                if ((afp = fopen(homerc, "r")) == NULL)
Packit Service 501009
	                        error(INFO, "cannot open %s: %s\n",
Packit Service 501009
	                                homerc, strerror(errno));
Packit Service 501009
			else if (untrusted_file(afp, homerc))
Packit Service 501009
				fclose(afp);
Packit Service 501009
	                else {
Packit Service 501009
	                        while (fgets(buf, BUFSIZE, afp))
Packit Service 501009
	                                resolve_rc_cmd(buf, ALIAS_RCHOME);
Packit Service 501009
	                        fclose(afp);
Packit Service 501009
	                }
Packit Service 501009
	        }
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
        sprintf(localrc, ".%src", pc->program_name);
Packit Service 501009
	if (!same_file(homerc, localrc) && 
Packit Service 501009
	    !(pc->flags & NOCRASHRC) && file_exists(localrc, NULL)) {
Packit Service 501009
		if ((afp = fopen(localrc, "r")) == NULL)
Packit Service 501009
                        error(INFO, "cannot open %s: %s\n",
Packit Service 501009
				localrc, strerror(errno));
Packit Service 501009
		else if (untrusted_file(afp, localrc))
Packit Service 501009
			fclose(afp);
Packit Service 501009
		else {
Packit Service 501009
			while (fgets(buf, BUFSIZE, afp)) 
Packit Service 501009
				resolve_rc_cmd(buf, ALIAS_RCLOCAL);
Packit Service 501009
			fclose(afp);
Packit Service 501009
		}
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	if (STREQ(pc->editing_mode, "no_mode"))
Packit Service 501009
		pc->editing_mode = "vi";
Packit Service 501009
Packit Service 501009
	machdep_init(SETUP_ENV);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  "help -p" output
Packit Service 501009
 */
Packit Service 501009
void
Packit Service 501009
dump_program_context(void)
Packit Service 501009
{
Packit Service 501009
	int i;
Packit Service 501009
	int others = 0;
Packit Service 501009
	char *p1;
Packit Service 501009
	char buf[BUFSIZE];
Packit Service 501009
	char buf2[BUFSIZE];
Packit Service 501009
Packit Service 501009
	fprintf(fp, "     program_name: %s\n", pc->program_name);
Packit Service 501009
	fprintf(fp, "     program_path: %s\n", pc->program_path);
Packit Service 501009
	fprintf(fp, "  program_version: %s\n", pc->program_version);
Packit Service 501009
	fprintf(fp, "      gdb_version: %s\n", pc->gdb_version);
Packit Service 501009
	fprintf(fp, "      program_pid: %ld\n", pc->program_pid);
Packit Service 501009
	fprintf(fp, "           prompt: \"%s\"\n", pc->prompt);
Packit Service 501009
	fprintf(fp, "            flags: %llx ", pc->flags);
Packit Service 501009
Packit Service 501009
	if (pc->flags)
Packit Service 501009
		sprintf(buf, "(");
Packit Service 501009
	if (pc->flags & RUNTIME)
Packit Service 501009
		sprintf(&buf[strlen(buf)], "%sRUNTIME", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags & LIVE_SYSTEM)
Packit Service 501009
		sprintf(&buf[strlen(buf)], "%sLIVE_SYSTEM", 
Packit Service 501009
			others++ ? "|" : "");
Packit Service 501009
	if (pc->flags & TTY)
Packit Service 501009
		sprintf(&buf[strlen(buf)], "%sTTY", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & IN_FOREACH)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sIN_FOREACH", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & MFD_RDWR)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sMFD_RDWR", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & KVMDUMP)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sKVMDUMP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & SILENT)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sSILENT", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & HASH)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sHASH", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & SCROLL)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sSCROLL", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & NO_CONSOLE)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sNO_CONSOLE", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & MCLXCD)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sMCLXCD", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & RUNTIME_IFILE)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sRUNTIME_IFILE", 
Packit Service 501009
			others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & CMDLINE_IFILE)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sCMDLINE_IFILE", 
Packit Service 501009
			others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & DROP_CORE)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sDROP_CORE", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & LKCD)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sLKCD", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & GDB_INIT)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sGDB_INIT", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & IN_GDB)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sIN_GDB", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags & RCHOME_IFILE)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sRCHOME_IFILE", 
Packit Service 501009
			others++ ? "|" : "");
Packit Service 501009
	if (pc->flags & RCLOCAL_IFILE)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sRCLOCAL_IFILE", 
Packit Service 501009
			others++ ? "|" : "");
Packit Service 501009
	if (pc->flags & READLINE)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sREADLINE", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & _SIGINT_)
Packit Service 501009
                sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%s_SIGINT_", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & IN_RESTART)
Packit Service 501009
                sprintf(&buf[strlen(buf)], "%sIN_RESTART", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & KERNEL_DEBUG_QUERY)
Packit Service 501009
                sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sKERNEL_DEBUG_QUERY", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & DEVMEM)
Packit Service 501009
                sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sDEVMEM", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & MEMMOD)
Packit Service 501009
                sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sMEMMOD", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & MODPRELOAD)
Packit Service 501009
                sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sMODPRELOAD", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & REM_LIVE_SYSTEM)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sREM_LIVE_SYSTEM", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & NAMELIST_LOCAL)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sNAMELIST_LOCAL", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & DUMPFILE_SAVED)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sDUMPFILE_SAVED", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & NAMELIST_SAVED)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sNAMELIST_SAVED", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & UNLINK_NAMELIST)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sUNLINK_NAMELIST", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & NAMELIST_UNLINKED)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sNAMELIST_UNLINKED", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & REM_MCLXCD)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sREM_MCLXCD", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & REM_LKCD)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sREM_LKCD", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & NAMELIST_NO_GZIP)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sNAMELIST_NO_GZIP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & UNLINK_MODULES)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sUNLINK_MODULES", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & S390D)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sS390D", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & REM_S390D)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sREM_S390D", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & NETDUMP)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sNETDUMP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & XENDUMP)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sXENDUMP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & KDUMP)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sKDUMP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & SADUMP)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sSADUMP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & SYSRQ)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sSYSRQ", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & REM_NETDUMP)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sREM_NETDUMP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & DISKDUMP)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sDISKDUMP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & VMWARE_VMSS)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sVMWARE_VMSS", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & SYSMAP)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sSYSMAP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & SYSMAP_ARG)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sSYSMAP_ARG", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & DATADEBUG)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sDATADEBUG", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags & FINDKERNEL)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sFINDKERNEL", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & VERSION_QUERY)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sVERSION_QUERY", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & READNOW)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sREADNOW", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & NOCRASHRC)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sNOCRASHRC", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & INIT_IFILE)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sINIT_IFILE", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & XEN_HYPER)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sXEN_HYPER", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & XEN_CORE)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sXEN_CORE", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & PLEASE_WAIT)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sPLEASE_WAIT", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & IFILE_ERROR)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sIFILE_ERROR", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & MINIMAL_MODE)
Packit Service 501009
                sprintf(&buf[strlen(buf)],
Packit Service 501009
                        "%sMINIMAL_MODE", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & CRASHBUILTIN)
Packit Service 501009
                sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sCRASHBUILTIN", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & PRELOAD_EXTENSIONS)
Packit Service 501009
                sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sPRELOAD_EXTENSIONS", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags & PROC_KCORE)
Packit Service 501009
                sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sPROC_KCORE", others++ ? "|" : "");
Packit Service 501009
Packit Service 501009
	if (pc->flags)
Packit Service 501009
		strcat(buf, ")");
Packit Service 501009
Packit Service 501009
	if (strlen(buf)) {
Packit Service 501009
		if (strlen(buf) > 46) {
Packit Service 501009
			sprintf(buf2, "\n%s\n", 
Packit Service 501009
				mkstring(buf, 80, CENTER|LJUST, NULL));
Packit Service 501009
			if (strlen(buf2) <= 82) 
Packit Service 501009
				fprintf(fp, "%s", buf2);
Packit Service 501009
			else {
Packit Service 501009
				for (i = strlen(buf2)-1; i; i--) {
Packit Service 501009
					if ((buf2[i] == '|') && (i < 80))
Packit Service 501009
						break;
Packit Service 501009
				}
Packit Service 501009
Packit Service 501009
				strcpy(buf, buf2);
Packit Service 501009
				buf[i+1] = NULLCHAR;
Packit Service 501009
				fprintf(fp, "%s\n %s", buf, &buf2[i+1]);
Packit Service 501009
			}
Packit Service 501009
		}
Packit Service 501009
		else
Packit Service 501009
			fprintf(fp, "%s\n", buf);
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	others = 0;
Packit Service 501009
	fprintf(fp, "           flags2: %llx (", pc->flags2);
Packit Service 501009
	if (pc->flags2 & FLAT)
Packit Service 501009
		fprintf(fp, "%sFLAT", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & ELF_NOTES)
Packit Service 501009
		fprintf(fp, "%sELF_NOTES", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & GET_OSRELEASE)
Packit Service 501009
		fprintf(fp, "%sGET_OSRELEASE", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & REMOTE_DAEMON)
Packit Service 501009
		fprintf(fp, "%sREMOTE_DAEMON", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & LIVE_DUMP)
Packit Service 501009
		fprintf(fp, "%sLIVE_DUMP", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & RADIX_OVERRIDE)
Packit Service 501009
		fprintf(fp, "%sRADIX_OVERRIDE", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & QEMU_MEM_DUMP_ELF)
Packit Service 501009
		fprintf(fp, "%sQEMU_MEM_DUMP_ELF", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & QEMU_MEM_DUMP_COMPRESSED)
Packit Service 501009
		fprintf(fp, "%sQEMU_MEM_DUMP_COMPRESSED", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & GET_LOG)
Packit Service 501009
		fprintf(fp, "%sGET_LOG", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & VMCOREINFO)
Packit Service 501009
		fprintf(fp, "%sVMCOREINFO", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & ALLOW_FP)
Packit Service 501009
		fprintf(fp, "%sALLOW_FP", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & RAMDUMP)
Packit Service 501009
		fprintf(fp, "%sRAMDUMP", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & OFFLINE_HIDE)
Packit Service 501009
		fprintf(fp, "%sOFFLINE_HIDE", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & INCOMPLETE_DUMP)
Packit Service 501009
		fprintf(fp, "%sINCOMPLETE_DUMP", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & SNAP)
Packit Service 501009
		fprintf(fp, "%sSNAP", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & EXCLUDED_VMEMMAP)
Packit Service 501009
		fprintf(fp, "%sEXCLUDED_VMEMMAP", others++ ? "|" : "");
Packit Service 501009
        if (pc->flags2 & MEMSRC_LOCAL)
Packit Service 501009
		fprintf(fp, "%sMEMSRC_LOCAL", others++ ? "|" : "");
Packit Service 501009
	if (pc->flags2 & REDZONE)
Packit Service 501009
		fprintf(fp, "%sREDZONE", others++ ? "|" : "");
Packit Service 501009
	fprintf(fp, ")\n");
Packit Service 501009
Packit Service 501009
	fprintf(fp, "         namelist: %s\n", pc->namelist);
Packit Service 501009
	fprintf(fp, "         dumpfile: %s\n", pc->dumpfile);
Packit Service 501009
	fprintf(fp, "      live_memsrc: %s\n", pc->live_memsrc);
Packit Service 501009
	fprintf(fp, "       system_map: %s\n", pc->system_map);
Packit Service 501009
	fprintf(fp, "   namelist_debug: %s\n", pc->namelist_debug);
Packit Service 501009
	fprintf(fp, "   debuginfo_file: %s\n", pc->debuginfo_file);
Packit Service 501009
	fprintf(fp, "    namelist_orig: %s\n", pc->namelist_orig);
Packit Service 501009
	fprintf(fp, "namelist_dbg_orig: %s\n", pc->namelist_debug_orig);
Packit Service 501009
	fprintf(fp, "  kvmdump_mapfile: %s\n", pc->kvmdump_mapfile);
Packit Service 501009
	fprintf(fp, "    memory_module: %s\n", pc->memory_module);
Packit Service 501009
	fprintf(fp, "    memory_device: %s\n", pc->memory_device);
Packit Service 501009
	fprintf(fp, "     machine_type: %s\n", pc->machine_type);
Packit Service 501009
	fprintf(fp, "     editing_mode: %s\n", pc->editing_mode);
Packit Service 501009
	fprintf(fp, "              nfd: %d\n", pc->nfd);
Packit Service 501009
	fprintf(fp, "              mfd: %d\n", pc->mfd);
Packit Service 501009
	fprintf(fp, "              kfd: %d\n", pc->kfd);
Packit Service 501009
	fprintf(fp, "              dfd: %d\n", pc->dfd);
Packit Service 501009
	fprintf(fp, "            confd: %d\n", pc->confd);
Packit Service 501009
	fprintf(fp, "             home: %s\n", pc->home);
Packit Service 501009
	fprintf(fp, "     command_line: ");
Packit Service 501009
	if (STRNEQ(pc->command_line, args[0]))
Packit Service 501009
		fprintf(fp, "%s\n", concat_args(buf, 0, FALSE));
Packit Service 501009
	else
Packit Service 501009
		fprintf(fp, "%s\n", pc->command_line);
Packit Service 501009
	fprintf(fp, "        orig_line: %s\n", pc->orig_line);
Packit Service 501009
	fprintf(fp, "        eoc_index: %d\n", pc->eoc_index);
Packit Service 501009
	fprintf(fp, "         readline: %lx\n", (ulong)pc->readline);
Packit Service 501009
	fprintf(fp, "           my_tty: %s\n", pc->my_tty);
Packit Service 501009
	fprintf(fp, "            debug: %ld\n", pc->debug);
Packit Service 501009
	fprintf(fp, "       debug_save: %ld\n", pc->debug_save);
Packit Service 501009
	fprintf(fp, "          console: %s\n", pc->console);
Packit Service 501009
	fprintf(fp, " redhat_debug_loc: %s\n", pc->redhat_debug_loc);
Packit Service 501009
	fprintf(fp, "        pipefd[2]: %d,%d\n", pc->pipefd[0], pc->pipefd[1]);
Packit Service 501009
	fprintf(fp, "           nullfp: %lx\n", (ulong)pc->nullfp);
Packit Service 501009
	fprintf(fp, "          stdpipe: %lx\n", (ulong)pc->stdpipe);
Packit Service 501009
	fprintf(fp, "             pipe: %lx\n", (ulong)pc->pipe);
Packit Service 501009
	fprintf(fp, "            ifile: %lx\n", (ulong)pc->ifile);
Packit Service 501009
	fprintf(fp, "            ofile: %lx\n", (ulong)pc->ofile);
Packit Service 501009
	fprintf(fp, "       ifile_pipe: %lx\n", (ulong)pc->ifile_pipe);
Packit Service 501009
	fprintf(fp, "      ifile_ofile: %lx\n", (ulong)pc->ifile_ofile);
Packit Service 501009
	fprintf(fp, "       args_ifile: %lx\n", (ulong)pc->args_ifile);
Packit Service 501009
	fprintf(fp, "       input_file: %s\n", pc->input_file);
Packit Service 501009
	fprintf(fp, "ifile_in_progress: %lx (", pc->ifile_in_progress);
Packit Service 501009
	others = 0;
Packit Service 501009
	if (pc->ifile_in_progress & RCHOME_IFILE)
Packit Service 501009
		fprintf(fp, "%sRCHOME_IFILE", others++ ? "|" : "");
Packit Service 501009
	if (pc->ifile_in_progress & RCLOCAL_IFILE)
Packit Service 501009
		fprintf(fp, "%sRCLOCAL_IFILE", others++ ? "|" : "");
Packit Service 501009
	if (pc->ifile_in_progress & CMDLINE_IFILE)
Packit Service 501009
		fprintf(fp, "%sCMDLINE_IFILE", others++ ? "|" : "");
Packit Service 501009
	if (pc->ifile_in_progress & RUNTIME_IFILE)
Packit Service 501009
		fprintf(fp, "%sRUNTIME_IFILE", others++ ? "|" : "");
Packit Service 501009
	fprintf(fp, ")\n");
Packit Service 501009
	fprintf(fp, "     ifile_offset: %lld\n", (ulonglong)pc->ifile_offset);
Packit Service 501009
	fprintf(fp, "runtime_ifile_cmd: %s\n", pc->runtime_ifile_cmd ?
Packit Service 501009
                pc->runtime_ifile_cmd : "(unused)");
Packit Service 501009
	fprintf(fp, "   scroll_command: ");
Packit Service 501009
	switch (pc->scroll_command) 
Packit Service 501009
	{
Packit Service 501009
	case SCROLL_NONE:
Packit Service 501009
		fprintf(fp, "SCROLL_NONE\n");
Packit Service 501009
		break;
Packit Service 501009
	case SCROLL_LESS:
Packit Service 501009
		fprintf(fp, "SCROLL_LESS\n");
Packit Service 501009
		break;
Packit Service 501009
	case SCROLL_MORE:
Packit Service 501009
		fprintf(fp, "SCROLL_MORE\n");
Packit Service 501009
		break;
Packit Service 501009
	case SCROLL_CRASHPAGER:
Packit Service 501009
		fprintf(fp, "SCROLL_CRASHPAGER (%s)\n", getenv("CRASHPAGER"));
Packit Service 501009
		break;
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	buf[0] = NULLCHAR;
Packit Service 501009
	fprintf(fp, "         redirect: %lx ", pc->redirect);
Packit Service 501009
	if (pc->redirect)
Packit Service 501009
		sprintf(buf, "(");
Packit Service 501009
	others = 0;
Packit Service 501009
	if (pc->redirect & FROM_COMMAND_LINE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sFROM_COMMAND_LINE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & FROM_INPUT_FILE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sFROM_INPUT_FILE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_NOT_DONE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_NOT_DONE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_TO_PIPE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_TO_PIPE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_TO_STDPIPE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_TO_STDPIPE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_TO_FILE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_TO_FILE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_FAILURE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_FAILURE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_SHELL_ESCAPE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_SHELL_ESCAPE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_SHELL_COMMAND)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_SHELL_COMMAND", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_PID_KNOWN)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_PID_KNOWN", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect & REDIRECT_MULTI_PIPE)
Packit Service 501009
		sprintf(&buf[strlen(buf)], 
Packit Service 501009
			"%sREDIRECT_MULTI_PIPE", others++ ? "|" : "");
Packit Service 501009
	if (pc->redirect)
Packit Service 501009
		strcat(buf, ")");
Packit Service 501009
Packit Service 501009
        if (strlen(buf)) {
Packit Service 501009
                if (strlen(buf) > 54)
Packit Service 501009
                        fprintf(fp, "\n%s\n",
Packit Service 501009
                                mkstring(buf, 80, CENTER|LJUST, NULL));
Packit Service 501009
                else
Packit Service 501009
                        fprintf(fp, "%s\n", buf);
Packit Service 501009
        }
Packit Service 501009
Packit Service 501009
	if (!pc->redirect)
Packit Service 501009
		fprintf(fp, "\n");
Packit Service 501009
Packit Service 501009
	fprintf(fp, "      stdpipe_pid: %d\n", pc->stdpipe_pid);
Packit Service 501009
	fprintf(fp, "         pipe_pid: %d\n", pc->pipe_pid);
Packit Service 501009
	fprintf(fp, "   pipe_shell_pid: %d\n", pc->pipe_shell_pid);
Packit Service 501009
	fprintf(fp, "     pipe_command: %s\n", pc->pipe_command);
Packit Service 501009
	if (pc->symfile && pc->symfile2) {
Packit Service 501009
		fprintf(fp, "          symfile: %lx  (%ld)\n", 
Packit Service 501009
			(ulong)pc->symfile, (ulong)ftell(pc->symfile));
Packit Service 501009
		fprintf(fp, "         symfile2: %lx  (%ld)\n", 
Packit Service 501009
			(ulong)pc->symfile2, (ulong)ftell(pc->symfile2));
Packit Service 501009
	} else {
Packit Service 501009
		fprintf(fp, "          symfile: %lx \n", (ulong)pc->symfile);
Packit Service 501009
		fprintf(fp, "         symfile2: %lx \n", (ulong)pc->symfile2);
Packit Service 501009
	}
Packit Service 501009
	fprintf(fp, "          tmpfile: %lx\n", (ulong)pc->tmpfile);
Packit Service 501009
	fprintf(fp, "         saved_fp: %lx\n", (ulong)pc->saved_fp);
Packit Service 501009
	fprintf(fp, "           tmp_fp: %lx\n", (ulong)pc->tmp_fp);
Packit Service 501009
	fprintf(fp, "         tmpfile2: %lx\n", (ulong)pc->tmpfile2);
Packit Service 501009
Packit Service 501009
	fprintf(fp, "        cmd_table: %s\n", XEN_HYPER_MODE() ?
Packit Service 501009
		"xen_hyper_command_table" : "linux_command_table");
Packit Service 501009
	fprintf(fp, "           curcmd: %s\n", pc->curcmd);
Packit Service 501009
	fprintf(fp, "          lastcmd: %s\n", pc->lastcmd);
Packit Service 501009
	fprintf(fp, "      cur_gdb_cmd: %d  %s\n", pc->cur_gdb_cmd,
Packit Service 501009
		gdb_command_string(pc->cur_gdb_cmd, buf, FALSE));
Packit Service 501009
	fprintf(fp, "     last_gdb_cmd: %d  %s\n", pc->last_gdb_cmd,
Packit Service 501009
		gdb_command_string(pc->last_gdb_cmd, buf, FALSE));
Packit Service 501009
	fprintf(fp, "          cur_req: %lx\n", (ulong)pc->cur_req);
Packit Service 501009
	fprintf(fp, "        cmdgencur: %ld\n", pc->cmdgencur); 
Packit Service 501009
	fprintf(fp, "     curcmd_flags: %lx (", pc->curcmd_flags);
Packit Service 501009
	others = 0;
Packit Service 501009
        if (pc->curcmd_flags & XEN_MACHINE_ADDR)
Packit Service 501009
		fprintf(fp, "%sXEN_MACHINE_ADDR", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & REPEAT)
Packit Service 501009
		fprintf(fp, "%sREPEAT", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & IDLE_TASK_SHOWN)
Packit Service 501009
		fprintf(fp, "%sIDLE_TASK_SHOWN", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & TASK_SPECIFIED)
Packit Service 501009
		fprintf(fp, "%sTASK_SPECIFIED", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & MEMTYPE_UVADDR)
Packit Service 501009
		fprintf(fp, "%sMEMTYPE_UVADDR", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & MEMTYPE_FILEADDR)
Packit Service 501009
		fprintf(fp, "%sMEMTYPE_FILEADDR", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & HEADER_PRINTED)
Packit Service 501009
		fprintf(fp, "%sHEADER_PRINTED", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & BAD_INSTRUCTION)
Packit Service 501009
		fprintf(fp, "%sBAD_INSTRUCTION", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & UD2A_INSTRUCTION)
Packit Service 501009
		fprintf(fp, "%sUD2A_INSTRUCTION", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & IRQ_IN_USE)
Packit Service 501009
		fprintf(fp, "%sIRQ_IN_USE", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & IGNORE_ERRORS)
Packit Service 501009
		fprintf(fp, "%sIGNORE_ERRORS", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & FROM_RCFILE)
Packit Service 501009
		fprintf(fp, "%sFROM_RCFILE", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & MEMTYPE_KVADDR)
Packit Service 501009
		fprintf(fp, "%sMEMTYPE_KVADDR", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & NO_MODIFY)
Packit Service 501009
		fprintf(fp, "%sNO_MODIFY", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & MOD_SECTIONS)
Packit Service 501009
		fprintf(fp, "%sMOD_SECTIONS", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & MOD_READNOW)
Packit Service 501009
		fprintf(fp, "%sMOD_READNOW", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & MM_STRUCT_FORCE)
Packit Service 501009
		fprintf(fp, "%sMM_STRUCT_FORCE", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & CPUMASK)
Packit Service 501009
		fprintf(fp, "%sCPUMASK", others ? "|" : "");
Packit Service 501009
        if (pc->curcmd_flags & PARTIAL_READ_OK)
Packit Service 501009
		fprintf(fp, "%sPARTIAL_READ_OK", others ? "|" : "");
Packit Service 501009
	fprintf(fp, ")\n");
Packit Service 501009
	fprintf(fp, "   curcmd_private: %llx\n", pc->curcmd_private); 
Packit Service 501009
	fprintf(fp, "      cmd_cleanup: %lx\n", (ulong)pc->cmd_cleanup);
Packit Service 501009
	fprintf(fp, "  cmd_cleanup_arg: %lx\n", (ulong)pc->cmd_cleanup_arg);
Packit Service 501009
	fprintf(fp, "       sigint_cnt: %d\n", pc->sigint_cnt);
Packit Service 501009
	fprintf(fp, "        sigaction: %lx\n", (ulong)&pc->sigaction);
Packit Service 501009
	fprintf(fp, "    gdb_sigaction: %lx\n", (ulong)&pc->gdb_sigaction);
Packit Service 501009
	fprintf(fp, "    main_loop_env: %lx\n", (ulong)&pc->main_loop_env);
Packit Service 501009
	fprintf(fp, " foreach_loop_env: %lx\n", (ulong)&pc->foreach_loop_env);
Packit Service 501009
	fprintf(fp, "gdb_interface_env: %lx\n", (ulong)&pc->gdb_interface_env);
Packit Service 501009
	fprintf(fp, "     termios_orig: %lx\n", (ulong)&pc->termios_orig);
Packit Service 501009
	fprintf(fp, "      termios_raw: %lx\n", (ulong)&pc->termios_raw);
Packit Service 501009
	fprintf(fp, "            ncmds: %d\n", pc->ncmds);
Packit Service 501009
	fprintf(fp, "          cmdlist: %lx\n", (ulong)pc->cmdlist);
Packit Service 501009
	fprintf(fp, "        cmdlistsz: %d\n", pc->cmdlistsz);
Packit Service 501009
	fprintf(fp, "     output_radix: %d (%s)\n", pc->output_radix,
Packit Service 501009
		pc->output_radix == 16 ? 
Packit Service 501009
		"hex" : ((pc->output_radix == 10) ? "decimal" : "???"));
Packit Service 501009
Packit Service 501009
	fprintf(fp, "           server: %s\n", pc->server);
Packit Service 501009
	fprintf(fp, "       server_pid: %ld\n", pc->server_pid);
Packit Service 501009
	fprintf(fp, "             port: %d\n", pc->port);
Packit Service 501009
	fprintf(fp, "           sockfd: %d\n", pc->sockfd);
Packit Service 501009
	fprintf(fp, "    server_memsrc: %s\n", pc->server_memsrc);
Packit Service 501009
	fprintf(fp, "  server_namelist: %s\n", pc->server_namelist);
Packit Service 501009
	fprintf(fp, "             rmfd: %d\n", pc->rmfd);
Packit Service 501009
	fprintf(fp, "             rkfd: %d\n", pc->rkfd);
Packit Service 501009
	fprintf(fp, "       rcvbufsize: %ld\n", pc->rcvbufsize);
Packit Service 501009
Packit Service 501009
	fprintf(fp, "          readmem: ");
Packit Service 501009
	if ((p1 = readmem_function_name()))
Packit Service 501009
		fprintf(fp, "%s()\n", p1);
Packit Service 501009
	else
Packit Service 501009
		fprintf(fp, "%lx\n", (ulong)pc->readmem);
Packit Service 501009
Packit Service 501009
	fprintf(fp, "         writemem: ");
Packit Service 501009
	if ((p1 = writemem_function_name()))
Packit Service 501009
		fprintf(fp, "%s()\n", p1);
Packit Service 501009
	else
Packit Service 501009
		fprintf(fp, "%lx\n", (ulong)pc->writemem);
Packit Service 501009
Packit Service 501009
	fprintf(fp, "  dumpfile memory: %d\n", 
Packit Service 501009
		dumpfile_memory(DUMPFILE_MEM_USED)); 
Packit Service 501009
	fprintf(fp, "           curext: %lx\n", (ulong)pc->curext); 
Packit Service 501009
	fprintf(fp, "             sbrk: %lx\n", (ulong)pc->sbrk); 
Packit Service 501009
	fprintf(fp, "          cleanup: %s\n", pc->cleanup);
Packit Service 501009
	fprintf(fp, "            scope: %lx %s\n", pc->scope,
Packit Service 501009
		pc->scope ? "" : "(not set)");
Packit Service 501009
	fprintf(fp, "   nr_hash_queues: %ld\n", pc->nr_hash_queues);
Packit Service 501009
	fprintf(fp, "  read_vmcoreinfo: %lx\n", (ulong)pc->read_vmcoreinfo);
Packit Service 501009
	fprintf(fp, "         error_fp: %lx\n", (ulong)pc->error_fp);
Packit Service 501009
	fprintf(fp, "       error_path: %s\n", pc->error_path);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
char *
Packit Service 501009
readmem_function_name(void)
Packit Service 501009
{
Packit Service 501009
	if (pc->readmem == read_dev_mem)
Packit Service 501009
		return("read_dev_mem");
Packit Service 501009
	else if (pc->readmem == read_mclx_dumpfile)
Packit Service 501009
		return("read_mclx_dumpfile");
Packit Service 501009
	else if (pc->readmem == read_lkcd_dumpfile)
Packit Service 501009
		return("read_lkcd_dumpfile");
Packit Service 501009
	else if (pc->readmem == read_daemon)
Packit Service 501009
		return("read_daemon");
Packit Service 501009
	else if (pc->readmem == read_netdump)
Packit Service 501009
		return("read_netdump");
Packit Service 501009
	else if (pc->readmem == read_xendump)
Packit Service 501009
		return("read_xendump");
Packit Service 501009
	else if (pc->readmem == read_kdump)
Packit Service 501009
		return("read_kdump");
Packit Service 501009
	else if (pc->readmem == read_memory_device)
Packit Service 501009
		return("read_memory_device");
Packit Service 501009
	else if (pc->readmem == read_xendump_hyper)
Packit Service 501009
		return("read_xendump_hyper");
Packit Service 501009
	else if (pc->readmem == read_diskdump)
Packit Service 501009
		return("read_diskdump");
Packit Service 501009
	else if (pc->readmem == read_proc_kcore)
Packit Service 501009
		return("read_proc_kcore");
Packit Service 501009
	else if (pc->readmem == read_sadump)
Packit Service 501009
		return("read_sadump");
Packit Service 501009
	else if (pc->readmem == read_s390_dumpfile)
Packit Service 501009
		return("read_s390_dumpfile");
Packit Service 501009
	else if (pc->readmem == read_ramdump)
Packit Service 501009
		return("read_ramdump");
Packit Service 501009
	else if (pc->readmem == read_vmware_vmss)
Packit Service 501009
		return("read_vmware_vmss");
Packit Service 501009
	else
Packit Service 501009
		return NULL;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
char *
Packit Service 501009
writemem_function_name(void)
Packit Service 501009
{
Packit Service 501009
	if (pc->writemem == write_dev_mem)
Packit Service 501009
		return("write_dev_mem");
Packit Service 501009
	else if (pc->writemem == write_mclx_dumpfile)
Packit Service 501009
		return("write_mclx_dumpfile");
Packit Service 501009
	else if (pc->writemem == write_lkcd_dumpfile)
Packit Service 501009
		return("write_lkcd_dumpfile");
Packit Service 501009
	else if (pc->writemem == write_daemon)
Packit Service 501009
		return("write_daemon");
Packit Service 501009
	else if (pc->writemem == write_netdump)
Packit Service 501009
		return("write_netdump");
Packit Service 501009
	else if (pc->writemem == write_xendump)
Packit Service 501009
		return("write_xendump");
Packit Service 501009
	else if (pc->writemem == write_kdump)
Packit Service 501009
		return("write_kdump");
Packit Service 501009
	else if (pc->writemem == write_memory_device)
Packit Service 501009
		return("write_memory_device");
Packit Service 501009
//	else if (pc->writemem == write_xendump_hyper)
Packit Service 501009
//		return("write_xendump_hyper");
Packit Service 501009
	else if (pc->writemem == write_diskdump)
Packit Service 501009
		return("write_diskdump");
Packit Service 501009
	else if (pc->writemem == write_proc_kcore)
Packit Service 501009
		return("write_proc_kcore");
Packit Service 501009
	else if (pc->writemem == write_sadump)
Packit Service 501009
		return("write_sadump");
Packit Service 501009
	else if (pc->writemem == write_s390_dumpfile)
Packit Service 501009
		return("write_s390_dumpfile");
Packit Service 501009
	else if (pc->writemem == write_vmware_vmss)
Packit Service 501009
		return("write_vmware_vmss");
Packit Service 501009
	else
Packit Service 501009
		return NULL;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  "help -B" output
Packit Service 501009
 */
Packit Service 501009
void
Packit Service 501009
dump_build_data(void)
Packit Service 501009
{
Packit Service 501009
        fprintf(fp, "   build_command: %s\n", build_command);
Packit Service 501009
        fprintf(fp, "      build_data: %s\n", build_data);
Packit Service 501009
        fprintf(fp, "    build_target: %s\n", build_target);
Packit Service 501009
        fprintf(fp, "   build_version: %s\n", build_version);
Packit Service 501009
        fprintf(fp, "compiler version: %s\n", compiler_version);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Perform any cleanup activity here.
Packit Service 501009
 */
Packit Service 501009
int 
Packit Service 501009
clean_exit(int status)
Packit Service 501009
{
Packit Service 501009
	if (pc->flags & MEMMOD)
Packit Service 501009
		cleanup_memory_driver();
Packit Service 501009
Packit Service 501009
	if ((pc->namelist_orig) && file_exists(pc->namelist, NULL))
Packit Service 501009
		unlink(pc->namelist);
Packit Service 501009
	if ((pc->namelist_debug_orig) && file_exists(pc->namelist_debug, NULL))
Packit Service 501009
		unlink(pc->namelist_debug);
Packit Service 501009
	if (pc->cleanup && file_exists(pc->cleanup, NULL))
Packit Service 501009
		unlink(pc->cleanup);
Packit Service 501009
Packit Service 501009
	ramdump_cleanup();
Packit Service 501009
	exit(status);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Check whether this session is for xen hypervisor analysis.
Packit Service 501009
 */
Packit Service 501009
static void
Packit Service 501009
check_xen_hyper(void)
Packit Service 501009
{
Packit Service 501009
	if (!pc->namelist)
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
	if (!XEN_HYPER_MODE()) {
Packit Service 501009
		if (STRNEQ(basename(pc->namelist), "xen-syms"))
Packit Service 501009
			pc->flags |= XEN_HYPER;
Packit Service 501009
		else
Packit Service 501009
			return;
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
#ifdef XEN_HYPERVISOR_ARCH
Packit Service 501009
	pc->cmd_table = xen_hyper_command_table;
Packit Service 501009
	if (pc->flags & XENDUMP)
Packit Service 501009
		pc->readmem = read_xendump_hyper;
Packit Service 501009
#else
Packit Service 501009
	error(FATAL, XEN_HYPERVISOR_NOT_SUPPORTED);
Packit Service 501009
#endif
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Reject untrusted .crashrc, $HOME/.crashrc, 
Packit Service 501009
 *  .gdbinit, and $HOME/.gdbinit files.
Packit Service 501009
 */
Packit Service 501009
static char *untrusted_file_list[4] = { 0 };
Packit Service 501009
Packit Service 501009
int
Packit Service 501009
untrusted_file(FILE *filep, char *filename)
Packit Service 501009
{
Packit Service 501009
	struct stat sbuf;
Packit Service 501009
	int i;
Packit Service 501009
Packit Service 501009
	if (filep && (fstat(fileno(filep), &sbuf) == 0) &&
Packit Service 501009
	    (sbuf.st_uid == getuid()) && !(sbuf.st_mode & S_IWOTH))
Packit Service 501009
		return FALSE;
Packit Service 501009
	
Packit Service 501009
	for (i = 0; i < 4; i++) {
Packit Service 501009
		if (!untrusted_file_list[i]) {
Packit Service 501009
			untrusted_file_list[i] = strdup(filename);
Packit Service 501009
			break;
Packit Service 501009
		}
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	return TRUE;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
static void
Packit Service 501009
show_untrusted_files(void)
Packit Service 501009
{
Packit Service 501009
	int i, cnt;
Packit Service 501009
Packit Service 501009
	for (i = cnt = 0; i < 4; i++) {
Packit Service 501009
		if (untrusted_file_list[i]) {
Packit Service 501009
			error(WARNING, "not using untrusted file: \"%s\"\n", 
Packit Service 501009
				untrusted_file_list[i]);
Packit Service 501009
			free(untrusted_file_list[i]);
Packit Service 501009
			cnt++;
Packit Service 501009
		}
Packit Service 501009
	}
Packit Service 501009
	if (cnt)
Packit Service 501009
		fprintf(fp, "\n");
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  If GET_OSRELEASE is still set, the OS release has been
Packit Service 501009
 *  found and displayed.
Packit Service 501009
 */
Packit Service 501009
static void
Packit Service 501009
get_osrelease(char *dumpfile)
Packit Service 501009
{
Packit Service 501009
	int retval = 1;
Packit Service 501009
Packit Service 501009
	if (is_flattened_format(dumpfile)) {
Packit Service 501009
		if (pc->flags2 & GET_OSRELEASE)
Packit Service 501009
			retval = 0;
Packit Service 501009
	} else if (is_diskdump(dumpfile)) {
Packit Service 501009
		if (pc->flags2 & GET_OSRELEASE)
Packit Service 501009
			retval = 0;
Packit Service 501009
	} else if (is_kdump(dumpfile, KDUMP_LOCAL)) {
Packit Service 501009
		if (pc->flags2 & GET_OSRELEASE)
Packit Service 501009
			retval = 0;
Packit Service 501009
	}
Packit Service 501009
	
Packit Service 501009
	if (retval)
Packit Service 501009
		fprintf(fp, "unknown\n");
Packit Service 501009
Packit Service 501009
	clean_exit(retval);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
static void
Packit Service 501009
get_log(char *dumpfile)
Packit Service 501009
{
Packit Service 501009
Packit Service 501009
	int retval = 1;
Packit Service 501009
Packit Service 501009
	if (is_flattened_format(dumpfile))
Packit Service 501009
		pc->flags2 |= FLAT;
Packit Service 501009
	
Packit Service 501009
	if (is_diskdump(dumpfile)) {
Packit Service 501009
		if (pc->flags2 & GET_LOG)
Packit Service 501009
			retval = 0;
Packit Service 501009
	} else if (is_kdump(dumpfile, KDUMP_LOCAL)) {
Packit Service 501009
		if (pc->flags2 & GET_LOG)
Packit Service 501009
			retval = 0;
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	if (retval)
Packit Service 501009
		fprintf(fp, "%s: no VMCOREINFO data\n", dumpfile);
Packit Service 501009
Packit Service 501009
	clean_exit(retval);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
Packit Service 501009
char *
Packit Service 501009
no_vmcoreinfo(const char *unused)
Packit Service 501009
{
Packit Service 501009
	return NULL;
Packit Service 501009
}