@@ -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);
@@ -1120,6 +1125,31 @@ void Debugger::freeState(Module *m, uint8_t *interruptData) {
11201125 debug (" done with first msg\n " );
11211126}
11221127
1128+ void load (uint8_t *bytes, Module* m) {
1129+ auto start = read_B32 (&bytes);
1130+ auto limit = read_B32 (&bytes);
1131+ auto total_bytes = limit - start + 1 ;
1132+ memcpy (m->memory .bytes + start, bytes, total_bytes);
1133+ }
1134+
1135+ void Debugger::transfer (Module *m, uint8_t *interruptData) {
1136+ uint8_t *cursor = nullptr ;
1137+ uint8_t *end = nullptr ;
1138+ cursor = interruptData + 1 ; // skip interruptLoadSnapshot
1139+ uint32_t len = read_B32 (&cursor);
1140+ end = cursor + len;
1141+
1142+ while (cursor < end) {
1143+ switch (*cursor++) {
1144+ case memoryState:
1145+ load (cursor, m);
1146+ default : {
1147+ debug (" do nothing\n " );
1148+ }
1149+ }
1150+ }
1151+ }
1152+
11231153bool Debugger::saveState (Module *m, uint8_t *interruptData) {
11241154 uint8_t *program_state = nullptr ;
11251155 uint8_t *end_state = nullptr ;
0 commit comments