11package armify .services ;
22
33
4+ import armify .domain .MMIOAccessEntry ;
45import ghidra .framework .store .LockException ;
56import ghidra .program .model .address .Address ;
67import ghidra .program .model .address .AddressOverflowException ;
@@ -45,6 +46,9 @@ public void apply(Program program, String deviceName) {
4546 reset (program );
4647 }
4748
49+ // Backup current MMIO Accesses
50+ List <MMIOAccessEntry > mmioAccesses = storage .loadMMIOAccesses (program );
51+
4852 int tx = program .startTransaction ("Apply device " + deviceName );
4953 boolean commit = false ;
5054 try {
@@ -105,11 +109,14 @@ public void apply(Program program, String deviceName) {
105109 } catch (CodeUnitInsertionException ex ) {
106110 Msg .error (this , "Can't create data" , ex );
107111 }
112+ }
113+
114+ // Restore MMIO accesses after memory blocks were changed
115+ storage .saveMMIOAccesses (program , mmioAccesses );
108116
109- storage .setAppliedDeviceName (program , deviceName );
117+ storage .setAppliedDeviceName (program , deviceName );
110118
111- commit = true ;
112- }
119+ commit = true ;
113120 } finally {
114121 program .endTransaction (tx , commit );
115122 }
@@ -120,6 +127,9 @@ public void reset(Program program) {
120127 return ;
121128 }
122129
130+ // Backup current MMIO Accesses
131+ List <MMIOAccessEntry > mmioAccesses = storage .loadMMIOAccesses (program );
132+
123133 int tx = program .startTransaction ("ARMify reset" );
124134 boolean commit = false ;
125135 try {
@@ -176,7 +186,10 @@ public void reset(Program program) {
176186 Msg .error (this , "Can't recreate default peripheral block" , ex );
177187 }
178188
179- // 5. Clear the stored device name
189+ // 5. Restore MMIO accesses after memory blocks were changed
190+ storage .saveMMIOAccesses (program , mmioAccesses );
191+
192+ // 6. Clear the stored device name
180193 storage .setAppliedDeviceName (program , null );
181194 commit = true ;
182195 } finally {
0 commit comments