summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarshall Dawson <marshalldawson3rd@gmail.com>2018-01-30 15:33:23 -0700
committerMartin Roth <martinroth@google.com>2018-02-07 16:22:40 +0000
commit8d6e0e0a72ed81d44ba61add0c2aab55bb217412 (patch)
treed910a30a26bab28ec8d24b8a9de341ca8eba4985
parentac1cd44525d7230a0138fdd3e442ad8b1363c4dc (diff)
downloadcoreboot-8d6e0e0a72ed81d44ba61add0c2aab55bb217412.tar.xz
lib/stage_cache: Add save/get raw storage
Leverage the stage_cache mechanism to store a non-specific type of data. This is not interesting when the location for the cache is in cbmem. However it will be more useful when an external location is used, e.g. when the cache is in TSEG, locked from user modification. Change-Id: Iaf0b25ebe14c176bbd24fc8942f902f627ca8e6f Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com> Reviewed-on: https://review.coreboot.org/23518 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
-rw-r--r--src/commonlib/include/commonlib/cbmem_id.h1
-rw-r--r--src/include/stage_cache.h10
-rw-r--r--src/lib/cbmem_stage_cache.c29
-rw-r--r--src/lib/ext_stage_cache.c41
4 files changed, 81 insertions, 0 deletions
diff --git a/src/commonlib/include/commonlib/cbmem_id.h b/src/commonlib/include/commonlib/cbmem_id.h
index 9a66246001..3529fefaa0 100644
--- a/src/commonlib/include/commonlib/cbmem_id.h
+++ b/src/commonlib/include/commonlib/cbmem_id.h
@@ -61,6 +61,7 @@
#define CBMEM_ID_SMM_SAVE_SPACE 0x07e9acee
#define CBMEM_ID_STAGEx_META 0x57a9e000
#define CBMEM_ID_STAGEx_CACHE 0x57a9e100
+#define CBMEM_ID_STAGEx_RAW 0x57a9e200
#define CBMEM_ID_STORAGE_DATA 0x53746f72
#define CBMEM_ID_TCPA_LOG 0x54435041
#define CBMEM_ID_TIMESTAMP 0x54494d45
diff --git a/src/include/stage_cache.h b/src/include/stage_cache.h
index 08312ff554..28cb85998b 100644
--- a/src/include/stage_cache.h
+++ b/src/include/stage_cache.h
@@ -20,14 +20,24 @@
#include <stdint.h>
#include <program_loading.h>
+/* Types of stages that may be stored in stage cache */
enum {
STAGE_RAMSTAGE,
STAGE_REFCODE,
STAGE_POSTCAR,
};
+/* Types of raw data that may be stored in stage cache */
+enum {
+ STAGE_S3_DATA,
+};
+
/* Cache the loaded stage provided according to the parameters. */
void stage_cache_add(int stage_id, const struct prog *stage);
+/* Cache non-specific data or code. */
+void stage_cache_add_raw(int stage_id, const void *base, const size_t size);
+/* Get a pointer to cached raw data and its size. */
+void stage_cache_get_raw(int stage_id, void **base, size_t *size);
/* Load the cached stage at given location returning the stage entry point. */
void stage_cache_load_stage(int stage_id, struct prog *stage);
/* Fill in parameters for the external stage cache, if utilized. */
diff --git a/src/lib/cbmem_stage_cache.c b/src/lib/cbmem_stage_cache.c
index f17f12c892..299cb00dcf 100644
--- a/src/lib/cbmem_stage_cache.c
+++ b/src/lib/cbmem_stage_cache.c
@@ -45,6 +45,35 @@ void stage_cache_add(int stage_id, const struct prog *stage)
memcpy(c, prog_start(stage), prog_size(stage));
}
+void stage_cache_add_raw(int stage_id, const void *base, const size_t size)
+{
+ void *c;
+
+ c = cbmem_add(CBMEM_ID_STAGEx_RAW + stage_id, size);
+ if (c == NULL) {
+ printk(BIOS_DEBUG, "Error: Can't add %x raw data to cbmem\n",
+ CBMEM_ID_STAGEx_RAW + stage_id);
+ return;
+ }
+
+ memcpy(c, base, size);
+}
+
+void stage_cache_get_raw(int stage_id, void **base, size_t *size)
+{
+ const struct cbmem_entry *e;
+
+ e = cbmem_entry_find(CBMEM_ID_STAGEx_RAW + stage_id);
+ if (e == NULL) {
+ printk(BIOS_ERR, "Error: Can't find raw %x data in cbmem\n",
+ CBMEM_ID_STAGEx_RAW + stage_id);
+ return;
+ }
+
+ *base = cbmem_entry_start(e);
+ *size = cbmem_entry_size(e);
+}
+
void stage_cache_load_stage(int stage_id, struct prog *stage)
{
struct stage_cache *meta;
diff --git a/src/lib/ext_stage_cache.c b/src/lib/ext_stage_cache.c
index cea9f52625..ab783473f3 100644
--- a/src/lib/ext_stage_cache.c
+++ b/src/lib/ext_stage_cache.c
@@ -93,6 +93,47 @@ void stage_cache_add(int stage_id, const struct prog *stage)
memcpy(c, prog_start(stage), prog_size(stage));
}
+void stage_cache_add_raw(int stage_id, const void *base, const size_t size)
+{
+ struct imd *imd;
+ const struct imd_entry *e;
+ void *c;
+
+ imd = imd_get();
+ e = imd_entry_add(imd, CBMEM_ID_STAGEx_RAW + stage_id, size);
+ if (e == NULL) {
+ printk(BIOS_DEBUG, "Error: Can't add %x raw data to imd\n",
+ CBMEM_ID_STAGEx_RAW + stage_id);
+ return;
+ }
+
+ c = imd_entry_at(imd, e);
+ if (c == NULL) {
+ printk(BIOS_DEBUG, "Error: Can't get %x raw entry in imd\n",
+ CBMEM_ID_STAGEx_RAW + stage_id);
+ return;
+ }
+
+ memcpy(c, base, size);
+}
+
+void stage_cache_get_raw(int stage_id, void **base, size_t *size)
+{
+ struct imd *imd;
+ const struct imd_entry *e;
+
+ imd = imd_get();
+ e = imd_entry_find(imd, CBMEM_ID_STAGEx_RAW + stage_id);
+ if (e == NULL) {
+ printk(BIOS_DEBUG, "Error: Can't find %x raw data to imd\n",
+ CBMEM_ID_STAGEx_RAW + stage_id);
+ return;
+ }
+
+ *base = imd_entry_at(imd, e);
+ *size = imd_entry_size(imd, e);
+}
+
void stage_cache_load_stage(int stage_id, struct prog *stage)
{
struct imd *imd;