OLD | NEW |
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Utility for manipulating firmware screen block (BMPBLOCK) in GBB. | 5 // Utility for manipulating firmware screen block (BMPBLOCK) in GBB. |
6 // | 6 // |
7 | 7 |
8 #include "bmpblk_utility.h" | 8 #include "bmpblk_utility.h" |
9 | 9 |
10 #include <assert.h> | 10 #include <assert.h> |
11 #include <errno.h> | 11 #include <errno.h> |
12 #include <getopt.h> | 12 #include <getopt.h> |
| 13 #include <lzma.h> |
13 #include <stdarg.h> | 14 #include <stdarg.h> |
14 #include <stdio.h> | 15 #include <stdio.h> |
15 #include <stdlib.h> | 16 #include <stdlib.h> |
16 #include <string.h> | 17 #include <string.h> |
17 #include <yaml.h> | 18 #include <yaml.h> |
18 | 19 |
19 extern "C" { | 20 extern "C" { |
20 #include "eficompress.h" | 21 #include "eficompress.h" |
21 } | 22 } |
22 | 23 |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 if (EFI_SUCCESS != EfiCompress((uint8_t *)content.c_str(), tmpsize, | 320 if (EFI_SUCCESS != EfiCompress((uint8_t *)content.c_str(), tmpsize, |
320 tmpbuf, &tmpsize)) { | 321 tmpbuf, &tmpsize)) { |
321 error("Unable to compress!\n"); | 322 error("Unable to compress!\n"); |
322 } | 323 } |
323 it->second.data.compression = compression_; | 324 it->second.data.compression = compression_; |
324 it->second.compressed_content.assign((const char *)tmpbuf, tmpsize); | 325 it->second.compressed_content.assign((const char *)tmpbuf, tmpsize); |
325 it->second.data.compressed_size = tmpsize; | 326 it->second.data.compressed_size = tmpsize; |
326 free(tmpbuf); | 327 free(tmpbuf); |
327 } | 328 } |
328 break; | 329 break; |
| 330 case COMPRESS_LZMA1: |
| 331 { |
| 332 // Calculate the worst case of buffer size. |
| 333 uint32_t tmpsize = lzma_stream_buffer_bound(content.size()); |
| 334 uint8_t *tmpbuf = (uint8_t *)malloc(tmpsize); |
| 335 lzma_stream stream = LZMA_STREAM_INIT; |
| 336 lzma_options_lzma options; |
| 337 lzma_ret result; |
| 338 |
| 339 lzma_lzma_preset(&options, 9); |
| 340 result = lzma_alone_encoder(&stream, &options); |
| 341 if (result != LZMA_OK) { |
| 342 error("Unable to initialize easy encoder (error: %d)!\n", result); |
| 343 } |
| 344 |
| 345 stream.next_in = (uint8_t *)content.data(); |
| 346 stream.avail_in = content.size(); |
| 347 stream.next_out = tmpbuf; |
| 348 stream.avail_out = tmpsize; |
| 349 result = lzma_code(&stream, LZMA_FINISH); |
| 350 if (result != LZMA_STREAM_END) { |
| 351 error("Unable to encode data (error: %d)!\n", result); |
| 352 } |
| 353 |
| 354 it->second.data.compression = compression_; |
| 355 it->second.compressed_content.assign((const char *)tmpbuf, |
| 356 tmpsize - stream.avail_out); |
| 357 it->second.data.compressed_size = tmpsize - stream.avail_out; |
| 358 lzma_end(&stream); |
| 359 free(tmpbuf); |
| 360 } |
| 361 break; |
329 default: | 362 default: |
330 error("Unsupported compression method attempted.\n"); | 363 error("Unsupported compression method attempted.\n"); |
331 } | 364 } |
332 } | 365 } |
333 } | 366 } |
334 | 367 |
335 const string BmpBlockUtil::read_image_file(const char *filename) { | 368 const string BmpBlockUtil::read_image_file(const char *filename) { |
336 string content; | 369 string content; |
337 vector<char> buffer; | 370 vector<char> buffer; |
338 | 371 |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 static void usagehelp_exit(const char *prog_name) { | 561 static void usagehelp_exit(const char *prog_name) { |
529 printf( | 562 printf( |
530 "\n" | 563 "\n" |
531 "To create a new BMPBLOCK file using config from YAML file:\n" | 564 "To create a new BMPBLOCK file using config from YAML file:\n" |
532 "\n" | 565 "\n" |
533 " %s [-z NUM] -c YAML BMPBLOCK\n" | 566 " %s [-z NUM] -c YAML BMPBLOCK\n" |
534 "\n" | 567 "\n" |
535 " -z NUM = compression algorithm to use\n" | 568 " -z NUM = compression algorithm to use\n" |
536 " 0 = none\n" | 569 " 0 = none\n" |
537 " 1 = EFIv1\n" | 570 " 1 = EFIv1\n" |
538 " 2 = TBD\n" | 571 " 2 = LZMA1\n" |
539 "\n", prog_name); | 572 "\n", prog_name); |
540 printf( | 573 printf( |
541 "To display the contents of a BMPBLOCK:\n" | 574 "To display the contents of a BMPBLOCK:\n" |
542 "\n" | 575 "\n" |
543 " %s [-y] BMPBLOCK\n" | 576 " %s [-y] BMPBLOCK\n" |
544 "\n" | 577 "\n" |
545 " -y = display as yaml\n" | 578 " -y = display as yaml\n" |
546 "\n", prog_name); | 579 "\n", prog_name); |
547 printf( | 580 printf( |
548 "To unpack a BMPBLOCK file:\n" | 581 "To unpack a BMPBLOCK file:\n" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 else if (extract_mode) { | 678 else if (extract_mode) { |
646 return dump_bmpblock(bmpblock_fn, 1, extract_dir, overwrite); | 679 return dump_bmpblock(bmpblock_fn, 1, extract_dir, overwrite); |
647 } else { | 680 } else { |
648 return dump_bmpblock(bmpblock_fn, show_as_yaml, 0, 0); | 681 return dump_bmpblock(bmpblock_fn, show_as_yaml, 0, 0); |
649 } | 682 } |
650 | 683 |
651 return 0; | 684 return 0; |
652 } | 685 } |
653 | 686 |
654 #endif // WITH_UTIL_MAIN | 687 #endif // WITH_UTIL_MAIN |
OLD | NEW |