Skip to content

Commit 6936a4f

Browse files
committed
Integrate TLSF memory pool
1 parent 57069ea commit 6936a4f

File tree

4 files changed

+978
-15
lines changed

4 files changed

+978
-15
lines changed

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ OBJS := \
9393
emulate.o \
9494
riscv.o \
9595
elf.o \
96+
tlsf.o \
9697
cache.o \
9798
$(OBJS_EXT) \
9899
main.o

src/io.c

+13-15
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,27 @@
99
#include <string.h>
1010

1111
#include "io.h"
12+
#include "tlsf.h"
13+
14+
#define POOL_SIZE 1 << 22
1215

1316
static const uint32_t mask_lo = 0xffff;
1417
static const uint32_t mask_hi = ~(0xffff);
1518

19+
char pool[POOL_SIZE];
20+
1621
memory_t *memory_new()
1722
{
18-
memory_t *m = malloc(sizeof(memory_t));
19-
memset(m->chunks, 0, sizeof(m->chunks));
23+
init_memory_pool(POOL_SIZE, pool);
24+
memory_t *m = calloc_ex(1, sizeof(memory_t), pool);
2025
return m;
2126
}
2227

2328
void memory_delete(memory_t *m)
2429
{
2530
if (!m)
2631
return;
27-
28-
for (uint32_t i = 0; i < (sizeof(m->chunks) / sizeof(chunk_t *)); i++) {
29-
chunk_t *c = m->chunks[i];
30-
if (c)
31-
free(c);
32-
}
33-
free(m);
32+
destroy_memory_pool(pool);
3433
}
3534

3635
void memory_read(memory_t *m, uint8_t *dst, uint32_t addr, uint32_t size)
@@ -109,7 +108,7 @@ void memory_write(memory_t *m, uint32_t addr, const uint8_t *src, uint32_t size)
109108
uint32_t x = p >> 16;
110109
chunk_t *c = m->chunks[x];
111110
if (!c) {
112-
c = calloc(1, sizeof(chunk_t));
111+
c = malloc_ex(sizeof(chunk_t), pool);
113112
m->chunks[x] = c;
114113
}
115114
c->data[p & 0xffff] = src[i];
@@ -121,7 +120,7 @@ void memory_write_w(memory_t *m, uint32_t addr, const uint8_t *src)
121120
const uint32_t addr_lo = addr & mask_lo, addr_hi = addr >> 16;
122121
chunk_t *c = m->chunks[addr_hi];
123122
if (unlikely(!c)) {
124-
c = calloc(1, sizeof(chunk_t));
123+
c = calloc_ex(1, sizeof(chunk_t), pool);
125124
m->chunks[addr_hi] = c;
126125
}
127126
*(uint32_t *) (c->data + addr_lo) = *(const uint32_t *) src;
@@ -132,7 +131,7 @@ void memory_write_s(memory_t *m, uint32_t addr, const uint8_t *src)
132131
const uint32_t addr_lo = addr & mask_lo, addr_hi = addr >> 16;
133132
chunk_t *c = m->chunks[addr_hi];
134133
if (unlikely(!c)) {
135-
c = calloc(1, sizeof(chunk_t));
134+
c = calloc_ex(1, sizeof(chunk_t), pool);
136135
m->chunks[addr_hi] = c;
137136
}
138137
*(uint16_t *) (c->data + addr_lo) = *(const uint16_t *) src;
@@ -143,7 +142,7 @@ void memory_write_b(memory_t *m, uint32_t addr, const uint8_t *src)
143142
const uint32_t addr_lo = addr & mask_lo, addr_hi = addr >> 16;
144143
chunk_t *c = m->chunks[addr_hi];
145144
if (unlikely(!c)) {
146-
c = calloc(1, sizeof(chunk_t));
145+
c = calloc_ex(1, sizeof(chunk_t), pool);
147146
m->chunks[addr_hi] = c;
148147
}
149148
c->data[addr_lo] = src[0];
@@ -156,8 +155,7 @@ void memory_fill(memory_t *m, uint32_t addr, uint32_t size, uint8_t val)
156155
uint32_t x = p >> 16;
157156
chunk_t *c = m->chunks[x];
158157
if (!c) {
159-
c = malloc(sizeof(chunk_t));
160-
memset(c->data, 0, sizeof(c->data));
158+
c = calloc_ex(1, sizeof(chunk_t), pool);
161159
m->chunks[x] = c;
162160
}
163161
c->data[p & 0xffff] = val;

0 commit comments

Comments
 (0)