coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
cbmem_stage_cache.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <cbmem.h>
4 #include <stage_cache.h>
5 #include <string.h>
6 #include <console/console.h>
7 
8 /* Stage cache uses cbmem. */
9 void stage_cache_add(int stage_id, const struct prog *stage)
10 {
11  struct stage_cache *meta;
12  void *c;
13 
14  meta = cbmem_add(CBMEM_ID_STAGEx_META + stage_id, sizeof(*meta));
15  if (meta == NULL) {
16  printk(BIOS_ERR, "Can't add %x metadata to cbmem\n",
17  CBMEM_ID_STAGEx_META + stage_id);
18  return;
19  }
20  meta->load_addr = (uintptr_t)prog_start(stage);
21  meta->entry_addr = (uintptr_t)prog_entry(stage);
22  meta->arg = (uintptr_t)prog_entry_arg(stage);
23 
24  c = cbmem_add(CBMEM_ID_STAGEx_CACHE + stage_id, prog_size(stage));
25  if (c == NULL) {
26  printk(BIOS_ERR, "Can't add stage_cache %x to cbmem\n",
27  CBMEM_ID_STAGEx_CACHE + stage_id);
28  return;
29  }
30 
31  memcpy(c, prog_start(stage), prog_size(stage));
32 }
33 
34 void stage_cache_add_raw(int stage_id, const void *base, const size_t size)
35 {
36  void *c;
37 
38  c = cbmem_add(CBMEM_ID_STAGEx_RAW + stage_id, size);
39  if (c == NULL) {
40  printk(BIOS_DEBUG, "Error: Can't add %x raw data to cbmem\n",
41  CBMEM_ID_STAGEx_RAW + stage_id);
42  return;
43  }
44 
45  memcpy(c, base, size);
46 }
47 
48 void stage_cache_get_raw(int stage_id, void **base, size_t *size)
49 {
50  const struct cbmem_entry *e;
51 
52  e = cbmem_entry_find(CBMEM_ID_STAGEx_RAW + stage_id);
53  if (e == NULL) {
54  printk(BIOS_ERR, "Can't find raw %x data in cbmem\n",
55  CBMEM_ID_STAGEx_RAW + stage_id);
56  return;
57  }
58 
59  *base = cbmem_entry_start(e);
60  *size = cbmem_entry_size(e);
61 }
62 
63 void stage_cache_load_stage(int stage_id, struct prog *stage)
64 {
65  struct stage_cache *meta;
66  const struct cbmem_entry *e;
67  void *c;
68  size_t size;
69  void *load_addr;
70 
71  prog_set_entry(stage, NULL, NULL);
72 
73  meta = cbmem_find(CBMEM_ID_STAGEx_META + stage_id);
74  if (meta == NULL) {
75  printk(BIOS_ERR, "Can't find %x metadata in cbmem\n",
76  CBMEM_ID_STAGEx_META + stage_id);
77  return;
78  }
79 
81 
82  if (e == NULL) {
83  printk(BIOS_ERR, "Can't find stage_cache %x in cbmem\n",
84  CBMEM_ID_STAGEx_CACHE + stage_id);
85  return;
86  }
87 
88  c = cbmem_entry_start(e);
89  size = cbmem_entry_size(e);
90  load_addr = (void *)(uintptr_t)meta->load_addr;
91 
92  memcpy(load_addr, c, size);
93 
94  prog_set_area(stage, load_addr, size);
95  prog_set_entry(stage, (void *)(uintptr_t)meta->entry_addr,
96  (void *)(uintptr_t)meta->arg);
97 }
void * memcpy(void *dest, const void *src, size_t n)
Definition: memcpy.c:7
void * cbmem_entry_start(const struct cbmem_entry *entry)
Definition: imd_cbmem.c:190
const struct cbmem_entry * cbmem_entry_find(u32 id)
Definition: imd_cbmem.c:157
void * cbmem_add(u32 id, u64 size)
Definition: imd_cbmem.c:144
void * cbmem_find(u32 id)
Definition: imd_cbmem.c:166
u64 cbmem_entry_size(const struct cbmem_entry *entry)
Definition: imd_cbmem.c:185
#define CBMEM_ID_STAGEx_RAW
Definition: cbmem_id.h:58
#define CBMEM_ID_STAGEx_CACHE
Definition: cbmem_id.h:57
#define CBMEM_ID_STAGEx_META
Definition: cbmem_id.h:56
void stage_cache_add_raw(int stage_id, const void *base, const size_t size)
void stage_cache_get_raw(int stage_id, void **base, size_t *size)
void stage_cache_add(int stage_id, const struct prog *stage)
void stage_cache_load_stage(int stage_id, struct prog *stage)
#define printk(level,...)
Definition: stdlib.h:16
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
static void * prog_entry(const struct prog *prog)
static void * prog_entry_arg(const struct prog *prog)
static void prog_set_entry(struct prog *prog, void *e, void *arg)
static void * prog_start(const struct prog *prog)
static size_t prog_size(const struct prog *prog)
static void prog_set_area(struct prog *prog, void *start, size_t size)
uintptr_t base
Definition: uart.c:17
#define NULL
Definition: stddef.h:19
unsigned long uintptr_t
Definition: stdint.h:21
uint64_t load_addr
Definition: stage_cache.h:56
uint64_t arg
Definition: stage_cache.h:58
uint64_t entry_addr
Definition: stage_cache.h:57
#define c(value, pmcreg, dst_bits)