Software APIs
boot_svc_empty_test.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "sw/device/silicon_creator/lib/boot_svc/boot_svc_empty.h"
6 
7 #include "sw/device/lib/base/status.h"
9 #include "sw/device/lib/testing/test_framework/check.h"
11 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
12 #include "sw/device/silicon_creator/lib/drivers/rstmgr.h"
13 #include "sw/device/silicon_creator/rom_ext/e2e/boot_svc/boot_svc_test_lib.h"
14 
15 OTTF_DEFINE_TEST_CONFIG();
16 
17 static status_t initialize(retention_sram_t *retram, boot_svc_retram_t *state) {
18  boot_svc_msg_t msg = {0};
19  boot_svc_empty_req_init(&msg.empty);
20  retram->creator.boot_svc_msg = msg;
21  state->state = kBootSvcTestStateCheckEmpty;
22  rstmgr_reset();
23  return INTERNAL();
24 }
25 
26 static status_t check_empty(retention_sram_t *retram,
27  boot_svc_retram_t *state) {
28  boot_svc_msg_t msg = retram->creator.boot_svc_msg;
29  TRY(boot_svc_header_check(&msg.header));
30  TRY_CHECK(msg.header.type == kBootSvcEmptyResType);
31  state->state = kBootSvcTestStateFinal;
32  return OK_STATUS();
33 }
34 
35 static status_t empty_message_test(void) {
36  retention_sram_t *retram = retention_sram_get();
37  TRY(boot_svc_test_init(retram, kBootSvcTestEmpty));
38  boot_svc_retram_t *state = (boot_svc_retram_t *)&retram->owner;
39 
40  for (;;) {
41  LOG_INFO("Test state = %d", state->state);
42  switch (state->state) {
43  case kBootSvcTestStateInit:
44  TRY(initialize(retram, state));
45  break;
46  case kBootSvcTestStateCheckEmpty:
47  TRY(check_empty(retram, state));
48  break;
49  case kBootSvcTestStateFinal:
50  LOG_INFO("FinalBootLog: %d:%s", state->boots, state->partition);
51  return OK_STATUS();
52  default:
53  return UNKNOWN();
54  }
55  }
56 }
57 
58 bool test_main(void) {
59  status_t sts = empty_message_test();
60  if (status_err(sts)) {
61  LOG_ERROR("empty_message_test: %r", sts);
62  }
63  return status_ok(sts);
64 }