Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: client/common_lib/gbb_util.py

Issue 3350021: Generate GBB during factory instead of writing a prebuilt GBB. (Closed) Base URL: http://git.chromium.org/git/autotest.git
Patch Set: Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Provides convenience routines to access the GBB on the current BIOS. 6 """Provides convenience routines to access the GBB on the current BIOS.
7 7
8 GBBUtility is a wrapper of gbb_utility program. 8 GBBUtility is a wrapper of gbb_utility program.
9 """ 9 """
10 10
(...skipping 10 matching lines...) Expand all
21 21
22 It accesses the GBB on the current BIOS image. 22 It accesses the GBB on the current BIOS image.
23 """ 23 """
24 def __init__(self, 24 def __init__(self,
25 gbb_command='gbb_utility', 25 gbb_command='gbb_utility',
26 temp_dir=None, 26 temp_dir=None,
27 keep_temp_files=False): 27 keep_temp_files=False):
28 self._gbb_command = gbb_command 28 self._gbb_command = gbb_command
29 self._temp_dir = temp_dir 29 self._temp_dir = temp_dir
30 self._keep_temp_files = keep_temp_files 30 self._keep_temp_files = keep_temp_files
31 self._bios_file = None 31 self._need_commit = False
32 self._clear_cached()
32 33
33 34
34 def __del__(self): 35 def __del__(self):
35 if self._bios_file: 36 if self._gbb_file:
36 self._remove_temp_file(self._bios_file) 37 self._remove_temp_file(self._gbb_file)
38 if self._need_commit:
39 raise error.TestError(
40 'You changed somethings; should commit or discard them.')
37 41
38 42
39 def _get_temp_filename(self, prefix='tmp'): 43 def _clear_cached(self):
44 if self._gbb_file:
45 self._remove_temp_file(self._gbb_file)
46 self._gbb_file = None
47 self._bmpfv = None
48 self._recoverykey = None
49 self._rootkey = None
50 self._hwid = None
51
52
53 def _get_temp_filename(self, prefix='tmp_'):
40 """Returns the name of a temporary file in self._temp_dir.""" 54 """Returns the name of a temporary file in self._temp_dir."""
41 (fd, name) = tempfile.mkstemp(prefix=prefix, dir=self._temp_dir) 55 (fd, name) = tempfile.mkstemp(prefix=prefix, dir=self._temp_dir)
42 os.close(fd) 56 os.close(fd)
43 return name 57 return name
44 58
45 59
46 def _remove_temp_file(self, filename): 60 def _remove_temp_file(self, filename):
47 """Removes a temporary file if self._keep_temp_files is false.""" 61 """Removes a temporary file if self._keep_temp_files is false."""
48 if self._keep_temp_files: 62 if self._keep_temp_files:
49 return 63 return
50 if os.path.exists(filename): 64 if os.path.exists(filename):
51 os.remove(filename) 65 os.remove(filename)
52 66
53 67
54 def _read_bios(self, force=False): 68 def _get_current_gbb_file(self):
55 """Reads the BIOS to a file, self._bios_file.""" 69 """Gets the GBB in BIOS to a file, self._gbb_file."""
56 if not self._bios_file or force: 70 if not self._gbb_file:
57 flashrom = flashrom_util.flashrom_util() 71 flashrom = flashrom_util.FlashromUtility()
58 if not flashrom.select_bios_flashrom(): 72 flashrom.initialize(flashrom.TARGET_BIOS)
59 raise error.TestError('Unable to select BIOS flashrom') 73
60 bios_file = self._get_temp_filename('bios') 74 gbb_data = flashrom.read_section('FV_GBB')
61 if not flashrom.read_whole_to_file(bios_file): 75 gbb_file = self._get_temp_filename('current_gbb_')
62 raise error.TestError('Unable to read the BIOS image') 76 utils.open_write_close(gbb_file, gbb_data)
63 self._bios_file = bios_file 77 self._gbb_file = gbb_file
78
79 return self._gbb_file
64 80
65 81
66 def _run_gbb_utility(self, args='', output_file=''): 82 def _run_gbb_utility(self, args, output_file=''):
67 """Runs gbb_utility on the current BIOS firmware data.""" 83 """Runs gbb_utility on the current BIOS firmware data."""
68 self._read_bios() 84 gbb_file = self._get_current_gbb_file()
69 cmd = 'gbb_utility %s "%s" "%s"' % (args, self._bios_file, 85 cmd = 'gbb_utility %s "%s" "%s"' % (args, gbb_file, output_file)
70 output_file)
71 result = utils.system_output(cmd) 86 result = utils.system_output(cmd)
72 return result 87 return result
73 88
74 89
75 def _get_gbb_value(self, key): 90 def _get_gbb_value(self, key):
76 """Gets the GBB value which needs to be output to a file in gbb_utility. 91 """Gets the GBB value which needs to be output to a file in gbb_utility.
77 92
78 @param key: The key of the value you want to get. Should be 'bmfv', 93 @param key: The key of the value you want to get. Should be 'bmfv',
79 'recoverykey', or 'rootkey'. 94 'recoverykey', or 'rootkey'.
80 @return: The returned GBB value. 95 @return: The returned GBB value.
81 """ 96 """
82 value_file = self._get_temp_filename(key) 97 value_file = self._get_temp_filename('get_%s_' % key)
83 self._run_gbb_utility('--get --%s=%s' % (key, value_file)) 98 self._run_gbb_utility('--get --%s=%s' % (key, value_file))
84 with open(value_file, 'rb') as f: 99 value = utils.read_file(value_file)
85 value = f.read()
86 self._remove_temp_file(value_file) 100 self._remove_temp_file(value_file)
87 return value 101 return value
88 102
89 103
90 def get_bmpfv(self): 104 def get_bmpfv(self):
91 return self._get_gbb_value('bmpfv') 105 if not self._bmpfv:
106 self._bmpfv = self._get_gbb_value('bmpfv')
107 return self._bmpfv
92 108
93 109
94 def get_hwid(self): 110 def get_hwid(self):
95 result = _self._run_gbb_utility(self, '--get --hwid') 111 if not self._hwid:
96 return result.strip().partition('hardware_id: ')[2] 112 result = _self._run_gbb_utility(self, '--get --hwid')
113 self._hwid = result.strip().partition('hardware_id: ')[2]
114 return self._hwid
97 115
98 116
99 def get_recoverykey(self): 117 def get_recoverykey(self):
100 return self._get_gbb_value('recoverykey') 118 if not self._recoverykey:
119 self._recoverykey = self._get_gbb_value('recoverykey')
120 return self._recoverykey
101 121
102 122
103 def get_rootkey(self): 123 def get_rootkey(self):
104 return self._get_gbb_value('rootkey') 124 if not self._rootkey:
125 self._rootkey = self._get_gbb_value('rootkey')
126 return self._rootkey
127
128
129 def set_bmpfv(self, bmpfv):
130 self._bmpfv = bmpfv
131 self._need_commit = True
132
133
134 def set_hwid(self, hwid):
135 self._hwid = hwid
136 self._need_commit = True
137
138
139 def set_recoverykey(self, recoverykey):
140 self._recoverykey = recoverykey
141 self._need_commit = True
142
143
144 def set_rootkey(self, rootkey):
145 self._rootkey = rootkey
146 self._need_commit = True
147
148
149 def commit(self):
150 """Commit all changes to the current BIOS."""
151 if self._need_commit:
152 args = '--set'
153 if self._bmpfv:
154 bmpfv_file = self._get_temp_filename('set_bmpfv_')
155 utils.open_write_close(bmpfv_file, self._bmpfv)
156 args += ' --bmpfv=%s' % bmpfv_file
157 if self._hwid:
158 args += ' --hwid="%s"' % self._hwid
159 if self._recoverykey:
160 recoverykey_file = self._get_temp_filename('set_recoverykey_')
161 utils.open_write_close(recoverykey_file, self._recoverykey)
162 args += ' --recoverykey=%s' % recoverykey_file
163 if self._rootkey:
164 rootkey_file = self._get_temp_filename('set_rootkey_')
165 utils.open_write_close(rootkey_file, self._rootkey)
166 args += ' --rootkey=%s' % rootkey_file
167
168 flashrom = flashrom_util.FlashromUtility()
169 flashrom.initialize(flashrom.TARGET_BIOS)
170
171 new_gbb_file = self._get_temp_filename('new_gbb_')
172 self._run_gbb_utility(args, output_file=new_gbb_file)
173 new_gbb = utils.read_file(new_gbb_file)
174
175 flashrom.write_section('FV_GBB', new_gbb)
176 flashrom.commit()
177
178 if self._bmpfv:
179 self._remove_temp_file(bmpfv_file)
180 if self._recoverykey:
181 self._remove_temp_file(recoverykey_file)
182 if self._rootkey:
183 self._remove_temp_file(rootkey_file)
184 self._need_commit = False
185 self._clear_cached()
186
187
188 def discard(self):
189 """Discard all uncommitted changes."""
190 if self._need_commit:
191 self._need_commit = False
192 self._clear_cached()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698