diff options
-rw-r--r-- | hdata/spira.c | 46 | ||||
-rw-r--r-- | hdata/spira.h | 2 | ||||
-rw-r--r-- | include/mem-map.h | 5 | ||||
-rw-r--r-- | skiboot.lds.S | 5 |
4 files changed, 57 insertions, 1 deletions
diff --git a/hdata/spira.c b/hdata/spira.c index 1286856..b8ef0b0 100644 --- a/hdata/spira.c +++ b/hdata/spira.c @@ -147,6 +147,52 @@ __section(".spira.data") struct spira spira = { }, }; +/* The Hypervisor SPIRA-H Structure */ +__section(".spirah.data") struct spirah spirah = { + .hdr = HDIF_SIMPLE_HDR(SPIRAH_HDIF_SIG, SPIRAH_VERSION, struct spirah), + .ntuples_ptr = HDIF_IDATA_PTR(offsetof(struct spirah, ntuples), + sizeof(struct spirah_ntuples)), + .ntuples = { + .array_hdr = { + .offset = CPU_TO_BE32(HDIF_ARRAY_OFFSET), + .ecnt = CPU_TO_BE32(SPIRAH_NTUPLES_COUNT), + .esize + = CPU_TO_BE32(sizeof(struct spira_ntuple)), + .eactsz = CPU_TO_BE32(0x18), + }, + /* Host Data Areas */ + .hs_data_area = { + .addr = CPU_TO_BE64(SPIRA_HEAP_BASE), + .alloc_cnt = CPU_TO_BE16(1), + .alloc_len = CPU_TO_BE32(SPIRA_HEAP_SIZE), + }, + /* We only populate some n-tuples */ + .proc_init = { + .addr = CPU_TO_BE64(PROCIN_OFF), + .alloc_cnt = CPU_TO_BE16(1), + .act_cnt = CPU_TO_BE16(1), + .alloc_len + = CPU_TO_BE32(sizeof(struct proc_init_data)), + }, +#if !defined(TEST) + .cpu_ctrl = { + .addr = CPU_TO_BE64((unsigned long)&cpu_ctl_init_data), + .alloc_cnt = CPU_TO_BE16(1), + .act_cnt = CPU_TO_BE16(1), + .alloc_len = + CPU_TO_BE32(sizeof(cpu_ctl_init_data)), + }, +#endif + .mdump_src = { + .addr = CPU_TO_BE64(MDST_TABLE_OFF), + .alloc_cnt = CPU_TO_BE16(ARRAY_SIZE(init_mdst_table)), + .act_cnt = CPU_TO_BE16(ARRAY_SIZE(init_mdst_table)), + .alloc_len = + CPU_TO_BE32(sizeof(init_mdst_table)), + }, + }, +}; + /* Overridden for testing. */ #ifndef spira_check_ptr bool spira_check_ptr(const void *ptr, const char *file, unsigned int line) diff --git a/hdata/spira.h b/hdata/spira.h index a912fe4..0025cdd 100644 --- a/hdata/spira.h +++ b/hdata/spira.h @@ -113,6 +113,8 @@ struct spirah { u8 reserved[0x100]; } __packed __align(0x100); +extern struct spirah spirah; + /* SPIRA-S signature */ #define SPIRAS_HDIF_SIG "SPIRAS" diff --git a/include/mem-map.h b/include/mem-map.h index 1258d87..2bcaf07 100644 --- a/include/mem-map.h +++ b/include/mem-map.h @@ -33,8 +33,11 @@ * give it 64k before placing the SPIRA and related data. */ #define SPIRA_OFF 0x00010000 +#define SPIRAH_OFF 0x00010400 -/* SPIRA is 2k, then follow with for proc_init_data (aka PROCIN). +/* Actual SPIRA size is lesser than 1K (presently 0x340 bytes). + * Use 1K for legacy SPIRA and 1K for SPIRA-H. + * Then follow with for proc_init_data (aka PROCIN). * These need to be at fixed addresses in case we're ever little * endian: linker can't endian reverse a pointer for us. Text, data * et. al. follows this. diff --git a/skiboot.lds.S b/skiboot.lds.S index 5c8bbbd..7d3d0cf 100644 --- a/skiboot.lds.S +++ b/skiboot.lds.S @@ -31,6 +31,11 @@ SECTIONS KEEP(*(.spira.data)) } + . = SPIRAH_OFF; + .spirah : { + KEEP(*(.spirah.data)) + } + . = PROCIN_OFF; .procin.data : { KEEP(*(.procin.data)) |