apply_efi_prefix.pl 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/usr/bin/perl -w
  2. #
  3. # Program to apply an efi header to an ia64 etherboot file.
  4. #
  5. # GPL Eric Biederman 2002
  6. #
  7. use strict;
  8. use bytes;
  9. main(@ARGV);
  10. sub usage
  11. {
  12. my ($err) = @_;
  13. print STDERR $err , "\n";
  14. die "Usage $0 prrefix file bss_size\n";
  15. }
  16. sub main
  17. {
  18. my ($prefix_name, $suffix_name, $bss_size) = @_;
  19. usage("No prefix") unless (defined($prefix_name));
  20. usage("No suffix") unless (defined($suffix_name));
  21. usage("No bss size") unless (defined($bss_size));
  22. open(PREFIX, "<$prefix_name") or die "Cannot open $prefix_name";
  23. open(SUFFIX, "<$suffix_name") or die "Cannot open $suffix_name";
  24. $/ = undef;
  25. my $prefix = <PREFIX>; close(PREFIX);
  26. my $suffix = <SUFFIX>; close(SUFFIX);
  27. # Payload sizes.
  28. my $payload_size = length($suffix);
  29. my $payload_bss = $bss_size;
  30. # Update the image size
  31. my $hdr_off = unpack("V",substr($prefix, 0x3c, 4));
  32. my $image_size_off = 0x050 + $hdr_off;
  33. my $img_mem_size_off = 0x0c0 + $hdr_off;
  34. my $img_size_off = 0x0c8 + $hdr_off;
  35. my $image_size = unpack("V", substr($prefix, $image_size_off, 4));
  36. my $img_mem_size = unpack("V", substr($prefix, $img_mem_size_off, 4));
  37. my $img_size = unpack("V", substr($prefix, $img_size_off, 4));
  38. $image_size += $payload_size + $payload_bss;
  39. $img_mem_size += $payload_size + $payload_bss;
  40. $img_size += $payload_size;
  41. substr($prefix, $image_size_off, 4) = pack("V", $image_size);
  42. substr($prefix, $img_mem_size_off, 4) = pack("V", $img_mem_size);
  43. substr($prefix, $img_size_off, 4) = pack("V", $img_size);
  44. #print(STDERR "image_size: $image_size\n");
  45. #print(STDERR "img_mem_size: $img_mem_size\n");
  46. #print(STDERR "img_size: $img_size\n");
  47. print $prefix;
  48. print $suffix;
  49. }