crash/global_data.c

141 lines
5.7 KiB
C

/* global_data.c - core analysis suite
*
* Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
* Copyright (C) 2002-2006, 2010, 2012-2013, 2018 David Anderson
* Copyright (C) 2002-2006, 2010, 2012-2013, 2018 Red Hat, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "defs.h"
/*
* Data output FILE pointer. The contents of fp are changed on the fly
* depending upon whether the output is going to stdout, redirected to a
* user-designated pipe or file, or to the "standard" scrolling pipe.
* Regardless of where it ends up, fprintf(fp, ...) is used throughout
* instead of printf().
*/
FILE *fp;
/*
* The state of the program is kept in the program_context structure.
* Given that it's consulted so often, "pc" is globally available to
* quickly access the structure contents.
*/
struct program_context program_context = { 0 };
struct program_context *pc = &program_context;
/*
* The same thing goes for accesses to the frequently-accessed task_table,
* kernel_table, vm_table, symbol_table_data and machdep_table, making the
* "tt", "kt", "vt", "st" and "machdep" pointers globally available.
*/
struct task_table task_table = { 0 };
struct task_table *tt = &task_table;
struct kernel_table kernel_table = { 0 };
struct kernel_table *kt = &kernel_table;
struct vm_table vm_table = { 0 };
struct vm_table *vt = &vm_table;
struct symbol_table_data symbol_table_data = { 0 };
struct symbol_table_data *st = &symbol_table_data;
struct machdep_table machdep_table = { 0 };
struct machdep_table *machdep = &machdep_table;
/*
* Command functions are entered with the args[] array and argcnt value
* pre-set for issuance to getopt().
*/
char *args[MAXARGS]; /* argument array */
int argcnt; /* argument count */
int argerrs; /* argument error counter */
/*
* To add a new command, declare it in defs.h and enter it in this table.
*/
struct command_table_entry linux_command_table[] = {
{"*", cmd_pointer, help_pointer, 0},
{"alias", cmd_alias, help_alias, 0},
{"ascii", cmd_ascii, help_ascii, 0},
{"bpf", cmd_bpf, help_bpf, 0},
{"bt", cmd_bt, help_bt, REFRESH_TASK_TABLE},
{"btop", cmd_btop, help_btop, 0},
{"dev", cmd_dev, help_dev, 0},
{"dis", cmd_dis, help_dis, MINIMAL},
{"eval", cmd_eval, help_eval, MINIMAL},
{"exit", cmd_quit, help_exit, MINIMAL},
{"extend", cmd_extend, help_extend, MINIMAL},
{"files", cmd_files, help_files, REFRESH_TASK_TABLE},
{"foreach", cmd_foreach, help_foreach, REFRESH_TASK_TABLE},
{"fuser", cmd_fuser, help_fuser, REFRESH_TASK_TABLE},
{"gdb", cmd_gdb, help_gdb, REFRESH_TASK_TABLE},
{"help", cmd_help, help_help, MINIMAL},
{"ipcs", cmd_ipcs, help_ipcs, REFRESH_TASK_TABLE},
{"irq", cmd_irq, help_irq, 0},
{"kmem", cmd_kmem, help_kmem, 0},
{"list", cmd_list, help__list, REFRESH_TASK_TABLE},
{"log", cmd_log, help_log, MINIMAL},
{"mach", cmd_mach, help_mach, 0},
{"map", cmd_map, help_map, HIDDEN_COMMAND},
{"mod", cmd_mod, help_mod, 0},
{"mount", cmd_mount, help_mount, REFRESH_TASK_TABLE},
{"net", cmd_net, help_net, REFRESH_TASK_TABLE},
{"p", cmd_p, help_p, 0},
{"ps", cmd_ps, help_ps, REFRESH_TASK_TABLE},
{"pte", cmd_pte, help_pte, 0},
{"ptob", cmd_ptob, help_ptob, 0},
{"ptov", cmd_ptov, help_ptov, 0},
{"q", cmd_quit, help_quit, MINIMAL},
{"tree", cmd_tree, help_tree, REFRESH_TASK_TABLE},
{"rd", cmd_rd, help_rd, MINIMAL},
{"repeat", cmd_repeat, help_repeat, 0},
{"runq", cmd_runq, help_runq, REFRESH_TASK_TABLE},
{"sbitmapq", cmd_sbitmapq, help_sbitmapq, 0},
{"search", cmd_search, help_search, 0},
{"set", cmd_set, help_set, REFRESH_TASK_TABLE | MINIMAL},
{"sig", cmd_sig, help_sig, REFRESH_TASK_TABLE},
{"struct", cmd_struct, help_struct, 0},
{"swap", cmd_swap, help_swap, 0},
{"sym", cmd_sym, help_sym, MINIMAL},
{"sys", cmd_sys, help_sys, REFRESH_TASK_TABLE},
{"task", cmd_task, help_task, REFRESH_TASK_TABLE},
{"test", cmd_test, NULL, HIDDEN_COMMAND},
{"timer", cmd_timer, help_timer, 0},
{"union", cmd_union, help_union, 0},
{"vm", cmd_vm, help_vm, REFRESH_TASK_TABLE},
{"vtop", cmd_vtop, help_vtop, REFRESH_TASK_TABLE},
{"waitq", cmd_waitq, help_waitq, REFRESH_TASK_TABLE},
{"whatis", cmd_whatis, help_whatis, 0},
{"wr", cmd_wr, help_wr, 0},
#if defined(S390) || defined(S390X)
{"s390dbf", cmd_s390dbf, help_s390dbf, 0},
#endif
{(char *)NULL}
};
struct extension_table *extension_table = NULL;
/*
* The offset_table and size_table structure contents are referenced
* through several OFFSET- and SIZE-related macros. The array_table
* is a shortcut used by get_array_length().
*/
struct offset_table offset_table = { 0 };
struct size_table size_table = { 0 };
struct array_table array_table = { 0 };