Unified binfile interface.
This commit is contained in:
parent
fab96c725d
commit
d9e42457f5
2
Makefile
2
Makefile
|
@ -43,7 +43,7 @@ install: mspdebug mspdebug.man
|
|||
|
||||
mspdebug: main.o fet.o rf2500.o dis.o uif.o ihex.o elf32.o stab.o util.o \
|
||||
bsl.o sim.o symmap.o gdb.o btree.o device.o rtools.o sym.o devcmd.o \
|
||||
cproc.o vector.o cproc_util.o expr.o fet_error.o
|
||||
cproc.o vector.o cproc_util.o expr.o fet_error.o binfile.o
|
||||
$(CC) $(LDFLAGS) -o $@ $^ -lusb $(READLINE_LIBS)
|
||||
|
||||
.c.o:
|
||||
|
|
|
@ -0,0 +1,108 @@
|
|||
/* MSPDebug - debugging tool for MSP430 MCUs
|
||||
* Copyright (C) 2009, 2010 Daniel Beer
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "util.h"
|
||||
#include "binfile.h"
|
||||
#include "ihex.h"
|
||||
#include "elf32.h"
|
||||
#include "symmap.h"
|
||||
|
||||
struct file_format {
|
||||
int (*check)(FILE *in);
|
||||
int (*extract)(FILE *in, binfile_imgcb_t cb, void *user_data);
|
||||
int (*syms)(FILE *in, stab_t stab);
|
||||
};
|
||||
|
||||
static const struct file_format formats[] = {
|
||||
{
|
||||
.check = elf32_check,
|
||||
.extract = elf32_extract,
|
||||
.syms = elf32_syms
|
||||
},
|
||||
{
|
||||
.check = ihex_check,
|
||||
.extract = ihex_extract
|
||||
},
|
||||
{
|
||||
.check = symmap_check,
|
||||
.syms = symmap_syms
|
||||
}
|
||||
};
|
||||
|
||||
static const struct file_format *identify(FILE *in)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_LEN(formats); i++) {
|
||||
const struct file_format *f = &formats[i];
|
||||
|
||||
if (f->check(in) > 0)
|
||||
return f;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int binfile_info(FILE *in)
|
||||
{
|
||||
const struct file_format *fmt = identify(in);
|
||||
int flags = 0;
|
||||
|
||||
if (fmt) {
|
||||
if (fmt->extract)
|
||||
flags |= BINFILE_HAS_TEXT;
|
||||
if (fmt->syms)
|
||||
flags |= BINFILE_HAS_SYMS;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
int binfile_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
||||
{
|
||||
const struct file_format *fmt = identify(in);
|
||||
|
||||
if (!fmt) {
|
||||
fprintf(stderr, "binfile: unknown file format\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!fmt->extract) {
|
||||
fprintf(stderr, "binfile: this format contains no code\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fmt->extract(in, cb, user_data);
|
||||
}
|
||||
|
||||
int binfile_syms(FILE *in, stab_t stab)
|
||||
{
|
||||
const struct file_format *fmt = identify(in);
|
||||
|
||||
if (!fmt) {
|
||||
fprintf(stderr, "binfile: unknown file format\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!fmt->syms) {
|
||||
fprintf(stderr, "binfile: this format contains no symbols\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fmt->syms(in, stab);
|
||||
}
|
34
binfile.h
34
binfile.h
|
@ -21,24 +21,32 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "stab.h"
|
||||
|
||||
/* Callback for binary image data */
|
||||
typedef int (*imgfunc_t)(void *user_data,
|
||||
uint16_t addr, const uint8_t *data, int len);
|
||||
typedef int (*binfile_imgcb_t)(void *user_data,
|
||||
uint16_t addr, const uint8_t *data, int len);
|
||||
|
||||
/* Intel HEX file support */
|
||||
int ihex_check(FILE *in);
|
||||
int ihex_extract(FILE *in, imgfunc_t cb, void *user_data);
|
||||
#define BINFILE_HAS_SYMS 0x01
|
||||
#define BINFILE_HAS_TEXT 0x02
|
||||
|
||||
/* ELF32 file support */
|
||||
int elf32_check(FILE *in);
|
||||
int elf32_extract(FILE *in, imgfunc_t cb, void *user_data);
|
||||
int elf32_syms(FILE *in, stab_t stab);
|
||||
/* Examine the given file and figure out what it contains. If the file
|
||||
* type is unknown, 0 is returned. If an IO error occurs, -1 is
|
||||
* returned. Otherwise, the return value is a positive integer
|
||||
* bitmask.
|
||||
*/
|
||||
int binfile_info(FILE *in);
|
||||
|
||||
/* *.map file support */
|
||||
int symmap_check(FILE *in);
|
||||
int symmap_syms(FILE *in, stab_t stab);
|
||||
/* If possible, extract the text from this file, feeding it in chunks
|
||||
* of an indeterminate size to the callback given.
|
||||
*
|
||||
* Returns 0 if successful, -1 if an error occurs.
|
||||
*/
|
||||
int binfile_extract(FILE *in, binfile_imgcb_t cb, void *user_data);
|
||||
|
||||
/* Attempt to load symbols from the file and store them in the given
|
||||
* symbol table. Returns 0 on success or -1 if an error occurs.
|
||||
*/
|
||||
int binfile_syms(FILE *in, stab_t stab);
|
||||
|
||||
#endif
|
||||
|
|
17
devcmd.c
17
devcmd.c
|
@ -533,7 +533,6 @@ static int cmd_prog(cproc_t cp, char **arg)
|
|||
device_t dev = cproc_device(cp);
|
||||
stab_t stab = cproc_stab(cp);
|
||||
FILE *in;
|
||||
int result = 0;
|
||||
struct prog_data prog;
|
||||
|
||||
if (cproc_prompt_abort(cp, CPROC_MODIFY_SYMS))
|
||||
|
@ -552,14 +551,14 @@ static int cmd_prog(cproc_t cp, char **arg)
|
|||
|
||||
prog_init(&prog, dev);
|
||||
|
||||
if (elf32_check(in)) {
|
||||
result = elf32_extract(in, prog_feed, &prog);
|
||||
if (binfile_extract(in, prog_feed, &prog) < 0) {
|
||||
fclose(in);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (binfile_info(in) & BINFILE_HAS_SYMS) {
|
||||
stab_clear(stab);
|
||||
elf32_syms(in, stab);
|
||||
} else if (ihex_check(in)) {
|
||||
result = ihex_extract(in, prog_feed, &prog);
|
||||
} else {
|
||||
fprintf(stderr, "prog: %s: unknown file type\n", *arg);
|
||||
binfile_syms(in, stab);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
|
@ -573,7 +572,7 @@ static int cmd_prog(cproc_t cp, char **arg)
|
|||
}
|
||||
|
||||
cproc_unmodify(cp, CPROC_MODIFY_SYMS);
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct cproc_command commands[] = {
|
||||
|
|
6
elf32.c
6
elf32.c
|
@ -24,7 +24,7 @@
|
|||
#else
|
||||
#include <elf.h>
|
||||
#endif
|
||||
#include "binfile.h"
|
||||
#include "elf32.h"
|
||||
|
||||
#ifndef EM_MSP430
|
||||
#define EM_MSP430 0x69
|
||||
|
@ -136,7 +136,7 @@ static uint32_t file_to_phys(struct elf32_info *info, uint32_t v)
|
|||
}
|
||||
|
||||
static int feed_section(struct elf32_info *info,
|
||||
FILE *in, int offset, int size, imgfunc_t cb,
|
||||
FILE *in, int offset, int size, binfile_imgcb_t cb,
|
||||
void *user_data)
|
||||
{
|
||||
uint8_t buf[1024];
|
||||
|
@ -186,7 +186,7 @@ static int read_all(struct elf32_info *info, FILE *in)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int elf32_extract(FILE *in, imgfunc_t cb, void *user_data)
|
||||
int elf32_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
||||
{
|
||||
struct elf32_info info;
|
||||
int i;
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
/* MSPDebug - debugging tool for the eZ430
|
||||
* Copyright (C) 2009, 2010 Daniel Beer
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef ELF32_H_
|
||||
#define ELF32_H_
|
||||
|
||||
#include "binfile.h"
|
||||
|
||||
int elf32_check(FILE *in);
|
||||
int elf32_extract(FILE *in, binfile_imgcb_t cb, void *user_data);
|
||||
int elf32_syms(FILE *in, stab_t stab);
|
||||
|
||||
#endif
|
6
ihex.c
6
ihex.c
|
@ -19,7 +19,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "binfile.h"
|
||||
#include "ihex.h"
|
||||
|
||||
int ihex_check(FILE *in)
|
||||
{
|
||||
|
@ -27,7 +27,7 @@ int ihex_check(FILE *in)
|
|||
return fgetc(in) == ':';
|
||||
}
|
||||
|
||||
static int feed_line(FILE *in, uint8_t *data, int nbytes, imgfunc_t cb,
|
||||
static int feed_line(FILE *in, uint8_t *data, int nbytes, binfile_imgcb_t cb,
|
||||
void *user_data)
|
||||
{
|
||||
uint8_t cksum = 0;
|
||||
|
@ -52,7 +52,7 @@ static int feed_line(FILE *in, uint8_t *data, int nbytes, imgfunc_t cb,
|
|||
data + 4, nbytes - 5);
|
||||
}
|
||||
|
||||
int ihex_extract(FILE *in, imgfunc_t cb, void *user_data)
|
||||
int ihex_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
||||
{
|
||||
char buf[128];
|
||||
int lno = 0;
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
/* MSPDebug - debugging tool for the eZ430
|
||||
* Copyright (C) 2009, 2010 Daniel Beer
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef IHEX_H_
|
||||
#define IHEX_H_
|
||||
|
||||
#include "binfile.h"
|
||||
|
||||
int ihex_check(FILE *in);
|
||||
int ihex_extract(FILE *in, binfile_imgcb_t cb, void *user_data);
|
||||
|
||||
#endif
|
25
sym.c
25
sym.c
|
@ -57,7 +57,6 @@ static int cmd_sym_load_add(cproc_t cp, int clear, char **arg)
|
|||
{
|
||||
stab_t stab = cproc_stab(cp);
|
||||
FILE *in;
|
||||
int result = 0;
|
||||
|
||||
if (clear && cproc_prompt_abort(cp, CPROC_MODIFY_SYMS))
|
||||
return 0;
|
||||
|
@ -68,24 +67,20 @@ static int cmd_sym_load_add(cproc_t cp, int clear, char **arg)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (clear)
|
||||
if (clear) {
|
||||
stab_clear(stab);
|
||||
cproc_unmodify(cp, CPROC_MODIFY_SYMS);
|
||||
} else {
|
||||
cproc_modify(cp, CPROC_MODIFY_SYMS);
|
||||
}
|
||||
|
||||
if (elf32_check(in))
|
||||
result = elf32_syms(in, stab);
|
||||
else if (symmap_check(in))
|
||||
result = symmap_syms(in, stab);
|
||||
else
|
||||
fprintf(stderr, "sym: %s: unknown file type\n", *arg);
|
||||
if (binfile_syms(in, stab) < 0) {
|
||||
fclose(in);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
|
||||
if (clear)
|
||||
cproc_unmodify(cp, CPROC_MODIFY_SYMS);
|
||||
else
|
||||
cproc_modify(cp, CPROC_MODIFY_SYMS);
|
||||
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int savemap_cb(void *user_data, const char *name, uint16_t value)
|
||||
|
|
2
symmap.c
2
symmap.c
|
@ -19,7 +19,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "binfile.h"
|
||||
#include "symmap.h"
|
||||
|
||||
int symmap_check(FILE *in)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
/* MSPDebug - debugging tool for the eZ430
|
||||
* Copyright (C) 2009, 2010 Daniel Beer
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef SYMMAP_H_
|
||||
#define SYMMAP_H_
|
||||
|
||||
#include "binfile.h"
|
||||
|
||||
int symmap_check(FILE *in);
|
||||
int symmap_syms(FILE *in, stab_t stab);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue