MCPcopy Index your code
hub / github.com/cloud-hypervisor/cloud-hypervisor / create_memory_node

Function create_memory_node

arch/src/riscv64/fdt.rs:149–196  ·  view source on GitHub ↗
(fdt: &mut FdtWriter, guest_mem: &GuestMemoryMmap)

Source from the content-addressed store, hash-verified

147}
148
149fn create_memory_node(fdt: &mut FdtWriter, guest_mem: &GuestMemoryMmap) -> FdtWriterResult<()> {
150 // Note: memory regions from "GuestMemory" are sorted and non-zero sized.
151 let ram_regions = {
152 let mut ram_regions = Vec::new();
153 let mut current_start = guest_mem
154 .iter()
155 .next()
156 .map(GuestMemoryRegion::start_addr)
157 .expect("GuestMemory must have one memory region at least")
158 .raw_value();
159 let mut current_end = current_start;
160
161 for (start, size) in guest_mem
162 .iter()
163 .map(|m| (m.start_addr().raw_value(), m.len()))
164 {
165 if current_end == start {
166 // This zone is continuous with the previous one.
167 current_end += size;
168 } else {
169 ram_regions.push((current_start, current_end));
170
171 current_start = start;
172 current_end = start + size;
173 }
174 }
175
176 ram_regions.push((current_start, current_end));
177
178 ram_regions
179 };
180
181 let mut mem_reg_property = Vec::new();
182 for region in ram_regions {
183 let mem_size = region.1 - region.0;
184 mem_reg_property.push(region.0);
185 mem_reg_property.push(mem_size);
186 }
187
188 let ram_start = super::layout::RAM_START.raw_value();
189 let memory_node_name = format!("memory@{ram_start:x}");
190 let memory_node = fdt.begin_node(&memory_node_name)?;
191 fdt.property_string("device_type", "memory")?;
192 fdt.property_array_u64("reg", &mem_reg_property)?;
193 fdt.end_node(memory_node)?;
194
195 Ok(())
196}
197
198fn create_chosen_node(
199 fdt: &mut FdtWriter,

Callers 1

create_fdtFunction · 0.70

Calls 7

newFunction · 0.85
iterMethod · 0.80
start_addrMethod · 0.80
mapMethod · 0.45
nextMethod · 0.45
lenMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected