|
Packit Service |
501009 |
/*
|
|
Packit Service |
501009 |
* ramdump.c - core analysis suite
|
|
Packit Service |
501009 |
*
|
|
Packit Service |
501009 |
* Copyright (c) 2014 Broadcom Corporation
|
|
Packit Service |
501009 |
* Oza Pawandeep <oza@broadcom.com>
|
|
Packit Service |
501009 |
* Vikram Prakash <vikramp@broadcom.com>
|
|
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 |
* Author: Oza Pawandeep <oza@broadcom.com>
|
|
Packit Service |
501009 |
*/
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
#define _LARGEFILE64_SOURCE 1 /* stat64() */
|
|
Packit Service |
501009 |
#include "defs.h"
|
|
Packit Service |
501009 |
#include <elf.h>
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
struct ramdump_def {
|
|
Packit Service |
501009 |
char *path;
|
|
Packit Service |
501009 |
int rfd;
|
|
Packit Service |
501009 |
ulonglong start_paddr;
|
|
Packit Service |
501009 |
ulonglong end_paddr;
|
|
Packit Service |
501009 |
};
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
static struct ramdump_def *ramdump;
|
|
Packit Service |
501009 |
static int nodes;
|
|
Packit Service |
501009 |
static char *user_elf = NULL;
|
|
Packit Service |
501009 |
static char elf_default[] = "/var/tmp/ramdump_elf_XXXXXX";
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
static void alloc_elf_header(Elf64_Ehdr *ehdr, ushort e_machine)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
memcpy(ehdr->e_ident, ELFMAG, SELFMAG);
|
|
Packit Service |
501009 |
ehdr->e_ident[EI_CLASS] = ELFCLASS64;
|
|
Packit Service |
501009 |
ehdr->e_ident[EI_DATA] = ELFDATA2LSB;
|
|
Packit Service |
501009 |
ehdr->e_ident[EI_VERSION] = EV_CURRENT;
|
|
Packit Service |
501009 |
ehdr->e_ident[EI_OSABI] = ELFOSABI_LINUX;
|
|
Packit Service |
501009 |
ehdr->e_ident[EI_ABIVERSION] = 0;
|
|
Packit Service |
501009 |
memset(ehdr->e_ident+EI_PAD, 0,
|
|
Packit Service |
501009 |
EI_NIDENT-EI_PAD);
|
|
Packit Service |
501009 |
ehdr->e_type = ET_CORE;
|
|
Packit Service |
501009 |
ehdr->e_machine = e_machine;
|
|
Packit Service |
501009 |
ehdr->e_version = EV_CURRENT;
|
|
Packit Service |
501009 |
ehdr->e_entry = 0;
|
|
Packit Service |
501009 |
ehdr->e_phoff = sizeof(Elf64_Ehdr);
|
|
Packit Service |
501009 |
ehdr->e_shoff = 0;
|
|
Packit Service |
501009 |
ehdr->e_flags = 0;
|
|
Packit Service |
501009 |
ehdr->e_ehsize = sizeof(Elf64_Ehdr);
|
|
Packit Service |
501009 |
ehdr->e_phentsize = sizeof(Elf64_Phdr);
|
|
Packit Service |
501009 |
ehdr->e_phnum = 1 + nodes;
|
|
Packit Service |
501009 |
ehdr->e_shentsize = 0;
|
|
Packit Service |
501009 |
ehdr->e_shnum = 0;
|
|
Packit Service |
501009 |
ehdr->e_shstrndx = 0;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
static void alloc_program_headers(Elf64_Phdr *phdr)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
unsigned int i;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
for (i = 0; i < nodes; i++) {
|
|
Packit Service |
501009 |
phdr[i].p_type = PT_LOAD;
|
|
Packit Service |
501009 |
phdr[i].p_filesz = ramdump[i].end_paddr + 1 - ramdump[i].start_paddr;
|
|
Packit Service |
501009 |
phdr[i].p_memsz = phdr[i].p_filesz;
|
|
Packit Service |
501009 |
phdr[i].p_vaddr = 0;
|
|
Packit Service |
501009 |
phdr[i].p_paddr = ramdump[i].start_paddr;
|
|
Packit Service |
501009 |
phdr[i].p_flags = PF_R | PF_W | PF_X;
|
|
Packit Service |
501009 |
phdr[i].p_align = 0;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
static char *write_elf(Elf64_Phdr *load, Elf64_Ehdr *e_head, size_t data_offset)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
#define CPY_BUF_SZ 4096
|
|
Packit Service |
501009 |
int fd1, fd2, i, err = 1;
|
|
Packit Service |
501009 |
char *buf;
|
|
Packit Service |
501009 |
char *out_elf;
|
|
Packit Service |
501009 |
size_t offset;
|
|
Packit Service |
501009 |
ssize_t rd, len;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
buf = (char *)malloc(CPY_BUF_SZ);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
offset = data_offset;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (user_elf) {
|
|
Packit Service |
501009 |
fd2 = open(user_elf, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
|
|
Packit Service |
501009 |
if (fd2 < 0) {
|
|
Packit Service |
501009 |
error(INFO, "%s open error, %s\n",
|
|
Packit Service |
501009 |
user_elf, strerror(errno));
|
|
Packit Service |
501009 |
goto end1;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
out_elf = user_elf;
|
|
Packit Service |
501009 |
} else {
|
|
Packit Service |
501009 |
fd2 = mkstemp(elf_default);
|
|
Packit Service |
501009 |
if (fd2 < 0) {
|
|
Packit Service |
501009 |
error(INFO, "%s open error, %s\n",
|
|
Packit Service |
501009 |
elf_default, strerror(errno));
|
|
Packit Service |
501009 |
goto end1;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
out_elf = elf_default;
|
|
Packit Service |
501009 |
pc->flags2 |= RAMDUMP;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (user_elf) {
|
|
Packit Service |
501009 |
sprintf(buf, "creating ELF dumpfile: %s", out_elf);
|
|
Packit Service |
501009 |
please_wait(buf);
|
|
Packit Service |
501009 |
} else if (CRASHDEBUG(1))
|
|
Packit Service |
501009 |
fprintf(fp, "creating temporary ELF header: %s\n\n",
|
|
Packit Service |
501009 |
elf_default);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
while (offset > 0) {
|
|
Packit Service |
501009 |
len = write(fd2, e_head + (data_offset - offset), offset);
|
|
Packit Service |
501009 |
if (len < 0) {
|
|
Packit Service |
501009 |
error(INFO, "ramdump write error, %s\n",
|
|
Packit Service |
501009 |
strerror(errno));
|
|
Packit Service |
501009 |
goto end;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
offset -= len;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (user_elf) {
|
|
Packit Service |
501009 |
for (i = 0; i < nodes; i++) {
|
|
Packit Service |
501009 |
offset = load[i].p_offset;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
fd1 = open(ramdump[i].path, O_RDONLY, S_IRUSR);
|
|
Packit Service |
501009 |
if (fd1 < 0) {
|
|
Packit Service |
501009 |
error(INFO, "%s open error, %s\n",
|
|
Packit Service |
501009 |
ramdump[i].path, strerror(errno));
|
|
Packit Service |
501009 |
goto end;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
lseek(fd2, (off_t)offset, SEEK_SET);
|
|
Packit Service |
501009 |
while ((rd = read(fd1, buf, CPY_BUF_SZ)) > 0) {
|
|
Packit Service |
501009 |
if (write(fd2, buf, rd) != rd) {
|
|
Packit Service |
501009 |
error(INFO, "%s write error, %s\n",
|
|
Packit Service |
501009 |
ramdump[i].path,
|
|
Packit Service |
501009 |
strerror(errno));
|
|
Packit Service |
501009 |
close(fd1);
|
|
Packit Service |
501009 |
goto end;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
close(fd1);
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
please_wait_done();
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
err = 0;
|
|
Packit Service |
501009 |
end:
|
|
Packit Service |
501009 |
close(fd2);
|
|
Packit Service |
501009 |
end1:
|
|
Packit Service |
501009 |
free(buf);
|
|
Packit Service |
501009 |
return err ? NULL : out_elf;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
static void alloc_notes(Elf64_Phdr *notes)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
/* Nothing filled in as of now */
|
|
Packit Service |
501009 |
notes->p_type = PT_NOTE;
|
|
Packit Service |
501009 |
notes->p_offset = 0;
|
|
Packit Service |
501009 |
notes->p_vaddr = 0;
|
|
Packit Service |
501009 |
notes->p_paddr = 0;
|
|
Packit Service |
501009 |
notes->p_filesz = 0;
|
|
Packit Service |
501009 |
notes->p_memsz = 0;
|
|
Packit Service |
501009 |
notes->p_flags = 0;
|
|
Packit Service |
501009 |
notes->p_align = 0;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
char *ramdump_to_elf(void)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
int i;
|
|
Packit Service |
501009 |
char *ptr, *e_file = NULL;
|
|
Packit Service |
501009 |
ushort e_machine = 0;
|
|
Packit Service |
501009 |
size_t offset, data_offset;
|
|
Packit Service |
501009 |
size_t l_offset;
|
|
Packit Service |
501009 |
Elf64_Phdr *notes, *load;
|
|
Packit Service |
501009 |
Elf64_Ehdr *e_head;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (machine_type("ARM"))
|
|
Packit Service |
501009 |
e_machine = EM_ARM;
|
|
Packit Service |
501009 |
else if (machine_type("ARM64"))
|
|
Packit Service |
501009 |
e_machine = EM_AARCH64;
|
|
Packit Service |
501009 |
else if (machine_type("MIPS"))
|
|
Packit Service |
501009 |
e_machine = EM_MIPS;
|
|
Packit Service |
501009 |
else if (machine_type("X86_64"))
|
|
Packit Service |
501009 |
e_machine = EM_X86_64;
|
|
Packit Service |
501009 |
else
|
|
Packit Service |
501009 |
error(FATAL, "ramdump: unsupported machine type: %s\n",
|
|
Packit Service |
501009 |
MACHINE_TYPE);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
e_head = (Elf64_Ehdr *)malloc(sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) +
|
|
Packit Service |
501009 |
(nodes * sizeof(Elf64_Phdr)) + (CPY_BUF_SZ * 2));
|
|
Packit Service |
501009 |
ptr = (char *)e_head;
|
|
Packit Service |
501009 |
offset = 0;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
alloc_elf_header(e_head, e_machine);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
ptr += sizeof(Elf64_Ehdr);
|
|
Packit Service |
501009 |
offset += sizeof(Elf64_Ehdr);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
notes = (Elf64_Phdr *)ptr;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
alloc_notes(notes);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
offset += sizeof(Elf64_Phdr);
|
|
Packit Service |
501009 |
ptr += sizeof(Elf64_Phdr);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
load = (Elf64_Phdr *)ptr;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
alloc_program_headers(load);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
offset += sizeof(Elf64_Phdr) * nodes;
|
|
Packit Service |
501009 |
ptr += sizeof(Elf64_Phdr) * nodes;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
/* Empty note */
|
|
Packit Service |
501009 |
notes->p_offset = offset;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
l_offset = offset;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
data_offset = offset;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
for (i = 0; i < nodes; i++) {
|
|
Packit Service |
501009 |
load[i].p_offset = l_offset;
|
|
Packit Service |
501009 |
l_offset += load[i].p_filesz;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
e_file = write_elf(load, e_head, data_offset);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
free(e_head);
|
|
Packit Service |
501009 |
return e_file;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
#define PREFIX(ptr, pat) \
|
|
Packit Service |
501009 |
(strncmp((ptr), (pat), sizeof(pat)-1) ? 0 : \
|
|
Packit Service |
501009 |
((ptr) += sizeof(pat)-1, 1))
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
int is_ramdump(char *p)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
char *x = NULL, *y = NULL, *pat;
|
|
Packit Service |
501009 |
size_t len;
|
|
Packit Service |
501009 |
char *pattern;
|
|
Packit Service |
501009 |
struct stat64 st;
|
|
Packit Service |
501009 |
int is_live;
|
|
Packit Service |
501009 |
int err = 0;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
is_live = PREFIX(p, "live:");
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (nodes || !strchr(p, '@'))
|
|
Packit Service |
501009 |
return 0;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
len = strlen(p);
|
|
Packit Service |
501009 |
pattern = (char *)malloc(len + 1);
|
|
Packit Service |
501009 |
strlcpy(pattern, p, len + 1);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
pat = pattern;
|
|
Packit Service |
501009 |
while ((pat = strtok_r(pat, ",", &x))) {
|
|
Packit Service |
501009 |
if ((pat = strtok_r(pat, "@", &y))) {
|
|
Packit Service |
501009 |
nodes++;
|
|
Packit Service |
501009 |
ramdump = realloc(ramdump,
|
|
Packit Service |
501009 |
sizeof(struct ramdump_def) * nodes);
|
|
Packit Service |
501009 |
if (!ramdump)
|
|
Packit Service |
501009 |
error(FATAL, "realloc failure\n");
|
|
Packit Service |
501009 |
ramdump[nodes - 1].path = pat;
|
|
Packit Service |
501009 |
pat = strtok_r(NULL, "@", &y);
|
|
Packit Service |
501009 |
ramdump[nodes - 1].start_paddr =
|
|
Packit Service |
501009 |
htoll(pat, RETURN_ON_ERROR, &err;;
|
|
Packit Service |
501009 |
if (err == TRUE)
|
|
Packit Service |
501009 |
error(FATAL, "Invalid ramdump address\n");
|
|
Packit Service |
501009 |
if ((ramdump[nodes - 1].rfd =
|
|
Packit Service |
501009 |
open(ramdump[nodes - 1].path, O_RDONLY)) < 0)
|
|
Packit Service |
501009 |
error(FATAL,
|
|
Packit Service |
501009 |
"ramdump %s open failed:%s\n",
|
|
Packit Service |
501009 |
ramdump[nodes - 1].path,
|
|
Packit Service |
501009 |
strerror(errno));
|
|
Packit Service |
501009 |
if (fstat64(ramdump[nodes - 1].rfd, &st) < 0)
|
|
Packit Service |
501009 |
error(FATAL, "ramdump stat failed\n");
|
|
Packit Service |
501009 |
ramdump[nodes - 1].end_paddr =
|
|
Packit Service |
501009 |
ramdump[nodes - 1].start_paddr + st.st_size - 1;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
pat = NULL;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (nodes && is_live) {
|
|
Packit Service |
501009 |
pc->flags |= LIVE_SYSTEM;
|
|
Packit Service |
501009 |
pc->dumpfile = ramdump[0].path;
|
|
Packit Service |
501009 |
pc->live_memsrc = pc->dumpfile;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
return nodes;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
void ramdump_elf_output_file(char *opt)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
user_elf = opt;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
void ramdump_cleanup(void)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
if (!user_elf)
|
|
Packit Service |
501009 |
unlink(elf_default);
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
int
|
|
Packit Service |
501009 |
read_ramdump(int fd, void *bufptr, int cnt, ulong addr, physaddr_t paddr)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
off_t offset;
|
|
Packit Service |
501009 |
int i, found;
|
|
Packit Service |
501009 |
struct ramdump_def *r = &ramdump[0];
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
offset = 0;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
for (i = found = 0; i < nodes; i++) {
|
|
Packit Service |
501009 |
r = &ramdump[i];
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if ((paddr >= r->start_paddr) &&
|
|
Packit Service |
501009 |
(paddr <= r->end_paddr)) {
|
|
Packit Service |
501009 |
offset = (off_t)paddr - (off_t)r->start_paddr;
|
|
Packit Service |
501009 |
found++;
|
|
Packit Service |
501009 |
break;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (!found) {
|
|
Packit Service |
501009 |
if (CRASHDEBUG(8))
|
|
Packit Service |
501009 |
fprintf(fp, "read_ramdump: READ_ERROR: "
|
|
Packit Service |
501009 |
"offset not found for paddr: %llx\n",
|
|
Packit Service |
501009 |
(ulonglong)paddr);
|
|
Packit Service |
501009 |
return READ_ERROR;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (CRASHDEBUG(8))
|
|
Packit Service |
501009 |
fprintf(fp,
|
|
Packit Service |
501009 |
"read_ramdump: addr: %lx paddr: %llx cnt: %d offset: %llx\n",
|
|
Packit Service |
501009 |
addr, (ulonglong)paddr, cnt, (ulonglong)offset);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (lseek(r->rfd, offset, SEEK_SET) == -1) {
|
|
Packit Service |
501009 |
if (CRASHDEBUG(8))
|
|
Packit Service |
501009 |
fprintf(fp, "read_ramdump: SEEK_ERROR: "
|
|
Packit Service |
501009 |
"offset: %llx\n", (ulonglong)offset);
|
|
Packit Service |
501009 |
return SEEK_ERROR;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (read(r->rfd, bufptr, cnt) != cnt) {
|
|
Packit Service |
501009 |
if (CRASHDEBUG(8))
|
|
Packit Service |
501009 |
fprintf(fp, "read_ramdump: READ_ERROR: "
|
|
Packit Service |
501009 |
"offset: %llx\n", (ulonglong)offset);
|
|
Packit Service |
501009 |
return READ_ERROR;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
return cnt;
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
void
|
|
Packit Service |
501009 |
show_ramdump_files(void)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
int i;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
fprintf(fp, "%s [temporary ELF header]\n", elf_default);
|
|
Packit Service |
501009 |
for (i = 0; i < nodes; i++) {
|
|
Packit Service |
501009 |
fprintf(fp, "%s %s",
|
|
Packit Service |
501009 |
i ? "\n" : "", ramdump[i].path);
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
void
|
|
Packit Service |
501009 |
dump_ramdump_data()
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
int i;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
if (!user_elf && !is_ramdump_image())
|
|
Packit Service |
501009 |
return;
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
fprintf(fp, "\nramdump data:\n");
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
fprintf(fp, " user_elf: %s\n",
|
|
Packit Service |
501009 |
user_elf ? user_elf : "(unused)");
|
|
Packit Service |
501009 |
fprintf(fp, " elf_default: %s\n",
|
|
Packit Service |
501009 |
user_elf ? "(unused)" : elf_default);
|
|
Packit Service |
501009 |
fprintf(fp, " nodes: %d\n", nodes);
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
for (i = 0; i < nodes; i++) {
|
|
Packit Service |
501009 |
fprintf(fp, " ramdump[%d]:\n", i);
|
|
Packit Service |
501009 |
fprintf(fp, " path: %s\n",
|
|
Packit Service |
501009 |
ramdump[i].path);
|
|
Packit Service |
501009 |
fprintf(fp, " rfd: %d\n",
|
|
Packit Service |
501009 |
ramdump[i].rfd);
|
|
Packit Service |
501009 |
fprintf(fp, " start_paddr: %llx\n",
|
|
Packit Service |
501009 |
(ulonglong)ramdump[i].start_paddr);
|
|
Packit Service |
501009 |
fprintf(fp, " end_paddr: %llx\n",
|
|
Packit Service |
501009 |
(ulonglong)ramdump[i].end_paddr);
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
fprintf(fp, "\n");
|
|
Packit Service |
501009 |
}
|
|
Packit Service |
501009 |
|
|
Packit Service |
501009 |
int
|
|
Packit Service |
501009 |
is_ramdump_image(void)
|
|
Packit Service |
501009 |
{
|
|
Packit Service |
501009 |
return (pc->flags2 & RAMDUMP ? TRUE : FALSE);
|
|
Packit Service |
501009 |
}
|