blob: e04554a7d0553219c300b91b53da86914769e778 [file] [log] [blame]
Randall Spangler1cbf7052013-01-23 16:14:14 -08001/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
Randall Spangler391b3102011-09-02 11:28:24 -07002 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 *
5 * Tests for vboot_api_init
6 */
7
Bill Richardson0c3ba242013-03-29 11:09:30 -07008#include <stdint.h>
Randall Spangler391b3102011-09-02 11:28:24 -07009#include <stdio.h>
10#include <stdlib.h>
11
Bill Richardsonc8e4ff72011-11-10 13:31:39 -080012#include "gbb_header.h"
Randall Spangler391b3102011-09-02 11:28:24 -070013#include "host_common.h"
14#include "rollback_index.h"
15#include "test_common.h"
16#include "vboot_common.h"
17#include "vboot_nvstorage.h"
18#include "vboot_struct.h"
19
20/* Mock data */
21static VbCommonParams cparams;
22static VbInitParams iparams;
23static VbNvContext vnc;
24static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
Randall Spangler1cbf7052013-01-23 16:14:14 -080025static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
Randall Spangler391b3102011-09-02 11:28:24 -070026static uint64_t mock_timer;
27static int rollback_s3_retval;
28static int nv_write_called;
Bill Richardsonc8e4ff72011-11-10 13:31:39 -080029static GoogleBinaryBlockHeader gbb;
Bill Richardsonec8df162012-06-07 04:21:14 -070030static int mock_virt_dev_sw;
Bill Richardsonb75d8ad2012-05-17 13:26:05 -070031static uint32_t mock_tpm_version;
32static uint32_t mock_rfs_retval;
Randall Spangler723aed32013-01-23 16:30:54 -080033static int rfs_clear_tpm_request;
34static int rfs_disable_dev_request;
Randall Spangler391b3102011-09-02 11:28:24 -070035
36/* Reset mock data (for use before each test) */
Randall Spangler1cbf7052013-01-23 16:14:14 -080037static void ResetMocks(void)
38{
39 Memset(&cparams, 0, sizeof(cparams));
40 cparams.shared_data_size = sizeof(shared_data);
41 cparams.shared_data_blob = shared_data;
42 cparams.gbb_data = &gbb;
Bill Richardsonc8e4ff72011-11-10 13:31:39 -080043
Randall Spangler1cbf7052013-01-23 16:14:14 -080044 Memset(&gbb, 0, sizeof(gbb));
45 gbb.major_version = GBB_MAJOR_VER;
46 gbb.minor_version = GBB_MINOR_VER;
47 gbb.flags = 0;
Randall Spangler391b3102011-09-02 11:28:24 -070048
Randall Spangler1cbf7052013-01-23 16:14:14 -080049 Memset(&iparams, 0, sizeof(iparams));
Randall Spangler391b3102011-09-02 11:28:24 -070050
Randall Spangler1cbf7052013-01-23 16:14:14 -080051 Memset(&vnc, 0, sizeof(vnc));
52 VbNvSetup(&vnc);
53 VbNvTeardown(&vnc); /* So CRC gets generated */
Randall Spangler391b3102011-09-02 11:28:24 -070054
Randall Spangler1cbf7052013-01-23 16:14:14 -080055 Memset(&shared_data, 0, sizeof(shared_data));
56 VbSharedDataInit(shared, sizeof(shared_data));
Randall Spangler391b3102011-09-02 11:28:24 -070057
Randall Spangler1cbf7052013-01-23 16:14:14 -080058 mock_timer = 10;
59 rollback_s3_retval = TPM_SUCCESS;
60 nv_write_called = 0;
Bill Richardsonb75d8ad2012-05-17 13:26:05 -070061
Randall Spangler1cbf7052013-01-23 16:14:14 -080062 mock_virt_dev_sw = 0;
63 mock_tpm_version = 0x10001;
64 mock_rfs_retval = 0;
Randall Spangler723aed32013-01-23 16:30:54 -080065
66 rfs_clear_tpm_request = 0;
67 rfs_disable_dev_request = 0;
Randall Spangler391b3102011-09-02 11:28:24 -070068}
69
70/****************************************************************************/
71/* Mocked verification functions */
72
Randall Spangler1cbf7052013-01-23 16:14:14 -080073VbError_t VbExNvStorageRead(uint8_t *buf)
74{
75 Memcpy(buf, vnc.raw, sizeof(vnc.raw));
76 return VBERROR_SUCCESS;
Randall Spangler391b3102011-09-02 11:28:24 -070077}
78
Randall Spangler1cbf7052013-01-23 16:14:14 -080079VbError_t VbExNvStorageWrite(const uint8_t *buf)
80{
81 nv_write_called = 1;
82 Memcpy(vnc.raw, buf, sizeof(vnc.raw));
83 return VBERROR_SUCCESS;
Randall Spangler391b3102011-09-02 11:28:24 -070084}
85
Randall Spangler1cbf7052013-01-23 16:14:14 -080086uint64_t VbExGetTimer(void)
87{
88 /*
89 * Exponential-ish rather than linear time, so that subtracting any
90 * two mock values will yield a unique result.
91 */
92 uint64_t new_timer = mock_timer * 2 + 1;
93 VbAssert(new_timer > mock_timer); /* Make sure we don't overflow */
94 mock_timer = new_timer;
95 return mock_timer;
Randall Spangler391b3102011-09-02 11:28:24 -070096}
97
Randall Spangler1cbf7052013-01-23 16:14:14 -080098uint32_t RollbackS3Resume(void)
99{
100 return rollback_s3_retval;
Randall Spangler391b3102011-09-02 11:28:24 -0700101}
102
Bill Richardsonec8df162012-06-07 04:21:14 -0700103uint32_t RollbackFirmwareSetup(int recovery_mode, int is_hw_dev,
104 int disable_dev_request,
Randall Spangler29e88072012-06-19 10:03:53 -0700105 int clear_tpm_owner_request,
Bill Richardsonec8df162012-06-07 04:21:14 -0700106 /* two outputs on success */
Randall Spangler1cbf7052013-01-23 16:14:14 -0800107 int *is_virt_dev, uint32_t *version)
108{
Randall Spangler723aed32013-01-23 16:30:54 -0800109 rfs_clear_tpm_request = clear_tpm_owner_request;
110 rfs_disable_dev_request = disable_dev_request;
111
Randall Spangler1cbf7052013-01-23 16:14:14 -0800112 *is_virt_dev = mock_virt_dev_sw;
113 *version = mock_tpm_version;
114 return mock_rfs_retval;
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700115}
116
Randall Spangler391b3102011-09-02 11:28:24 -0700117/****************************************************************************/
118/* Test VbInit() and check expected return value and recovery reason */
Randall Spangler391b3102011-09-02 11:28:24 -0700119
Randall Spangler1cbf7052013-01-23 16:14:14 -0800120static void TestVbInit(VbError_t expected_retval,
121 uint8_t expected_recovery, const char *desc)
122{
123 uint32_t rr = 256;
124
125 TEST_EQ(VbInit(&cparams, &iparams), expected_retval, desc);
126 VbNvGet(&vnc, VBNV_RECOVERY_REQUEST, &rr);
127 TEST_EQ(rr, expected_recovery, " (recovery request)");
Randall Spangler391b3102011-09-02 11:28:24 -0700128}
129
130/****************************************************************************/
131
Randall Spangler1cbf7052013-01-23 16:14:14 -0800132static void VbInitTest(void)
133{
134 uint32_t u;
Randall Spangler391b3102011-09-02 11:28:24 -0700135
Randall Spangler1cbf7052013-01-23 16:14:14 -0800136 /* Test passing in too small a shared data area */
137 ResetMocks();
138 cparams.shared_data_size = VB_SHARED_DATA_MIN_SIZE - 1;
139 TestVbInit(VBERROR_INIT_SHARED_DATA, 0, "Shared data too small");
Randall Spangler391b3102011-09-02 11:28:24 -0700140
Randall Spangler1cbf7052013-01-23 16:14:14 -0800141 /* Normal call; dev=0 rec=0 */
142 ResetMocks();
143 TestVbInit(0, 0, "Normal call");
144 TEST_EQ(shared->timer_vb_init_enter, 21, " time enter");
145 TEST_EQ(shared->timer_vb_init_exit, 43, " time exit");
146 TEST_EQ(shared->flags, 0, " shared flags");
147 TEST_EQ(iparams.out_flags, 0, " out flags");
148 TEST_EQ(nv_write_called, 0,
149 " NV write not called since nothing changed");
Randall Spangler391b3102011-09-02 11:28:24 -0700150
Randall Spangler1cbf7052013-01-23 16:14:14 -0800151 /* If NV data is trashed, we initialize it */
152 ResetMocks();
153 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
154 /*
155 * Note that we're not doing a VbNvTeardown(), so the CRC hasn't been
156 * regenerated yet. So VbInit() should ignore the corrupted recovery
157 * value and boot normally.
158 */
159 TestVbInit(0, 0, "NV data trashed");
160 TEST_EQ(nv_write_called, 1, " NV write called");
Randall Spangler391b3102011-09-02 11:28:24 -0700161
Randall Spangler1cbf7052013-01-23 16:14:14 -0800162 /*
163 * Test boot switch flags which are just passed through to shared
164 * flags, and don't have an effect on VbInit().
165 */
166 ResetMocks();
167 iparams.flags = VB_INIT_FLAG_WP_ENABLED;
168 TestVbInit(0, 0, "Flags test WP");
169 TEST_EQ(shared->flags, VBSD_BOOT_FIRMWARE_WP_ENABLED,
Randall Spangler723aed32013-01-23 16:30:54 -0800170 " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700171
Randall Spangler1cbf7052013-01-23 16:14:14 -0800172 ResetMocks();
173 iparams.flags = VB_INIT_FLAG_SW_WP_ENABLED;
174 TestVbInit(0, 0, "Flags test SW WP");
175 TEST_EQ(shared->flags, VBSD_BOOT_FIRMWARE_SW_WP_ENABLED,
Randall Spangler723aed32013-01-23 16:30:54 -0800176 " shared flags");
Bill Richardson9dc62172012-08-28 15:00:51 -0700177
Randall Spangler1cbf7052013-01-23 16:14:14 -0800178 ResetMocks();
179 iparams.flags = VB_INIT_FLAG_RO_NORMAL_SUPPORT;
180 TestVbInit(0, 0, " flags test RO normal");
181 TEST_EQ(shared->flags, VBSD_BOOT_RO_NORMAL_SUPPORT,
Randall Spangler723aed32013-01-23 16:30:54 -0800182 " shared flags");
183
184 ResetMocks();
185 iparams.flags = VB_INIT_FLAG_EC_SOFTWARE_SYNC;
186 TestVbInit(0, 0, " flags test EC software sync");
187 TEST_EQ(shared->flags, VBSD_EC_SOFTWARE_SYNC, " shared flags");
188
189 ResetMocks();
190 iparams.flags = VB_INIT_FLAG_EC_SLOW_UPDATE;
191 TestVbInit(0, 0, " flags test EC slow update");
192 TEST_EQ(shared->flags, VBSD_EC_SLOW_UPDATE, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700193
Randall Spangler1cbf7052013-01-23 16:14:14 -0800194 /* S3 resume */
195 ResetMocks();
196 iparams.flags = VB_INIT_FLAG_S3_RESUME;
197 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
198 VbNvTeardown(&vnc);
199 /* S3 resume doesn't clear the recovery request (or act on it) */
200 TestVbInit(0, 123, "S3 resume");
201 TEST_EQ(shared->flags, VBSD_BOOT_S3_RESUME, " shared flags S3");
202 TEST_EQ(iparams.out_flags, 0, " out flags");
203 TEST_EQ(shared->recovery_reason, 0,
204 " S3 doesn't look at recovery request");
Randall Spangler391b3102011-09-02 11:28:24 -0700205
Randall Spangler1cbf7052013-01-23 16:14:14 -0800206 /* S3 resume with TPM resume error */
207 ResetMocks();
208 iparams.flags = VB_INIT_FLAG_S3_RESUME;
209 rollback_s3_retval = 1;
210 /* S3 resume doesn't clear the recovery request (or act on it) */
211 TestVbInit(VBERROR_TPM_S3_RESUME, 0, "S3 resume rollback error");
Randall Spangler391b3102011-09-02 11:28:24 -0700212
Randall Spangler1cbf7052013-01-23 16:14:14 -0800213 /*
214 * Normal boot doesn't care about TPM resume error because it doesn't
215 * call RollbackS3Resume().
216 */
217 ResetMocks();
218 rollback_s3_retval = 1;
219 TestVbInit(0, 0, "Normal doesn't S3 resume");
Randall Spangler391b3102011-09-02 11:28:24 -0700220
Randall Spangler1cbf7052013-01-23 16:14:14 -0800221 /* S3 resume with debug reset */
222 ResetMocks();
223 iparams.flags = VB_INIT_FLAG_S3_RESUME;
224 VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
225 VbNvTeardown(&vnc);
226 TestVbInit(0, 0, "S3 debug reset");
227 TEST_EQ(iparams.out_flags, VB_INIT_OUT_S3_DEBUG_BOOT, " out flags");
228 VbNvGet(&vnc, VBNV_DEBUG_RESET_MODE, &u);
229 TEST_EQ(u, 0, " S3 clears nv debug reset mode");
Randall Spangler391b3102011-09-02 11:28:24 -0700230
Randall Spangler1cbf7052013-01-23 16:14:14 -0800231 /* Normal boot clears S3 debug reset mode; doesn't set output flag */
232 ResetMocks();
233 VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
234 VbNvTeardown(&vnc);
235 TestVbInit(0, 0, "Normal with debug reset mode");
236 TEST_EQ(iparams.out_flags, 0, " out flags");
237 VbNvGet(&vnc, VBNV_DEBUG_RESET_MODE, &u);
238 TEST_EQ(u, 0, " normal clears nv debug reset mode");
Randall Spangler391b3102011-09-02 11:28:24 -0700239
Randall Spangler1cbf7052013-01-23 16:14:14 -0800240 /*
241 * S3 resume with debug reset is a normal boot, so doesn't resume the
242 * TPM.
243 */
244 ResetMocks();
245 iparams.flags = VB_INIT_FLAG_S3_RESUME;
246 rollback_s3_retval = 1;
247 VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
248 VbNvTeardown(&vnc);
249 TestVbInit(0, 0, "S3 debug reset rollback error");
Randall Spangler391b3102011-09-02 11:28:24 -0700250
Randall Spangler1cbf7052013-01-23 16:14:14 -0800251 /* Developer mode */
252 ResetMocks();
253 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
254 TestVbInit(0, 0, "Dev mode on");
255 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
256 TEST_EQ(iparams.out_flags,
257 VB_INIT_OUT_CLEAR_RAM |
258 VB_INIT_OUT_ENABLE_DISPLAY |
259 VB_INIT_OUT_ENABLE_USB_STORAGE |
260 VB_INIT_OUT_ENABLE_DEVELOPER |
261 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
262 TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700263
Randall Spangler1cbf7052013-01-23 16:14:14 -0800264 /* Developer mode forced by GBB flag */
265 ResetMocks();
266 iparams.flags = 0;
267 gbb.flags = GBB_FLAG_FORCE_DEV_SWITCH_ON;
268 TestVbInit(0, 0, "Dev mode via GBB");
269 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
270 TEST_EQ(iparams.out_flags,
271 VB_INIT_OUT_CLEAR_RAM |
272 VB_INIT_OUT_ENABLE_DISPLAY |
273 VB_INIT_OUT_ENABLE_USB_STORAGE |
274 VB_INIT_OUT_ENABLE_DEVELOPER |
275 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
276 TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags");
Randall Spangleracd6f462012-06-13 16:43:59 -0700277
Randall Spangler723aed32013-01-23 16:30:54 -0800278 /* Developer mode when option ROM matters and isn't loaded */
279 ResetMocks();
280 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON |
281 VB_INIT_FLAG_OPROM_MATTERS;
282 TestVbInit(VBERROR_VGA_OPROM_MISMATCH, 0, "Dev mode need oprom");
283 VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
284 TEST_EQ(u, 1, " oprom requested");
285
286 /* Developer mode when option ROM matters and is already loaded */
287 ResetMocks();
288 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON |
289 VB_INIT_FLAG_OPROM_MATTERS | VB_INIT_FLAG_OPROM_LOADED;
290 TestVbInit(0, 0, "Dev mode has oprom");
291
292 /* Normal mode when option ROM matters and is loaded */
293 ResetMocks();
294 VbNvSet(&vnc, VBNV_OPROM_NEEDED, 1);
295 VbNvTeardown(&vnc);
296 iparams.flags = VB_INIT_FLAG_OPROM_MATTERS | VB_INIT_FLAG_OPROM_LOADED;
297 TestVbInit(VBERROR_VGA_OPROM_MISMATCH, 0, "Normal mode with oprom");
298 VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
299 TEST_EQ(u, 0, " oprom not requested");
300
301 /* Option ROMs can be forced by GBB flag */
302 ResetMocks();
303 gbb.flags = GBB_FLAG_LOAD_OPTION_ROMS;
304 TestVbInit(0, 0, "GBB load option ROMs");
305 TEST_EQ(iparams.out_flags, VB_INIT_OUT_ENABLE_OPROM, " out flags");
306
307 /* If requiring signed only, don't enable alternate OS by default */
308 ResetMocks();
309 VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1);
310 VbNvTeardown(&vnc);
311 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
312 TestVbInit(0, 0, "Dev signed only");
313 TEST_EQ(iparams.out_flags,
314 VB_INIT_OUT_CLEAR_RAM |
315 VB_INIT_OUT_ENABLE_DISPLAY |
316 VB_INIT_OUT_ENABLE_USB_STORAGE |
317 VB_INIT_OUT_ENABLE_DEVELOPER, " out flags");
318
319 /* But that can be overridden by the GBB */
320 ResetMocks();
321 VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1);
322 VbNvTeardown(&vnc);
323 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
324 gbb.flags = GBB_FLAG_ENABLE_ALTERNATE_OS;
325 TestVbInit(0, 0, "Force option ROMs via GBB");
326 TEST_EQ(iparams.out_flags,
327 VB_INIT_OUT_CLEAR_RAM |
328 VB_INIT_OUT_ENABLE_DISPLAY |
329 VB_INIT_OUT_ENABLE_USB_STORAGE |
330 VB_INIT_OUT_ENABLE_DEVELOPER |
331 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
332
333 /* The GBB override is ignored in normal mode */
334 ResetMocks();
335 gbb.flags = GBB_FLAG_ENABLE_ALTERNATE_OS;
336 TestVbInit(0, 0, "Normal mode ignores forcing option ROMs via GBB");
337 TEST_EQ(iparams.out_flags, 0, " out flags");
338
Randall Spangler1cbf7052013-01-23 16:14:14 -0800339 /* Recovery mode from NV storage */
340 ResetMocks();
341 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
342 VbNvTeardown(&vnc);
343 TestVbInit(0, 0, "Recovery mode - from nv");
344 TEST_EQ(shared->recovery_reason, 123, " recovery reason");
345 TEST_EQ(iparams.out_flags,
346 VB_INIT_OUT_ENABLE_RECOVERY |
347 VB_INIT_OUT_CLEAR_RAM |
348 VB_INIT_OUT_ENABLE_DISPLAY |
349 VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags");
350 TEST_EQ(shared->flags, 0, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700351
Randall Spangler1cbf7052013-01-23 16:14:14 -0800352 /* Recovery mode from recovery button */
353 ResetMocks();
354 iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
355 TestVbInit(0, 0, "Recovery mode - button");
356 TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
357 " recovery reason");
358 TEST_EQ(iparams.out_flags,
359 VB_INIT_OUT_ENABLE_RECOVERY |
360 VB_INIT_OUT_CLEAR_RAM |
361 VB_INIT_OUT_ENABLE_DISPLAY |
362 VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags");
363 TEST_EQ(shared->flags, VBSD_BOOT_REC_SWITCH_ON, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700364
Randall Spangler1cbf7052013-01-23 16:14:14 -0800365 /* Recovery button reason supersedes NV reason */
366 ResetMocks();
367 iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
368 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
369 VbNvTeardown(&vnc);
370 TestVbInit(0, 0, "Recovery mode - button AND nv");
371 TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
372 " recovery reason");
Randall Spangler391b3102011-09-02 11:28:24 -0700373
Randall Spangler1cbf7052013-01-23 16:14:14 -0800374 /* Recovery mode from previous boot fail */
375 ResetMocks();
376 iparams.flags = VB_INIT_FLAG_PREVIOUS_BOOT_FAIL;
377 TestVbInit(0, 0, "Recovery mode - previous boot fail");
378 TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_FIRMWARE,
379 " recovery reason");
380 TEST_EQ(iparams.out_flags,
381 VB_INIT_OUT_ENABLE_RECOVERY |
382 VB_INIT_OUT_CLEAR_RAM |
383 VB_INIT_OUT_ENABLE_DISPLAY |
384 VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags");
385 TEST_EQ(shared->flags, 0, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700386
Randall Spangler1cbf7052013-01-23 16:14:14 -0800387 /* Recovery mode from NV supersedes previous boot fail */
388 ResetMocks();
389 iparams.flags = VB_INIT_FLAG_PREVIOUS_BOOT_FAIL;
390 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
391 VbNvTeardown(&vnc);
392 TestVbInit(0, 0, "Recovery mode - previous boot fail AND nv");
393 TEST_EQ(shared->recovery_reason, 123, " recovery reason");
Randall Spangler391b3102011-09-02 11:28:24 -0700394
Randall Spangler1cbf7052013-01-23 16:14:14 -0800395 /* Dev + recovery = recovery */
396 ResetMocks();
397 iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED |
398 VB_INIT_FLAG_DEV_SWITCH_ON;
399 TestVbInit(0, 0, "Recovery mode - button");
400 TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
401 " recovery reason");
402 TEST_EQ(iparams.out_flags,
403 VB_INIT_OUT_ENABLE_RECOVERY |
404 VB_INIT_OUT_CLEAR_RAM |
405 VB_INIT_OUT_ENABLE_DISPLAY |
406 VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags");
407 TEST_EQ(shared->flags,
408 VBSD_BOOT_REC_SWITCH_ON | VBSD_BOOT_DEV_SWITCH_ON,
409 " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700410}
411
Randall Spangler1cbf7052013-01-23 16:14:14 -0800412static void VbInitTestTPM(void)
413{
Randall Spangler723aed32013-01-23 16:30:54 -0800414 uint32_t u;
415
Randall Spangler1cbf7052013-01-23 16:14:14 -0800416 /* Rollback setup needs to reboot */
417 ResetMocks();
418 mock_rfs_retval = TPM_E_MUST_REBOOT;
419 TestVbInit(VBERROR_TPM_REBOOT_REQUIRED, 0,
420 "Rollback TPM reboot (rec=0)");
421 ResetMocks();
422 mock_rfs_retval = TPM_E_MUST_REBOOT;
423 iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
424 TestVbInit(VBERROR_TPM_REBOOT_REQUIRED, VBNV_RECOVERY_RO_TPM_REBOOT,
425 "Rollback TPM reboot, in recovery, first time");
426 /* Ignore if we already tried rebooting */
427 ResetMocks();
428 mock_rfs_retval = TPM_E_MUST_REBOOT;
429 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, VBNV_RECOVERY_RO_TPM_REBOOT);
430 VbNvTeardown(&vnc);
431 TestVbInit(0, 0, "Rollback TPM reboot, in recovery, already retried");
432 TEST_EQ(shared->fw_version_tpm, 0x10001, " shared fw_version_tpm");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700433
Randall Spangler1cbf7052013-01-23 16:14:14 -0800434 /* Other rollback setup errors */
435 ResetMocks();
436 mock_rfs_retval = TPM_E_IOERROR;
437 mock_tpm_version = 0x20002;
438 TestVbInit(VBERROR_TPM_FIRMWARE_SETUP, VBNV_RECOVERY_RO_TPM_S_ERROR,
439 "Rollback TPM setup error - not in recovery");
440 TEST_EQ(shared->fw_version_tpm, 0, " shared fw_version_tpm not set");
441 ResetMocks();
442 mock_rfs_retval = TPM_E_IOERROR;
443 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, VBNV_RECOVERY_US_TEST);
444 VbNvTeardown(&vnc);
445 TestVbInit(0, 0, "Rollback TPM setup error ignored in recovery");
446 TEST_EQ(shared->fw_version_tpm, 0x10001, " shared fw_version_tpm");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700447
Randall Spangler1cbf7052013-01-23 16:14:14 -0800448 /* Virtual developer switch, but not enabled. */
449 ResetMocks();
Randall Spangler723aed32013-01-23 16:30:54 -0800450 VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1);
451 VbNvTeardown(&vnc);
Randall Spangler1cbf7052013-01-23 16:14:14 -0800452 iparams.flags = VB_INIT_FLAG_VIRTUAL_DEV_SWITCH;
453 TestVbInit(0, 0, "TPM Dev mode off");
454 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
455 TEST_EQ(iparams.out_flags, 0, " out flags");
456 TEST_EQ(shared->flags, VBSD_HONOR_VIRT_DEV_SWITCH, " shared flags");
Randall Spangler723aed32013-01-23 16:30:54 -0800457 VbNvGet(&vnc, VBNV_DISABLE_DEV_REQUEST, &u);
458 TEST_EQ(u, 0, " disable dev request");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700459
Randall Spangler1cbf7052013-01-23 16:14:14 -0800460 /* Virtual developer switch, enabled. */
461 ResetMocks();
Randall Spangler723aed32013-01-23 16:30:54 -0800462 VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1);
463 VbNvTeardown(&vnc);
Randall Spangler1cbf7052013-01-23 16:14:14 -0800464 iparams.flags = VB_INIT_FLAG_VIRTUAL_DEV_SWITCH;
465 mock_virt_dev_sw = 1;
466 TestVbInit(0, 0, "TPM Dev mode on");
467 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
468 TEST_EQ(iparams.out_flags,
469 VB_INIT_OUT_CLEAR_RAM |
470 VB_INIT_OUT_ENABLE_DISPLAY |
471 VB_INIT_OUT_ENABLE_USB_STORAGE |
472 VB_INIT_OUT_ENABLE_DEVELOPER |
473 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
474 TEST_EQ(shared->flags,
475 VBSD_BOOT_DEV_SWITCH_ON | VBSD_HONOR_VIRT_DEV_SWITCH,
476 " shared flags");
Randall Spangler723aed32013-01-23 16:30:54 -0800477 /* Disable-request doesn't get cleared because dev mode is still on */
478 VbNvGet(&vnc, VBNV_DISABLE_DEV_REQUEST, &u);
479 TEST_EQ(u, 1, " disable dev request");
480 /* Disable request was passed on to RollbackFirmwareSetup() */
481 TEST_EQ(rfs_disable_dev_request, 1, " rfs disable dev");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700482
Randall Spangler1cbf7052013-01-23 16:14:14 -0800483 /* Ignore virtual developer switch, even though enabled. */
484 ResetMocks();
485 mock_virt_dev_sw = 1;
486 TestVbInit(0, 0, "TPM Dev mode on but ignored");
487 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
488 TEST_EQ(iparams.out_flags, 0, " out flags");
489 TEST_EQ(shared->flags, 0, " shared flags");
Bill Richardsonec8df162012-06-07 04:21:14 -0700490
Randall Spangler1cbf7052013-01-23 16:14:14 -0800491 /* HW dev switch on, no virtual developer switch */
492 ResetMocks();
493 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
494 TestVbInit(0, 0, "HW Dev mode on");
495 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
496 TEST_EQ(iparams.out_flags,
497 VB_INIT_OUT_CLEAR_RAM |
498 VB_INIT_OUT_ENABLE_DISPLAY |
499 VB_INIT_OUT_ENABLE_USB_STORAGE |
500 VB_INIT_OUT_ENABLE_DEVELOPER |
501 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
502 TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags");
Randall Spangler723aed32013-01-23 16:30:54 -0800503
504 /* Check TPM owner clear request */
505 ResetMocks();
506 VbNvSet(&vnc, VBNV_CLEAR_TPM_OWNER_REQUEST, 1);
507 VbNvTeardown(&vnc);
508 TestVbInit(0, 0, "TPM clear owner");
509 VbNvGet(&vnc, VBNV_CLEAR_TPM_OWNER_REQUEST, &u);
510 TEST_EQ(u, 0, " tpm clear request");
511 VbNvGet(&vnc, VBNV_CLEAR_TPM_OWNER_DONE, &u);
512 TEST_EQ(u, 1, " tpm clear request");
513 TEST_EQ(rfs_clear_tpm_request, 1, "rfs tpm clear request");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700514}
515
Randall Spangler1cbf7052013-01-23 16:14:14 -0800516int main(int argc, char *argv[])
517{
518 VbInitTest();
519 VbInitTestTPM();
Randall Spangler391b3102011-09-02 11:28:24 -0700520
Randall Spangler1cbf7052013-01-23 16:14:14 -0800521 return gTestSuccess ? 0 : 255;
Randall Spangler391b3102011-09-02 11:28:24 -0700522}