-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathbin_load.cpp
126 lines (114 loc) · 3.34 KB
/
bin_load.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//-----------------------------------------------------------------
// ExactStep IAISS
// V0.5
// github.com/ultraembedded/exactstep
// Copyright 2014-2019
// License: BSD 3-Clause
//-----------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include "bin_load.h"
//--------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------
bin_load::bin_load(const char *filename, mem_api *target)
{
m_filename = std::string(filename);
m_target = target;
}
//-----------------------------------------------------------------
// load: Binary load
//-----------------------------------------------------------------
bool bin_load::load(uint32_t mem_base, uint32_t mem_size)
{
// Load file
FILE *f = fopen(m_filename.c_str(), "rb");
if (f)
{
long size;
uint8_t *buf;
int error = 1;
// Get size
fseek(f, 0, SEEK_END);
size = ftell(f);
rewind(f);
buf = (uint8_t*)malloc(size);
if (buf)
{
// Read file data in
int len = fread(buf, 1, size, f);
if (!m_target->create_memory(mem_base, mem_size))
fprintf (stderr,"Error: Could not allocate memory\n");
else
{
error = 0;
for (int i=0;i<len;i++)
{
if (m_target->valid_addr(mem_base + i))
m_target->write(mem_base + i, buf[i]);
else
{
fprintf (stderr,"Error: Could not load image to memory\n");
error = 1;
break;
}
}
}
free(buf);
fclose(f);
}
return !error;
}
else
{
fprintf (stderr,"Error: Could not open %s\n", m_filename.c_str());
return false;
}
}
//-----------------------------------------------------------------
// load: Binary load (memory assumed to already exist)
//-----------------------------------------------------------------
bool bin_load::load(uint32_t mem_base)
{
// Load file
FILE *f = fopen(m_filename.c_str(), "rb");
if (f)
{
long size;
uint8_t *buf;
int error = 1;
// Get size
fseek(f, 0, SEEK_END);
size = ftell(f);
rewind(f);
buf = (uint8_t*)malloc(size);
if (buf)
{
// Read file data in
int len = fread(buf, 1, size, f);
error = 0;
for (int i=0;i<len;i++)
{
if (m_target->valid_addr(mem_base + i))
m_target->write(mem_base + i, buf[i]);
else
{
fprintf (stderr,"Error: Could not load image to memory\n");
error = 1;
break;
}
}
free(buf);
fclose(f);
}
return !error;
}
else
{
fprintf (stderr,"Error: Could not open %s\n", m_filename.c_str());
return false;
}
}