@@ -312,6 +312,11 @@ bool Debugger::checkDebugMessages(Module *m, RunningState *program_state) {
312312 this ->channel ->write (" %s!\n " , receivingData ? " ack" : " done" );
313313 }
314314 break ;
315+ case interruptTransfer:
316+ this ->transfer (m, interruptData);
317+ free (interruptData);
318+ this ->channel ->write (" Transferred!\n " );
319+ break ;
315320 case interruptProxyCall: {
316321 this ->handleProxyCall (m, program_state, interruptData + 1 );
317322 free (interruptData);
@@ -1105,6 +1110,31 @@ void Debugger::freeState(Module *m, uint8_t *interruptData) {
11051110 debug (" done with first msg\n " );
11061111}
11071112
1113+ void load (uint8_t *bytes, Module* m) {
1114+ auto start = read_B32 (&bytes);
1115+ auto limit = read_B32 (&bytes);
1116+ auto total_bytes = limit - start + 1 ;
1117+ memcpy (m->memory .bytes + start, bytes, total_bytes);
1118+ }
1119+
1120+ void Debugger::transfer (Module *m, uint8_t *interruptData) {
1121+ uint8_t *cursor = nullptr ;
1122+ uint8_t *end = nullptr ;
1123+ cursor = interruptData + 1 ; // skip interruptLoadSnapshot
1124+ uint32_t len = read_B32 (&cursor);
1125+ end = cursor + len;
1126+
1127+ while (cursor < end) {
1128+ switch (*cursor++) {
1129+ case memoryState:
1130+ load (cursor, m);
1131+ default : {
1132+ debug (" do nothing\n " );
1133+ }
1134+ }
1135+ }
1136+ }
1137+
11081138bool Debugger::saveState (Module *m, uint8_t *interruptData) {
11091139 uint8_t *program_state = nullptr ;
11101140 uint8_t *end_state = nullptr ;
0 commit comments