176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- * 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2007-2008 H. Peter Anvin - All Rights Reserved 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2010 Intel Corporation; author: H. Peter Anvin 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or modify 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * it under the terms of the GNU General Public License as published by 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Boston MA 02111-1307, USA; either version 2 of the License, or 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (at your option) any later version; incorporated herein by reference. 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */ 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h> 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h> 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdbool.h> 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <inttypes.h> 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <dprintf.h> 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <console.h> 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <sys/cpu.h> 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <version.h> 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "sysdump.h" 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char program[] = "sysdump"; 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char version[] = "SYSDUMP " VERSION_STR " " DATE "\n"; 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__noreturn die(const char *msg) 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("%s: %s\n", program, msg); 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman exit(1); 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void dump_all(struct upload_backend *be, const char *argv[]) 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cpio_init(be, argv); 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cpio_writefile(be, "sysdump", version, sizeof version-1); 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dump_memory_map(be); 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dump_memory(be); 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dump_dmi(be); 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dump_acpi(be); 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dump_cpuid(be); 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dump_pci(be); 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dump_vesa_tables(be); 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cpio_close(be); 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman flush_data(be); 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic struct upload_backend *upload_backends[] = 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &upload_tftp, 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &upload_ymodem, 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &upload_srec, 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NULL 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__noreturn usage(void) 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct upload_backend **bep, *be; 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("Usage:\n"); 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (bep = upload_backends ; (be = *bep) ; bep++) 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" %s %s %s\n", program, be->name, be->helpmsg); 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman exit(1); 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint main(int argc, char *argv[]) 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct upload_backend **bep, *be; 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fputs(version, stdout); 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (argc < 2) 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman usage(); 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (bep = upload_backends ; (be = *bep) ; bep++) { 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!strcmp(be->name, argv[1])) 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!be || argc < be->minargs + 2) 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman usage(); 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Do this as early as possible */ 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman snapshot_lowmem(); 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("Backend: %s\n", be->name); 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Do the actual data dump */ 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dump_all(be, (const char **)argv + 2); 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 98