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