xref: /aosp_15_r20/external/vboot_reference/tests/vb2_misc_tests.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2014 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  *
5*8617a60dSAndroid Build Coastguard Worker  * Tests for misc library
6*8617a60dSAndroid Build Coastguard Worker  */
7*8617a60dSAndroid Build Coastguard Worker 
8*8617a60dSAndroid Build Coastguard Worker #include "2api.h"
9*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
10*8617a60dSAndroid Build Coastguard Worker #include "2misc.h"
11*8617a60dSAndroid Build Coastguard Worker #include "2nvstorage.h"
12*8617a60dSAndroid Build Coastguard Worker #include "2secdata.h"
13*8617a60dSAndroid Build Coastguard Worker #include "2sysincludes.h"
14*8617a60dSAndroid Build Coastguard Worker #include "common/boot_mode.h"
15*8617a60dSAndroid Build Coastguard Worker #include "common/tests.h"
16*8617a60dSAndroid Build Coastguard Worker 
17*8617a60dSAndroid Build Coastguard Worker /* Common context for tests */
18*8617a60dSAndroid Build Coastguard Worker static uint8_t workbuf[VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE]
19*8617a60dSAndroid Build Coastguard Worker 	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
20*8617a60dSAndroid Build Coastguard Worker static uint8_t workbuf2[VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE]
21*8617a60dSAndroid Build Coastguard Worker 	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
22*8617a60dSAndroid Build Coastguard Worker static struct vb2_context *ctx;
23*8617a60dSAndroid Build Coastguard Worker static struct vb2_shared_data *sd;
24*8617a60dSAndroid Build Coastguard Worker static struct vb2_gbb_header gbb;
25*8617a60dSAndroid Build Coastguard Worker static struct vb2_secdata_fwmp *fwmp;
26*8617a60dSAndroid Build Coastguard Worker 
27*8617a60dSAndroid Build Coastguard Worker /* Mocked function data */
28*8617a60dSAndroid Build Coastguard Worker static enum vb2_resource_index mock_resource_index;
29*8617a60dSAndroid Build Coastguard Worker static void *mock_resource_ptr;
30*8617a60dSAndroid Build Coastguard Worker static uint32_t mock_resource_size;
31*8617a60dSAndroid Build Coastguard Worker static int mock_tpm_clear_called;
32*8617a60dSAndroid Build Coastguard Worker static int mock_tpm_clear_retval;
33*8617a60dSAndroid Build Coastguard Worker 
reset_common_data(void)34*8617a60dSAndroid Build Coastguard Worker static void reset_common_data(void)
35*8617a60dSAndroid Build Coastguard Worker {
36*8617a60dSAndroid Build Coastguard Worker 	memset(workbuf, 0xaa, sizeof(workbuf));
37*8617a60dSAndroid Build Coastguard Worker 	memset(workbuf2, 0xbb, sizeof(workbuf2));
38*8617a60dSAndroid Build Coastguard Worker 
39*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
40*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_init failed");
41*8617a60dSAndroid Build Coastguard Worker 
42*8617a60dSAndroid Build Coastguard Worker 	sd = vb2_get_sd(ctx);
43*8617a60dSAndroid Build Coastguard Worker 	sd->status |= VB2_SD_STATUS_SECDATA_FWMP_INIT;
44*8617a60dSAndroid Build Coastguard Worker 
45*8617a60dSAndroid Build Coastguard Worker 	memset(&gbb, 0, sizeof(gbb));
46*8617a60dSAndroid Build Coastguard Worker 
47*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_init(ctx);
48*8617a60dSAndroid Build Coastguard Worker 
49*8617a60dSAndroid Build Coastguard Worker 	vb2api_secdata_firmware_create(ctx);
50*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_firmware_init(ctx);
51*8617a60dSAndroid Build Coastguard Worker 
52*8617a60dSAndroid Build Coastguard Worker 	fwmp = (struct vb2_secdata_fwmp *)&ctx->secdata_fwmp;
53*8617a60dSAndroid Build Coastguard Worker 
54*8617a60dSAndroid Build Coastguard Worker 	mock_tpm_clear_called = 0;
55*8617a60dSAndroid Build Coastguard Worker 	mock_tpm_clear_retval = VB2_SUCCESS;
56*8617a60dSAndroid Build Coastguard Worker 
57*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
58*8617a60dSAndroid Build Coastguard Worker };
59*8617a60dSAndroid Build Coastguard Worker 
60*8617a60dSAndroid Build Coastguard Worker /* Mocked functions */
61*8617a60dSAndroid Build Coastguard Worker 
vb2_get_gbb(struct vb2_context * c)62*8617a60dSAndroid Build Coastguard Worker struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
63*8617a60dSAndroid Build Coastguard Worker {
64*8617a60dSAndroid Build Coastguard Worker 	return &gbb;
65*8617a60dSAndroid Build Coastguard Worker }
66*8617a60dSAndroid Build Coastguard Worker 
vb2ex_read_resource(struct vb2_context * c,enum vb2_resource_index index,uint32_t offset,void * buf,uint32_t size)67*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_read_resource(struct vb2_context *c,
68*8617a60dSAndroid Build Coastguard Worker 				enum vb2_resource_index index, uint32_t offset,
69*8617a60dSAndroid Build Coastguard Worker 				void *buf, uint32_t size)
70*8617a60dSAndroid Build Coastguard Worker {
71*8617a60dSAndroid Build Coastguard Worker 	if (index != mock_resource_index)
72*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_EX_READ_RESOURCE_INDEX;
73*8617a60dSAndroid Build Coastguard Worker 
74*8617a60dSAndroid Build Coastguard Worker 	if (offset > mock_resource_size || offset + size > mock_resource_size)
75*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_EX_READ_RESOURCE_SIZE;
76*8617a60dSAndroid Build Coastguard Worker 
77*8617a60dSAndroid Build Coastguard Worker 	memcpy(buf, (uint8_t *)mock_resource_ptr + offset, size);
78*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
79*8617a60dSAndroid Build Coastguard Worker }
80*8617a60dSAndroid Build Coastguard Worker 
vb2ex_tpm_clear_owner(struct vb2_context * c)81*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_tpm_clear_owner(struct vb2_context *c)
82*8617a60dSAndroid Build Coastguard Worker {
83*8617a60dSAndroid Build Coastguard Worker 	mock_tpm_clear_called++;
84*8617a60dSAndroid Build Coastguard Worker 
85*8617a60dSAndroid Build Coastguard Worker 	return mock_tpm_clear_retval;
86*8617a60dSAndroid Build Coastguard Worker }
87*8617a60dSAndroid Build Coastguard Worker 
88*8617a60dSAndroid Build Coastguard Worker /* Tests */
init_workbuf_tests(void)89*8617a60dSAndroid Build Coastguard Worker static void init_workbuf_tests(void)
90*8617a60dSAndroid Build Coastguard Worker {
91*8617a60dSAndroid Build Coastguard Worker 	struct vb2_context *orig_ctx;
92*8617a60dSAndroid Build Coastguard Worker 
93*8617a60dSAndroid Build Coastguard Worker 	/* check constants */
94*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(sizeof(struct vb2_context) < VB2_CONTEXT_MAX_SIZE,
95*8617a60dSAndroid Build Coastguard Worker 		  "vb2_context max size constant");
96*8617a60dSAndroid Build Coastguard Worker 
97*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_init() - misaligned */
98*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_init(workbuf + 1, sizeof(workbuf) - 1, &ctx),
99*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_WORKBUF_ALIGN, "vb2api_init - misaligned");
100*8617a60dSAndroid Build Coastguard Worker 
101*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_init() - size too small */
102*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_init(workbuf, sizeof(struct vb2_shared_data) - 1,
103*8617a60dSAndroid Build Coastguard Worker 			      &ctx), VB2_ERROR_WORKBUF_SMALL,
104*8617a60dSAndroid Build Coastguard Worker 		"vb2api_init - size too small");
105*8617a60dSAndroid Build Coastguard Worker 
106*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_init() - success */
107*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
108*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_init - success");
109*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE((uintptr_t)workbuf < (uintptr_t)ctx &&
110*8617a60dSAndroid Build Coastguard Worker 		  (uintptr_t)ctx < (uintptr_t)workbuf + sizeof(workbuf),
111*8617a60dSAndroid Build Coastguard Worker 		  "  return proper pointer");
112*8617a60dSAndroid Build Coastguard Worker 	struct vb2_context zero_ctx = {0};
113*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(memcmp(ctx, &zero_ctx, sizeof(struct vb2_context)),
114*8617a60dSAndroid Build Coastguard Worker 		  "  vb2_context set to zero");
115*8617a60dSAndroid Build Coastguard Worker 	sd = vb2_get_sd(ctx);
116*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->magic, VB2_SHARED_DATA_MAGIC, "  set magic");
117*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->struct_version_major, VB2_SHARED_DATA_VERSION_MAJOR,
118*8617a60dSAndroid Build Coastguard Worker 		"  set major version");
119*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->struct_version_minor, VB2_SHARED_DATA_VERSION_MINOR,
120*8617a60dSAndroid Build Coastguard Worker 		"  set minor version");
121*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->workbuf_size, sizeof(workbuf), "  set workbuf size");
122*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(sd->workbuf_used - sizeof(struct vb2_shared_data)
123*8617a60dSAndroid Build Coastguard Worker 		  < VB2_WORKBUF_ALIGN, "  set workbuf used");
124*8617a60dSAndroid Build Coastguard Worker 
125*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - misaligned source */
126*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
127*8617a60dSAndroid Build Coastguard Worker 	memmove(workbuf + 1, workbuf, sizeof(workbuf) - 1);
128*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_relocate(workbuf2, workbuf + 1, sizeof(workbuf) - 1,
129*8617a60dSAndroid Build Coastguard Worker 				  &ctx), "vb2api_relocate - misaligned source");
130*8617a60dSAndroid Build Coastguard Worker 
131*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - misaligned target */
132*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
133*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_relocate(workbuf2 + 1, workbuf, sizeof(workbuf) - 1,
134*8617a60dSAndroid Build Coastguard Worker 				&ctx),
135*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_WORKBUF_ALIGN, "vb2api_relocate - misaligned target");
136*8617a60dSAndroid Build Coastguard Worker 
137*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - bad magic */
138*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
139*8617a60dSAndroid Build Coastguard Worker 	sd->magic = 0;
140*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf), &ctx),
141*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_SHARED_DATA_MAGIC, "vb2api_relocate - bad magic");
142*8617a60dSAndroid Build Coastguard Worker 
143*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - small major version */
144*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
145*8617a60dSAndroid Build Coastguard Worker 	sd->struct_version_major--;
146*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf), &ctx),
147*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_SHARED_DATA_VERSION,
148*8617a60dSAndroid Build Coastguard Worker 		"vb2api_relocate - small major version");
149*8617a60dSAndroid Build Coastguard Worker 
150*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - big major version */
151*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
152*8617a60dSAndroid Build Coastguard Worker 	sd->struct_version_major++;
153*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf), &ctx),
154*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_SHARED_DATA_VERSION,
155*8617a60dSAndroid Build Coastguard Worker 		"vb2api_relocate - big major version");
156*8617a60dSAndroid Build Coastguard Worker 
157*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - small minor version */
158*8617a60dSAndroid Build Coastguard Worker 	if (VB2_SHARED_DATA_VERSION_MINOR > 0) {
159*8617a60dSAndroid Build Coastguard Worker 		reset_common_data();
160*8617a60dSAndroid Build Coastguard Worker 		sd->struct_version_minor--;
161*8617a60dSAndroid Build Coastguard Worker 		TEST_EQ(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf),
162*8617a60dSAndroid Build Coastguard Worker 					&ctx),
163*8617a60dSAndroid Build Coastguard Worker 			VB2_ERROR_SHARED_DATA_VERSION,
164*8617a60dSAndroid Build Coastguard Worker 			  "vb2api_relocate - small minor version");
165*8617a60dSAndroid Build Coastguard Worker 	}
166*8617a60dSAndroid Build Coastguard Worker 
167*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - big minor version */
168*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
169*8617a60dSAndroid Build Coastguard Worker 	sd->struct_version_minor++;
170*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf), &ctx),
171*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_relocate - big minor version");
172*8617a60dSAndroid Build Coastguard Worker 
173*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - small workbuf_used */
174*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
175*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_used = sizeof(struct vb2_shared_data) - 1;
176*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf), &ctx),
177*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_WORKBUF_INVALID,
178*8617a60dSAndroid Build Coastguard Worker 		"vb2api_relocate - small workbuf_used");
179*8617a60dSAndroid Build Coastguard Worker 
180*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - workbuf_size < workbuf_used */
181*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
182*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_used = sd->workbuf_size;
183*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_size--;
184*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf), &ctx),
185*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_WORKBUF_INVALID,
186*8617a60dSAndroid Build Coastguard Worker 		"vb2api_relocate - workbuf_size < workbuf_used");
187*8617a60dSAndroid Build Coastguard Worker 
188*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - target workbuf too small */
189*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
190*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_used = sd->workbuf_size - 1;
191*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_relocate(workbuf2, workbuf, sd->workbuf_used - 1, &ctx),
192*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_WORKBUF_SMALL,
193*8617a60dSAndroid Build Coastguard Worker 		"vb2api_relocate - target workbuf too small");
194*8617a60dSAndroid Build Coastguard Worker 
195*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - success (same size) */
196*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
197*8617a60dSAndroid Build Coastguard Worker 	orig_ctx = ctx;
198*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf), &ctx),
199*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_relocate - success (same size)");
200*8617a60dSAndroid Build Coastguard Worker 	sd = vb2_get_sd(ctx);
201*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ((uintptr_t)orig_ctx - (uintptr_t)workbuf,
202*8617a60dSAndroid Build Coastguard Worker 		(uintptr_t)ctx - (uintptr_t)workbuf2,
203*8617a60dSAndroid Build Coastguard Worker 		"  same context pointer");
204*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(memcmp(workbuf2, workbuf, sd->workbuf_used),
205*8617a60dSAndroid Build Coastguard Worker 		  "  same workbuf");
206*8617a60dSAndroid Build Coastguard Worker 
207*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - success (smaller size) */
208*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
209*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf) - 1, &ctx),
210*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_relocate - success (smaller size)");
211*8617a60dSAndroid Build Coastguard Worker 	sd = vb2_get_sd(ctx);
212*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->workbuf_size, sizeof(workbuf) - 1, "  set workbuf size");
213*8617a60dSAndroid Build Coastguard Worker 
214*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - success (larger size) */
215*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
216*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_size--;
217*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_relocate(workbuf2, workbuf, sizeof(workbuf), &ctx),
218*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_relocate - success (larger size)");
219*8617a60dSAndroid Build Coastguard Worker 	sd = vb2_get_sd(ctx);
220*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->workbuf_size, sizeof(workbuf), "  set workbuf size");
221*8617a60dSAndroid Build Coastguard Worker 
222*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_relocate() - success (overlapping) */
223*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
224*8617a60dSAndroid Build Coastguard Worker 	orig_ctx = ctx;
225*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_size -= VB2_WORKBUF_ALIGN;
226*8617a60dSAndroid Build Coastguard Worker 	memcpy(workbuf2, workbuf, sd->workbuf_used);
227*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_relocate(workbuf + VB2_WORKBUF_ALIGN, workbuf,
228*8617a60dSAndroid Build Coastguard Worker 				  sizeof(workbuf) - VB2_WORKBUF_ALIGN, &ctx),
229*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_relocate - success (overlapping)");
230*8617a60dSAndroid Build Coastguard Worker 	sd = vb2_get_sd(ctx);
231*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ((uintptr_t)ctx - (uintptr_t)orig_ctx,
232*8617a60dSAndroid Build Coastguard Worker 		VB2_WORKBUF_ALIGN,
233*8617a60dSAndroid Build Coastguard Worker 		"  context pointer moved");
234*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(memcmp(workbuf2, workbuf + VB2_WORKBUF_ALIGN,
235*8617a60dSAndroid Build Coastguard Worker 			 sd->workbuf_used), "  same workbuf");
236*8617a60dSAndroid Build Coastguard Worker 
237*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_reinit() - workbuf_size < workbuf_used */
238*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
239*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_size = sd->workbuf_used - 1;
240*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_reinit(workbuf, &ctx), VB2_ERROR_WORKBUF_INVALID,
241*8617a60dSAndroid Build Coastguard Worker 		"vb2api_reinit - workbuf_size < workbuf_used");
242*8617a60dSAndroid Build Coastguard Worker 
243*8617a60dSAndroid Build Coastguard Worker 	/* vb2api_reinit() - success */
244*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
245*8617a60dSAndroid Build Coastguard Worker 	orig_ctx = ctx;
246*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_reinit(workbuf, &ctx),
247*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_reinit - success");
248*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ((uintptr_t)ctx, (uintptr_t)orig_ctx,
249*8617a60dSAndroid Build Coastguard Worker 		"  context pointer unchanged");
250*8617a60dSAndroid Build Coastguard Worker }
251*8617a60dSAndroid Build Coastguard Worker 
misc_tests(void)252*8617a60dSAndroid Build Coastguard Worker static void misc_tests(void)
253*8617a60dSAndroid Build Coastguard Worker {
254*8617a60dSAndroid Build Coastguard Worker 	struct vb2_workbuf wb;
255*8617a60dSAndroid Build Coastguard Worker 
256*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
257*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_used = VB2_WORKBUF_ALIGN;
258*8617a60dSAndroid Build Coastguard Worker 
259*8617a60dSAndroid Build Coastguard Worker 	vb2_workbuf_from_ctx(ctx, &wb);
260*8617a60dSAndroid Build Coastguard Worker 
261*8617a60dSAndroid Build Coastguard Worker 	TEST_PTR_EQ(wb.buf, workbuf + VB2_WORKBUF_ALIGN,
262*8617a60dSAndroid Build Coastguard Worker 		    "vb_workbuf_from_ctx() buf");
263*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(wb.size, sd->workbuf_size - VB2_WORKBUF_ALIGN,
264*8617a60dSAndroid Build Coastguard Worker 		"vb_workbuf_from_ctx() size");
265*8617a60dSAndroid Build Coastguard Worker 
266*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
267*8617a60dSAndroid Build Coastguard Worker 	sd->status |= VB2_SD_STATUS_RECOVERY_DECIDED;
268*8617a60dSAndroid Build Coastguard Worker 	TEST_ABORT(VB2_REC_OR_DIE(ctx, "die\n"), "REC_OR_DIE in normal mode");
269*8617a60dSAndroid Build Coastguard Worker 
270*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
271*8617a60dSAndroid Build Coastguard Worker 	sd->status |= VB2_SD_STATUS_RECOVERY_DECIDED;
272*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_RECOVERY_MODE;
273*8617a60dSAndroid Build Coastguard Worker 	VB2_REC_OR_DIE(ctx, "VB2_REC_OR_DIE() test in recovery mode\n");
274*8617a60dSAndroid Build Coastguard Worker 	/* Would exit here if it didn't work as intended. */
275*8617a60dSAndroid Build Coastguard Worker 
276*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
277*8617a60dSAndroid Build Coastguard Worker 	VB2_REC_OR_DIE(ctx, "VB2_REC_OR_DIE() test in fw_phase1\n");
278*8617a60dSAndroid Build Coastguard Worker }
279*8617a60dSAndroid Build Coastguard Worker 
gbb_tests(void)280*8617a60dSAndroid Build Coastguard Worker static void gbb_tests(void)
281*8617a60dSAndroid Build Coastguard Worker {
282*8617a60dSAndroid Build Coastguard Worker 	struct vb2_gbb_header gbbsrc = {
283*8617a60dSAndroid Build Coastguard Worker 		.signature = {'$', 'G', 'B', 'B'},
284*8617a60dSAndroid Build Coastguard Worker 		.major_version = VB2_GBB_MAJOR_VER,
285*8617a60dSAndroid Build Coastguard Worker 		.minor_version = VB2_GBB_MINOR_VER,
286*8617a60dSAndroid Build Coastguard Worker 		.header_size = sizeof(struct vb2_gbb_header),
287*8617a60dSAndroid Build Coastguard Worker 		.flags = 0x1234,
288*8617a60dSAndroid Build Coastguard Worker 		.rootkey_offset = 240,
289*8617a60dSAndroid Build Coastguard Worker 		.rootkey_size = 1040,
290*8617a60dSAndroid Build Coastguard Worker 	};
291*8617a60dSAndroid Build Coastguard Worker 
292*8617a60dSAndroid Build Coastguard Worker 	struct vb2_gbb_header gbbdest;
293*8617a60dSAndroid Build Coastguard Worker 
294*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sizeof(struct vb2_gbb_header),
295*8617a60dSAndroid Build Coastguard Worker 		EXPECTED_VB2_GBB_HEADER_SIZE,
296*8617a60dSAndroid Build Coastguard Worker 		"sizeof(struct vb2_gbb_header)");
297*8617a60dSAndroid Build Coastguard Worker 
298*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
299*8617a60dSAndroid Build Coastguard Worker 
300*8617a60dSAndroid Build Coastguard Worker 	/* Good contents */
301*8617a60dSAndroid Build Coastguard Worker 	mock_resource_index = VB2_RES_GBB;
302*8617a60dSAndroid Build Coastguard Worker 	mock_resource_ptr = &gbbsrc;
303*8617a60dSAndroid Build Coastguard Worker 	mock_resource_size = sizeof(gbbsrc);
304*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_read_gbb_header(ctx, &gbbdest), "read gbb header good");
305*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(memcmp(&gbbsrc, &gbbdest, sizeof(gbbsrc)),
306*8617a60dSAndroid Build Coastguard Worker 		  "read gbb contents");
307*8617a60dSAndroid Build Coastguard Worker 
308*8617a60dSAndroid Build Coastguard Worker 	mock_resource_index = VB2_RES_GBB + 1;
309*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_read_gbb_header(ctx, &gbbdest),
310*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_EX_READ_RESOURCE_INDEX, "read gbb header missing");
311*8617a60dSAndroid Build Coastguard Worker 	mock_resource_index = VB2_RES_GBB;
312*8617a60dSAndroid Build Coastguard Worker 
313*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.signature[0]++;
314*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_read_gbb_header(ctx, &gbbdest),
315*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_MAGIC, "read gbb header bad magic");
316*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.signature[0]--;
317*8617a60dSAndroid Build Coastguard Worker 
318*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.major_version = VB2_GBB_MAJOR_VER + 1;
319*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_read_gbb_header(ctx, &gbbdest),
320*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_VERSION, "read gbb header major version");
321*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.major_version = VB2_GBB_MAJOR_VER;
322*8617a60dSAndroid Build Coastguard Worker 
323*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.minor_version = VB2_GBB_MINOR_VER + 1;
324*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_read_gbb_header(ctx, &gbbdest),
325*8617a60dSAndroid Build Coastguard Worker 		  "read gbb header minor++");
326*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.minor_version = 1;
327*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_read_gbb_header(ctx, &gbbdest),
328*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_TOO_OLD, "read gbb header 1.1 fails");
329*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.minor_version = 0;
330*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_read_gbb_header(ctx, &gbbdest),
331*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_TOO_OLD, "read gbb header 1.0 fails");
332*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.minor_version = VB2_GBB_MINOR_VER;
333*8617a60dSAndroid Build Coastguard Worker 
334*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.header_size--;
335*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_read_gbb_header(ctx, &gbbdest),
336*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_HEADER_SIZE, "read gbb header size");
337*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_fw_init_gbb(ctx),
338*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_HEADER_SIZE, "init gbb failure");
339*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.header_size++;
340*8617a60dSAndroid Build Coastguard Worker 
341*8617a60dSAndroid Build Coastguard Worker 	/* Init GBB */
342*8617a60dSAndroid Build Coastguard Worker 	int used_before = sd->workbuf_used;
343*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_fw_init_gbb(ctx), "init gbb");
344*8617a60dSAndroid Build Coastguard Worker 	/* Manually calculate the location of GBB since we have mocked out the
345*8617a60dSAndroid Build Coastguard Worker 	   original definition of vb2_get_gbb. */
346*8617a60dSAndroid Build Coastguard Worker 	struct vb2_gbb_header *current_gbb = vb2_member_of(sd, sd->gbb_offset);
347*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(memcmp(&gbbsrc, current_gbb, sizeof(gbbsrc)),
348*8617a60dSAndroid Build Coastguard Worker 		  "  copy gbb contents");
349*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(sd->workbuf_used - sizeof(gbbsrc) - used_before
350*8617a60dSAndroid Build Coastguard Worker 		  < VB2_WORKBUF_ALIGN, "  unexpected workbuf size");
351*8617a60dSAndroid Build Coastguard Worker 
352*8617a60dSAndroid Build Coastguard Worker 	/* Workbuf failure */
353*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
354*8617a60dSAndroid Build Coastguard Worker 	sd->workbuf_used = sd->workbuf_size - 4;
355*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_fw_init_gbb(ctx),
356*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_GBB_WORKBUF, "init gbb no workbuf");
357*8617a60dSAndroid Build Coastguard Worker 
358*8617a60dSAndroid Build Coastguard Worker 	/* Check for setting NO_SECDATA_FWMP context flag */
359*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
360*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_fw_init_gbb(ctx), "init gbb");
361*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_NO_SECDATA_FWMP, 0,
362*8617a60dSAndroid Build Coastguard Worker 		"without DISABLE_FWMP: NO_SECDATA_FWMP shouldn't be set");
363*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
364*8617a60dSAndroid Build Coastguard Worker 	gbbsrc.flags |= VB2_GBB_FLAG_DISABLE_FWMP;
365*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_fw_init_gbb(ctx), "init gbb");
366*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(ctx->flags & VB2_CONTEXT_NO_SECDATA_FWMP, 0,
367*8617a60dSAndroid Build Coastguard Worker 		 "with DISABLE_FWMP: NO_SECDATA_FWMP should be set");
368*8617a60dSAndroid Build Coastguard Worker }
369*8617a60dSAndroid Build Coastguard Worker 
fail_tests(void)370*8617a60dSAndroid Build Coastguard Worker static void fail_tests(void)
371*8617a60dSAndroid Build Coastguard Worker {
372*8617a60dSAndroid Build Coastguard Worker 	/* Early fail (before even NV init) */
373*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
374*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_NV_INIT;
375*8617a60dSAndroid Build Coastguard Worker 	vb2api_fail(ctx, 1, 2);
376*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_NV_INIT, 0, "vb2api_fail inits NV");
377*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
378*8617a60dSAndroid Build Coastguard Worker 		1, "vb2api_fail request");
379*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE),
380*8617a60dSAndroid Build Coastguard Worker 		2, "vb2api_fail subcode");
381*8617a60dSAndroid Build Coastguard Worker 
382*8617a60dSAndroid Build Coastguard Worker 	/* Repeated fail doesn't overwrite the error code */
383*8617a60dSAndroid Build Coastguard Worker 	vb2api_fail(ctx, 3, 4);
384*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
385*8617a60dSAndroid Build Coastguard Worker 		1, "vb2api_fail repeat");
386*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE),
387*8617a60dSAndroid Build Coastguard Worker 		2, "vb2api_fail repeat2");
388*8617a60dSAndroid Build Coastguard Worker 
389*8617a60dSAndroid Build Coastguard Worker 	/* Fail with other slot good doesn't trigger recovery */
390*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
391*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_TRY_COUNT, 3);
392*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_UNKNOWN);
393*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_TRIED, 0);
394*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_PREV_TRIED, 1);
395*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_PREV_RESULT, VB2_FW_RESULT_UNKNOWN);
396*8617a60dSAndroid Build Coastguard Worker 	sd->status |= VB2_SD_STATUS_CHOSE_SLOT;
397*8617a60dSAndroid Build Coastguard Worker 	vb2api_fail(ctx, 5, 6);
398*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "vb2_failover");
399*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
400*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_FAILURE, "vb2api_fail this fw");
401*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_COUNT), 0,
402*8617a60dSAndroid Build Coastguard Worker 		"vb2api_fail use up tries");
403*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT), 1,
404*8617a60dSAndroid Build Coastguard Worker 		"vb2api_fail try other slot");
405*8617a60dSAndroid Build Coastguard Worker 
406*8617a60dSAndroid Build Coastguard Worker 	/* Fail with other slot already failing triggers recovery */
407*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
408*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_PREV_TRIED, 0);
409*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_PREV_RESULT, VB2_FW_RESULT_FAILURE);
410*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_TRIED, 1);
411*8617a60dSAndroid Build Coastguard Worker 	sd->status |= VB2_SD_STATUS_CHOSE_SLOT;
412*8617a60dSAndroid Build Coastguard Worker 	vb2api_fail(ctx, 7, 8);
413*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 7,
414*8617a60dSAndroid Build Coastguard Worker 		"vb2api_fail both slots bad");
415*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
416*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_FAILURE, "vb2api_fail this fw");
417*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT), 0,
418*8617a60dSAndroid Build Coastguard Worker 		"vb2api_fail try other slot");
419*8617a60dSAndroid Build Coastguard Worker 
420*8617a60dSAndroid Build Coastguard Worker 	/* Fail with single slot already failing triggers recovery */
421*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
422*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_PREV_TRIED, 0);
423*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_TRIED, 0);
424*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_TRYING);
425*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_SLOT_A_ONLY;
426*8617a60dSAndroid Build Coastguard Worker 	sd->status |= VB2_SD_STATUS_CHOSE_SLOT;
427*8617a60dSAndroid Build Coastguard Worker 	vb2api_fail(ctx, 9, 10);
428*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 9,
429*8617a60dSAndroid Build Coastguard Worker 		"vb2api_fail single slot fail");
430*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
431*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_FAILURE, "vb2api_fail this fw");
432*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT), 0,
433*8617a60dSAndroid Build Coastguard Worker 		"vb2api_fail did not try other slot");
434*8617a60dSAndroid Build Coastguard Worker }
435*8617a60dSAndroid Build Coastguard Worker 
previous_boot_fail_tests(void)436*8617a60dSAndroid Build Coastguard Worker static void previous_boot_fail_tests(void)
437*8617a60dSAndroid Build Coastguard Worker {
438*8617a60dSAndroid Build Coastguard Worker 	/* Previous boot fail (before even NV init) */
439*8617a60dSAndroid Build Coastguard Worker 	/* Fail with other slot good doesn't trigger recovery */
440*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
441*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_TRIED, VB2_FW_SLOT_A);
442*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_TRY_COUNT, 3);
443*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_UNKNOWN);
444*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_NV_INIT;
445*8617a60dSAndroid Build Coastguard Worker 	vb2api_previous_boot_fail(ctx, 1, 2);
446*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_NV_INIT,
447*8617a60dSAndroid Build Coastguard Worker 		 0, "vb2api_previous_boot_fail inits NV");
448*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
449*8617a60dSAndroid Build Coastguard Worker 		0, "vb2_previous_boot_fail over");
450*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
451*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_FAILURE, "vb2api_previous_boot_fail result");
452*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_COUNT),
453*8617a60dSAndroid Build Coastguard Worker 		0, "vb2api_previous_boot_fail try count");
454*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT),
455*8617a60dSAndroid Build Coastguard Worker 		1, "vb2api_previous_boot_fail FW tried");
456*8617a60dSAndroid Build Coastguard Worker 
457*8617a60dSAndroid Build Coastguard Worker 	/* Fail with other slot already failing triggers recovery */
458*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
459*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_PREV_TRIED, VB2_FW_SLOT_A);
460*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_PREV_RESULT, VB2_FW_RESULT_FAILURE);
461*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_TRIED, VB2_FW_SLOT_B);
462*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_TRY_COUNT, 3);
463*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_UNKNOWN);
464*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_NV_INIT;
465*8617a60dSAndroid Build Coastguard Worker 	vb2api_previous_boot_fail(ctx, 3, 4);
466*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
467*8617a60dSAndroid Build Coastguard Worker 		3, "vb2api_previous_boot_fail both slots bad");
468*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
469*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_FAILURE, "vb2api_previous_boot_fail result");
470*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_COUNT),
471*8617a60dSAndroid Build Coastguard Worker 		0, "vb2api_previous_boot_fail try count");
472*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT),
473*8617a60dSAndroid Build Coastguard Worker 		0, "vb2api_previous_boot_fail FW tried");
474*8617a60dSAndroid Build Coastguard Worker 
475*8617a60dSAndroid Build Coastguard Worker 	/* Repeated fail doesn't overwrite the error code */
476*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
477*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_TRY_NEXT, VB2_FW_SLOT_A);
478*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_TRY_COUNT, 3);
479*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_FAILURE);
480*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_NV_INIT;
481*8617a60dSAndroid Build Coastguard Worker 	vb2api_previous_boot_fail(ctx, 5, 6);
482*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
483*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_FAILURE, "vb2api_previous_boot_fail result");
484*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_COUNT),
485*8617a60dSAndroid Build Coastguard Worker 		3, "vb2api_previous_boot_fail try count");
486*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT),
487*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_SLOT_A, "vb2api_previous_boot_fail try next");
488*8617a60dSAndroid Build Coastguard Worker }
489*8617a60dSAndroid Build Coastguard Worker 
recovery_tests(void)490*8617a60dSAndroid Build Coastguard Worker static void recovery_tests(void)
491*8617a60dSAndroid Build Coastguard Worker {
492*8617a60dSAndroid Build Coastguard Worker 	/* No recovery */
493*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
494*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->status & VB2_SD_STATUS_RECOVERY_DECIDED,
495*8617a60dSAndroid Build Coastguard Worker 		0, "recovery not yet decided before testing check_recovery()");
496*8617a60dSAndroid Build Coastguard Worker 	vb2_check_recovery(ctx);
497*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->recovery_reason, 0, "No recovery reason");
498*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_RECOVERY_MODE,
499*8617a60dSAndroid Build Coastguard Worker 		0, "Not recovery mode");
500*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_RECOVERY_DECIDED,
501*8617a60dSAndroid Build Coastguard Worker 		 0, "Recovery decided");
502*8617a60dSAndroid Build Coastguard Worker 
503*8617a60dSAndroid Build Coastguard Worker 	/* From request */
504*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
505*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST, 3);
506*8617a60dSAndroid Build Coastguard Worker 	vb2_check_recovery(ctx);
507*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->recovery_reason, 3, "Recovery reason from request");
508*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 3, "NV not cleared");
509*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(ctx->flags & VB2_CONTEXT_RECOVERY_MODE,
510*8617a60dSAndroid Build Coastguard Worker 		 0, "Recovery mode");
511*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_RECOVERY_DECIDED,
512*8617a60dSAndroid Build Coastguard Worker 		 0, "Recovery decided");
513*8617a60dSAndroid Build Coastguard Worker 
514*8617a60dSAndroid Build Coastguard Worker 	/* From request, but already failed */
515*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
516*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST, 4);
517*8617a60dSAndroid Build Coastguard Worker 	sd->recovery_reason = 5;
518*8617a60dSAndroid Build Coastguard Worker 	vb2_check_recovery(ctx);
519*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->recovery_reason, 5, "Recovery reason already failed");
520*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
521*8617a60dSAndroid Build Coastguard Worker 		4, "NV not cleared");
522*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_RECOVERY_DECIDED,
523*8617a60dSAndroid Build Coastguard Worker 		 0, "Recovery decided");
524*8617a60dSAndroid Build Coastguard Worker 
525*8617a60dSAndroid Build Coastguard Worker 	/* Override */
526*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
527*8617a60dSAndroid Build Coastguard Worker 	sd->recovery_reason = 6;
528*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_FORCE_RECOVERY_MODE;
529*8617a60dSAndroid Build Coastguard Worker 	vb2_check_recovery(ctx);
530*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->recovery_reason, VB2_RECOVERY_RO_MANUAL,
531*8617a60dSAndroid Build Coastguard Worker 		"Recovery reason forced");
532*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_RECOVERY_DECIDED,
533*8617a60dSAndroid Build Coastguard Worker 		 0, "Recovery decided");
534*8617a60dSAndroid Build Coastguard Worker 
535*8617a60dSAndroid Build Coastguard Worker 	/* Override subcode TRAIN_AND_REBOOT */
536*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
537*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, VB2_RECOVERY_TRAIN_AND_REBOOT);
538*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_FORCE_RECOVERY_MODE;
539*8617a60dSAndroid Build Coastguard Worker 	vb2_check_recovery(ctx);
540*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->recovery_reason, VB2_RECOVERY_RO_MANUAL,
541*8617a60dSAndroid Build Coastguard Worker 		"Recovery reason forced");
542*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_RECOVERY_DECIDED,
543*8617a60dSAndroid Build Coastguard Worker 		 0, "Recovery decided");
544*8617a60dSAndroid Build Coastguard Worker 
545*8617a60dSAndroid Build Coastguard Worker 	/* Promote subcode from BROKEN screen*/
546*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
547*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, VB2_RECOVERY_US_TEST);
548*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_FORCE_RECOVERY_MODE;
549*8617a60dSAndroid Build Coastguard Worker 	vb2_check_recovery(ctx);
550*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->recovery_reason, VB2_RECOVERY_US_TEST,
551*8617a60dSAndroid Build Coastguard Worker 		"Recovery reason forced from BROKEN");
552*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_RECOVERY_DECIDED,
553*8617a60dSAndroid Build Coastguard Worker 		 0, "Recovery decided");
554*8617a60dSAndroid Build Coastguard Worker }
555*8617a60dSAndroid Build Coastguard Worker 
dev_switch_tests(void)556*8617a60dSAndroid Build Coastguard Worker static void dev_switch_tests(void)
557*8617a60dSAndroid Build Coastguard Worker {
558*8617a60dSAndroid Build Coastguard Worker 	uint32_t v;
559*8617a60dSAndroid Build Coastguard Worker 
560*8617a60dSAndroid Build Coastguard Worker 	/* Normal mode */
561*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
562*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "dev mode off");
563*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd not in dev");
564*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_DEVELOPER_MODE, 0, "  ctx not in dev");
565*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 0, "  no tpm clear");
566*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_REQ_WIPEOUT), 0, "  no nv wipeout");
567*8617a60dSAndroid Build Coastguard Worker 
568*8617a60dSAndroid Build Coastguard Worker 	/* Dev mode */
569*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
570*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_firmware_set(
571*8617a60dSAndroid Build Coastguard Worker 		ctx, VB2_SECDATA_FIRMWARE_FLAGS,
572*8617a60dSAndroid Build Coastguard Worker 		(VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE |
573*8617a60dSAndroid Build Coastguard Worker 		 VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER));
574*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "dev mode on");
575*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd in dev");
576*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(ctx->flags & VB2_CONTEXT_DEVELOPER_MODE, 0, "  ctx in dev");
577*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 0, "  no tpm clear");
578*8617a60dSAndroid Build Coastguard Worker 
579*8617a60dSAndroid Build Coastguard Worker 	/* Any normal mode boot clears dev boot flags */
580*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
581*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
582*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_ALTFW, 1);
583*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_SIGNED_ONLY, 1);
584*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT, 1);
585*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "dev mode off");
586*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL),
587*8617a60dSAndroid Build Coastguard Worker 		0, "  cleared dev boot external");
588*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DEV_BOOT_ALTFW),
589*8617a60dSAndroid Build Coastguard Worker 		0, "  cleared dev boot altfw");
590*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DEV_BOOT_SIGNED_ONLY),
591*8617a60dSAndroid Build Coastguard Worker 		0, "  cleared dev boot signed only");
592*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DEV_DEFAULT_BOOT),
593*8617a60dSAndroid Build Coastguard Worker 		0, "  cleared dev default boot");
594*8617a60dSAndroid Build Coastguard Worker 
595*8617a60dSAndroid Build Coastguard Worker 	/* Normal-dev transition clears TPM */
596*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
597*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_firmware_set(ctx, VB2_SECDATA_FIRMWARE_FLAGS,
598*8617a60dSAndroid Build Coastguard Worker 				 VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE);
599*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "to dev mode");
600*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 1, "  tpm clear");
601*8617a60dSAndroid Build Coastguard Worker 	v = vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_FLAGS);
602*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(v, (VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE |
603*8617a60dSAndroid Build Coastguard Worker 		    VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER),
604*8617a60dSAndroid Build Coastguard Worker 		"  last boot developer now");
605*8617a60dSAndroid Build Coastguard Worker 
606*8617a60dSAndroid Build Coastguard Worker 	/* Dev-normal transition clears TPM too */
607*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
608*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_firmware_set(ctx, VB2_SECDATA_FIRMWARE_FLAGS,
609*8617a60dSAndroid Build Coastguard Worker 				 VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER);
610*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "from dev mode");
611*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 1, "  tpm clear");
612*8617a60dSAndroid Build Coastguard Worker 	v = vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_FLAGS);
613*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(v, 0, "  last boot not developer now");
614*8617a60dSAndroid Build Coastguard Worker 
615*8617a60dSAndroid Build Coastguard Worker 	/* Disable dev mode */
616*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
617*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_firmware_set(
618*8617a60dSAndroid Build Coastguard Worker 		ctx, VB2_SECDATA_FIRMWARE_FLAGS,
619*8617a60dSAndroid Build Coastguard Worker 		(VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE |
620*8617a60dSAndroid Build Coastguard Worker 		 VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER));
621*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
622*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "disable dev request");
623*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd not in dev");
624*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST),
625*8617a60dSAndroid Build Coastguard Worker 		0, "  request cleared");
626*8617a60dSAndroid Build Coastguard Worker 
627*8617a60dSAndroid Build Coastguard Worker 	/* Force enabled by GBB */
628*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
629*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON;
630*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "dev on via gbb");
631*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd in dev");
632*8617a60dSAndroid Build Coastguard Worker 	v = vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_FLAGS);
633*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(v, VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER,
634*8617a60dSAndroid Build Coastguard Worker 		"  doesn't set dev on in secdata_firmware "
635*8617a60dSAndroid Build Coastguard Worker 		"but does set last boot dev");
636*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 1, "  tpm clear");
637*8617a60dSAndroid Build Coastguard Worker 
638*8617a60dSAndroid Build Coastguard Worker 	/* Request disable by ctx flag */
639*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
640*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_firmware_set(
641*8617a60dSAndroid Build Coastguard Worker 		ctx, VB2_SECDATA_FIRMWARE_FLAGS,
642*8617a60dSAndroid Build Coastguard Worker 		(VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE |
643*8617a60dSAndroid Build Coastguard Worker 		 VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER));
644*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_DISABLE_DEVELOPER_MODE;
645*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "disable dev on ctx request");
646*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd not in dev");
647*8617a60dSAndroid Build Coastguard Worker 
648*8617a60dSAndroid Build Coastguard Worker 	/* Simulate clear owner failure */
649*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
650*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_firmware_set(ctx, VB2_SECDATA_FIRMWARE_FLAGS,
651*8617a60dSAndroid Build Coastguard Worker 				 VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER);
652*8617a60dSAndroid Build Coastguard Worker 	mock_tpm_clear_retval = VB2_ERROR_EX_TPM_CLEAR_OWNER;
653*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_check_dev_switch(ctx),
654*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_EX_TPM_CLEAR_OWNER, "tpm clear fail");
655*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 1, "  tpm clear");
656*8617a60dSAndroid Build Coastguard Worker 	v = vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_FLAGS);
657*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(v, VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER,
658*8617a60dSAndroid Build Coastguard Worker 		"  last boot still developer");
659*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
660*8617a60dSAndroid Build Coastguard Worker 		VB2_RECOVERY_TPM_CLEAR_OWNER, "  requests recovery");
661*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE),
662*8617a60dSAndroid Build Coastguard Worker 		(uint8_t)VB2_ERROR_EX_TPM_CLEAR_OWNER, "  recovery subcode");
663*8617a60dSAndroid Build Coastguard Worker 
664*8617a60dSAndroid Build Coastguard Worker 	/*
665*8617a60dSAndroid Build Coastguard Worker 	 * secdata_firmware failure in normal mode fails and shows dev=0 even
666*8617a60dSAndroid Build Coastguard Worker 	 * if dev mode was on in the (inaccessible) secdata_firmware. Since this
667*8617a60dSAndroid Build Coastguard Worker 	 * happens in fw_phase1, we do not abort -- we know that when secdata
668*8617a60dSAndroid Build Coastguard Worker 	 * is uninitialized here, we must be headed for recovery mode.
669*8617a60dSAndroid Build Coastguard Worker 	 */
670*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
671*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_firmware_set(ctx, VB2_SECDATA_FIRMWARE_FLAGS,
672*8617a60dSAndroid Build Coastguard Worker 				 VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE);
673*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_SECDATA_FIRMWARE_INIT;
674*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "secdata_firmware fail normal");
675*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd not in dev");
676*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_DEVELOPER_MODE, 0, "  ctx not in dev");
677*8617a60dSAndroid Build Coastguard Worker 
678*8617a60dSAndroid Build Coastguard Worker 	/* secdata_firmware failure in recovery mode continues */
679*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
680*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_RECOVERY_MODE;
681*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_SECDATA_FIRMWARE_INIT;
682*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "secdata_firmware fail recovery");
683*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd not in dev");
684*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_DEVELOPER_MODE, 0, "  ctx not in dev");
685*8617a60dSAndroid Build Coastguard Worker 
686*8617a60dSAndroid Build Coastguard Worker 	/* And doesn't check or clear dev disable request */
687*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
688*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_RECOVERY_MODE;
689*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_SECDATA_FIRMWARE_INIT;
690*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
691*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx),
692*8617a60dSAndroid Build Coastguard Worker 		  "secdata_firmware fail recovery disable");
693*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd not in dev");
694*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_DEVELOPER_MODE, 0, "  ctx not in dev");
695*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST),
696*8617a60dSAndroid Build Coastguard Worker 		1, "  request not cleared");
697*8617a60dSAndroid Build Coastguard Worker 
698*8617a60dSAndroid Build Coastguard Worker 	/* Can still override with GBB flag */
699*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
700*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_RECOVERY_MODE;
701*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_SECDATA_FIRMWARE_INIT;
702*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON;
703*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx),
704*8617a60dSAndroid Build Coastguard Worker 		  "secdata_firmware fail recovery gbb");
705*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED, 0, "  sd in dev");
706*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(ctx->flags & VB2_CONTEXT_DEVELOPER_MODE, 0, "  ctx in dev");
707*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 1, "  tpm clear");
708*8617a60dSAndroid Build Coastguard Worker 
709*8617a60dSAndroid Build Coastguard Worker 	/* Force wipeout by ctx flag */
710*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
711*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_FORCE_WIPEOUT_MODE;
712*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_dev_switch(ctx), "wipeout on ctx flag");
713*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_REQ_WIPEOUT), 1, "  nv wipeout");
714*8617a60dSAndroid Build Coastguard Worker }
715*8617a60dSAndroid Build Coastguard Worker 
enable_dev_tests(void)716*8617a60dSAndroid Build Coastguard Worker static void enable_dev_tests(void)
717*8617a60dSAndroid Build Coastguard Worker {
718*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
719*8617a60dSAndroid Build Coastguard Worker 	TEST_FAIL(vb2api_enable_developer_mode(ctx),
720*8617a60dSAndroid Build Coastguard Worker 		 "vb2api_enable_developer_mode - failed");
721*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_FLAGS) &
722*8617a60dSAndroid Build Coastguard Worker 		VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE, 0,
723*8617a60dSAndroid Build Coastguard Worker 		"  dev mode flag not set");
724*8617a60dSAndroid Build Coastguard Worker 
725*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
726*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_MANUAL_RECOVERY,
727*8617a60dSAndroid Build Coastguard Worker 		      VB2_RECOVERY_RO_MANUAL);
728*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_enable_developer_mode(ctx),
729*8617a60dSAndroid Build Coastguard Worker 		  "vb2api_enable_developer_mode - success");
730*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_FLAGS) &
731*8617a60dSAndroid Build Coastguard Worker 	         VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE, 0,
732*8617a60dSAndroid Build Coastguard Worker 		 "  dev mode flag set");
733*8617a60dSAndroid Build Coastguard Worker 
734*8617a60dSAndroid Build Coastguard Worker 	/* secdata_firmware not initialized, aborts */
735*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
736*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_MANUAL_RECOVERY,
737*8617a60dSAndroid Build Coastguard Worker 		      VB2_RECOVERY_RO_MANUAL);
738*8617a60dSAndroid Build Coastguard Worker 	sd->status &= ~VB2_SD_STATUS_SECDATA_FIRMWARE_INIT;
739*8617a60dSAndroid Build Coastguard Worker 	sd->status |= VB2_SD_STATUS_RECOVERY_DECIDED;
740*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2api_enable_developer_mode(ctx),
741*8617a60dSAndroid Build Coastguard Worker 		  "secdata_firmware no init, enable dev mode ignored");
742*8617a60dSAndroid Build Coastguard Worker 	sd->status |= VB2_SD_STATUS_SECDATA_FIRMWARE_INIT;
743*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_FLAGS) &
744*8617a60dSAndroid Build Coastguard Worker 	        VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE, 0,
745*8617a60dSAndroid Build Coastguard Worker 		"  dev mode flag not set");
746*8617a60dSAndroid Build Coastguard Worker }
747*8617a60dSAndroid Build Coastguard Worker 
tpm_clear_tests(void)748*8617a60dSAndroid Build Coastguard Worker static void tpm_clear_tests(void)
749*8617a60dSAndroid Build Coastguard Worker {
750*8617a60dSAndroid Build Coastguard Worker 	/* No clear request */
751*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
752*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_tpm_clear(ctx), "no clear request");
753*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 0, "tpm not cleared");
754*8617a60dSAndroid Build Coastguard Worker 
755*8617a60dSAndroid Build Coastguard Worker 	/* Successful request */
756*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
757*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_CLEAR_TPM_OWNER_REQUEST, 1);
758*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_check_tpm_clear(ctx), "clear request");
759*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_CLEAR_TPM_OWNER_REQUEST),
760*8617a60dSAndroid Build Coastguard Worker 		0, "request cleared");
761*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_CLEAR_TPM_OWNER_DONE),
762*8617a60dSAndroid Build Coastguard Worker 		1, "done set");
763*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(mock_tpm_clear_called, 1, "tpm cleared");
764*8617a60dSAndroid Build Coastguard Worker 
765*8617a60dSAndroid Build Coastguard Worker 	/* Failed request */
766*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
767*8617a60dSAndroid Build Coastguard Worker 	mock_tpm_clear_retval = VB2_ERROR_EX_TPM_CLEAR_OWNER;
768*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_CLEAR_TPM_OWNER_REQUEST, 1);
769*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_check_tpm_clear(ctx),
770*8617a60dSAndroid Build Coastguard Worker 		VB2_ERROR_EX_TPM_CLEAR_OWNER, "clear failure");
771*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_CLEAR_TPM_OWNER_REQUEST),
772*8617a60dSAndroid Build Coastguard Worker 		0, "request cleared");
773*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_CLEAR_TPM_OWNER_DONE),
774*8617a60dSAndroid Build Coastguard Worker 		0, "done not set");
775*8617a60dSAndroid Build Coastguard Worker }
776*8617a60dSAndroid Build Coastguard Worker 
select_slot_tests(void)777*8617a60dSAndroid Build Coastguard Worker static void select_slot_tests(void)
778*8617a60dSAndroid Build Coastguard Worker {
779*8617a60dSAndroid Build Coastguard Worker 	/* Slot A */
780*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
781*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_select_fw_slot(ctx), "select slot A");
782*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
783*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_UNKNOWN, "result unknown");
784*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_CHOSE_SLOT, 0, "chose slot");
785*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_TRIED), 0, "tried A");
786*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->fw_slot, 0, "selected A");
787*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_FW_SLOT_B, 0, "didn't choose B");
788*8617a60dSAndroid Build Coastguard Worker 
789*8617a60dSAndroid Build Coastguard Worker 	/* Slot B */
790*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
791*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_TRY_NEXT, 1);
792*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_select_fw_slot(ctx), "select slot B");
793*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
794*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_UNKNOWN, "result unknown");
795*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_CHOSE_SLOT, 0, "chose slot");
796*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_TRIED), 1, "tried B");
797*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->fw_slot, 1, "selected B");
798*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(ctx->flags & VB2_CONTEXT_FW_SLOT_B, 0, "ctx says choose B");
799*8617a60dSAndroid Build Coastguard Worker 
800*8617a60dSAndroid Build Coastguard Worker 	/* Slot A ran out of tries */
801*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
802*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_TRYING);
803*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_select_fw_slot(ctx), "select slot A out of tries");
804*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT), 1, "try B next");
805*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_CHOSE_SLOT, 0, "chose slot");
806*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_TRIED), 1, "tried B");
807*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->fw_slot, 1, "selected B");
808*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(ctx->flags & VB2_CONTEXT_FW_SLOT_B, 0, "ctx says choose B");
809*8617a60dSAndroid Build Coastguard Worker 
810*8617a60dSAndroid Build Coastguard Worker 	/* Slot A ran out of tries, but slot B not present */
811*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
812*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_SLOT_A_ONLY;
813*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_TRYING);
814*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_select_fw_slot(ctx), VB2_ERROR_API_NEXT_SLOT_UNAVAILABLE,
815*8617a60dSAndroid Build Coastguard Worker 		"don't try slot B if only one slot present");
816*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->status & VB2_SD_STATUS_CHOSE_SLOT, 0, "didn't choose slot");
817*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_TRIED), 0, "tried A");
818*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->fw_slot, 0, "selected A");
819*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_FW_SLOT_B, 0, "didn't choose B");
820*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT), 0, "didn't try B next");
821*8617a60dSAndroid Build Coastguard Worker 
822*8617a60dSAndroid Build Coastguard Worker 	/* Slot A ran out of tries, even with nofail active */
823*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
824*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_NOFAIL_BOOT;
825*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_TRYING);
826*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_select_fw_slot(ctx), "select slot A out of tries");
827*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_NEXT), 1, "try B next");
828*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_CHOSE_SLOT, 0, "chose slot");
829*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_TRIED), 1, "tried B");
830*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->fw_slot, 1, "selected B");
831*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(ctx->flags & VB2_CONTEXT_FW_SLOT_B, 0, "ctx says choose B");
832*8617a60dSAndroid Build Coastguard Worker 
833*8617a60dSAndroid Build Coastguard Worker 	/* Slot A used up a try */
834*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
835*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_TRY_COUNT, 3);
836*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_select_fw_slot(ctx), "try slot A");
837*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
838*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_TRYING, "result trying");
839*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_CHOSE_SLOT, 0, "chose slot");
840*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_TRIED), 0, "tried A");
841*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->fw_slot, 0, "selected A");
842*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_FW_SLOT_B, 0, "didn't choose B");
843*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_COUNT), 2, "tries decremented");
844*8617a60dSAndroid Build Coastguard Worker 
845*8617a60dSAndroid Build Coastguard Worker 	/* Slot A failed, but nofail active */
846*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
847*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_NOFAIL_BOOT;
848*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_TRY_COUNT, 3);
849*8617a60dSAndroid Build Coastguard Worker 	TEST_SUCC(vb2_select_fw_slot(ctx), "try slot A");
850*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_RESULT),
851*8617a60dSAndroid Build Coastguard Worker 		VB2_FW_RESULT_TRYING, "result trying");
852*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(sd->status & VB2_SD_STATUS_CHOSE_SLOT, 0, "chose slot");
853*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_TRIED), 0, "tried A");
854*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(sd->fw_slot, 0, "selected A");
855*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx->flags & VB2_CONTEXT_FW_SLOT_B, 0, "didn't choose B");
856*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_COUNT), 3, "tries not decremented");
857*8617a60dSAndroid Build Coastguard Worker 
858*8617a60dSAndroid Build Coastguard Worker 	/* Tried/result get copied to the previous fields */
859*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
860*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_TRIED, 0);
861*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_SUCCESS);
862*8617a60dSAndroid Build Coastguard Worker 	vb2_select_fw_slot(ctx);
863*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_PREV_TRIED), 0, "prev A");
864*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_PREV_RESULT),	VB2_FW_RESULT_SUCCESS,
865*8617a60dSAndroid Build Coastguard Worker 		"prev success");
866*8617a60dSAndroid Build Coastguard Worker 
867*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
868*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_TRIED, 1);
869*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_FAILURE);
870*8617a60dSAndroid Build Coastguard Worker 	vb2_select_fw_slot(ctx);
871*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_PREV_TRIED), 1, "prev B");
872*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_FW_PREV_RESULT),	VB2_FW_RESULT_FAILURE,
873*8617a60dSAndroid Build Coastguard Worker 		"prev failure");
874*8617a60dSAndroid Build Coastguard Worker }
875*8617a60dSAndroid Build Coastguard Worker 
need_reboot_for_display_tests(void)876*8617a60dSAndroid Build Coastguard Worker static void need_reboot_for_display_tests(void)
877*8617a60dSAndroid Build Coastguard Worker {
878*8617a60dSAndroid Build Coastguard Worker 	/* Display not available, reboot required */
879*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
880*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_need_reboot_for_display(ctx), 1,
881*8617a60dSAndroid Build Coastguard Worker 		"need_reboot_for_display: need reboot");
882*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 1,
883*8617a60dSAndroid Build Coastguard Worker 		"  set display request");
884*8617a60dSAndroid Build Coastguard Worker 
885*8617a60dSAndroid Build Coastguard Worker 	/* Display available, don't need reboot */
886*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
887*8617a60dSAndroid Build Coastguard Worker 	sd->flags |= VB2_SD_FLAG_DISPLAY_AVAILABLE;
888*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_need_reboot_for_display(ctx), 0,
889*8617a60dSAndroid Build Coastguard Worker 		"need_reboot_for_display: don't need reboot");
890*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 0,
891*8617a60dSAndroid Build Coastguard Worker 		"  not set display request");
892*8617a60dSAndroid Build Coastguard Worker }
893*8617a60dSAndroid Build Coastguard Worker 
clear_recovery_tests(void)894*8617a60dSAndroid Build Coastguard Worker static void clear_recovery_tests(void)
895*8617a60dSAndroid Build Coastguard Worker {
896*8617a60dSAndroid Build Coastguard Worker 
897*8617a60dSAndroid Build Coastguard Worker 	/* Manual recovery */
898*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
899*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_MANUAL_RECOVERY, 4);
900*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST, 5);
901*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, 13);
902*8617a60dSAndroid Build Coastguard Worker 	vb2api_clear_recovery(ctx);
903*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
904*8617a60dSAndroid Build Coastguard Worker 		0, "  request cleared");
905*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE),
906*8617a60dSAndroid Build Coastguard Worker 		0, "  subcode cleared");
907*8617a60dSAndroid Build Coastguard Worker 
908*8617a60dSAndroid Build Coastguard Worker 	/* Broken screen */
909*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
910*8617a60dSAndroid Build Coastguard Worker 	SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 4);
911*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST, 5);
912*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, 13);
913*8617a60dSAndroid Build Coastguard Worker 	vb2api_clear_recovery(ctx);
914*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
915*8617a60dSAndroid Build Coastguard Worker 		0, "  request cleared");
916*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE),
917*8617a60dSAndroid Build Coastguard Worker 		4, "  subcode shifted");
918*8617a60dSAndroid Build Coastguard Worker }
919*8617a60dSAndroid Build Coastguard Worker 
get_recovery_reason_tests(void)920*8617a60dSAndroid Build Coastguard Worker static void get_recovery_reason_tests(void)
921*8617a60dSAndroid Build Coastguard Worker {
922*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
923*8617a60dSAndroid Build Coastguard Worker 	sd->recovery_reason = 4;
924*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_recovery_reason(ctx), 4, "correct recovery reason");
925*8617a60dSAndroid Build Coastguard Worker }
926*8617a60dSAndroid Build Coastguard Worker 
diagnostic_ui_enabled_tests(void)927*8617a60dSAndroid Build Coastguard Worker static void diagnostic_ui_enabled_tests(void)
928*8617a60dSAndroid Build Coastguard Worker {
929*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
930*8617a60dSAndroid Build Coastguard Worker 	vb2api_secdata_kernel_create(ctx);
931*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_kernel_init(ctx);
932*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_diagnostic_ui_enabled(ctx), 1,
933*8617a60dSAndroid Build Coastguard Worker 		"diagnostic UI enabled");
934*8617a60dSAndroid Build Coastguard Worker 
935*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
936*8617a60dSAndroid Build Coastguard Worker 	vb2api_secdata_kernel_create(ctx);
937*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_kernel_init(ctx);
938*8617a60dSAndroid Build Coastguard Worker 	vb2_secdata_kernel_set(
939*8617a60dSAndroid Build Coastguard Worker 		ctx, VB2_SECDATA_KERNEL_FLAGS,
940*8617a60dSAndroid Build Coastguard Worker 		VB2_SECDATA_KERNEL_FLAG_DIAGNOSTIC_UI_DISABLED);
941*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_diagnostic_ui_enabled(ctx), 0,
942*8617a60dSAndroid Build Coastguard Worker 		"diagnostic UI disabled");
943*8617a60dSAndroid Build Coastguard Worker }
944*8617a60dSAndroid Build Coastguard Worker 
dev_default_boot_tests(void)945*8617a60dSAndroid Build Coastguard Worker static void dev_default_boot_tests(void)
946*8617a60dSAndroid Build Coastguard Worker {
947*8617a60dSAndroid Build Coastguard Worker 	/* No default boot */
948*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
949*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
950*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL,
951*8617a60dSAndroid Build Coastguard Worker 		"no default boot, boot disk");
952*8617a60dSAndroid Build Coastguard Worker 
953*8617a60dSAndroid Build Coastguard Worker 	/* Set boot altfw by GBB */
954*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
955*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_ALTFW;
956*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
957*8617a60dSAndroid Build Coastguard Worker 		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
958*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
959*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_ALTFW,
960*8617a60dSAndroid Build Coastguard Worker 		"GBB set default boot altfw");
961*8617a60dSAndroid Build Coastguard Worker 
962*8617a60dSAndroid Build Coastguard Worker 	/* Boot from internal disk */
963*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
964*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
965*8617a60dSAndroid Build Coastguard Worker 		   VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL);
966*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
967*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL,
968*8617a60dSAndroid Build Coastguard Worker 		"set default boot internal disk");
969*8617a60dSAndroid Build Coastguard Worker 
970*8617a60dSAndroid Build Coastguard Worker 	/* Boot from external disk */
971*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
972*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_DEV_BOOT_EXTERNAL_ALLOWED;
973*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
974*8617a60dSAndroid Build Coastguard Worker 		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
975*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
976*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL,
977*8617a60dSAndroid Build Coastguard Worker 		"set default boot external disk");
978*8617a60dSAndroid Build Coastguard Worker 
979*8617a60dSAndroid Build Coastguard Worker 	/* Boot from external disk not allowed */
980*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
981*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
982*8617a60dSAndroid Build Coastguard Worker 		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
983*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
984*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL,
985*8617a60dSAndroid Build Coastguard Worker 		"default boot external not allowed");
986*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
987*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_DEV_BOOT_ALTFW_ALLOWED;
988*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
989*8617a60dSAndroid Build Coastguard Worker 		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
990*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
991*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL,
992*8617a60dSAndroid Build Coastguard Worker 		"default boot external not allowed");
993*8617a60dSAndroid Build Coastguard Worker 
994*8617a60dSAndroid Build Coastguard Worker 	/* Boot altfw */
995*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
996*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_DEV_BOOT_ALTFW_ALLOWED;
997*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
998*8617a60dSAndroid Build Coastguard Worker 		   VB2_DEV_DEFAULT_BOOT_TARGET_ALTFW);
999*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
1000*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_ALTFW,
1001*8617a60dSAndroid Build Coastguard Worker 		"set default boot altfw");
1002*8617a60dSAndroid Build Coastguard Worker 
1003*8617a60dSAndroid Build Coastguard Worker 	/* Boot altfw not allowed */
1004*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1005*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
1006*8617a60dSAndroid Build Coastguard Worker 		   VB2_DEV_DEFAULT_BOOT_TARGET_ALTFW);
1007*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
1008*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL,
1009*8617a60dSAndroid Build Coastguard Worker 		"default boot altfw not allowed");
1010*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1011*8617a60dSAndroid Build Coastguard Worker 	ctx->flags |= VB2_CONTEXT_DEV_BOOT_EXTERNAL_ALLOWED;
1012*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
1013*8617a60dSAndroid Build Coastguard Worker 		   VB2_DEV_DEFAULT_BOOT_TARGET_ALTFW);
1014*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_get_dev_default_boot_target(ctx),
1015*8617a60dSAndroid Build Coastguard Worker 		VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL,
1016*8617a60dSAndroid Build Coastguard Worker 		"default boot altfw not allowed");
1017*8617a60dSAndroid Build Coastguard Worker }
1018*8617a60dSAndroid Build Coastguard Worker 
fill_dev_boot_flags_tests(void)1019*8617a60dSAndroid Build Coastguard Worker static void fill_dev_boot_flags_tests(void)
1020*8617a60dSAndroid Build Coastguard Worker {
1021*8617a60dSAndroid Build Coastguard Worker 	/* Dev boot - allowed by default */
1022*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1023*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1024*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_ALLOWED,
1025*8617a60dSAndroid Build Coastguard Worker 		  "dev boot - allowed by default");
1026*8617a60dSAndroid Build Coastguard Worker 
1027*8617a60dSAndroid Build Coastguard Worker 	/* Dev boot - disabled by FWMP */
1028*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1029*8617a60dSAndroid Build Coastguard Worker 	fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
1030*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1031*8617a60dSAndroid Build Coastguard Worker 	TEST_FALSE(ctx->flags & VB2_CONTEXT_DEV_BOOT_ALLOWED,
1032*8617a60dSAndroid Build Coastguard Worker 		   "dev boot - FWMP disabled");
1033*8617a60dSAndroid Build Coastguard Worker 
1034*8617a60dSAndroid Build Coastguard Worker 	/* Dev boot - force enabled by GBB */
1035*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1036*8617a60dSAndroid Build Coastguard Worker 	fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
1037*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON;
1038*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1039*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_ALLOWED,
1040*8617a60dSAndroid Build Coastguard Worker 		  "dev boot - GBB force dev on");
1041*8617a60dSAndroid Build Coastguard Worker 
1042*8617a60dSAndroid Build Coastguard Worker 	/* External boot - not allowed by default */
1043*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1044*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1045*8617a60dSAndroid Build Coastguard Worker 	TEST_FALSE(ctx->flags & VB2_CONTEXT_DEV_BOOT_EXTERNAL_ALLOWED,
1046*8617a60dSAndroid Build Coastguard Worker 		   "dev boot external - not allowed by default");
1047*8617a60dSAndroid Build Coastguard Worker 
1048*8617a60dSAndroid Build Coastguard Worker 	/* External boot - enabled by nvdata */
1049*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1050*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
1051*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1052*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_EXTERNAL_ALLOWED,
1053*8617a60dSAndroid Build Coastguard Worker 		  "dev boot external - nvdata enabled");
1054*8617a60dSAndroid Build Coastguard Worker 
1055*8617a60dSAndroid Build Coastguard Worker 	/* External boot - enabled by FWMP */
1056*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1057*8617a60dSAndroid Build Coastguard Worker 	fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL;
1058*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1059*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_EXTERNAL_ALLOWED,
1060*8617a60dSAndroid Build Coastguard Worker 		  "dev boot external - secdata enabled");
1061*8617a60dSAndroid Build Coastguard Worker 
1062*8617a60dSAndroid Build Coastguard Worker 	/* External boot - force enabled by GBB */
1063*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1064*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_USB;
1065*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1066*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_EXTERNAL_ALLOWED,
1067*8617a60dSAndroid Build Coastguard Worker 		  "dev boot external - GBB force enabled");
1068*8617a60dSAndroid Build Coastguard Worker 
1069*8617a60dSAndroid Build Coastguard Worker 	/* External boot - set all flags */
1070*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1071*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
1072*8617a60dSAndroid Build Coastguard Worker 	fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL;
1073*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_USB;
1074*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1075*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_EXTERNAL_ALLOWED,
1076*8617a60dSAndroid Build Coastguard Worker 		  "dev boot external - all flags set");
1077*8617a60dSAndroid Build Coastguard Worker 
1078*8617a60dSAndroid Build Coastguard Worker 	/* Alternate boot - not allowed by default */
1079*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1080*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1081*8617a60dSAndroid Build Coastguard Worker 	TEST_FALSE(ctx->flags & VB2_CONTEXT_DEV_BOOT_ALTFW_ALLOWED,
1082*8617a60dSAndroid Build Coastguard Worker 		   "dev boot altfw - not allowed by default");
1083*8617a60dSAndroid Build Coastguard Worker 
1084*8617a60dSAndroid Build Coastguard Worker 	/* Alternate boot - enabled by nvdata */
1085*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1086*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_ALTFW, 1);
1087*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1088*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_ALTFW_ALLOWED,
1089*8617a60dSAndroid Build Coastguard Worker 		  "dev boot altfw - nvdata enabled");
1090*8617a60dSAndroid Build Coastguard Worker 
1091*8617a60dSAndroid Build Coastguard Worker 	/* Alternate boot - enabled by FWMP */
1092*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1093*8617a60dSAndroid Build Coastguard Worker 	fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_ALTFW;
1094*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1095*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_ALTFW_ALLOWED,
1096*8617a60dSAndroid Build Coastguard Worker 		  "dev boot altfw - secdata enabled");
1097*8617a60dSAndroid Build Coastguard Worker 
1098*8617a60dSAndroid Build Coastguard Worker 	/* Alternate boot - force enabled by GBB */
1099*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1100*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_ALTFW;
1101*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1102*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_ALTFW_ALLOWED,
1103*8617a60dSAndroid Build Coastguard Worker 		  "dev boot altfw - GBB force enabled");
1104*8617a60dSAndroid Build Coastguard Worker 
1105*8617a60dSAndroid Build Coastguard Worker 	/* Alternate boot - set all flags */
1106*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1107*8617a60dSAndroid Build Coastguard Worker 	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_ALTFW, 1);
1108*8617a60dSAndroid Build Coastguard Worker 	fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_ALTFW;
1109*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_ALTFW;
1110*8617a60dSAndroid Build Coastguard Worker 	vb2_fill_dev_boot_flags(ctx);
1111*8617a60dSAndroid Build Coastguard Worker 	TEST_TRUE(ctx->flags & VB2_CONTEXT_DEV_BOOT_ALTFW_ALLOWED,
1112*8617a60dSAndroid Build Coastguard Worker 		  "dev boot altfw - all flags set");
1113*8617a60dSAndroid Build Coastguard Worker }
1114*8617a60dSAndroid Build Coastguard Worker 
use_dev_screen_short_delay_tests(void)1115*8617a60dSAndroid Build Coastguard Worker static void use_dev_screen_short_delay_tests(void)
1116*8617a60dSAndroid Build Coastguard Worker {
1117*8617a60dSAndroid Build Coastguard Worker 	/* Normal delay */
1118*8617a60dSAndroid Build Coastguard Worker 	reset_common_data();
1119*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_use_short_dev_screen_delay(ctx), 0,
1120*8617a60dSAndroid Build Coastguard Worker 		"short delay: no");
1121*8617a60dSAndroid Build Coastguard Worker 
1122*8617a60dSAndroid Build Coastguard Worker 	/* Short delay */
1123*8617a60dSAndroid Build Coastguard Worker 	gbb.flags |= VB2_GBB_FLAG_DEV_SCREEN_SHORT_DELAY;
1124*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(vb2api_use_short_dev_screen_delay(ctx), 1,
1125*8617a60dSAndroid Build Coastguard Worker 		"short delay: yes");
1126*8617a60dSAndroid Build Coastguard Worker }
1127*8617a60dSAndroid Build Coastguard Worker 
main(int argc,char * argv[])1128*8617a60dSAndroid Build Coastguard Worker int main(int argc, char* argv[])
1129*8617a60dSAndroid Build Coastguard Worker {
1130*8617a60dSAndroid Build Coastguard Worker 	init_workbuf_tests();
1131*8617a60dSAndroid Build Coastguard Worker 	misc_tests();
1132*8617a60dSAndroid Build Coastguard Worker 	gbb_tests();
1133*8617a60dSAndroid Build Coastguard Worker 	fail_tests();
1134*8617a60dSAndroid Build Coastguard Worker 	previous_boot_fail_tests();
1135*8617a60dSAndroid Build Coastguard Worker 	recovery_tests();
1136*8617a60dSAndroid Build Coastguard Worker 	dev_switch_tests();
1137*8617a60dSAndroid Build Coastguard Worker 	enable_dev_tests();
1138*8617a60dSAndroid Build Coastguard Worker 	tpm_clear_tests();
1139*8617a60dSAndroid Build Coastguard Worker 	select_slot_tests();
1140*8617a60dSAndroid Build Coastguard Worker 	need_reboot_for_display_tests();
1141*8617a60dSAndroid Build Coastguard Worker 	clear_recovery_tests();
1142*8617a60dSAndroid Build Coastguard Worker 	get_recovery_reason_tests();
1143*8617a60dSAndroid Build Coastguard Worker 	diagnostic_ui_enabled_tests();
1144*8617a60dSAndroid Build Coastguard Worker 	dev_default_boot_tests();
1145*8617a60dSAndroid Build Coastguard Worker 	fill_dev_boot_flags_tests();
1146*8617a60dSAndroid Build Coastguard Worker 	use_dev_screen_short_delay_tests();
1147*8617a60dSAndroid Build Coastguard Worker 
1148*8617a60dSAndroid Build Coastguard Worker 	return gTestSuccess ? 0 : 255;
1149*8617a60dSAndroid Build Coastguard Worker }
1150