summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChe-Liang Chiou <clchiou@chromium.org>2011-08-15 12:18:38 +0800
committerChe-Liang Chiou <clchiou@chromium.org>2011-08-15 03:39:43 -0700
commit49446d8489acfd01c642568d5af6e4b36f5a0fef (patch)
tree5ec80f591d3a3365ca269a386ff30ce401c6ecd5
parent010630f18c8880b80e564fc6a0bcf8e5eb7f9de6 (diff)
downloadvboot-49446d8489acfd01c642568d5af6e4b36f5a0fef.tar.gz
obsolete pack_firmware_image
The firmware image packing is now done by cros_bundle_firmware of cros-devutils package, and we may retire pack_firmware_image. BUG=none TEST=emerge vboot_reference && [ ! -x /usr/bin/pack_firmware_image ] Change-Id: I177508bf8aada822535fe61258cd1a0df52bfac6 Reviewed-on: http://gerrit.chromium.org/gerrit/5979 Tested-by: Che-Liang Chiou <clchiou@chromium.org> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--utility/Makefile5
-rwxr-xr-xutility/pack_firmware_image309
2 files changed, 0 insertions, 314 deletions
diff --git a/utility/Makefile b/utility/Makefile
index 6e7af055..88c8a5b4 100644
--- a/utility/Makefile
+++ b/utility/Makefile
@@ -36,7 +36,6 @@ TARGET_NAMES = crossystem \
dev_sign_file \
dump_fmap \
dev_debug_vboot \
- pack_firmware_image \
vbutil_what_keys
ifeq ($(MINIMAL),)
@@ -145,10 +144,6 @@ ${BUILD_ROOT}/dev_sign_file: dev_sign_file.c $(LIBS)
${BUILD_ROOT}/dump_fmap: dump_fmap.c $(LIBS)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)
-${BUILD_ROOT}/pack_firmware_image: pack_firmware_image
- cp -f $< $@
- chmod +x $@
-
install: $(TARGET_BINS)
mkdir -p $(DESTDIR)
cp -f $(TARGET_BINS) $(DESTDIR)
diff --git a/utility/pack_firmware_image b/utility/pack_firmware_image
deleted file mode 100755
index 1ca1b326..00000000
--- a/utility/pack_firmware_image
+++ /dev/null
@@ -1,309 +0,0 @@
-#!/usr/bin/env python2.6
-
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import re
-import struct
-import subprocess
-import sys
-import tempfile
-
-# TODO(clchiou): Rewrite this part after official flashmap implementation is
-# pulled into Chromium OS code base
-
-# constants imported from lib/fmap.h
-FMAP_SIGNATURE = "__FMAP__"
-FMAP_VER_MAJOR = 1
-FMAP_VER_MINOR = 0
-FMAP_STRLEN = 32
-
-FMAP_AREA_STATIC = 1 << 0
-FMAP_AREA_COMPRESSED = 1 << 1
-FMAP_AREA_RO = 1 << 2
-
-FMAP_HEADER_FORMAT = "<8sBBQI%dsH" % (FMAP_STRLEN)
-FMAP_AREA_FORMAT = "<II%dsH" % (FMAP_STRLEN)
-
-FMAP_HEADER_NAMES = (
- 'signature',
- 'ver_major',
- 'ver_minor',
- 'base',
- 'size',
- 'name',
- 'nareas',
-)
-
-FMAP_AREA_NAMES = (
- 'offset',
- 'size',
- 'name',
- 'flags',
-)
-
-RE_ASSIGNMENT = re.compile(r'^(\w+)=(.*)$')
-
-VERBOSE = False
-
-
-class ConfigError(Exception):
- pass
-
-
-class PackError(Exception):
- pass
-
-
-class Entry(dict):
-
- @staticmethod
- def _CheckFields(kwargs, fields):
- for f in fields:
- if f not in kwargs:
- raise ConfigError('Entry: missing required field: %s' % f)
-
- def __init__(self, **kwargs):
- Entry._CheckFields(kwargs, ('offset', 'length', 'name'))
- super(Entry, self).__init__(kwargs)
-
- def __getattr__(self, name):
- return self[name]
-
- def IsOverlapped(self, entry):
- return (entry.offset <= self.offset < entry.offset + entry.length or
- self.offset <= entry.offset < self.offset + self.length)
-
- def Pack(self, firmware_image, entries):
- raise PackError('class Entry does not implement Pack()')
-
-
-class EntryFmapArea(Entry):
-
- def __init__(self, **kwargs):
- Entry._CheckFields(kwargs, ('flags',))
- super(EntryFmapArea, self).__init__(**kwargs)
-
- def Pack(self, firmware_image, entries):
- pass
-
-
-class EntryFmap(EntryFmapArea):
-
- def __init__(self, **kwargs):
- Entry._CheckFields(kwargs, ('ver_major', 'ver_minor', 'base', 'size'))
- super(EntryFmap, self).__init__(**kwargs)
-
- def Pack(self, firmware_image, entries):
- # prepare header areas
- areas = []
- for e in entries:
- areas.append(dict((name, e[name] if name != 'size' else e['length'])
- for name in FMAP_AREA_NAMES))
-
- # prepare header
- obj = {'areas':areas}
- for name in FMAP_HEADER_NAMES:
- if name == 'nareas':
- v = len(areas)
- elif name == 'signature':
- v = FMAP_SIGNATURE
- else:
- v = self[name]
- obj[name] = v
-
- blob = fmap_encode(obj)
-
- if len(blob) > self.length:
- raise PackError('fmap too large: %d > %d' % (len(blob), self.length))
-
- firmware_image.seek(self.offset)
- firmware_image.write(blob)
-
-
-class EntryWiped(EntryFmapArea):
-
- def __init__(self, **kwargs):
- Entry._CheckFields(kwargs, ('wipe_value',))
- super(EntryWiped, self).__init__(**kwargs)
- if type(self.wipe_value) is int:
- try:
- self.wipe_value = chr(self.wipe_value)
- except ValueError as e:
- raise PackError('cannot convert wipe_value to a character: %s' % str(e))
- elif type(self.wipe_value) is str:
- if len(self.wipe_value) != 1:
- raise PackError('wipe_value out of range [00:ff]: %s' %
- repr(self.wipe_value))
- else:
- raise PackError('wipe_value is neither int nor str: %s' %
- repr(self.wipe_value))
-
- def Pack(self, firmware_image, entries):
- firmware_image.seek(self.offset)
- firmware_image.write(self.wipe_value * self.length)
-
-
-class EntryBlobString(EntryFmapArea):
-
- def __init__(self, **kwargs):
- Entry._CheckFields(kwargs, ('value',))
- super(EntryBlobString, self).__init__(**kwargs)
-
- def Pack(self, firmware_image, entries):
- if len(self.value) > self.length:
- raise PackError('string too large: len(%s) > %d' %
- (self.value, self.length))
- firmware_image.seek(self.offset)
- firmware_image.write(self.value)
-
-
-class EntryBlob(EntryFmapArea):
-
- def __init__(self, **kwargs):
- Entry._CheckFields(kwargs, ('path',))
- super(EntryBlob, self).__init__(**kwargs)
-
- def Pack(self, firmware_image, entries):
- size = os.stat(self.path).st_size
- if size > self.length:
- raise PackError('blob too large: %s: %d > %d' %
- (self.path, size, self.length))
- if size == 0: # special case for files like /dev/zero
- size = self.length
- with open(self.path, 'rb') as blob_image:
- firmware_image.seek(self.offset)
- firmware_image.write(blob_image.read(size))
-
-
-class EntryKeyBlock(EntryFmapArea):
-
- stdout = None
- stderr = None
-
- def __init__(self, **kwargs):
- Entry._CheckFields(kwargs,
- ('keyblock', 'signprivate', 'version', 'fv', 'kernelkey'))
- super(EntryKeyBlock, self).__init__(**kwargs)
- if VERBOSE:
- EntryKeyBlock.stdout = sys.stdout
- EntryKeyBlock.stderr = sys.stderr
-
- def Pack(self, firmware_image, entries):
- fd, path = tempfile.mkstemp()
- try:
- args = [
- 'vbutil_firmware',
- '--vblock', path,
- '--keyblock', self.keyblock,
- '--signprivate', self.signprivate,
- '--version', '%d' % self.version,
- '--fv', self.fv,
- '--kernelkey', self.kernelkey,
- ]
- _Info('run: %s' % ' '.join(args))
- proc = subprocess.Popen(args,
- stdout=EntryKeyBlock.stdout, stderr=EntryKeyBlock.stderr)
- proc.wait()
- if proc.returncode != 0:
- raise PackError('cannot make key block: vbutil_firmware returns %d' %
- proc.returncode)
-
- size = os.stat(path).st_size
- if size > self.length:
- raise PackError('key block too large: %d > %d' % (size, self.length))
-
- with open(path, 'rb') as keyblock_image:
- firmware_image.seek(self.offset)
- firmware_image.write(keyblock_image.read())
- finally:
- os.unlink(path)
-
-
-# TODO(clchiou): Keep fmap_encode interface compatible with official's flashmap
-# implementation, and remove it after it is pulled in.
-def fmap_encode(obj):
- def _FormatBlob(format, names, obj):
- return struct.pack(format, *(obj[name] for name in names))
- obj['nareas'] = len(obj['areas'])
- blob = _FormatBlob(FMAP_HEADER_FORMAT, FMAP_HEADER_NAMES, obj)
- for area in obj['areas']:
- blob = blob + _FormatBlob(FMAP_AREA_FORMAT, FMAP_AREA_NAMES, area)
- return blob
-
-
-def parse_assignment(stmt):
- m = RE_ASSIGNMENT.match(stmt)
- if m is None:
- raise ConfigError('illegal statement: %s' % repr(stmt))
- return (m.group(1), parse_value(m.group(2)))
-
-
-def parse_value(expr):
- if ((expr.startswith('"') and expr.endswith('"')) or
- (expr.startswith("'") and expr.endswith("'"))):
- return expr[1:-1] # if it is quoted, always interpreted as string literals
- try:
- return int(expr, 0)
- except ValueError:
- return expr # if not a number, interpret as string literals
-
-
-def pack_firmware_image(entries, output_path, image_size):
- entries = sorted(entries, key=lambda e: e.offset)
- for e1, e2 in zip(entries, entries[1:]):
- # Allow overlap between "pure" fmap areas, but not any of its subclasses
- # Here we exploit the fact that Entry is a new-style class
- if (e1.IsOverlapped(e2) and
- type(e1) is not EntryFmapArea and type(e2) is not EntryFmapArea):
- raise PackError('overlapped entries: [%08x:%08x], [%08x:%08x]' %
- (e1.offset, e1.offset + e1.length, e2.offset, e2.offset + e2.length))
-
- with open(output_path, 'wb') as firmware_image:
- # resize firmware image file
- firmware_image.seek(0)
- firmware_image.write('\0' * image_size)
-
- for entry in entries:
- entry.Pack(firmware_image, entries)
-
-
-def _Info(msg):
- if VERBOSE:
- print >>sys.stderr, 'INFO: %s' % msg
-
-
-def main():
- global VERBOSE
-
- if len(sys.argv) < 2:
- print 'Usage: %s [-v] CONFIG_FILE [NAME=VALUE...]' % sys.argv[0]
- sys.exit(1)
-
- if sys.argv[1] == '-v':
- VERBOSE = True
- argv = sys.argv[0:1] + sys.argv[2:]
- else:
- argv = sys.argv
-
- if len(argv) > 2:
- env = dict(parse_assignment(stmt) for stmt in argv[2:])
- else:
- env = {}
-
- execfile(argv[1], globals(), env)
-
- for varname in ('ENTRIES', 'OUTPUT', 'SIZE'):
- if varname not in env:
- raise ConfigError('undefined variable: %s' % varname)
- _Info('%s = %s' % (varname, repr(env[varname])))
-
- pack_firmware_image(env['ENTRIES'], env['OUTPUT'], env['SIZE'])
-
- sys.exit(0)
-
-
-if __name__ == '__main__':
- main()