@@ -312,6 +312,11 @@ bool Debugger::checkDebugMessages(Module *m, RunningState *program_state) {
312
312
this ->channel ->write (" %s!\n " , receivingData ? " ack" : " done" );
313
313
}
314
314
break ;
315
+ case interruptTransfer:
316
+ this ->transfer (m, interruptData);
317
+ free (interruptData);
318
+ this ->channel ->write (" Transferred!\n " );
319
+ break ;
315
320
case interruptProxyCall: {
316
321
this ->handleProxyCall (m, program_state, interruptData + 1 );
317
322
free (interruptData);
@@ -1120,6 +1125,31 @@ void Debugger::freeState(Module *m, uint8_t *interruptData) {
1120
1125
debug (" done with first msg\n " );
1121
1126
}
1122
1127
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
+
1123
1153
bool Debugger::saveState (Module *m, uint8_t *interruptData) {
1124
1154
uint8_t *program_state = nullptr ;
1125
1155
uint8_t *end_state = nullptr ;
0 commit comments