[Skiboot] [PATCH v7 20/22] fadump: Hardcode architected register destination memory

Michael Neuling mikey at neuling.org
Thu May 9 14:15:12 AEST 2019


On Sat, 2019-04-13 at 14:45 +0530, Vasant Hegde wrote:
> Hardcode architected register destination memory address. So that we can
> capture early OPAL crashes.
> 
> Note that this patch splits SPIRAH memory into two parts to accommodate
> architected register ntuple. Today we have 1K memory for SPIRAH and it uses
> 288 bytes. After this split we have 244 bytes left for SPIRAH expansion. I
> think this is good enough (at least for P9 generation).
> 
> Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
> ---
>  core/opal-dump.c  |  4 ++++
>  hdata/spira.c     | 12 ++++++++++++
>  include/mem-map.h | 26 +++++++++++++++++++++++---
>  skiboot.lds.S     |  5 +++++
>  4 files changed, 44 insertions(+), 3 deletions(-)
> 
> diff --git a/core/opal-dump.c b/core/opal-dump.c
> index 8e042083c..f06739937 100644
> --- a/core/opal-dump.c
> +++ b/core/opal-dump.c
> @@ -261,6 +261,10 @@ static void add_dump_reserve_node(struct dt_node
> *dump_node)
>  
>  	mem_reserve_fw("ibm,firmware-dump", (u64)OPAL_DUMP_DEST_BASE,
>  		       new_size > cur_size ? new_size : cur_size);
> +
> +	/* Reserved memory used to capture architected register state */
> +	mem_reserve_fw("ibm,firmware-arch-registers",
> +		       (u64)ARCH_REGS_STATE_BASE, ARCH_REGS_STATE_SIZE);
>  }
>  
>  /* Pass OPAL dump reservation details to payload via device tree. */
> diff --git a/hdata/spira.c b/hdata/spira.c
> index fa6149322..856126844 100644
> --- a/hdata/spira.c
> +++ b/hdata/spira.c
> @@ -131,6 +131,11 @@ __section(".mddt.data") struct mddt_table
> init_mddt_table[3] = {
>  	},
>  };
>  
> +__section(".procdump.data") struct proc_dump_area proc_dump_area = {
> +	.alloc_addr = CPU_TO_BE64(ARCH_REGS_STATE_BASE | HRMOR_BIT),
> +	.alloc_size = CPU_TO_BE32(ARCH_REGS_STATE_SIZE),
> +};
> +
>  /* SP Interface Root Array, aka SPIRA */
>  __section(".spira.data") struct spira spira = {
>  	.hdr = HDIF_SIMPLE_HDR("SPIRA ", SPIRA_VERSION, struct spira),
> @@ -242,6 +247,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 01b8945b6..0cb4d5da4 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		0x200
> +
> +#define PROC_DUMP_AREA_OFF	(SPIRAH_OFF + SPIRAH_SIZE)
> +#define PROC_DUMP_AREA_SIZE	0x200
>  
>  /* 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 512 bytes (presently we use 288 bytes)
> + * Use 512 bytes for SPIRAH.
> + *
> + * Use 512 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
> @@ -133,9 +145,17 @@
>   * XXX: Use continuguous memory for OPAL destination memory so that we can
>   *      create single reserve node entry in device tree for OPAL destination
>   *      memory.
> + *
> + *      Note that we allocate maximum memory required to capture architected
> + *      registers on P9 two socket system. If we ever support bigger system
> + *      then we have to adjust this size.

Please put an assert in the code for this. This comment is likely to be long
forgotten when we get our first > 2 socket machine.

>   */
> -#define OPAL_DUMP_DEST_BASE	(CPU_STACKS_BASE + \
> +#define ARCH_REGS_STATE_BASE	(CPU_STACKS_BASE + \
>  				 ((SPR_PIR_P9_MASK + 1) * STACK_SIZE))
> +#define ARCH_REGS_STATE_SIZE	0x200000

How is this number calculated?

> +
> +/* Destination memory to capture OPAL dump */
> +#define OPAL_DUMP_DEST_BASE	(ARCH_REGS_STATE_BASE + ARCH_REGS_STATE_SIZE)
>  
>  #define DUMP_DEST_CON_BASE	(OPAL_DUMP_DEST_BASE)
>  #define DUMP_DEST_CON_SIZE	(INMEM_CON_LEN)
> @@ -145,7 +165,7 @@
>  
>  #define DUMP_DEST_SKIBOOT_BASE	(DUMP_DEST_HBRT_BASE +
> DUMP_DEST_HBRT_SIZE)
>  /* Collect OPAL core including max possible CPU stack data */
> -#define DUMP_DEST_SKIBOOT_SIZE	(OPAL_DUMP_DEST_BASE - SKIBOOT_BASE)
> +#define DUMP_DEST_SKIBOOT_SIZE	(ARCH_REGS_STATE_BASE - SKIBOOT_BASE)
>  
>  /*
>   * Address at which we load the kernel LID. This is also where
> diff --git a/skiboot.lds.S b/skiboot.lds.S
> index 7eb28fc49..41b43258c 100644
> --- a/skiboot.lds.S
> +++ b/skiboot.lds.S
> @@ -37,6 +37,11 @@ SECTIONS
>  		KEEP(*(.spirah.data))
>  	}
>  
> +	. = PROC_DUMP_AREA_OFF;
> +	.procdump : {
> +		KEEP(*(.procdump.data))
> +	}
> +
>  	. = PROCIN_OFF;
>  	.procin.data : {
>  		KEEP(*(.procin.data))



More information about the Skiboot mailing list