blob: 6d220aa1b92a53ccc1b5eeaade40b675ad1faabd [file] [log] [blame]
/*
* Copyright (c) 2018, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <firmware_image_package.h>
#include <fwu_nvm.h>
#include <io_storage.h>
#include <platform.h>
#include <psci.h>
#include <smccc.h>
#include <status.h>
#include <tftf_lib.h>
/*
* @Test_Aim@ Validate the FWU ToC invalid case.
* The Firmware Update feature implemented in Trusted Firmware-A
* code needs to be tested to check if FWU process gets started
* or not when the ToC header value in fip.bin is invalid.
* Test SUCCESS in case ToC is found valid.
* Test FAIL in case ToC is found invalid.
*/
test_result_t test_fwu_toc(void)
{
STATUS status;
unsigned int toc_header;
smc_args args = { SMC_PSCI_SYSTEM_RESET };
smc_ret_values ret = {0};
if (tftf_is_rebooted()) {
/*
* Check whether we successfully resumed from the
* Firmware Update process. If we have, then the
* ToC header value will have been repaired.
*/
status = fwu_nvm_read(0, &toc_header, 4);
if (status != STATUS_SUCCESS) {
tftf_testcase_printf("Failed to read NVM (%d)\n", status);
return TEST_RESULT_FAIL;
}
if (toc_header != TOC_HEADER_NAME) {
tftf_testcase_printf("ToC is Invalid (%u)\n", toc_header);
return TEST_RESULT_FAIL;
}
return TEST_RESULT_SUCCESS;
}
/* Corrupt the TOC in fip.bin. */
toc_header = 0xdeadbeef;
status = fwu_nvm_write(0, &toc_header, 4);
if (status != STATUS_SUCCESS) {
tftf_testcase_printf("Failed to overwrite the ToC header (%d)\n",
status);
return TEST_RESULT_SKIPPED;
}
/* Notify that we are rebooting now. */
tftf_notify_reboot();
/* Request PSCI system reset. */
ret = tftf_smc(&args);
/* The PSCI SYSTEM_RESET call is not supposed to return */
tftf_testcase_printf("System didn't reboot properly (%d)\n",
(unsigned int)ret.ret0);
return TEST_RESULT_FAIL;
}