[Skiboot] [PATCH v9 23/25] MPIPL: Reserve memory to capture architected registers data
Vasant Hegde
hegdevasant at linux.vnet.ibm.com
Fri Jul 12 21:18:00 AEST 2019
- Split SPIRAH memory to accommodate architected register ntuple.
Today we have 1K memory for SPIRAH and it uses 288 bytes. Lets split
this into two parts :
SPIRAH (756 bytes)
architected register memory (256 bytes)
- Update SPIRAH architected register ntuple
- Calculate memory required to capture architected registers data
Ideally we should use HDAT provided data (proc_dump_area->thread_size).
But we are not getting this data during boot. Hence lets reserve fixed
memory for architected registers data collection.
- Add architected registers destination memory to reserve-memory DT node.
Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
---
core/opal-dump.c | 28 ++++++++++++++++++++++++++++
hdata/spira.c | 7 +++++++
include/mem-map.h | 14 +++++++++++++-
skiboot.lds.S | 5 +++++
4 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/core/opal-dump.c b/core/opal-dump.c
index 6aefefdf7..fb8ff9fe8 100644
--- a/core/opal-dump.c
+++ b/core/opal-dump.c
@@ -16,6 +16,7 @@
#define pr_fmt(fmt) "DUMP: " fmt
+#include <chip.h>
#include <cpu.h>
#include <device.h>
#include <mem-map.h>
@@ -31,9 +32,16 @@
#include "hdata/spira.h"
+/* XXX Ideally we should use HDAT provided data (proc_dump_area->thread_size).
+ * But we are not getting this data durig boot. Hence lets reserve fixed
+ * memory for architected registers data collection.
+ */
+#define ARCH_REGS_DATA_SIZE_PER_CHIP (512 * 1024)
+
/* Actual address of MDST and MDDT table */
#define MDST_TABLE_BASE (SKIBOOT_BASE + MDST_TABLE_OFF)
#define MDDT_TABLE_BASE (SKIBOOT_BASE + MDDT_TABLE_OFF)
+#define PROC_DUMP_AREA_BASE (SKIBOOT_BASE + PROC_DUMP_AREA_OFF)
static struct spira_ntuple *ntuple_mdst;
static struct spira_ntuple *ntuple_mddt;
@@ -214,6 +222,8 @@ static int opal_mpipl_remove_entry_mddt(bool remove_all, u8 region, u64 dest)
static void opal_mpipl_register(void)
{
u64 opal_dest, opal_size;
+ u64 arch_regs_dest, arch_regs_size;
+ struct proc_dump_area *proc_dump = (void *)(PROC_DUMP_AREA_BASE);
/* Get OPAL runtime size */
if (!dt_find_property(opal_node, "opal-runtime-size")) {
@@ -233,6 +243,24 @@ static void opal_mpipl_register(void)
/* Add OPAL reservation detail to MDST/MDDT table */
opal_mpipl_add_entry(DUMP_REGION_OPAL_MEMORY,
SKIBOOT_BASE, opal_dest, opal_size);
+
+ /* Thread size check */
+ if (proc_dump->thread_size != 0) {
+ prlog(PR_INFO, "Thread register entry size is available, "
+ "but not supported.\n");
+ }
+
+ /* Calculate memory to capture CPU register data */
+ arch_regs_dest = opal_dest + opal_size;
+ arch_regs_size = nr_chips() * ARCH_REGS_DATA_SIZE_PER_CHIP;
+
+ /* Reserve memory used to capture architected register state */
+ mem_reserve_fw("ibm,firmware-arch-registers",
+ arch_regs_dest, arch_regs_size);
+ proc_dump->alloc_addr = arch_regs_dest | HRMOR_BIT;
+ proc_dump->alloc_size = arch_regs_size;
+ prlog(PR_NOTICE, "Architected register dest addr : 0x%llx, "
+ "size : 0x%llx\n", arch_regs_dest, arch_regs_size);
}
static int payload_mpipl_register(u64 src, u64 dest, u64 size)
diff --git a/hdata/spira.c b/hdata/spira.c
index 9d487b8b2..76886b065 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -213,6 +213,13 @@ __section(".spirah.data") struct spirah spirah = {
.alloc_len = CPU_TO_BE32(sizeof(struct mdrt_table)),
.act_len = CPU_TO_BE32(sizeof(struct mdrt_table)),
},
+ .proc_dump_area = {
+ .addr = CPU_TO_BE64(PROC_DUMP_AREA_OFF),
+ .alloc_cnt = CPU_TO_BE16(1),
+ .act_cnt = CPU_TO_BE16(1),
+ .alloc_len = CPU_TO_BE32(sizeof(struct proc_dump_area)),
+ .act_len = CPU_TO_BE32(sizeof(struct proc_dump_area)),
+ },
},
};
diff --git a/include/mem-map.h b/include/mem-map.h
index a29b8fb3e..859fef75c 100644
--- a/include/mem-map.h
+++ b/include/mem-map.h
@@ -38,10 +38,22 @@
* give it 64k before placing the SPIRA and related data.
*/
#define SPIRA_OFF 0x00010000
+#define SPIRA_SIZE 0x400
#define SPIRAH_OFF 0x00010400
+#define SPIRAH_SIZE 0x300
+
+#define PROC_DUMP_AREA_OFF (SPIRAH_OFF + SPIRAH_SIZE)
+#define PROC_DUMP_AREA_SIZE 0x100
/* Actual SPIRA size is lesser than 1K (presently 0x340 bytes).
- * Use 1K for legacy SPIRA and 1K for SPIRA-H.
+ * Use 1K for legacy SPIRA.
+ *
+ * SPIRA-H is lesser than 768 bytes (presently we use 288 bytes)
+ * Use 768 bytes for SPIRAH.
+ *
+ * Use 256 bytes for processor dump area. (presently we use
+ * sizeof(proc_dump_area) = 0x30 bytes).
+ *
* 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
diff --git a/skiboot.lds.S b/skiboot.lds.S
index 5fb32c866..81fa6eaa1 100644
--- a/skiboot.lds.S
+++ b/skiboot.lds.S
@@ -80,6 +80,11 @@ SECTIONS
KEEP(*(.spirah.data))
}
+ . = PROC_DUMP_AREA_OFF;
+ .procdump : {
+ KEEP(*(.procdump.data))
+ }
+
. = PROCIN_OFF;
.procin.data : {
KEEP(*(.procin.data))
--
2.14.3
More information about the Skiboot
mailing list