@@ -119,29 +119,53 @@ def generate_update_overlay(self, instance_name: str, old_instance, new_instance
119119 fdt_sw .begin_node ("fragment@0" )
120120 fdt_sw .begin_node ("__overlay__" )
121121
122- # 1. memory-remove (if memory changed)
122+ # 1. memory-remove (if memory shrunk or base changed)
123123 if memory_changed :
124- fdt_sw .begin_node ("memory-remove" )
125- fdt_sw .property_string ("mk,instance" , instance_name )
126-
127- fdt_sw .begin_node ("region@0" )
128- reg_data = struct .pack (">QQ" , old_mem_base , old_mem_size )
129- fdt_sw .property ("reg" , reg_data )
130- fdt_sw .end_node ()
131-
132- fdt_sw .end_node ()
124+ if old_mem_base == new_mem_base :
125+ # Same base: only remove the excess if shrinking
126+ if old_mem_size > new_mem_size :
127+ remove_base = old_mem_base + new_mem_size
128+ remove_size = old_mem_size - new_mem_size
129+ fdt_sw .begin_node ("memory-remove" )
130+ fdt_sw .property_string ("mk,instance" , instance_name )
131+ fdt_sw .begin_node ("region@0" )
132+ reg_data = struct .pack (">QQ" , remove_base , remove_size )
133+ fdt_sw .property ("reg" , reg_data )
134+ fdt_sw .end_node ()
135+ fdt_sw .end_node ()
136+ else :
137+ # Different base: remove entire old region
138+ fdt_sw .begin_node ("memory-remove" )
139+ fdt_sw .property_string ("mk,instance" , instance_name )
140+ fdt_sw .begin_node ("region@0" )
141+ reg_data = struct .pack (">QQ" , old_mem_base , old_mem_size )
142+ fdt_sw .property ("reg" , reg_data )
143+ fdt_sw .end_node ()
144+ fdt_sw .end_node ()
133145
134- # 2. memory-add (if memory changed)
146+ # 2. memory-add (if memory grew or base changed)
135147 if memory_changed :
136- fdt_sw .begin_node ("memory-add" )
137- fdt_sw .property_string ("mk,instance" , instance_name )
138-
139- fdt_sw .begin_node ("region@0" )
140- reg_data = struct .pack (">QQ" , new_mem_base , new_mem_size )
141- fdt_sw .property ("reg" , reg_data )
142- fdt_sw .end_node ()
143-
144- fdt_sw .end_node ()
148+ if old_mem_base == new_mem_base :
149+ # Same base: only add the extension if growing
150+ if new_mem_size > old_mem_size :
151+ add_base = old_mem_base + old_mem_size
152+ add_size = new_mem_size - old_mem_size
153+ fdt_sw .begin_node ("memory-add" )
154+ fdt_sw .property_string ("mk,instance" , instance_name )
155+ fdt_sw .begin_node ("region@0" )
156+ reg_data = struct .pack (">QQ" , add_base , add_size )
157+ fdt_sw .property ("reg" , reg_data )
158+ fdt_sw .end_node ()
159+ fdt_sw .end_node ()
160+ else :
161+ # Different base: add entire new region
162+ fdt_sw .begin_node ("memory-add" )
163+ fdt_sw .property_string ("mk,instance" , instance_name )
164+ fdt_sw .begin_node ("region@0" )
165+ reg_data = struct .pack (">QQ" , new_mem_base , new_mem_size )
166+ fdt_sw .property ("reg" , reg_data )
167+ fdt_sw .end_node ()
168+ fdt_sw .end_node ()
145169
146170 # 3. cpu-remove (if CPUs removed)
147171 if cpus_to_remove :
0 commit comments