coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
transfer_buffer.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <amdblocks/reset.h>
5 #include <console/console.h>
6 #include <pc80/mc146818rtc.h>
7 #include <security/vboot/vbnv.h>
9 #include <soc/psp_transfer.h>
10 #include <timestamp.h>
11 #include <2struct.h>
12 
13 DECLARE_REGION(cbmemc_transfer)
14 
16 {
17  if (ptr->magic_val == TRANSFER_MAGIC_VAL && ptr->struct_bytes == sizeof(*ptr))
18  return 1;
19  else
20  return 0;
21 }
22 
24 {
25  if (*(uint32_t *)_vboot2_work == VB2_SHARED_DATA_MAGIC) {
26  cmos_write(0x00, CMOS_RECOVERY_BYTE);
27  return;
28  }
29 
30  /*
31  * If CMOS is valid and the system has already been rebooted once, but
32  * still returns here, instead of rebooting to verstage again, assume
33  * that the system is in a reboot loop and halt.
34  */
35  if ((!vbnv_cmos_failed()) && cmos_read(CMOS_RECOVERY_BYTE) ==
37  die("Error: Reboot into recovery was unsuccessful. Halting.");
38 
39  printk(BIOS_ERR, "VBOOT workbuf not valid.\n");
40  printk(BIOS_DEBUG, "Signature: %#08x\n", *(uint32_t *)_vboot2_work);
41  cmos_init(0);
42  cmos_write(CMOS_RECOVERY_MAGIC_VAL, CMOS_RECOVERY_BYTE);
43  warm_reset();
44 }
45 
47 {
49  (void *)(uintptr_t)_transfer_buffer;
50 
52  if ((info->psp_info & PSP_INFO_VALID) == 0) {
53  printk(BIOS_INFO, "No PSP info found in transfer buffer.\n");
54  return;
55  }
56 
57  printk(BIOS_INFO, "PSP boot mode: %s\n",
58  info->psp_info & PSP_INFO_PRODUCTION_MODE ?
59  "Production" : "Development");
60  printk(BIOS_INFO, "Silicon level: %s\n",
61  info->psp_info & PSP_INFO_PRODUCTION_SILICON ?
62  "Production" : "Pre-Production");
63  }
64 }
65 
67 {
68  const struct transfer_info_struct *info = (const struct transfer_info_struct *)
69  (void *)(uintptr_t)_transfer_buffer;
70 
71  void *cbmemc;
72  size_t cbmemc_size;
73 
75  return;
76 
77  if (info->console_offset < sizeof(*info))
78  return;
79 
80  if (info->timestamp_offset <= info->console_offset)
81  return;
82 
83  cbmemc_size = info->timestamp_offset - info->console_offset;
84 
85  if (info->console_offset + cbmemc_size > info->buffer_size)
86  return;
87 
88  cbmemc = (void *)((uintptr_t)info + info->console_offset);
89 
90  /* Verify the cbmemc transfer buffer is where we expect it to be. */
91  if ((void *)_cbmemc_transfer != (void *)cbmemc)
92  return;
93 
94  if (REGION_SIZE(cbmemc_transfer) != cbmemc_size)
95  return;
96 
97  /* We need to manually initialize cbmemc so we can fill the new buffer. cbmemc_init()
98  * will also be called later in console_hw_init(), but it will be a no-op. */
99  cbmemc_init();
100  cbmemc_copy_in(cbmemc, cbmemc_size);
101 }
void cbmemc_init(void)
Definition: cbmem_console.c:82
void cbmemc_copy_in(void *buffer, size_t size)
#define PSP_INFO_VALID
Definition: psp_transfer.h:22
#define CMOS_RECOVERY_MAGIC_VAL
Definition: psp_transfer.h:12
#define TRANSFER_MAGIC_VAL
Definition: psp_transfer.h:17
#define PSP_INFO_PRODUCTION_MODE
Definition: psp_transfer.h:20
#define PSP_INFO_PRODUCTION_SILICON
Definition: psp_transfer.h:21
#define printk(level,...)
Definition: stdlib.h:16
void __noreturn die(const char *fmt,...)
Definition: die.c:17
static struct smmstore_params_info info
Definition: ramstage.c:12
#define REGION_SIZE(name)
Definition: symbols.h:10
#define DECLARE_REGION(name)
Definition: symbols.h:12
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
int vbnv_cmos_failed(void)
Definition: vboot.c:78
void cmos_init(bool invalid)
Definition: mc146818rtc.c:156
static void cmos_write(unsigned char val, unsigned char addr)
Definition: mc146818rtc.h:141
static unsigned char cmos_read(unsigned char addr)
Definition: mc146818rtc.h:105
static __noreturn void warm_reset(void)
Definition: reset.h:15
unsigned int uint32_t
Definition: stdint.h:14
unsigned long uintptr_t
Definition: stdint.h:21
void verify_psp_transfer_buf(void)
int transfer_buffer_valid(const struct transfer_info_struct *ptr)
void show_psp_transfer_info(void)
void replay_transfer_buffer_cbmemc(void)