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

Function cbfs_payload_decompress

util/cbfstool/cbfs_image.c:840–930  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

838}
839
840static int cbfs_payload_decompress(struct cbfs_payload_segment *segments,
841 struct buffer *buff, int num_seg)
842{
843 struct buffer new_buffer;
844 struct buffer seg_buffer;
845 size_t new_buff_sz;
846 char *in_ptr;
847 char *out_ptr;
848 size_t new_offset;
849 decomp_func_ptr decompress;
850
851 new_offset = num_seg * sizeof(*segments);
852 new_buff_sz = num_seg * sizeof(*segments);
853
854 /* Find out and allocate the amount of memory occupied
855 * by the binary data */
856 for (int i = 0; i < num_seg; i++)
857 new_buff_sz += segments[i].mem_len;
858
859 if (buffer_create(&new_buffer, new_buff_sz, "decompressed_buff"))
860 return -1;
861
862 in_ptr = buffer_get(buff) + new_offset;
863 out_ptr = buffer_get(&new_buffer) + new_offset;
864
865 for (int i = 0; i < num_seg; i++) {
866 struct buffer tbuff;
867 size_t decomp_size;
868
869 /* Segments BSS and ENTRY do not have binary data. */
870 if (segments[i].type == PAYLOAD_SEGMENT_BSS ||
871 segments[i].type == PAYLOAD_SEGMENT_ENTRY) {
872 continue;
873 } else if (segments[i].type == PAYLOAD_SEGMENT_DEPRECATED_PARAMS) {
874 memcpy(out_ptr, in_ptr, segments[i].len);
875 segments[i].offset = new_offset;
876 new_offset += segments[i].len;
877 in_ptr += segments[i].len;
878 out_ptr += segments[i].len;
879 segments[i].compression = CBFS_COMPRESS_NONE;
880 continue;
881 }
882
883 /* The payload uses an unknown compression algorithm. */
884 decompress = decompression_function(segments[i].compression);
885 if (decompress == NULL) {
886 ERROR("Unknown decompression algorithm: %u\n",
887 segments[i].compression);
888 return -1;
889 }
890
891 if (buffer_create(&tbuff, segments[i].mem_len, "segment")) {
892 buffer_delete(&new_buffer);
893 return -1;
894 }
895
896 if (decompress(in_ptr, segments[i].len, buffer_get(&tbuff),
897 (int) buffer_size(&tbuff),

Callers 1

cbfs_payload_make_elfFunction · 0.85

Calls 8

buffer_createFunction · 0.85
buffer_getFunction · 0.85
decompression_functionFunction · 0.85
buffer_deleteFunction · 0.85
buffer_sizeFunction · 0.85
buffer_spliceFunction · 0.85
xdr_segsFunction · 0.85
memcpyFunction · 0.50

Tested by

no test coverage detected