17c55708979036bff83370036034d8d2cea3053edRandall Spangler/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2bf020a0d4db68897058503767067567565450ddeBill Richardson * Use of this source code is governed by a BSD-style license that can be
3bf020a0d4db68897058503767067567565450ddeBill Richardson * found in the LICENSE file.
4bf020a0d4db68897058503767067567565450ddeBill Richardson *
5bf020a0d4db68897058503767067567565450ddeBill Richardson * Tests for VbTryLoadKernel()
6bf020a0d4db68897058503767067567565450ddeBill Richardson */
7bf020a0d4db68897058503767067567565450ddeBill Richardson
8bf020a0d4db68897058503767067567565450ddeBill Richardson#include <stddef.h>
90c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include <stdint.h>
10bf020a0d4db68897058503767067567565450ddeBill Richardson#include <stdio.h>
11bf020a0d4db68897058503767067567565450ddeBill Richardson#include <stdlib.h>
12bf020a0d4db68897058503767067567565450ddeBill Richardson
13bf020a0d4db68897058503767067567565450ddeBill Richardson#include "gbb_header.h"
14bf020a0d4db68897058503767067567565450ddeBill Richardson#include "load_kernel_fw.h"
15bf020a0d4db68897058503767067567565450ddeBill Richardson#include "rollback_index.h"
16bf020a0d4db68897058503767067567565450ddeBill Richardson#include "test_common.h"
17bf020a0d4db68897058503767067567565450ddeBill Richardson#include "utility.h"
18bf020a0d4db68897058503767067567565450ddeBill Richardson#include "vboot_api.h"
197f43669630cb42e40ca6ddc1128eefea8fd339d9Randall Spangler#include "vboot_kernel.h"
20bf020a0d4db68897058503767067567565450ddeBill Richardson
21bf020a0d4db68897058503767067567565450ddeBill Richardson#define MAX_TEST_DISKS 10
22bf020a0d4db68897058503767067567565450ddeBill Richardson#define DEFAULT_COUNT -1
23bf020a0d4db68897058503767067567565450ddeBill Richardson
24bf020a0d4db68897058503767067567565450ddeBill Richardsontypedef struct {
257c55708979036bff83370036034d8d2cea3053edRandall Spangler	uint64_t bytes_per_lba;
267c55708979036bff83370036034d8d2cea3053edRandall Spangler	uint64_t lba_count;
277c55708979036bff83370036034d8d2cea3053edRandall Spangler	uint32_t flags;
287c55708979036bff83370036034d8d2cea3053edRandall Spangler	const char *diskname;
29bf020a0d4db68897058503767067567565450ddeBill Richardson} disk_desc_t;
30bf020a0d4db68897058503767067567565450ddeBill Richardson
31bf020a0d4db68897058503767067567565450ddeBill Richardsontypedef struct {
327c55708979036bff83370036034d8d2cea3053edRandall Spangler	char *name;
33bf020a0d4db68897058503767067567565450ddeBill Richardson
347c55708979036bff83370036034d8d2cea3053edRandall Spangler	/* inputs for test case */
357c55708979036bff83370036034d8d2cea3053edRandall Spangler	uint32_t want_flags;
367c55708979036bff83370036034d8d2cea3053edRandall Spangler	VbError_t diskgetinfo_return_val;
377c55708979036bff83370036034d8d2cea3053edRandall Spangler	disk_desc_t disks_to_provide[MAX_TEST_DISKS];
387c55708979036bff83370036034d8d2cea3053edRandall Spangler	int disk_count_to_return;
397c55708979036bff83370036034d8d2cea3053edRandall Spangler	VbError_t loadkernel_return_val[MAX_TEST_DISKS];
403f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg	uint8_t external_expected[MAX_TEST_DISKS];
41bf020a0d4db68897058503767067567565450ddeBill Richardson
427c55708979036bff83370036034d8d2cea3053edRandall Spangler	/* outputs from test */
437c55708979036bff83370036034d8d2cea3053edRandall Spangler	uint32_t expected_recovery_request_val;
447c55708979036bff83370036034d8d2cea3053edRandall Spangler	const char *expected_to_find_disk;
457c55708979036bff83370036034d8d2cea3053edRandall Spangler	const char *expected_to_load_disk;
467c55708979036bff83370036034d8d2cea3053edRandall Spangler	uint32_t expected_return_val;
47bf020a0d4db68897058503767067567565450ddeBill Richardson
48bf020a0d4db68897058503767067567565450ddeBill Richardson} test_case_t;
49bf020a0d4db68897058503767067567565450ddeBill Richardson
50bf020a0d4db68897058503767067567565450ddeBill Richardson/****************************************************************************/
51bf020a0d4db68897058503767067567565450ddeBill Richardson/* Test cases */
52bf020a0d4db68897058503767067567565450ddeBill Richardson
53bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic const char pickme[] = "correct choice";
54bf020a0d4db68897058503767067567565450ddeBill Richardson#define DONT_CARE ((const char *)42)
55bf020a0d4db68897058503767067567565450ddeBill Richardson
56bf020a0d4db68897058503767067567565450ddeBill Richardsontest_case_t test[] = {
577c55708979036bff83370036034d8d2cea3053edRandall Spangler	{
587c55708979036bff83370036034d8d2cea3053edRandall Spangler		.name = "first removable drive",
597c55708979036bff83370036034d8d2cea3053edRandall Spangler		.want_flags = VB_DISK_FLAG_REMOVABLE,
607c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disks_to_provide = {
617c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* too small */
627c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,   10,  VB_DISK_FLAG_REMOVABLE, 0},
637c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong LBA */
647c55708979036bff83370036034d8d2cea3053edRandall Spangler			{2048, 100,  VB_DISK_FLAG_REMOVABLE, 0},
657c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong type */
667c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_FIXED, 0},
677c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong flags */
687c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  0, 0},
697c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* still wrong flags */
707c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  -1, 0},
713f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg			{512,  100,
723f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg			 VB_DISK_FLAG_REMOVABLE | VB_DISK_FLAG_EXTERNAL_GPT,
733f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg			 pickme},
747c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* already got one */
757c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_REMOVABLE, "holygrail"},
767c55708979036bff83370036034d8d2cea3053edRandall Spangler		},
777c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disk_count_to_return = DEFAULT_COUNT,
787c55708979036bff83370036034d8d2cea3053edRandall Spangler		.diskgetinfo_return_val = VBERROR_SUCCESS,
797c55708979036bff83370036034d8d2cea3053edRandall Spangler		.loadkernel_return_val = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
803f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg		.external_expected = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
817c55708979036bff83370036034d8d2cea3053edRandall Spangler
827c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_recovery_request_val = VBNV_RECOVERY_NOT_REQUESTED,
837c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_find_disk = pickme,
847c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_load_disk = pickme,
857c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_return_val = VBERROR_SUCCESS
867c55708979036bff83370036034d8d2cea3053edRandall Spangler	},
877c55708979036bff83370036034d8d2cea3053edRandall Spangler	{
887c55708979036bff83370036034d8d2cea3053edRandall Spangler		.name = "second removable drive",
897c55708979036bff83370036034d8d2cea3053edRandall Spangler		.want_flags = VB_DISK_FLAG_REMOVABLE,
907c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disks_to_provide = {
917c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong flags */
927c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  0, 0},
937c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_REMOVABLE, "not yet"},
947c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_REMOVABLE, pickme},
957c55708979036bff83370036034d8d2cea3053edRandall Spangler		},
967c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disk_count_to_return = DEFAULT_COUNT,
977c55708979036bff83370036034d8d2cea3053edRandall Spangler		.diskgetinfo_return_val = VBERROR_SUCCESS,
987c55708979036bff83370036034d8d2cea3053edRandall Spangler		.loadkernel_return_val = {1, 0, 1, 1, 1, 1, 1, 1, 1, 1,},
997c55708979036bff83370036034d8d2cea3053edRandall Spangler
1007c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_recovery_request_val = VBNV_RECOVERY_NOT_REQUESTED,
1017c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_find_disk = pickme,
1027c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_load_disk = pickme,
1037c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_return_val = VBERROR_SUCCESS
1047c55708979036bff83370036034d8d2cea3053edRandall Spangler	},
1057c55708979036bff83370036034d8d2cea3053edRandall Spangler	{
1067c55708979036bff83370036034d8d2cea3053edRandall Spangler		.name = "first fixed drive",
1077c55708979036bff83370036034d8d2cea3053edRandall Spangler		.want_flags = VB_DISK_FLAG_FIXED,
1087c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disks_to_provide = {
1097c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* too small */
1107c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,   10,  VB_DISK_FLAG_FIXED, 0},
1117c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong LBA */
1127c55708979036bff83370036034d8d2cea3053edRandall Spangler			{2048, 100,  VB_DISK_FLAG_FIXED, 0},
1137c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong type */
1147c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_REMOVABLE, 0},
1157c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong flags */
1167c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  0, 0},
1177c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* still wrong flags */
1187c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  -1, 0},
1197c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* flags */
1207c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_REMOVABLE|VB_DISK_FLAG_FIXED,
1217c55708979036bff83370036034d8d2cea3053edRandall Spangler			 0},
1227c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_FIXED, pickme},
1237c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* already got one */
1247c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_FIXED, "holygrail"},
1257c55708979036bff83370036034d8d2cea3053edRandall Spangler		},
1267c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disk_count_to_return = DEFAULT_COUNT,
1277c55708979036bff83370036034d8d2cea3053edRandall Spangler		.diskgetinfo_return_val = VBERROR_SUCCESS,
1287c55708979036bff83370036034d8d2cea3053edRandall Spangler		.loadkernel_return_val = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
1297c55708979036bff83370036034d8d2cea3053edRandall Spangler
1307c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_recovery_request_val = VBNV_RECOVERY_NOT_REQUESTED,
1317c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_find_disk = pickme,
1327c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_load_disk = pickme,
1337c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_return_val = VBERROR_SUCCESS
1347c55708979036bff83370036034d8d2cea3053edRandall Spangler	},
1357c55708979036bff83370036034d8d2cea3053edRandall Spangler	{
1367c55708979036bff83370036034d8d2cea3053edRandall Spangler		.name = "no drives at all",
1377c55708979036bff83370036034d8d2cea3053edRandall Spangler		.want_flags = VB_DISK_FLAG_FIXED,
1387c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disks_to_provide = {},
1397c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disk_count_to_return = DEFAULT_COUNT,
1407c55708979036bff83370036034d8d2cea3053edRandall Spangler		.diskgetinfo_return_val = VBERROR_SUCCESS,
1417c55708979036bff83370036034d8d2cea3053edRandall Spangler		.loadkernel_return_val = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
1427c55708979036bff83370036034d8d2cea3053edRandall Spangler
1437c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_recovery_request_val = VBNV_RECOVERY_RW_NO_DISK,
1447c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_find_disk = 0,
1457c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_load_disk = 0,
1467c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_return_val = VBERROR_NO_DISK_FOUND
1477c55708979036bff83370036034d8d2cea3053edRandall Spangler	},
1487c55708979036bff83370036034d8d2cea3053edRandall Spangler	{
1497c55708979036bff83370036034d8d2cea3053edRandall Spangler		.name = "no valid drives",
1507c55708979036bff83370036034d8d2cea3053edRandall Spangler		.want_flags = VB_DISK_FLAG_FIXED,
1517c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disks_to_provide = {
1527c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* too small */
1537c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,   10,  VB_DISK_FLAG_FIXED, 0},
1547c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong LBA */
1557c55708979036bff83370036034d8d2cea3053edRandall Spangler			{2048, 100,  VB_DISK_FLAG_FIXED, 0},
1567c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong type */
1577c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_REMOVABLE, 0},
1587c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* wrong flags */
1597c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  0, 0},
1607c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* still wrong flags */
1617c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  -1, 0},
1627c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* doesn't load */
1637c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_FIXED, "bad1"},
1647c55708979036bff83370036034d8d2cea3053edRandall Spangler			/* doesn't load */
1657c55708979036bff83370036034d8d2cea3053edRandall Spangler			{512,  100,  VB_DISK_FLAG_FIXED, "bad2"},
1667c55708979036bff83370036034d8d2cea3053edRandall Spangler		},
1677c55708979036bff83370036034d8d2cea3053edRandall Spangler		.disk_count_to_return = DEFAULT_COUNT,
1687c55708979036bff83370036034d8d2cea3053edRandall Spangler		.diskgetinfo_return_val = VBERROR_SUCCESS,
1697c55708979036bff83370036034d8d2cea3053edRandall Spangler		.loadkernel_return_val = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
1707c55708979036bff83370036034d8d2cea3053edRandall Spangler
1710714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler		.expected_recovery_request_val = VBNV_RECOVERY_RW_NO_KERNEL,
1727c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_find_disk = DONT_CARE,
1737c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_to_load_disk = 0,
1747c55708979036bff83370036034d8d2cea3053edRandall Spangler		.expected_return_val = 1
1757c55708979036bff83370036034d8d2cea3053edRandall Spangler	},
176bf020a0d4db68897058503767067567565450ddeBill Richardson};
177bf020a0d4db68897058503767067567565450ddeBill Richardson
178bf020a0d4db68897058503767067567565450ddeBill Richardson/****************************************************************************/
179bf020a0d4db68897058503767067567565450ddeBill Richardson
180bf020a0d4db68897058503767067567565450ddeBill Richardson/* Mock data */
181bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic LoadKernelParams lkparams;
182bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic VbDiskInfo mock_disks[MAX_TEST_DISKS];
183bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic test_case_t *t;
184bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic int load_kernel_calls;
185bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic uint32_t got_recovery_request_val;
186bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic const char *got_find_disk;
187bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic const char *got_load_disk;
188bf020a0d4db68897058503767067567565450ddeBill Richardsonstatic uint32_t got_return_val;
1893f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenbergstatic uint32_t got_external_mismatch;
190bf020a0d4db68897058503767067567565450ddeBill Richardson
1917c55708979036bff83370036034d8d2cea3053edRandall Spangler/**
1927c55708979036bff83370036034d8d2cea3053edRandall Spangler * Reset mock data (for use before each test)
1937c55708979036bff83370036034d8d2cea3053edRandall Spangler */
1947c55708979036bff83370036034d8d2cea3053edRandall Spanglerstatic void ResetMocks(int i)
1957c55708979036bff83370036034d8d2cea3053edRandall Spangler{
1967c55708979036bff83370036034d8d2cea3053edRandall Spangler	Memset(&lkparams, 0, sizeof(lkparams));
1977c55708979036bff83370036034d8d2cea3053edRandall Spangler	Memset(&mock_disks, 0, sizeof(mock_disks));
1987c55708979036bff83370036034d8d2cea3053edRandall Spangler	load_kernel_calls = 0;
1997c55708979036bff83370036034d8d2cea3053edRandall Spangler
2007c55708979036bff83370036034d8d2cea3053edRandall Spangler	got_recovery_request_val = VBNV_RECOVERY_NOT_REQUESTED;
2017c55708979036bff83370036034d8d2cea3053edRandall Spangler	got_find_disk = 0;
2027c55708979036bff83370036034d8d2cea3053edRandall Spangler	got_load_disk = 0;
2037c55708979036bff83370036034d8d2cea3053edRandall Spangler	got_return_val = 0xdeadbeef;
2047c55708979036bff83370036034d8d2cea3053edRandall Spangler
2057c55708979036bff83370036034d8d2cea3053edRandall Spangler	t = test + i;
206bf020a0d4db68897058503767067567565450ddeBill Richardson}
207bf020a0d4db68897058503767067567565450ddeBill Richardson
2087c55708979036bff83370036034d8d2cea3053edRandall Spanglerint is_nonzero(const void *vptr, size_t count)
2097c55708979036bff83370036034d8d2cea3053edRandall Spangler{
2107c55708979036bff83370036034d8d2cea3053edRandall Spangler	const char *p = (const char *)vptr;
2117c55708979036bff83370036034d8d2cea3053edRandall Spangler	while (count--)
2127c55708979036bff83370036034d8d2cea3053edRandall Spangler		if (*p++)
2137c55708979036bff83370036034d8d2cea3053edRandall Spangler			return 1;
214bf020a0d4db68897058503767067567565450ddeBill Richardson
2157c55708979036bff83370036034d8d2cea3053edRandall Spangler	return 0;
216bf020a0d4db68897058503767067567565450ddeBill Richardson}
217bf020a0d4db68897058503767067567565450ddeBill Richardson
218bf020a0d4db68897058503767067567565450ddeBill Richardson/****************************************************************************/
219bf020a0d4db68897058503767067567565450ddeBill Richardson/* Mocked verification functions */
220bf020a0d4db68897058503767067567565450ddeBill Richardson
2217c55708979036bff83370036034d8d2cea3053edRandall SpanglerVbError_t VbExDiskGetInfo(VbDiskInfo **infos_ptr, uint32_t *count,
2227c55708979036bff83370036034d8d2cea3053edRandall Spangler                          uint32_t disk_flags)
2237c55708979036bff83370036034d8d2cea3053edRandall Spangler{
2247c55708979036bff83370036034d8d2cea3053edRandall Spangler	int i;
2257c55708979036bff83370036034d8d2cea3053edRandall Spangler	int num_disks = 0;
2267c55708979036bff83370036034d8d2cea3053edRandall Spangler
2277c55708979036bff83370036034d8d2cea3053edRandall Spangler	VBDEBUG(("My %s\n", __FUNCTION__));
2287c55708979036bff83370036034d8d2cea3053edRandall Spangler
2297c55708979036bff83370036034d8d2cea3053edRandall Spangler	*infos_ptr = mock_disks;
2307c55708979036bff83370036034d8d2cea3053edRandall Spangler
2310714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler	for(i = 0; i < MAX_TEST_DISKS; i++) {
2327c55708979036bff83370036034d8d2cea3053edRandall Spangler		if (is_nonzero(&t->disks_to_provide[i],
2337c55708979036bff83370036034d8d2cea3053edRandall Spangler			       sizeof(t->disks_to_provide[i]))) {
2347c55708979036bff83370036034d8d2cea3053edRandall Spangler			mock_disks[num_disks].bytes_per_lba =
2357c55708979036bff83370036034d8d2cea3053edRandall Spangler				t->disks_to_provide[i].bytes_per_lba;
2367c55708979036bff83370036034d8d2cea3053edRandall Spangler			mock_disks[num_disks].lba_count =
2373f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg				mock_disks[num_disks].streaming_lba_count =
2387c55708979036bff83370036034d8d2cea3053edRandall Spangler				t->disks_to_provide[i].lba_count;
2397c55708979036bff83370036034d8d2cea3053edRandall Spangler			mock_disks[num_disks].flags =
2407c55708979036bff83370036034d8d2cea3053edRandall Spangler				t->disks_to_provide[i].flags;
2417c55708979036bff83370036034d8d2cea3053edRandall Spangler			mock_disks[num_disks].handle = (VbExDiskHandle_t)
2427c55708979036bff83370036034d8d2cea3053edRandall Spangler				t->disks_to_provide[i].diskname;
2433401fdcd4125beea1a8cb1cc59ee27df89d4d88aSimon Glass			VBDEBUG(("  mock_disk[%d] %" PRIu64 " %" PRIu64
2443401fdcd4125beea1a8cb1cc59ee27df89d4d88aSimon Glass				 " 0x%x %s\n", i,
2457c55708979036bff83370036034d8d2cea3053edRandall Spangler				 mock_disks[num_disks].bytes_per_lba,
2467c55708979036bff83370036034d8d2cea3053edRandall Spangler				 mock_disks[num_disks].lba_count,
2477c55708979036bff83370036034d8d2cea3053edRandall Spangler				 mock_disks[num_disks].flags,
2487c55708979036bff83370036034d8d2cea3053edRandall Spangler				 (mock_disks[num_disks].handle
2497c55708979036bff83370036034d8d2cea3053edRandall Spangler				  ? (char *)mock_disks[num_disks].handle
2507c55708979036bff83370036034d8d2cea3053edRandall Spangler				  : "0")));
2517c55708979036bff83370036034d8d2cea3053edRandall Spangler			num_disks++;
2527c55708979036bff83370036034d8d2cea3053edRandall Spangler		} else {
2537c55708979036bff83370036034d8d2cea3053edRandall Spangler			mock_disks[num_disks].handle =
2547c55708979036bff83370036034d8d2cea3053edRandall Spangler				(VbExDiskHandle_t)"INVALID";
2557c55708979036bff83370036034d8d2cea3053edRandall Spangler		}
2567c55708979036bff83370036034d8d2cea3053edRandall Spangler	}
2577c55708979036bff83370036034d8d2cea3053edRandall Spangler
2587c55708979036bff83370036034d8d2cea3053edRandall Spangler	if (t->disk_count_to_return >= 0)
2597c55708979036bff83370036034d8d2cea3053edRandall Spangler		*count = t->disk_count_to_return;
2607c55708979036bff83370036034d8d2cea3053edRandall Spangler	else
2617c55708979036bff83370036034d8d2cea3053edRandall Spangler		*count = num_disks;
2627c55708979036bff83370036034d8d2cea3053edRandall Spangler
2633401fdcd4125beea1a8cb1cc59ee27df89d4d88aSimon Glass	VBDEBUG(("  *count=%" PRIu32 "\n", *count));
2647c55708979036bff83370036034d8d2cea3053edRandall Spangler	VBDEBUG(("  return 0x%x\n", t->diskgetinfo_return_val));
2657c55708979036bff83370036034d8d2cea3053edRandall Spangler
2667c55708979036bff83370036034d8d2cea3053edRandall Spangler	return t->diskgetinfo_return_val;
267bf020a0d4db68897058503767067567565450ddeBill Richardson}
268bf020a0d4db68897058503767067567565450ddeBill Richardson
2697c55708979036bff83370036034d8d2cea3053edRandall SpanglerVbError_t VbExDiskFreeInfo(VbDiskInfo *infos,
2707c55708979036bff83370036034d8d2cea3053edRandall Spangler                           VbExDiskHandle_t preserve_handle)
2717c55708979036bff83370036034d8d2cea3053edRandall Spangler{
2727c55708979036bff83370036034d8d2cea3053edRandall Spangler	got_load_disk = (const char *)preserve_handle;
2737c55708979036bff83370036034d8d2cea3053edRandall Spangler	VBDEBUG(("%s(): got_load_disk = %s\n", __FUNCTION__,
2747c55708979036bff83370036034d8d2cea3053edRandall Spangler		 got_load_disk ? got_load_disk : "0"));
2757c55708979036bff83370036034d8d2cea3053edRandall Spangler	return VBERROR_SUCCESS;
276bf020a0d4db68897058503767067567565450ddeBill Richardson}
277bf020a0d4db68897058503767067567565450ddeBill Richardson
278527ba810eff4006cf69579f6b96cb4350cb1e189Simon GlassVbError_t LoadKernel(LoadKernelParams *params, VbCommonParams *cparams)
2797c55708979036bff83370036034d8d2cea3053edRandall Spangler{
2807c55708979036bff83370036034d8d2cea3053edRandall Spangler	got_find_disk = (const char *)params->disk_handle;
2817c55708979036bff83370036034d8d2cea3053edRandall Spangler	VBDEBUG(("%s(%d): got_find_disk = %s\n", __FUNCTION__,
2827c55708979036bff83370036034d8d2cea3053edRandall Spangler		 load_kernel_calls,
2837c55708979036bff83370036034d8d2cea3053edRandall Spangler		 got_find_disk ? got_find_disk : "0"));
2843f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg	if (t->external_expected[load_kernel_calls] !=
2853f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg			!!(params->boot_flags & BOOT_FLAG_EXTERNAL_GPT))
2863f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg		got_external_mismatch++;
2877c55708979036bff83370036034d8d2cea3053edRandall Spangler	return t->loadkernel_return_val[load_kernel_calls++];
288bf020a0d4db68897058503767067567565450ddeBill Richardson}
289bf020a0d4db68897058503767067567565450ddeBill Richardson
2907c55708979036bff83370036034d8d2cea3053edRandall Spanglerint VbNvSet(VbNvContext *context, VbNvParam param, uint32_t value)
2917c55708979036bff83370036034d8d2cea3053edRandall Spangler{
2927c55708979036bff83370036034d8d2cea3053edRandall Spangler	VBDEBUG(("%s(): got_recovery_request_val = %d (0x%x)\n", __FUNCTION__,
2937c55708979036bff83370036034d8d2cea3053edRandall Spangler		 value, value));
2947c55708979036bff83370036034d8d2cea3053edRandall Spangler	got_recovery_request_val = value;
2957c55708979036bff83370036034d8d2cea3053edRandall Spangler	return 0;
296bf020a0d4db68897058503767067567565450ddeBill Richardson}
297bf020a0d4db68897058503767067567565450ddeBill Richardson
298bf020a0d4db68897058503767067567565450ddeBill Richardson/****************************************************************************/
299bf020a0d4db68897058503767067567565450ddeBill Richardson
3007c55708979036bff83370036034d8d2cea3053edRandall Spanglerstatic void VbTryLoadKernelTest(void)
3017c55708979036bff83370036034d8d2cea3053edRandall Spangler{
3027c55708979036bff83370036034d8d2cea3053edRandall Spangler	int i;
3037c55708979036bff83370036034d8d2cea3053edRandall Spangler	int num_tests =  sizeof(test) / sizeof(test[0]);
3047c55708979036bff83370036034d8d2cea3053edRandall Spangler
3050714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler	for (i = 0; i < num_tests; i++) {
3060714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler		printf("Test case: %s ...\n", test[i].name);
3077c55708979036bff83370036034d8d2cea3053edRandall Spangler		ResetMocks(i);
3080714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler		TEST_EQ(VbTryLoadKernel(0, &lkparams, test[i].want_flags),
3090714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler			t->expected_return_val, "  return value");
3100714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler		TEST_EQ(got_recovery_request_val,
3110714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler			t->expected_recovery_request_val, "  recovery_request");
3120714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler		if (t->expected_to_find_disk != DONT_CARE) {
3130714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler			TEST_PTR_EQ(got_find_disk, t->expected_to_find_disk,
3140714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler				    "  find disk");
3150714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler			TEST_PTR_EQ(got_load_disk, t->expected_to_load_disk,
3160714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler				    "  load disk");
3170714d9de56da3a5c686b26755d15aa6788c727d4Randall Spangler		}
3183f4d8d05ba4e32990c8584bd47cdf082d4604232Dan Ehrenberg		TEST_EQ(got_external_mismatch, 0, "  external GPT errors");
3197c55708979036bff83370036034d8d2cea3053edRandall Spangler	}
320bf020a0d4db68897058503767067567565450ddeBill Richardson}
321bf020a0d4db68897058503767067567565450ddeBill Richardson
3227c55708979036bff83370036034d8d2cea3053edRandall Spanglerint main(void)
3237c55708979036bff83370036034d8d2cea3053edRandall Spangler{
3247c55708979036bff83370036034d8d2cea3053edRandall Spangler	VbTryLoadKernelTest();
325bf020a0d4db68897058503767067567565450ddeBill Richardson
3262500185a83b453580f187087fffc6376f19f8ff0Simon Glass	if (vboot_api_stub_check_memory())
3272500185a83b453580f187087fffc6376f19f8ff0Simon Glass		return 255;
3282500185a83b453580f187087fffc6376f19f8ff0Simon Glass
3297c55708979036bff83370036034d8d2cea3053edRandall Spangler	return gTestSuccess ? 0 : 255;
330bf020a0d4db68897058503767067567565450ddeBill Richardson}
331