From 0f97a46f1fc42666ccbc55c057259c69e7a2a78e Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Thu, 26 Sep 2024 13:27:12 +0200 Subject: [PATCH 1/8] Use run length encoding when taking a memory snapshot --- src/Debug/debugger.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index a8e3802f..1bad82a3 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -873,10 +873,21 @@ void Debugger::inspect(Module *m, const uint16_t sizeStateArray, addComma ? "," : "", m->memory.pages, m->memory.maximum, m->memory.initial); addComma = true; - for (uint32_t j = 0; j < total_elems; j++) { - this->channel->write("%" PRIu8 "%s", m->memory.bytes[j], - (j + 1) == total_elems ? "" : ","); + uint8_t data = m->memory.bytes[0]; + uint32_t count = 1; + bool arrayComma = false; + for (uint32_t j = 1; j < total_elems; j++) { + if (m->memory.bytes[j] == data) { + count++; + } + else { + this->channel->write("%s%" PRIu8 ",%d", arrayComma ? "," : "", data, count); + arrayComma = true; + data = m->memory.bytes[j]; + count = 1; + } } + this->channel->write("%s%" PRIu8 ",%d", arrayComma ? "," : "", data, count); this->channel->write("]}"); // closing memory break; } From 3f7d5159c2c984c48fc6b7b7660f22b6ee0fa181 Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Thu, 26 Sep 2024 17:25:07 +0200 Subject: [PATCH 2/8] Fix issue with run length encoding when there are 0 memory pages --- src/Debug/debugger.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index 1bad82a3..d0e0d4fb 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -873,21 +873,23 @@ void Debugger::inspect(Module *m, const uint16_t sizeStateArray, addComma ? "," : "", m->memory.pages, m->memory.maximum, m->memory.initial); addComma = true; - uint8_t data = m->memory.bytes[0]; - uint32_t count = 1; - bool arrayComma = false; - for (uint32_t j = 1; j < total_elems; j++) { - if (m->memory.bytes[j] == data) { - count++; - } - else { - this->channel->write("%s%" PRIu8 ",%d", arrayComma ? "," : "", data, count); - arrayComma = true; - data = m->memory.bytes[j]; - count = 1; + if (total_elems != 0) { + uint8_t data = m->memory.bytes[0]; + uint32_t count = 1; + bool arrayComma = false; + for (uint32_t j = 1; j < total_elems; j++) { + if (m->memory.bytes[j] == data) { + count++; + } + else { + this->channel->write("%s%" PRIu8 ",%d", arrayComma ? "," : "", data, count); + arrayComma = true; + data = m->memory.bytes[j]; + count = 1; + } } + this->channel->write("%s%" PRIu8 ",%d", arrayComma ? "," : "", data, count); } - this->channel->write("%s%" PRIu8 ",%d", arrayComma ? "," : "", data, count); this->channel->write("]}"); // closing memory break; } From be9cd298c44363767dff6c09f43193225a8a924b Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Wed, 20 Nov 2024 22:15:43 +0100 Subject: [PATCH 3/8] Restore memory using run length encoding --- src/Debug/debugger.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index d0e0d4fb..fc1dd439 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -1250,12 +1250,27 @@ bool Debugger::saveState(Module *m, uint8_t *interruptData) { static_cast(m->bytes + start + total_bytes), static_cast(mem_end)); } - memcpy(m->memory.bytes + start, program_state, total_bytes); + + uint32_t byte_count = read_B32(&program_state); + printf("byte_count = %d\n", byte_count); + uint8_t *end = program_state + byte_count; + uint32_t current_pos = start; + while (program_state < end) { + uint32_t count = read_LEB_32(&program_state); + uint8_t byte = *program_state++; + //printf("%d x %d\n", count, byte); + // TODO: Maybe use memset? + /*for (uint32_t i = 0; i < count; i++) { + m->memory.bytes[current_pos++] = byte; + }*/ + memset(m->memory.bytes + current_pos, byte, count); + current_pos += count; + } + for (auto i = start; i < (start + total_bytes); i++) { debug("GOT byte idx %" PRIu32 " =%" PRIu8 "\n", i, m->memory.bytes[i]); } - program_state += total_bytes; break; } case branchingTableState: { From 3b7c88e05a052a3522516fea0824e83998fdef9b Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Mon, 25 Nov 2024 12:12:50 +0100 Subject: [PATCH 4/8] Remove old commented out code --- src/Debug/debugger.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index fc1dd439..a9a64e4a 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -1258,11 +1258,6 @@ bool Debugger::saveState(Module *m, uint8_t *interruptData) { while (program_state < end) { uint32_t count = read_LEB_32(&program_state); uint8_t byte = *program_state++; - //printf("%d x %d\n", count, byte); - // TODO: Maybe use memset? - /*for (uint32_t i = 0; i < count; i++) { - m->memory.bytes[current_pos++] = byte; - }*/ memset(m->memory.bytes + current_pos, byte, count); current_pos += count; } From cd93f1e4d30e7b69d5aa070e51dfb4b0ea65e38c Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Mon, 25 Nov 2024 12:15:51 +0100 Subject: [PATCH 5/8] Clang-format --- src/Debug/debugger.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index a9a64e4a..eb035c58 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -880,15 +880,17 @@ void Debugger::inspect(Module *m, const uint16_t sizeStateArray, for (uint32_t j = 1; j < total_elems; j++) { if (m->memory.bytes[j] == data) { count++; - } - else { - this->channel->write("%s%" PRIu8 ",%d", arrayComma ? "," : "", data, count); + } else { + this->channel->write("%s%" PRIu8 ",%d", + arrayComma ? "," : "", data, + count); arrayComma = true; data = m->memory.bytes[j]; count = 1; } } - this->channel->write("%s%" PRIu8 ",%d", arrayComma ? "," : "", data, count); + this->channel->write("%s%" PRIu8 ",%d", + arrayComma ? "," : "", data, count); } this->channel->write("]}"); // closing memory break; From e4b00687f14f75c16b893b2cfbc58e417e86ef3e Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Mon, 25 Nov 2024 12:22:56 +0100 Subject: [PATCH 6/8] Remove unnecessary print --- src/Debug/debugger.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index eb035c58..f79b4347 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -1254,7 +1254,6 @@ bool Debugger::saveState(Module *m, uint8_t *interruptData) { } uint32_t byte_count = read_B32(&program_state); - printf("byte_count = %d\n", byte_count); uint8_t *end = program_state + byte_count; uint32_t current_pos = start; while (program_state < end) { From 867c0db4aee649f552971f35f890fb37b77ed196 Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Mon, 25 Nov 2024 12:46:57 +0100 Subject: [PATCH 7/8] Add check to validate if run length encoding restored memory correctly --- src/Debug/debugger.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index f79b4347..98463dd6 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -1262,6 +1262,9 @@ bool Debugger::saveState(Module *m, uint8_t *interruptData) { memset(m->memory.bytes + current_pos, byte, count); current_pos += count; } + if (current_pos != limit + 1) { + FATAL("RLE did not restore the expected amount of bytes\n"); + } for (auto i = start; i < (start + total_bytes); i++) { debug("GOT byte idx %" PRIu32 " =%" PRIu8 "\n", i, From 9e12434e6d1c7e7000a2d275102145d6de7c7316 Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Mon, 25 Nov 2024 17:33:54 +0100 Subject: [PATCH 8/8] Fix conflicting variable name `end` --- src/Debug/debugger.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Debug/debugger.cpp b/src/Debug/debugger.cpp index 98463dd6..aeeaf3b0 100644 --- a/src/Debug/debugger.cpp +++ b/src/Debug/debugger.cpp @@ -1254,9 +1254,9 @@ bool Debugger::saveState(Module *m, uint8_t *interruptData) { } uint32_t byte_count = read_B32(&program_state); - uint8_t *end = program_state + byte_count; + uint8_t *end_pos = program_state + byte_count; uint32_t current_pos = start; - while (program_state < end) { + while (program_state < end_pos) { uint32_t count = read_LEB_32(&program_state); uint8_t byte = *program_state++; memset(m->memory.bytes + current_pos, byte, count);