MCPcopy Create free account
hub / github.com/coreboot/coreboot / load_payload_segments

Function load_payload_segments

src/lib/selfboot.c:172–243  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

170}
171
172static int load_payload_segments(struct cbfs_payload_segment *cbfssegs, uintptr_t *entry)
173{
174 uint8_t *dest, *src;
175 size_t filesz, memsz;
176 uint32_t compression;
177 struct cbfs_payload_segment *first_segment, *seg, segment;
178 int flags = 0;
179
180 for (first_segment = seg = cbfssegs;; ++seg) {
181 printk(BIOS_DEBUG, "Loading segment from ROM address %p\n", seg);
182
183 cbfs_decode_payload_segment(&segment, seg);
184 dest = (uint8_t *)(uintptr_t)segment.load_addr;
185 memsz = segment.mem_len;
186 compression = segment.compression;
187 filesz = segment.len;
188
189 switch (segment.type) {
190 case PAYLOAD_SEGMENT_CODE:
191 case PAYLOAD_SEGMENT_DATA:
192 printk(BIOS_DEBUG, " %s (compression=%x)\n",
193 segment.type == PAYLOAD_SEGMENT_CODE
194 ? "code" : "data", segment.compression);
195 src = ((uint8_t *)first_segment) + segment.offset;
196 printk(BIOS_DEBUG,
197 " New segment dstaddr %p memsize 0x%zx srcaddr %p filesize 0x%zx\n",
198 dest, memsz, src, filesz);
199
200 /* Clean up the values */
201 if (filesz > memsz) {
202 filesz = memsz;
203 printk(BIOS_DEBUG, " cleaned up filesize 0x%zx\n", filesz);
204 }
205 break;
206
207 case PAYLOAD_SEGMENT_BSS:
208 printk(BIOS_DEBUG, " BSS %p (%d byte)\n", (void *)
209 (intptr_t)segment.load_addr, segment.mem_len);
210 filesz = 0;
211 src = ((uint8_t *)first_segment) + segment.offset;
212 compression = CBFS_COMPRESS_NONE;
213 break;
214
215 case PAYLOAD_SEGMENT_ENTRY:
216 printk(BIOS_DEBUG, " Entry Point %p\n", (void *)
217 (intptr_t)segment.load_addr);
218
219 *entry = segment.load_addr;
220 /* Per definition, a payload always has the entry point
221 * as last segment. Thus, we use the occurrence of the
222 * entry point as break condition for the loop.
223 */
224 return 0;
225
226 default:
227 /* We found something that we don't know about. Throw
228 * hands into the sky and run away!
229 */

Callers 1

selfload_mappedFunction · 0.85

Calls 4

last_loadable_segmentFunction · 0.85
load_one_segmentFunction · 0.85
printkFunction · 0.50

Tested by

no test coverage detected