blob: bde10a7c6cd976f56836f07320a86462e1f6cea6 [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
8#include <stdio.h>
9#include <stdlib.h>
10
Bill Richardsonc8e4ff72011-11-10 13:31:39 -080011#include "gbb_header.h"
Randall Spangler391b3102011-09-02 11:28:24 -070012#include "host_common.h"
13#include "rollback_index.h"
14#include "test_common.h"
15#include "vboot_common.h"
16#include "vboot_nvstorage.h"
17#include "vboot_struct.h"
18
19/* Mock data */
20static VbCommonParams cparams;
21static VbInitParams iparams;
22static VbNvContext vnc;
23static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
Randall Spangler1cbf7052013-01-23 16:14:14 -080024static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
Randall Spangler391b3102011-09-02 11:28:24 -070025static uint64_t mock_timer;
26static int rollback_s3_retval;
27static int nv_write_called;
Bill Richardsonc8e4ff72011-11-10 13:31:39 -080028static GoogleBinaryBlockHeader gbb;
Bill Richardsonec8df162012-06-07 04:21:14 -070029static int mock_virt_dev_sw;
Bill Richardsonb75d8ad2012-05-17 13:26:05 -070030static uint32_t mock_tpm_version;
31static uint32_t mock_rfs_retval;
Randall Spangler723aed32013-01-23 16:30:54 -080032static int rfs_clear_tpm_request;
33static int rfs_disable_dev_request;
Randall Spangler391b3102011-09-02 11:28:24 -070034
35/* Reset mock data (for use before each test) */
Randall Spangler1cbf7052013-01-23 16:14:14 -080036static void ResetMocks(void)
37{
38 Memset(&cparams, 0, sizeof(cparams));
39 cparams.shared_data_size = sizeof(shared_data);
40 cparams.shared_data_blob = shared_data;
41 cparams.gbb_data = &gbb;
Bill Richardsonc8e4ff72011-11-10 13:31:39 -080042
Randall Spangler1cbf7052013-01-23 16:14:14 -080043 Memset(&gbb, 0, sizeof(gbb));
44 gbb.major_version = GBB_MAJOR_VER;
45 gbb.minor_version = GBB_MINOR_VER;
46 gbb.flags = 0;
Randall Spangler391b3102011-09-02 11:28:24 -070047
Randall Spangler1cbf7052013-01-23 16:14:14 -080048 Memset(&iparams, 0, sizeof(iparams));
Randall Spangler391b3102011-09-02 11:28:24 -070049
Randall Spangler1cbf7052013-01-23 16:14:14 -080050 Memset(&vnc, 0, sizeof(vnc));
51 VbNvSetup(&vnc);
52 VbNvTeardown(&vnc); /* So CRC gets generated */
Randall Spangler391b3102011-09-02 11:28:24 -070053
Randall Spangler1cbf7052013-01-23 16:14:14 -080054 Memset(&shared_data, 0, sizeof(shared_data));
55 VbSharedDataInit(shared, sizeof(shared_data));
Randall Spangler391b3102011-09-02 11:28:24 -070056
Randall Spangler1cbf7052013-01-23 16:14:14 -080057 mock_timer = 10;
58 rollback_s3_retval = TPM_SUCCESS;
59 nv_write_called = 0;
Bill Richardsonb75d8ad2012-05-17 13:26:05 -070060
Randall Spangler1cbf7052013-01-23 16:14:14 -080061 mock_virt_dev_sw = 0;
62 mock_tpm_version = 0x10001;
63 mock_rfs_retval = 0;
Randall Spangler723aed32013-01-23 16:30:54 -080064
65 rfs_clear_tpm_request = 0;
66 rfs_disable_dev_request = 0;
Randall Spangler391b3102011-09-02 11:28:24 -070067}
68
69/****************************************************************************/
70/* Mocked verification functions */
71
Randall Spangler1cbf7052013-01-23 16:14:14 -080072VbError_t VbExNvStorageRead(uint8_t *buf)
73{
74 Memcpy(buf, vnc.raw, sizeof(vnc.raw));
75 return VBERROR_SUCCESS;
Randall Spangler391b3102011-09-02 11:28:24 -070076}
77
Randall Spangler1cbf7052013-01-23 16:14:14 -080078VbError_t VbExNvStorageWrite(const uint8_t *buf)
79{
80 nv_write_called = 1;
81 Memcpy(vnc.raw, buf, sizeof(vnc.raw));
82 return VBERROR_SUCCESS;
Randall Spangler391b3102011-09-02 11:28:24 -070083}
84
Randall Spangler1cbf7052013-01-23 16:14:14 -080085uint64_t VbExGetTimer(void)
86{
87 /*
88 * Exponential-ish rather than linear time, so that subtracting any
89 * two mock values will yield a unique result.
90 */
91 uint64_t new_timer = mock_timer * 2 + 1;
92 VbAssert(new_timer > mock_timer); /* Make sure we don't overflow */
93 mock_timer = new_timer;
94 return mock_timer;
Randall Spangler391b3102011-09-02 11:28:24 -070095}
96
Randall Spangler1cbf7052013-01-23 16:14:14 -080097uint32_t RollbackS3Resume(void)
98{
99 return rollback_s3_retval;
Randall Spangler391b3102011-09-02 11:28:24 -0700100}
101
Bill Richardsonec8df162012-06-07 04:21:14 -0700102uint32_t RollbackFirmwareSetup(int recovery_mode, int is_hw_dev,
103 int disable_dev_request,
Randall Spangler29e88072012-06-19 10:03:53 -0700104 int clear_tpm_owner_request,
Bill Richardsonec8df162012-06-07 04:21:14 -0700105 /* two outputs on success */
Randall Spangler1cbf7052013-01-23 16:14:14 -0800106 int *is_virt_dev, uint32_t *version)
107{
Randall Spangler723aed32013-01-23 16:30:54 -0800108 rfs_clear_tpm_request = clear_tpm_owner_request;
109 rfs_disable_dev_request = disable_dev_request;
110
Randall Spangler1cbf7052013-01-23 16:14:14 -0800111 *is_virt_dev = mock_virt_dev_sw;
112 *version = mock_tpm_version;
113 return mock_rfs_retval;
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700114}
115
Randall Spangler391b3102011-09-02 11:28:24 -0700116/****************************************************************************/
117/* Test VbInit() and check expected return value and recovery reason */
Randall Spangler391b3102011-09-02 11:28:24 -0700118
Randall Spangler1cbf7052013-01-23 16:14:14 -0800119static void TestVbInit(VbError_t expected_retval,
120 uint8_t expected_recovery, const char *desc)
121{
122 uint32_t rr = 256;
123
124 TEST_EQ(VbInit(&cparams, &iparams), expected_retval, desc);
125 VbNvGet(&vnc, VBNV_RECOVERY_REQUEST, &rr);
126 TEST_EQ(rr, expected_recovery, " (recovery request)");
Randall Spangler391b3102011-09-02 11:28:24 -0700127}
128
129/****************************************************************************/
130
Randall Spangler1cbf7052013-01-23 16:14:14 -0800131static void VbInitTest(void)
132{
133 uint32_t u;
Randall Spangler391b3102011-09-02 11:28:24 -0700134
Randall Spangler1cbf7052013-01-23 16:14:14 -0800135 /* Test passing in too small a shared data area */
136 ResetMocks();
137 cparams.shared_data_size = VB_SHARED_DATA_MIN_SIZE - 1;
138 TestVbInit(VBERROR_INIT_SHARED_DATA, 0, "Shared data too small");
Randall Spangler391b3102011-09-02 11:28:24 -0700139
Randall Spangler1cbf7052013-01-23 16:14:14 -0800140 /* Normal call; dev=0 rec=0 */
141 ResetMocks();
142 TestVbInit(0, 0, "Normal call");
143 TEST_EQ(shared->timer_vb_init_enter, 21, " time enter");
144 TEST_EQ(shared->timer_vb_init_exit, 43, " time exit");
145 TEST_EQ(shared->flags, 0, " shared flags");
146 TEST_EQ(iparams.out_flags, 0, " out flags");
147 TEST_EQ(nv_write_called, 0,
148 " NV write not called since nothing changed");
Randall Spangler391b3102011-09-02 11:28:24 -0700149
Randall Spangler1cbf7052013-01-23 16:14:14 -0800150 /* If NV data is trashed, we initialize it */
151 ResetMocks();
152 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
153 /*
154 * Note that we're not doing a VbNvTeardown(), so the CRC hasn't been
155 * regenerated yet. So VbInit() should ignore the corrupted recovery
156 * value and boot normally.
157 */
158 TestVbInit(0, 0, "NV data trashed");
159 TEST_EQ(nv_write_called, 1, " NV write called");
Randall Spangler391b3102011-09-02 11:28:24 -0700160
Randall Spangler1cbf7052013-01-23 16:14:14 -0800161 /*
162 * Test boot switch flags which are just passed through to shared
163 * flags, and don't have an effect on VbInit().
164 */
165 ResetMocks();
166 iparams.flags = VB_INIT_FLAG_WP_ENABLED;
167 TestVbInit(0, 0, "Flags test WP");
168 TEST_EQ(shared->flags, VBSD_BOOT_FIRMWARE_WP_ENABLED,
Randall Spangler723aed32013-01-23 16:30:54 -0800169 " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700170
Randall Spangler1cbf7052013-01-23 16:14:14 -0800171 ResetMocks();
172 iparams.flags = VB_INIT_FLAG_SW_WP_ENABLED;
173 TestVbInit(0, 0, "Flags test SW WP");
174 TEST_EQ(shared->flags, VBSD_BOOT_FIRMWARE_SW_WP_ENABLED,
Randall Spangler723aed32013-01-23 16:30:54 -0800175 " shared flags");
Bill Richardson9dc62172012-08-28 15:00:51 -0700176
Randall Spangler1cbf7052013-01-23 16:14:14 -0800177 ResetMocks();
178 iparams.flags = VB_INIT_FLAG_RO_NORMAL_SUPPORT;
179 TestVbInit(0, 0, " flags test RO normal");
180 TEST_EQ(shared->flags, VBSD_BOOT_RO_NORMAL_SUPPORT,
Randall Spangler723aed32013-01-23 16:30:54 -0800181 " shared flags");
182
183 ResetMocks();
184 iparams.flags = VB_INIT_FLAG_EC_SOFTWARE_SYNC;
185 TestVbInit(0, 0, " flags test EC software sync");
186 TEST_EQ(shared->flags, VBSD_EC_SOFTWARE_SYNC, " shared flags");
187
188 ResetMocks();
189 iparams.flags = VB_INIT_FLAG_EC_SLOW_UPDATE;
190 TestVbInit(0, 0, " flags test EC slow update");
191 TEST_EQ(shared->flags, VBSD_EC_SLOW_UPDATE, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700192
Randall Spangler1cbf7052013-01-23 16:14:14 -0800193 /* S3 resume */
194 ResetMocks();
195 iparams.flags = VB_INIT_FLAG_S3_RESUME;
196 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
197 VbNvTeardown(&vnc);
198 /* S3 resume doesn't clear the recovery request (or act on it) */
199 TestVbInit(0, 123, "S3 resume");
200 TEST_EQ(shared->flags, VBSD_BOOT_S3_RESUME, " shared flags S3");
201 TEST_EQ(iparams.out_flags, 0, " out flags");
202 TEST_EQ(shared->recovery_reason, 0,
203 " S3 doesn't look at recovery request");
Randall Spangler391b3102011-09-02 11:28:24 -0700204
Randall Spangler1cbf7052013-01-23 16:14:14 -0800205 /* S3 resume with TPM resume error */
206 ResetMocks();
207 iparams.flags = VB_INIT_FLAG_S3_RESUME;
208 rollback_s3_retval = 1;
209 /* S3 resume doesn't clear the recovery request (or act on it) */
210 TestVbInit(VBERROR_TPM_S3_RESUME, 0, "S3 resume rollback error");
Randall Spangler391b3102011-09-02 11:28:24 -0700211
Randall Spangler1cbf7052013-01-23 16:14:14 -0800212 /*
213 * Normal boot doesn't care about TPM resume error because it doesn't
214 * call RollbackS3Resume().
215 */
216 ResetMocks();
217 rollback_s3_retval = 1;
218 TestVbInit(0, 0, "Normal doesn't S3 resume");
Randall Spangler391b3102011-09-02 11:28:24 -0700219
Randall Spangler1cbf7052013-01-23 16:14:14 -0800220 /* S3 resume with debug reset */
221 ResetMocks();
222 iparams.flags = VB_INIT_FLAG_S3_RESUME;
223 VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
224 VbNvTeardown(&vnc);
225 TestVbInit(0, 0, "S3 debug reset");
226 TEST_EQ(iparams.out_flags, VB_INIT_OUT_S3_DEBUG_BOOT, " out flags");
227 VbNvGet(&vnc, VBNV_DEBUG_RESET_MODE, &u);
228 TEST_EQ(u, 0, " S3 clears nv debug reset mode");
Randall Spangler391b3102011-09-02 11:28:24 -0700229
Randall Spangler1cbf7052013-01-23 16:14:14 -0800230 /* Normal boot clears S3 debug reset mode; doesn't set output flag */
231 ResetMocks();
232 VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
233 VbNvTeardown(&vnc);
234 TestVbInit(0, 0, "Normal with debug reset mode");
235 TEST_EQ(iparams.out_flags, 0, " out flags");
236 VbNvGet(&vnc, VBNV_DEBUG_RESET_MODE, &u);
237 TEST_EQ(u, 0, " normal clears nv debug reset mode");
Randall Spangler391b3102011-09-02 11:28:24 -0700238
Randall Spangler1cbf7052013-01-23 16:14:14 -0800239 /*
240 * S3 resume with debug reset is a normal boot, so doesn't resume the
241 * TPM.
242 */
243 ResetMocks();
244 iparams.flags = VB_INIT_FLAG_S3_RESUME;
245 rollback_s3_retval = 1;
246 VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
247 VbNvTeardown(&vnc);
248 TestVbInit(0, 0, "S3 debug reset rollback error");
Randall Spangler391b3102011-09-02 11:28:24 -0700249
Randall Spangler1cbf7052013-01-23 16:14:14 -0800250 /* Developer mode */
251 ResetMocks();
252 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
253 TestVbInit(0, 0, "Dev mode on");
254 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
255 TEST_EQ(iparams.out_flags,
256 VB_INIT_OUT_CLEAR_RAM |
257 VB_INIT_OUT_ENABLE_DISPLAY |
258 VB_INIT_OUT_ENABLE_USB_STORAGE |
259 VB_INIT_OUT_ENABLE_DEVELOPER |
260 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
261 TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700262
Randall Spangler1cbf7052013-01-23 16:14:14 -0800263 /* Developer mode forced by GBB flag */
264 ResetMocks();
265 iparams.flags = 0;
266 gbb.flags = GBB_FLAG_FORCE_DEV_SWITCH_ON;
267 TestVbInit(0, 0, "Dev mode via GBB");
268 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
269 TEST_EQ(iparams.out_flags,
270 VB_INIT_OUT_CLEAR_RAM |
271 VB_INIT_OUT_ENABLE_DISPLAY |
272 VB_INIT_OUT_ENABLE_USB_STORAGE |
273 VB_INIT_OUT_ENABLE_DEVELOPER |
274 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
275 TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags");
Randall Spangleracd6f462012-06-13 16:43:59 -0700276
Randall Spangler723aed32013-01-23 16:30:54 -0800277 /* Developer mode when option ROM matters and isn't loaded */
278 ResetMocks();
279 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON |
280 VB_INIT_FLAG_OPROM_MATTERS;
281 TestVbInit(VBERROR_VGA_OPROM_MISMATCH, 0, "Dev mode need oprom");
282 VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
283 TEST_EQ(u, 1, " oprom requested");
284
285 /* Developer mode when option ROM matters and is already loaded */
286 ResetMocks();
287 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON |
288 VB_INIT_FLAG_OPROM_MATTERS | VB_INIT_FLAG_OPROM_LOADED;
289 TestVbInit(0, 0, "Dev mode has oprom");
290
291 /* Normal mode when option ROM matters and is loaded */
292 ResetMocks();
293 VbNvSet(&vnc, VBNV_OPROM_NEEDED, 1);
294 VbNvTeardown(&vnc);
295 iparams.flags = VB_INIT_FLAG_OPROM_MATTERS | VB_INIT_FLAG_OPROM_LOADED;
296 TestVbInit(VBERROR_VGA_OPROM_MISMATCH, 0, "Normal mode with oprom");
297 VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
298 TEST_EQ(u, 0, " oprom not requested");
299
300 /* Option ROMs can be forced by GBB flag */
301 ResetMocks();
302 gbb.flags = GBB_FLAG_LOAD_OPTION_ROMS;
303 TestVbInit(0, 0, "GBB load option ROMs");
304 TEST_EQ(iparams.out_flags, VB_INIT_OUT_ENABLE_OPROM, " out flags");
305
306 /* If requiring signed only, don't enable alternate OS by default */
307 ResetMocks();
308 VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1);
309 VbNvTeardown(&vnc);
310 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
311 TestVbInit(0, 0, "Dev signed only");
312 TEST_EQ(iparams.out_flags,
313 VB_INIT_OUT_CLEAR_RAM |
314 VB_INIT_OUT_ENABLE_DISPLAY |
315 VB_INIT_OUT_ENABLE_USB_STORAGE |
316 VB_INIT_OUT_ENABLE_DEVELOPER, " out flags");
317
318 /* But that can be overridden by the GBB */
319 ResetMocks();
320 VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1);
321 VbNvTeardown(&vnc);
322 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
323 gbb.flags = GBB_FLAG_ENABLE_ALTERNATE_OS;
324 TestVbInit(0, 0, "Force option ROMs via GBB");
325 TEST_EQ(iparams.out_flags,
326 VB_INIT_OUT_CLEAR_RAM |
327 VB_INIT_OUT_ENABLE_DISPLAY |
328 VB_INIT_OUT_ENABLE_USB_STORAGE |
329 VB_INIT_OUT_ENABLE_DEVELOPER |
330 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
331
332 /* The GBB override is ignored in normal mode */
333 ResetMocks();
334 gbb.flags = GBB_FLAG_ENABLE_ALTERNATE_OS;
335 TestVbInit(0, 0, "Normal mode ignores forcing option ROMs via GBB");
336 TEST_EQ(iparams.out_flags, 0, " out flags");
337
Randall Spangler1cbf7052013-01-23 16:14:14 -0800338 /* Recovery mode from NV storage */
339 ResetMocks();
340 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
341 VbNvTeardown(&vnc);
342 TestVbInit(0, 0, "Recovery mode - from nv");
343 TEST_EQ(shared->recovery_reason, 123, " recovery reason");
344 TEST_EQ(iparams.out_flags,
345 VB_INIT_OUT_ENABLE_RECOVERY |
346 VB_INIT_OUT_CLEAR_RAM |
347 VB_INIT_OUT_ENABLE_DISPLAY |
348 VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags");
349 TEST_EQ(shared->flags, 0, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700350
Randall Spangler1cbf7052013-01-23 16:14:14 -0800351 /* Recovery mode from recovery button */
352 ResetMocks();
353 iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
354 TestVbInit(0, 0, "Recovery mode - button");
355 TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
356 " recovery reason");
357 TEST_EQ(iparams.out_flags,
358 VB_INIT_OUT_ENABLE_RECOVERY |
359 VB_INIT_OUT_CLEAR_RAM |
360 VB_INIT_OUT_ENABLE_DISPLAY |
361 VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags");
362 TEST_EQ(shared->flags, VBSD_BOOT_REC_SWITCH_ON, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700363
Randall Spangler1cbf7052013-01-23 16:14:14 -0800364 /* Recovery button reason supersedes NV reason */
365 ResetMocks();
366 iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
367 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
368 VbNvTeardown(&vnc);
369 TestVbInit(0, 0, "Recovery mode - button AND nv");
370 TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
371 " recovery reason");
Randall Spangler391b3102011-09-02 11:28:24 -0700372
Randall Spangler1cbf7052013-01-23 16:14:14 -0800373 /* Recovery mode from previous boot fail */
374 ResetMocks();
375 iparams.flags = VB_INIT_FLAG_PREVIOUS_BOOT_FAIL;
376 TestVbInit(0, 0, "Recovery mode - previous boot fail");
377 TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_FIRMWARE,
378 " recovery reason");
379 TEST_EQ(iparams.out_flags,
380 VB_INIT_OUT_ENABLE_RECOVERY |
381 VB_INIT_OUT_CLEAR_RAM |
382 VB_INIT_OUT_ENABLE_DISPLAY |
383 VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags");
384 TEST_EQ(shared->flags, 0, " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700385
Randall Spangler1cbf7052013-01-23 16:14:14 -0800386 /* Recovery mode from NV supersedes previous boot fail */
387 ResetMocks();
388 iparams.flags = VB_INIT_FLAG_PREVIOUS_BOOT_FAIL;
389 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
390 VbNvTeardown(&vnc);
391 TestVbInit(0, 0, "Recovery mode - previous boot fail AND nv");
392 TEST_EQ(shared->recovery_reason, 123, " recovery reason");
Randall Spangler391b3102011-09-02 11:28:24 -0700393
Randall Spangler1cbf7052013-01-23 16:14:14 -0800394 /* Dev + recovery = recovery */
395 ResetMocks();
396 iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED |
397 VB_INIT_FLAG_DEV_SWITCH_ON;
398 TestVbInit(0, 0, "Recovery mode - button");
399 TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
400 " recovery reason");
401 TEST_EQ(iparams.out_flags,
402 VB_INIT_OUT_ENABLE_RECOVERY |
403 VB_INIT_OUT_CLEAR_RAM |
404 VB_INIT_OUT_ENABLE_DISPLAY |
405 VB_INIT_OUT_ENABLE_USB_STORAGE, " out flags");
406 TEST_EQ(shared->flags,
407 VBSD_BOOT_REC_SWITCH_ON | VBSD_BOOT_DEV_SWITCH_ON,
408 " shared flags");
Randall Spangler391b3102011-09-02 11:28:24 -0700409}
410
Randall Spangler1cbf7052013-01-23 16:14:14 -0800411static void VbInitTestTPM(void)
412{
Randall Spangler723aed32013-01-23 16:30:54 -0800413 uint32_t u;
414
Randall Spangler1cbf7052013-01-23 16:14:14 -0800415 /* Rollback setup needs to reboot */
416 ResetMocks();
417 mock_rfs_retval = TPM_E_MUST_REBOOT;
418 TestVbInit(VBERROR_TPM_REBOOT_REQUIRED, 0,
419 "Rollback TPM reboot (rec=0)");
420 ResetMocks();
421 mock_rfs_retval = TPM_E_MUST_REBOOT;
422 iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
423 TestVbInit(VBERROR_TPM_REBOOT_REQUIRED, VBNV_RECOVERY_RO_TPM_REBOOT,
424 "Rollback TPM reboot, in recovery, first time");
425 /* Ignore if we already tried rebooting */
426 ResetMocks();
427 mock_rfs_retval = TPM_E_MUST_REBOOT;
428 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, VBNV_RECOVERY_RO_TPM_REBOOT);
429 VbNvTeardown(&vnc);
430 TestVbInit(0, 0, "Rollback TPM reboot, in recovery, already retried");
431 TEST_EQ(shared->fw_version_tpm, 0x10001, " shared fw_version_tpm");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700432
Randall Spangler1cbf7052013-01-23 16:14:14 -0800433 /* Other rollback setup errors */
434 ResetMocks();
435 mock_rfs_retval = TPM_E_IOERROR;
436 mock_tpm_version = 0x20002;
437 TestVbInit(VBERROR_TPM_FIRMWARE_SETUP, VBNV_RECOVERY_RO_TPM_S_ERROR,
438 "Rollback TPM setup error - not in recovery");
439 TEST_EQ(shared->fw_version_tpm, 0, " shared fw_version_tpm not set");
440 ResetMocks();
441 mock_rfs_retval = TPM_E_IOERROR;
442 VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, VBNV_RECOVERY_US_TEST);
443 VbNvTeardown(&vnc);
444 TestVbInit(0, 0, "Rollback TPM setup error ignored in recovery");
445 TEST_EQ(shared->fw_version_tpm, 0x10001, " shared fw_version_tpm");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700446
Randall Spangler1cbf7052013-01-23 16:14:14 -0800447 /* Virtual developer switch, but not enabled. */
448 ResetMocks();
Randall Spangler723aed32013-01-23 16:30:54 -0800449 VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1);
450 VbNvTeardown(&vnc);
Randall Spangler1cbf7052013-01-23 16:14:14 -0800451 iparams.flags = VB_INIT_FLAG_VIRTUAL_DEV_SWITCH;
452 TestVbInit(0, 0, "TPM Dev mode off");
453 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
454 TEST_EQ(iparams.out_flags, 0, " out flags");
455 TEST_EQ(shared->flags, VBSD_HONOR_VIRT_DEV_SWITCH, " shared flags");
Randall Spangler723aed32013-01-23 16:30:54 -0800456 VbNvGet(&vnc, VBNV_DISABLE_DEV_REQUEST, &u);
457 TEST_EQ(u, 0, " disable dev request");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700458
Randall Spangler1cbf7052013-01-23 16:14:14 -0800459 /* Virtual developer switch, enabled. */
460 ResetMocks();
Randall Spangler723aed32013-01-23 16:30:54 -0800461 VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1);
462 VbNvTeardown(&vnc);
Randall Spangler1cbf7052013-01-23 16:14:14 -0800463 iparams.flags = VB_INIT_FLAG_VIRTUAL_DEV_SWITCH;
464 mock_virt_dev_sw = 1;
465 TestVbInit(0, 0, "TPM Dev mode on");
466 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
467 TEST_EQ(iparams.out_flags,
468 VB_INIT_OUT_CLEAR_RAM |
469 VB_INIT_OUT_ENABLE_DISPLAY |
470 VB_INIT_OUT_ENABLE_USB_STORAGE |
471 VB_INIT_OUT_ENABLE_DEVELOPER |
472 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
473 TEST_EQ(shared->flags,
474 VBSD_BOOT_DEV_SWITCH_ON | VBSD_HONOR_VIRT_DEV_SWITCH,
475 " shared flags");
Randall Spangler723aed32013-01-23 16:30:54 -0800476 /* Disable-request doesn't get cleared because dev mode is still on */
477 VbNvGet(&vnc, VBNV_DISABLE_DEV_REQUEST, &u);
478 TEST_EQ(u, 1, " disable dev request");
479 /* Disable request was passed on to RollbackFirmwareSetup() */
480 TEST_EQ(rfs_disable_dev_request, 1, " rfs disable dev");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700481
Randall Spangler1cbf7052013-01-23 16:14:14 -0800482 /* Ignore virtual developer switch, even though enabled. */
483 ResetMocks();
484 mock_virt_dev_sw = 1;
485 TestVbInit(0, 0, "TPM Dev mode on but ignored");
486 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
487 TEST_EQ(iparams.out_flags, 0, " out flags");
488 TEST_EQ(shared->flags, 0, " shared flags");
Bill Richardsonec8df162012-06-07 04:21:14 -0700489
Randall Spangler1cbf7052013-01-23 16:14:14 -0800490 /* HW dev switch on, no virtual developer switch */
491 ResetMocks();
492 iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
493 TestVbInit(0, 0, "HW Dev mode on");
494 TEST_EQ(shared->recovery_reason, 0, " recovery reason");
495 TEST_EQ(iparams.out_flags,
496 VB_INIT_OUT_CLEAR_RAM |
497 VB_INIT_OUT_ENABLE_DISPLAY |
498 VB_INIT_OUT_ENABLE_USB_STORAGE |
499 VB_INIT_OUT_ENABLE_DEVELOPER |
500 VB_INIT_OUT_ENABLE_ALTERNATE_OS, " out flags");
501 TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, " shared flags");
Randall Spangler723aed32013-01-23 16:30:54 -0800502
503 /* Check TPM owner clear request */
504 ResetMocks();
505 VbNvSet(&vnc, VBNV_CLEAR_TPM_OWNER_REQUEST, 1);
506 VbNvTeardown(&vnc);
507 TestVbInit(0, 0, "TPM clear owner");
508 VbNvGet(&vnc, VBNV_CLEAR_TPM_OWNER_REQUEST, &u);
509 TEST_EQ(u, 0, " tpm clear request");
510 VbNvGet(&vnc, VBNV_CLEAR_TPM_OWNER_DONE, &u);
511 TEST_EQ(u, 1, " tpm clear request");
512 TEST_EQ(rfs_clear_tpm_request, 1, "rfs tpm clear request");
Bill Richardsonb75d8ad2012-05-17 13:26:05 -0700513}
514
Randall Spangler391b3102011-09-02 11:28:24 -0700515/* disable MSVC warnings on unused arguments */
516__pragma(warning (disable: 4100))
517
Randall Spangler1cbf7052013-01-23 16:14:14 -0800518int main(int argc, char *argv[])
519{
520 VbInitTest();
521 VbInitTestTPM();
Randall Spangler391b3102011-09-02 11:28:24 -0700522
Randall Spangler1cbf7052013-01-23 16:14:14 -0800523 return gTestSuccess ? 0 : 255;
Randall Spangler391b3102011-09-02 11:28:24 -0700524}