diff options
author | Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> | 2012-02-15 20:14:45 -0500 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2012-02-22 18:50:01 -0500 |
commit | ebaeb5ae24379b5b635dc1d1fa6df904bc95b4d9 (patch) | |
tree | 4c1d54e9ec25f48dd05708ed62d5eb6db9d0ba9d /arch/powerpc/include | |
parent | 2df173d9e85d9e2c6a8933c63f0c034accff7e0f (diff) |
fadump: Convert firmware-assisted cpu state dump data into elf notes.
When registered for firmware assisted dump on powerpc, firmware preserves
the registers for the active CPUs during a system crash. This patch reads
the cpu register data stored in Firmware-assisted dump format (except for
crashing cpu) and converts it into elf notes and updates the PT_NOTE program
header accordingly. The exact register state for crashing cpu is saved to
fadump crash info structure in scratch area during crash_fadump() and read
during second kernel boot.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/include')
-rw-r--r-- | arch/powerpc/include/asm/fadump.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/fadump.h b/arch/powerpc/include/asm/fadump.h index 9e172a5d53c7..67681958e4b8 100644 --- a/arch/powerpc/include/asm/fadump.h +++ b/arch/powerpc/include/asm/fadump.h | |||
@@ -65,6 +65,18 @@ | |||
65 | /* Dump status flag */ | 65 | /* Dump status flag */ |
66 | #define FADUMP_ERROR_FLAG 0x2000 | 66 | #define FADUMP_ERROR_FLAG 0x2000 |
67 | 67 | ||
68 | #define FADUMP_CPU_ID_MASK ((1UL << 32) - 1) | ||
69 | |||
70 | #define CPU_UNKNOWN (~((u32)0)) | ||
71 | |||
72 | /* Utility macros */ | ||
73 | #define SKIP_TO_NEXT_CPU(reg_entry) \ | ||
74 | ({ \ | ||
75 | while (reg_entry->reg_id != REG_ID("CPUEND")) \ | ||
76 | reg_entry++; \ | ||
77 | reg_entry++; \ | ||
78 | }) | ||
79 | |||
68 | /* Kernel Dump section info */ | 80 | /* Kernel Dump section info */ |
69 | struct fadump_section { | 81 | struct fadump_section { |
70 | u32 request_flag; | 82 | u32 request_flag; |
@@ -119,6 +131,9 @@ struct fw_dump { | |||
119 | unsigned long reserve_bootvar; | 131 | unsigned long reserve_bootvar; |
120 | 132 | ||
121 | unsigned long fadumphdr_addr; | 133 | unsigned long fadumphdr_addr; |
134 | unsigned long cpu_notes_buf; | ||
135 | unsigned long cpu_notes_buf_size; | ||
136 | |||
122 | int ibm_configure_kernel_dump; | 137 | int ibm_configure_kernel_dump; |
123 | 138 | ||
124 | unsigned long fadump_enabled:1; | 139 | unsigned long fadump_enabled:1; |
@@ -143,13 +158,40 @@ static inline u64 str_to_u64(const char *str) | |||
143 | return val; | 158 | return val; |
144 | } | 159 | } |
145 | #define STR_TO_HEX(x) str_to_u64(x) | 160 | #define STR_TO_HEX(x) str_to_u64(x) |
161 | #define REG_ID(x) str_to_u64(x) | ||
146 | 162 | ||
147 | #define FADUMP_CRASH_INFO_MAGIC STR_TO_HEX("FADMPINF") | 163 | #define FADUMP_CRASH_INFO_MAGIC STR_TO_HEX("FADMPINF") |
164 | #define REGSAVE_AREA_MAGIC STR_TO_HEX("REGSAVE") | ||
165 | |||
166 | /* The firmware-assisted dump format. | ||
167 | * | ||
168 | * The register save area is an area in the partition's memory used to preserve | ||
169 | * the register contents (CPU state data) for the active CPUs during a firmware | ||
170 | * assisted dump. The dump format contains register save area header followed | ||
171 | * by register entries. Each list of registers for a CPU starts with | ||
172 | * "CPUSTRT" and ends with "CPUEND". | ||
173 | */ | ||
174 | |||
175 | /* Register save area header. */ | ||
176 | struct fadump_reg_save_area_header { | ||
177 | u64 magic_number; | ||
178 | u32 version; | ||
179 | u32 num_cpu_offset; | ||
180 | }; | ||
181 | |||
182 | /* Register entry. */ | ||
183 | struct fadump_reg_entry { | ||
184 | u64 reg_id; | ||
185 | u64 reg_value; | ||
186 | }; | ||
148 | 187 | ||
149 | /* fadump crash info structure */ | 188 | /* fadump crash info structure */ |
150 | struct fadump_crash_info_header { | 189 | struct fadump_crash_info_header { |
151 | u64 magic_number; | 190 | u64 magic_number; |
152 | u64 elfcorehdr_addr; | 191 | u64 elfcorehdr_addr; |
192 | u32 crashing_cpu; | ||
193 | struct pt_regs regs; | ||
194 | struct cpumask cpu_online_mask; | ||
153 | }; | 195 | }; |
154 | 196 | ||
155 | /* Crash memory ranges */ | 197 | /* Crash memory ranges */ |
@@ -165,7 +207,9 @@ extern int early_init_dt_scan_fw_dump(unsigned long node, | |||
165 | extern int fadump_reserve_mem(void); | 207 | extern int fadump_reserve_mem(void); |
166 | extern int setup_fadump(void); | 208 | extern int setup_fadump(void); |
167 | extern int is_fadump_active(void); | 209 | extern int is_fadump_active(void); |
210 | extern void crash_fadump(struct pt_regs *, const char *); | ||
168 | #else /* CONFIG_FA_DUMP */ | 211 | #else /* CONFIG_FA_DUMP */ |
169 | static inline int is_fadump_active(void) { return 0; } | 212 | static inline int is_fadump_active(void) { return 0; } |
213 | static inline void crash_fadump(struct pt_regs *regs, const char *str) { } | ||
170 | #endif | 214 | #endif |
171 | #endif | 215 | #endif |