aboutsummaryrefslogtreecommitdiff
path: root/libstb/cvc.c
diff options
context:
space:
mode:
authorStewart Smith <stewart@linux.ibm.com>2019-07-29 11:44:28 +1000
committerOliver O'Halloran <oohall@gmail.com>2019-11-27 11:27:47 +1100
commit12610da1bacf3578849eefe8f8d70cc289f4b87a (patch)
treedbfd565439af350031184992b379c53ceb455edc /libstb/cvc.c
parent52952aca9d6148e7ae3c3725ae43d48e27b61357 (diff)
downloadskiboot-12610da1bacf3578849eefe8f8d70cc289f4b87a.zip
skiboot-12610da1bacf3578849eefe8f8d70cc289f4b87a.tar.gz
skiboot-12610da1bacf3578849eefe8f8d70cc289f4b87a.tar.bz2
libstb: export CVC/securerom code memory range
This is useful to capture a real in-memory image for use in a simulator (such as Mambo) without having to go through the complexity of setting up the in-memory image yourself. Signed-off-by: Stewart Smith <stewart@linux.ibm.com> [oliver: s/CVC/cvc/] Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Diffstat (limited to 'libstb/cvc.c')
-rw-r--r--libstb/cvc.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/libstb/cvc.c b/libstb/cvc.c
index dca4ac8..a14ed49 100644
--- a/libstb/cvc.c
+++ b/libstb/cvc.c
@@ -127,6 +127,7 @@ static void cvc_service_register(uint32_t id, uint32_t offset, uint32_t version)
static int cvc_reserved_mem_init(struct dt_node *parent) {
struct dt_node *node, *service;
struct dt_node *reserved_mem;
+ struct dt_node *exports;
uint32_t phandle;
uint64_t addr, size;
@@ -156,6 +157,13 @@ static int cvc_reserved_mem_init(struct dt_node *parent) {
addr = dt_get_address(cvc_resv_mem, 0, &size);
cvc_register(addr, addr + size-1);
+ exports = dt_find_by_path(dt_root, "/ibm,opal/firmware/exports");
+ if (!exports) {
+ prerror("OCC: dt node /ibm,opal/firmware/exports not found\n");
+ return false;
+ }
+ dt_add_property_u64s(exports, "cvc", addr, size - 1);
+
/*
* Each child of the CVC node describes a CVC service
*/
@@ -184,8 +192,9 @@ static int cvc_reserved_mem_init(struct dt_node *parent) {
static int cvc_secure_rom_init(void) {
const uint32_t reg_addr = SECURE_ROM_XSCOM_ADDRESS;
- uint64_t reg_data;
+ struct dt_node *exports;
struct proc_chip *chip;
+ uint64_t reg_data;
if (!secure_rom_mem) {
secure_rom_mem = malloc(SECURE_ROM_MEMORY_SIZE);
@@ -203,6 +212,16 @@ static int cvc_secure_rom_init(void) {
SECURE_ROM_MEMORY_SIZE);
cvc_register((uint64_t)secure_rom_mem,
(uint64_t)secure_rom_mem + SECURE_ROM_MEMORY_SIZE-1);
+
+ exports = dt_find_by_path(dt_root, "/ibm,opal/firmware/exports");
+ if (!exports) {
+ prerror("OCC: dt node /ibm,opal/firmware/exports not found\n");
+ return false;
+ }
+
+ dt_add_property_u64s(exports, "securerom", (uint64_t)secure_rom_mem,
+ SECURE_ROM_MEMORY_SIZE-1);
+
cvc_service_register(CVC_SHA512_SERVICE, SECURE_ROM_SHA512_OFFSET, 1);
cvc_service_register(CVC_VERIFY_SERVICE, SECURE_ROM_VERIFY_OFFSET, 1);
return 0;