1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2022 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 vb2_set_boot_mode.
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 "common/tests.h"
13*8617a60dSAndroid Build Coastguard Worker
14*8617a60dSAndroid Build Coastguard Worker /* Mock data */
15*8617a60dSAndroid Build Coastguard Worker
16*8617a60dSAndroid Build Coastguard Worker static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
17*8617a60dSAndroid Build Coastguard Worker __attribute__((aligned(VB2_WORKBUF_ALIGN)));
18*8617a60dSAndroid Build Coastguard Worker static struct vb2_context *ctx;
19*8617a60dSAndroid Build Coastguard Worker static struct vb2_shared_data *sd;
20*8617a60dSAndroid Build Coastguard Worker static struct vb2_gbb_header gbb;
21*8617a60dSAndroid Build Coastguard Worker
22*8617a60dSAndroid Build Coastguard Worker static int mock_diagnostic_ui_enabled;
23*8617a60dSAndroid Build Coastguard Worker
24*8617a60dSAndroid Build Coastguard Worker /* Mock functions */
25*8617a60dSAndroid Build Coastguard Worker
vb2_get_gbb(struct vb2_context * c)26*8617a60dSAndroid Build Coastguard Worker struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
27*8617a60dSAndroid Build Coastguard Worker {
28*8617a60dSAndroid Build Coastguard Worker return &gbb;
29*8617a60dSAndroid Build Coastguard Worker }
30*8617a60dSAndroid Build Coastguard Worker
vb2api_diagnostic_ui_enabled(struct vb2_context * c)31*8617a60dSAndroid Build Coastguard Worker int vb2api_diagnostic_ui_enabled(struct vb2_context *c)
32*8617a60dSAndroid Build Coastguard Worker {
33*8617a60dSAndroid Build Coastguard Worker return mock_diagnostic_ui_enabled;
34*8617a60dSAndroid Build Coastguard Worker }
35*8617a60dSAndroid Build Coastguard Worker
reset_common_data(void)36*8617a60dSAndroid Build Coastguard Worker static void reset_common_data(void)
37*8617a60dSAndroid Build Coastguard Worker {
38*8617a60dSAndroid Build Coastguard Worker memset(workbuf, 0xaa, sizeof(workbuf));
39*8617a60dSAndroid Build Coastguard Worker
40*8617a60dSAndroid Build Coastguard Worker memset(&gbb, 0, sizeof(gbb));
41*8617a60dSAndroid Build Coastguard Worker
42*8617a60dSAndroid Build Coastguard Worker TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
43*8617a60dSAndroid Build Coastguard Worker "vb2api_init failed");
44*8617a60dSAndroid Build Coastguard Worker sd = vb2_get_sd(ctx);
45*8617a60dSAndroid Build Coastguard Worker
46*8617a60dSAndroid Build Coastguard Worker vb2_nv_init(ctx);
47*8617a60dSAndroid Build Coastguard Worker
48*8617a60dSAndroid Build Coastguard Worker mock_diagnostic_ui_enabled = 0;
49*8617a60dSAndroid Build Coastguard Worker }
50*8617a60dSAndroid Build Coastguard Worker
set_boot_mode_tests(void)51*8617a60dSAndroid Build Coastguard Worker static void set_boot_mode_tests(void)
52*8617a60dSAndroid Build Coastguard Worker {
53*8617a60dSAndroid Build Coastguard Worker /* Normal boot */
54*8617a60dSAndroid Build Coastguard Worker reset_common_data();
55*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
56*8617a60dSAndroid Build Coastguard Worker TEST_EQ(ctx->boot_mode, VB2_BOOT_MODE_NORMAL, "Normal boot");
57*8617a60dSAndroid Build Coastguard Worker
58*8617a60dSAndroid Build Coastguard Worker /* Check that NV_DIAG_REQUEST triggers diagnostic mode */
59*8617a60dSAndroid Build Coastguard Worker reset_common_data();
60*8617a60dSAndroid Build Coastguard Worker mock_diagnostic_ui_enabled = 1;
61*8617a60dSAndroid Build Coastguard Worker vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 1);
62*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
63*8617a60dSAndroid Build Coastguard Worker TEST_EQ(ctx->boot_mode, VB2_BOOT_MODE_DIAGNOSTICS,
64*8617a60dSAndroid Build Coastguard Worker "Normal boot with diag UI enabled");
65*8617a60dSAndroid Build Coastguard Worker
66*8617a60dSAndroid Build Coastguard Worker reset_common_data();
67*8617a60dSAndroid Build Coastguard Worker vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 1);
68*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
69*8617a60dSAndroid Build Coastguard Worker TEST_EQ(ctx->boot_mode, VB2_BOOT_MODE_NORMAL,
70*8617a60dSAndroid Build Coastguard Worker "Normal boot with diag UI disabled");
71*8617a60dSAndroid Build Coastguard Worker
72*8617a60dSAndroid Build Coastguard Worker /* Developer boot */
73*8617a60dSAndroid Build Coastguard Worker reset_common_data();
74*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_DEVELOPER_MODE;
75*8617a60dSAndroid Build Coastguard Worker sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
76*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
77*8617a60dSAndroid Build Coastguard Worker TEST_EQ(ctx->boot_mode, VB2_BOOT_MODE_DEVELOPER, "Dev boot");
78*8617a60dSAndroid Build Coastguard Worker
79*8617a60dSAndroid Build Coastguard Worker /* Recovery boot */
80*8617a60dSAndroid Build Coastguard Worker reset_common_data();
81*8617a60dSAndroid Build Coastguard Worker sd->recovery_reason = 123;
82*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_RECOVERY_MODE;
83*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
84*8617a60dSAndroid Build Coastguard Worker TEST_EQ(ctx->boot_mode, VB2_BOOT_MODE_BROKEN_SCREEN, "Broken screen");
85*8617a60dSAndroid Build Coastguard Worker
86*8617a60dSAndroid Build Coastguard Worker reset_common_data();
87*8617a60dSAndroid Build Coastguard Worker sd->recovery_reason = VB2_RECOVERY_RO_MANUAL;
88*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_RECOVERY_MODE;
89*8617a60dSAndroid Build Coastguard Worker gbb.flags |= VB2_GBB_FLAG_FORCE_MANUAL_RECOVERY;
90*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
91*8617a60dSAndroid Build Coastguard Worker TEST_EQ(ctx->boot_mode, VB2_BOOT_MODE_MANUAL_RECOVERY,
92*8617a60dSAndroid Build Coastguard Worker "Manual recovery: forced by GBB flags");
93*8617a60dSAndroid Build Coastguard Worker
94*8617a60dSAndroid Build Coastguard Worker reset_common_data();
95*8617a60dSAndroid Build Coastguard Worker sd->recovery_reason = VB2_RECOVERY_RO_MANUAL;
96*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_FORCE_RECOVERY_MODE;
97*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_EC_TRUSTED;
98*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
99*8617a60dSAndroid Build Coastguard Worker TEST_EQ(ctx->boot_mode, VB2_BOOT_MODE_MANUAL_RECOVERY,
100*8617a60dSAndroid Build Coastguard Worker "Manual recovery: physical rec switch");
101*8617a60dSAndroid Build Coastguard Worker
102*8617a60dSAndroid Build Coastguard Worker reset_common_data();
103*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_EC_TRUSTED;
104*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
105*8617a60dSAndroid Build Coastguard Worker TEST_NEQ(ctx->boot_mode, VB2_BOOT_MODE_MANUAL_RECOVERY,
106*8617a60dSAndroid Build Coastguard Worker "VB2_CONTEXT_FORCE_RECOVERY_MODE is not set");
107*8617a60dSAndroid Build Coastguard Worker
108*8617a60dSAndroid Build Coastguard Worker reset_common_data();
109*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_FORCE_RECOVERY_MODE;
110*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_NO_BOOT;
111*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_EC_TRUSTED;
112*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
113*8617a60dSAndroid Build Coastguard Worker TEST_NEQ(ctx->boot_mode, VB2_BOOT_MODE_MANUAL_RECOVERY,
114*8617a60dSAndroid Build Coastguard Worker "Block manual recovery if NO_BOOT");
115*8617a60dSAndroid Build Coastguard Worker
116*8617a60dSAndroid Build Coastguard Worker reset_common_data();
117*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_FORCE_RECOVERY_MODE;
118*8617a60dSAndroid Build Coastguard Worker vb2_set_boot_mode(ctx);
119*8617a60dSAndroid Build Coastguard Worker TEST_NEQ(ctx->boot_mode, VB2_BOOT_MODE_MANUAL_RECOVERY,
120*8617a60dSAndroid Build Coastguard Worker "Block manual recovery for untrusted EC");
121*8617a60dSAndroid Build Coastguard Worker }
122*8617a60dSAndroid Build Coastguard Worker
main(void)123*8617a60dSAndroid Build Coastguard Worker int main(void)
124*8617a60dSAndroid Build Coastguard Worker {
125*8617a60dSAndroid Build Coastguard Worker set_boot_mode_tests();
126*8617a60dSAndroid Build Coastguard Worker
127*8617a60dSAndroid Build Coastguard Worker return gTestSuccess ? 0 : 255;
128*8617a60dSAndroid Build Coastguard Worker }
129