| 170 | } |
| 171 | |
| 172 | static 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 | */ |
no test coverage detected