Binary file interface is now 32-bit clean.
This commit is contained in:
parent
5b2c75563d
commit
9ecf177655
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
/* Callback for binary image data */
|
/* Callback for binary image data */
|
||||||
typedef int (*binfile_imgcb_t)(void *user_data,
|
typedef int (*binfile_imgcb_t)(void *user_data,
|
||||||
uint16_t addr, const uint8_t *data, int len);
|
address_t addr, const uint8_t *data, int len);
|
||||||
|
|
||||||
#define BINFILE_HAS_SYMS 0x01
|
#define BINFILE_HAS_SYMS 0x01
|
||||||
#define BINFILE_HAS_TEXT 0x02
|
#define BINFILE_HAS_TEXT 0x02
|
||||||
|
|
4
devcmd.c
4
devcmd.c
|
@ -452,7 +452,7 @@ struct prog_data {
|
||||||
device_t dev;
|
device_t dev;
|
||||||
|
|
||||||
uint8_t buf[128];
|
uint8_t buf[128];
|
||||||
uint16_t addr;
|
address_t addr;
|
||||||
int len;
|
int len;
|
||||||
int have_erased;
|
int have_erased;
|
||||||
};
|
};
|
||||||
|
@ -494,7 +494,7 @@ static int prog_flush(struct prog_data *prog)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int prog_feed(void *user_data,
|
static int prog_feed(void *user_data,
|
||||||
uint16_t addr, const uint8_t *data, int len)
|
address_t addr, const uint8_t *data, int len)
|
||||||
{
|
{
|
||||||
struct prog_data *prog = (struct prog_data *)user_data;
|
struct prog_data *prog = (struct prog_data *)user_data;
|
||||||
|
|
||||||
|
|
6
elf32.c
6
elf32.c
|
@ -136,11 +136,11 @@ static uint32_t file_to_phys(struct elf32_info *info, uint32_t v)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int feed_section(struct elf32_info *info,
|
static int feed_section(struct elf32_info *info,
|
||||||
FILE *in, int offset, int size, binfile_imgcb_t cb,
|
FILE *in, uint32_t offset, uint32_t size,
|
||||||
void *user_data)
|
binfile_imgcb_t cb, void *user_data)
|
||||||
{
|
{
|
||||||
uint8_t buf[1024];
|
uint8_t buf[1024];
|
||||||
uint16_t addr = file_to_phys(info, offset);
|
uint32_t addr = file_to_phys(info, offset);
|
||||||
|
|
||||||
if (fseek(in, offset, SEEK_SET) < 0) {
|
if (fseek(in, offset, SEEK_SET) < 0) {
|
||||||
perror("elf32: can't seek to section");
|
perror("elf32: can't seek to section");
|
||||||
|
|
55
ihex.c
55
ihex.c
|
@ -28,12 +28,16 @@ int ihex_check(FILE *in)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int feed_line(FILE *in, uint8_t *data, int nbytes, binfile_imgcb_t cb,
|
static int feed_line(FILE *in, uint8_t *data, int nbytes, binfile_imgcb_t cb,
|
||||||
void *user_data)
|
void *user_data, address_t *segment_offset)
|
||||||
{
|
{
|
||||||
uint8_t cksum = 0;
|
uint8_t cksum = 0;
|
||||||
|
address_t address;
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t *payload;
|
||||||
|
int data_len;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (nbytes < 5 || data[3])
|
if (nbytes < 5)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Verify checksum */
|
/* Verify checksum */
|
||||||
|
@ -47,15 +51,53 @@ static int feed_line(FILE *in, uint8_t *data, int nbytes, binfile_imgcb_t cb,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cb(user_data,
|
/* Extract other bits */
|
||||||
((uint16_t)data[1]) << 8 | ((uint16_t)data[2]),
|
type = data[3];
|
||||||
data + 4, nbytes - 5);
|
address = (data[1] << 8) | data[2];
|
||||||
|
payload = data + 4;
|
||||||
|
data_len = nbytes - 5;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 0:
|
||||||
|
return cb(user_data, address, payload, data_len);
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (data_len != 2) {
|
||||||
|
fprintf(stderr, "ihex: invalid 02 record\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*segment_offset = (address_t)((payload[0] << 8) |
|
||||||
|
payload[1]) << 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
if (data_len != 2) {
|
||||||
|
fprintf(stderr, "ihex: invalid 04 record\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*segment_offset = (address_t)((payload[0] << 8) |
|
||||||
|
payload[1]) << 16;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "warning: ihex: unknown record type: "
|
||||||
|
"0x%02x\n", type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ihex_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
int ihex_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
||||||
{
|
{
|
||||||
char buf[128];
|
char buf[128];
|
||||||
int lno = 0;
|
int lno = 0;
|
||||||
|
address_t segment_offset = 0;
|
||||||
|
|
||||||
rewind(in);
|
rewind(in);
|
||||||
while (fgets(buf, sizeof(buf), in)) {
|
while (fgets(buf, sizeof(buf), in)) {
|
||||||
|
@ -85,7 +127,8 @@ int ihex_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle the line */
|
/* Handle the line */
|
||||||
if (feed_line(in, data, nbytes, cb, user_data) < 0) {
|
if (feed_line(in, data, nbytes, cb, user_data,
|
||||||
|
&segment_offset) < 0) {
|
||||||
fprintf(stderr, "ihex: error on line %d\n", lno);
|
fprintf(stderr, "ihex: error on line %d\n", lno);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
2
srec.c
2
srec.c
|
@ -118,7 +118,7 @@ int srec_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
||||||
|
|
||||||
if (buf[1] >= '1' && buf[1] <= '3') {
|
if (buf[1] >= '1' && buf[1] <= '3') {
|
||||||
int addrbytes = buf[1] - '1' + 2;
|
int addrbytes = buf[1] - '1' + 2;
|
||||||
int addr = 0;
|
address_t addr = 0;
|
||||||
|
|
||||||
for (i = 0; i < addrbytes; i++)
|
for (i = 0; i < addrbytes; i++)
|
||||||
addr = (addr << 8) | bytes[i + 1];
|
addr = (addr << 8) | bytes[i + 1];
|
||||||
|
|
2
symmap.c
2
symmap.c
|
@ -58,7 +58,7 @@ int symmap_syms(FILE *in, stab_t stab)
|
||||||
name = strtok(NULL, " \t\r\n");
|
name = strtok(NULL, " \t\r\n");
|
||||||
|
|
||||||
if (addr && name) {
|
if (addr && name) {
|
||||||
int addr_val = strtoul(addr, NULL, 16);
|
address_t addr_val = strtoul(addr, NULL, 16);
|
||||||
|
|
||||||
if (stab_set(stab, name, addr_val) < 0)
|
if (stab_set(stab, name, addr_val) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
4
titext.c
4
titext.c
|
@ -67,7 +67,7 @@ int titext_check(FILE *in)
|
||||||
return is_address_line(buf);
|
return is_address_line(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int process_data_line(int address, const char *buf,
|
static int process_data_line(address_t address, const char *buf,
|
||||||
binfile_imgcb_t cb, void *user_data)
|
binfile_imgcb_t cb, void *user_data)
|
||||||
{
|
{
|
||||||
uint8_t data[64];
|
uint8_t data[64];
|
||||||
|
@ -129,7 +129,7 @@ static int process_data_line(int address, const char *buf,
|
||||||
|
|
||||||
int titext_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
int titext_extract(FILE *in, binfile_imgcb_t cb, void *user_data)
|
||||||
{
|
{
|
||||||
int address = 0;
|
address_t address = 0;
|
||||||
int lno = 0;
|
int lno = 0;
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue