|
56 | 56 | * Higher density PSRAM (ESP-PSRAM64H/etc.) works as well, but may be too
|
57 | 57 | large to effectively use with UMM. Only 256K is available vial malloc,
|
58 | 58 | but addresses above 256K do work and can be used for fixed buffers.
|
59 |
| - |
| 59 | +
|
60 | 60 | */
|
61 | 61 |
|
62 | 62 | #ifdef MMU_EXTERNAL_HEAP
|
|
71 | 71 |
|
72 | 72 | extern "C" {
|
73 | 73 |
|
| 74 | +#define VM_OFFSET_MASK 0x007fffffu |
| 75 | + |
74 | 76 | #define SHORT_MASK 0x000008u
|
75 | 77 | #define LOAD_MASK 0x00f00fu
|
76 | 78 | #define L8UI_MATCH 0x000002u
|
@@ -324,21 +326,21 @@ static IRAM_ATTR void loadstore_exception_handler(struct __exception_frame *ef,
|
324 | 326 | uint32_t val = ef->a_reg[regno];
|
325 | 327 | uint32_t what = insn & STORE_MASK;
|
326 | 328 | if (what == S8I_MATCH) {
|
327 |
| - spi_ramwrite(spi1, excvaddr & 0x1ffff, 8-1, val); |
| 329 | + spi_ramwrite(spi1, excvaddr & VM_OFFSET_MASK, 8-1, val); |
328 | 330 | } else if (what == S16I_MATCH) {
|
329 |
| - spi_ramwrite(spi1, excvaddr & 0x1ffff, 16-1, val); |
| 331 | + spi_ramwrite(spi1, excvaddr & VM_OFFSET_MASK, 16-1, val); |
330 | 332 | } else {
|
331 |
| - spi_ramwrite(spi1, excvaddr & 0x1ffff, 32-1, val); |
| 333 | + spi_ramwrite(spi1, excvaddr & VM_OFFSET_MASK, 32-1, val); |
332 | 334 | }
|
333 | 335 | } else {
|
334 | 336 | if (insn & L32_MASK) {
|
335 |
| - ef->a_reg[regno] = spi_ramread(spi1, excvaddr & 0x1ffff, 32-1); |
| 337 | + ef->a_reg[regno] = spi_ramread(spi1, excvaddr & VM_OFFSET_MASK, 32-1); |
336 | 338 | } else if (insn & L16_MASK) {
|
337 |
| - ef->a_reg[regno] = spi_ramread(spi1, excvaddr & 0x1ffff, 16-1); |
| 339 | + ef->a_reg[regno] = spi_ramread(spi1, excvaddr & VM_OFFSET_MASK, 16-1); |
338 | 340 | if ((insn & SIGNED_MASK ) && (ef->a_reg[regno] & 0x8000))
|
339 | 341 | ef->a_reg[regno] |= 0xffff0000;
|
340 | 342 | } else {
|
341 |
| - ef->a_reg[regno] = spi_ramread(spi1, excvaddr & 0x1ffff, 8-1); |
| 343 | + ef->a_reg[regno] = spi_ramread(spi1, excvaddr & VM_OFFSET_MASK, 8-1); |
342 | 344 | }
|
343 | 345 | }
|
344 | 346 | }
|
@@ -389,6 +391,11 @@ void install_vm_exception_handler()
|
389 | 391 | __vm_cache_line[cache_ways - 1].next = NULL;
|
390 | 392 | }
|
391 | 393 |
|
| 394 | + // Our umm_malloc configuration can only support a maximum of 256K RAM. A |
| 395 | + // change would affect the block size of all heaps, and a larger block size |
| 396 | + // would result in wasted space in the smaller heaps. |
| 397 | + static_assert(MMU_EXTERNAL_HEAP <= 256, "Heap size must not exceed 256K"); |
| 398 | + |
392 | 399 | // Hook into memory manager
|
393 | 400 | umm_init_vm( (void *)0x10000000, MMU_EXTERNAL_HEAP * 1024);
|
394 | 401 | }
|
|
0 commit comments