4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
27 * String conversion routines for ELF header attributes.
33 #include <sys/elf_SPARC.h>
37 static const conv_ds_t
**
38 ehdr_class_strings(Conv_fmt_flags_t fmt_flags
)
40 static const Msg class_cf
[] = {
41 MSG_ELFCLASSNONE_CF
, MSG_ELFCLASS32_CF
, MSG_ELFCLASS64_CF
43 static const Msg class_nf
[] = {
44 MSG_ELFCLASSNONE_NF
, MSG_ELFCLASS32_NF
, MSG_ELFCLASS64_NF
46 static const Msg class_dump
[] = {
47 MSG_ELFCLASSNONE_DMP
, MSG_ELFCLASS32_DMP
, MSG_ELFCLASS64_DMP
50 static const conv_ds_msg_t ds_classes_cf
= {
51 CONV_DS_MSG_INIT(ELFCLASSNONE
, class_cf
) };
52 static const conv_ds_msg_t ds_classes_nf
= {
53 CONV_DS_MSG_INIT(ELFCLASSNONE
, class_nf
) };
54 static const conv_ds_msg_t ds_classes_dump
= {
55 CONV_DS_MSG_INIT(ELFCLASSNONE
, class_dump
) };
57 static const conv_ds_t
*ds_cf
[] = { CONV_DS_ADDR(ds_classes_cf
), NULL
};
58 static const conv_ds_t
*ds_nf
[] = { CONV_DS_ADDR(ds_classes_nf
), NULL
};
59 static const conv_ds_t
*ds_dump
[] = {
60 CONV_DS_ADDR(ds_classes_dump
), NULL
};
62 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
63 case CONV_FMT_ALT_DUMP
:
64 case CONV_FMT_ALT_FILE
:
74 conv_ehdr_class(uchar_t
class, Conv_fmt_flags_t fmt_flags
,
75 Conv_inv_buf_t
*inv_buf
)
77 return (conv_map_ds(ELFOSABI_NONE
, EM_NONE
, class,
78 ehdr_class_strings(fmt_flags
), fmt_flags
, inv_buf
));
82 conv_iter_ehdr_class(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
85 return (conv_iter_ds(ELFOSABI_NONE
, EM_NONE
,
86 ehdr_class_strings(fmt_flags
), func
, uvalue
));
89 static const conv_ds_t
**
90 ehdr_data_strings(Conv_fmt_flags_t fmt_flags
)
92 static const Msg data_cf
[] = {
93 MSG_ELFDATANONE_CF
, MSG_ELFDATA2LSB_CF
, MSG_ELFDATA2MSB_CF
95 static const Msg data_nf
[] = {
96 MSG_ELFDATANONE_NF
, MSG_ELFDATA2LSB_NF
, MSG_ELFDATA2MSB_NF
98 static const Msg data_dump
[] = {
99 MSG_ELFDATANONE_DMP
, MSG_ELFDATA2LSB_DMP
, MSG_ELFDATA2MSB_DMP
101 static const Msg data_file
[] = {
102 MSG_ELFDATANONE_DMP
, MSG_ELFDATA2LSB_FIL
, MSG_ELFDATA2MSB_FIL
106 static const conv_ds_msg_t ds_data_cf
= {
107 CONV_DS_MSG_INIT(ELFCLASSNONE
, data_cf
) };
108 static const conv_ds_msg_t ds_data_nf
= {
109 CONV_DS_MSG_INIT(ELFCLASSNONE
, data_nf
) };
110 static const conv_ds_msg_t ds_data_dump
= {
111 CONV_DS_MSG_INIT(ELFCLASSNONE
, data_dump
) };
112 static const conv_ds_msg_t ds_data_file
= {
113 CONV_DS_MSG_INIT(ELFCLASSNONE
, data_file
) };
115 static const conv_ds_t
*ds_cf
[] = { CONV_DS_ADDR(ds_data_cf
), NULL
};
116 static const conv_ds_t
*ds_nf
[] = { CONV_DS_ADDR(ds_data_nf
), NULL
};
117 static const conv_ds_t
*ds_dump
[] = { CONV_DS_ADDR(ds_data_dump
),
119 static const conv_ds_t
*ds_file
[] = { CONV_DS_ADDR(ds_data_file
),
122 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
123 case CONV_FMT_ALT_DUMP
:
125 case CONV_FMT_ALT_FILE
:
127 case CONV_FMT_ALT_NF
:
135 conv_ehdr_data(uchar_t data
, Conv_fmt_flags_t fmt_flags
,
136 Conv_inv_buf_t
*inv_buf
)
138 return (conv_map_ds(ELFOSABI_NONE
, EM_NONE
, data
,
139 ehdr_data_strings(fmt_flags
), fmt_flags
, inv_buf
));
143 conv_iter_ehdr_data(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
146 return (conv_iter_ds(ELFOSABI_NONE
, EM_NONE
,
147 ehdr_data_strings(fmt_flags
), func
, uvalue
));
150 static const conv_ds_t
**
151 ehdr_mach_strings(Conv_fmt_flags_t fmt_flags
)
154 static const Msg mach_0_11_cf
[] = {
155 MSG_EM_NONE_CF
, MSG_EM_M32_CF
,
156 MSG_EM_SPARC_CF
, MSG_EM_386_CF
,
157 MSG_EM_68K_CF
, MSG_EM_88K_CF
,
158 MSG_EM_486_CF
, MSG_EM_860_CF
,
159 MSG_EM_MIPS_CF
, MSG_EM_S370_CF
,
160 MSG_EM_MIPS_RS3_LE_CF
, MSG_EM_RS6000_CF
162 static const Msg mach_0_11_nf
[] = {
163 MSG_EM_NONE_NF
, MSG_EM_M32_NF
,
164 MSG_EM_SPARC_NF
, MSG_EM_386_NF
,
165 MSG_EM_68K_NF
, MSG_EM_88K_NF
,
166 MSG_EM_486_NF
, MSG_EM_860_NF
,
167 MSG_EM_MIPS_NF
, MSG_EM_S370_NF
,
168 MSG_EM_MIPS_RS3_LE_NF
, MSG_EM_RS6000_NF
170 static const Msg mach_0_11_dmp
[] = {
171 MSG_EM_NONE_DMP
, MSG_EM_M32_DMP
,
172 MSG_EM_SPARC_DMP
, MSG_EM_386_DMP
,
173 MSG_EM_68K_DMP
, MSG_EM_88K_DMP
,
174 MSG_EM_486_DMP
, MSG_EM_860_DMP
,
175 MSG_EM_MIPS_DMP
, MSG_EM_S370_CF
,
176 MSG_EM_MIPS_RS3_LE_DMP
, MSG_EM_RS6000_DMP
178 static const conv_ds_msg_t ds_mach_0_11_cf
= {
179 CONV_DS_MSG_INIT(EM_NONE
, mach_0_11_cf
) };
180 static const conv_ds_msg_t ds_mach_0_11_nf
= {
181 CONV_DS_MSG_INIT(EM_NONE
, mach_0_11_nf
) };
182 static const conv_ds_msg_t ds_mach_0_11_dmp
= {
183 CONV_DS_MSG_INIT(EM_NONE
, mach_0_11_dmp
) };
186 static const Msg mach_15_22_cf
[] = {
187 MSG_EM_PA_RISC_CF
, MSG_EM_NCUBE_CF
,
188 MSG_EM_VPP500_CF
, MSG_EM_SPARC32PLUS_CF
,
189 MSG_EM_960_CF
, MSG_EM_PPC_CF
,
190 MSG_EM_PPC64_CF
, MSG_EM_S390_CF
192 static const Msg mach_15_22_nf
[] = {
193 MSG_EM_PA_RISC_NF
, MSG_EM_NCUBE_NF
,
194 MSG_EM_VPP500_NF
, MSG_EM_SPARC32PLUS_NF
,
195 MSG_EM_960_NF
, MSG_EM_PPC_NF
,
196 MSG_EM_PPC64_NF
, MSG_EM_S390_NF
198 static const Msg mach_15_22_dmp
[] = {
199 MSG_EM_PA_RISC_DMP
, MSG_EM_NCUBE_DMP
,
200 MSG_EM_VPP500_DMP
, MSG_EM_SPARC32PLUS_DMP
,
201 MSG_EM_960_CF
, MSG_EM_PPC_DMP
,
202 MSG_EM_PPC64_DMP
, MSG_EM_S390_CF
204 static const conv_ds_msg_t ds_mach_15_22_cf
= {
205 CONV_DS_MSG_INIT(EM_PA_RISC
, mach_15_22_cf
) };
206 static const conv_ds_msg_t ds_mach_15_22_nf
= {
207 CONV_DS_MSG_INIT(EM_PA_RISC
, mach_15_22_nf
) };
208 static const conv_ds_msg_t ds_mach_15_22_dmp
= {
209 CONV_DS_MSG_INIT(EM_PA_RISC
, mach_15_22_dmp
) };
212 static const Msg mach_36_63_cf
[] = {
213 MSG_EM_V800_CF
, MSG_EM_FR20_CF
,
214 MSG_EM_RH32_CF
, MSG_EM_RCE_CF
,
215 MSG_EM_ARM_CF
, MSG_EM_ALPHA_CF
,
216 MSG_EM_SH_CF
, MSG_EM_SPARCV9_CF
,
217 MSG_EM_TRICORE_CF
, MSG_EM_ARC_CF
,
218 MSG_EM_H8_300_CF
, MSG_EM_H8_300H_CF
,
219 MSG_EM_H8S_CF
, MSG_EM_H8_500_CF
,
220 MSG_EM_IA_64_CF
, MSG_EM_MIPS_X_CF
,
221 MSG_EM_COLDFIRE_CF
, MSG_EM_68HC12_CF
,
222 MSG_EM_MMA_CF
, MSG_EM_PCP_CF
,
223 MSG_EM_NCPU_CF
, MSG_EM_NDR1_CF
,
224 MSG_EM_STARCORE_CF
, MSG_EM_ME16_CF
,
225 MSG_EM_ST100_CF
, MSG_EM_TINYJ_CF
,
226 MSG_EM_AMD64_CF
, MSG_EM_PDSP_CF
228 static const Msg mach_36_63_nf
[] = {
229 MSG_EM_V800_NF
, MSG_EM_FR20_NF
,
230 MSG_EM_RH32_NF
, MSG_EM_RCE_NF
,
231 MSG_EM_ARM_NF
, MSG_EM_ALPHA_NF
,
232 MSG_EM_SH_NF
, MSG_EM_SPARCV9_NF
,
233 MSG_EM_TRICORE_NF
, MSG_EM_ARC_NF
,
234 MSG_EM_H8_300_NF
, MSG_EM_H8_300H_NF
,
235 MSG_EM_H8S_NF
, MSG_EM_H8_500_NF
,
236 MSG_EM_IA_64_NF
, MSG_EM_MIPS_X_NF
,
237 MSG_EM_COLDFIRE_NF
, MSG_EM_68HC12_NF
,
238 MSG_EM_MMA_NF
, MSG_EM_PCP_NF
,
239 MSG_EM_NCPU_NF
, MSG_EM_NDR1_NF
,
240 MSG_EM_STARCORE_NF
, MSG_EM_ME16_NF
,
241 MSG_EM_ST100_NF
, MSG_EM_TINYJ_NF
,
242 MSG_EM_AMD64_NF
, MSG_EM_PDSP_NF
244 static const Msg mach_36_63_dmp
[] = {
245 MSG_EM_V800_CF
, MSG_EM_FR20_CF
,
246 MSG_EM_RH32_CF
, MSG_EM_RCE_CF
,
247 MSG_EM_ARM_DMP
, MSG_EM_ALPHA_DMP
,
248 MSG_EM_SH_CF
, MSG_EM_SPARCV9_DMP
,
249 MSG_EM_TRICORE_CF
, MSG_EM_ARC_CF
,
250 MSG_EM_H8_300_CF
, MSG_EM_H8_300H_CF
,
251 MSG_EM_H8S_CF
, MSG_EM_H8_500_CF
,
252 MSG_EM_IA_64_DMP
, MSG_EM_MIPS_X_CF
,
253 MSG_EM_COLDFIRE_CF
, MSG_EM_68HC12_CF
,
254 MSG_EM_MMA_CF
, MSG_EM_PCP_CF
,
255 MSG_EM_NCPU_CF
, MSG_EM_NDR1_CF
,
256 MSG_EM_STARCORE_CF
, MSG_EM_ME16_CF
,
257 MSG_EM_ST100_CF
, MSG_EM_TINYJ_CF
,
258 MSG_EM_AMD64_DMP
, MSG_EM_PDSP_CF
260 static const conv_ds_msg_t ds_mach_36_63_cf
= {
261 CONV_DS_MSG_INIT(EM_V800
, mach_36_63_cf
) };
262 static const conv_ds_msg_t ds_mach_36_63_nf
= {
263 CONV_DS_MSG_INIT(EM_V800
, mach_36_63_nf
) };
264 static const conv_ds_msg_t ds_mach_36_63_dmp
= {
265 CONV_DS_MSG_INIT(EM_V800
, mach_36_63_dmp
) };
268 static const Msg mach_66_94_cf
[] = {
269 MSG_EM_FX66_CF
, MSG_EM_ST9PLUS_CF
,
270 MSG_EM_ST7_CF
, MSG_EM_68HC16_CF
,
271 MSG_EM_68HC11_CF
, MSG_EM_68HC08_CF
,
272 MSG_EM_68HC05_CF
, MSG_EM_SVX_CF
,
273 MSG_EM_ST19_CF
, MSG_EM_VAX_CF
,
274 MSG_EM_CRIS_CF
, MSG_EM_JAVELIN_CF
,
275 MSG_EM_FIREPATH_CF
, MSG_EM_ZSP_CF
,
276 MSG_EM_MMIX_CF
, MSG_EM_HUANY_CF
,
277 MSG_EM_PRISM_CF
, MSG_EM_AVR_CF
,
278 MSG_EM_FR30_CF
, MSG_EM_D10V_CF
,
279 MSG_EM_D30V_CF
, MSG_EM_V850_CF
,
280 MSG_EM_M32R_CF
, MSG_EM_MN10300_CF
,
281 MSG_EM_MN10200_CF
, MSG_EM_PJ_CF
,
282 MSG_EM_OPENRISC_CF
, MSG_EM_ARC_A5_CF
,
285 static const Msg mach_66_94_nf
[] = {
286 MSG_EM_FX66_NF
, MSG_EM_ST9PLUS_NF
,
287 MSG_EM_ST7_NF
, MSG_EM_68HC16_NF
,
288 MSG_EM_68HC11_NF
, MSG_EM_68HC08_NF
,
289 MSG_EM_68HC05_NF
, MSG_EM_SVX_NF
,
290 MSG_EM_ST19_NF
, MSG_EM_VAX_NF
,
291 MSG_EM_CRIS_NF
, MSG_EM_JAVELIN_NF
,
292 MSG_EM_FIREPATH_NF
, MSG_EM_ZSP_NF
,
293 MSG_EM_MMIX_NF
, MSG_EM_HUANY_NF
,
294 MSG_EM_PRISM_NF
, MSG_EM_AVR_NF
,
295 MSG_EM_FR30_NF
, MSG_EM_D10V_NF
,
296 MSG_EM_D30V_NF
, MSG_EM_V850_NF
,
297 MSG_EM_M32R_NF
, MSG_EM_MN10300_NF
,
298 MSG_EM_MN10200_NF
, MSG_EM_PJ_NF
,
299 MSG_EM_OPENRISC_NF
, MSG_EM_ARC_A5_NF
,
302 static const Msg mach_66_94_dmp
[] = {
303 MSG_EM_FX66_CF
, MSG_EM_ST9PLUS_CF
,
304 MSG_EM_ST7_CF
, MSG_EM_68HC16_CF
,
305 MSG_EM_68HC11_CF
, MSG_EM_68HC08_CF
,
306 MSG_EM_68HC05_CF
, MSG_EM_SVX_CF
,
307 MSG_EM_ST19_CF
, MSG_EM_VAX_DMP
,
308 MSG_EM_CRIS_CF
, MSG_EM_JAVELIN_CF
,
309 MSG_EM_FIREPATH_CF
, MSG_EM_ZSP_CF
,
310 MSG_EM_MMIX_CF
, MSG_EM_HUANY_CF
,
311 MSG_EM_PRISM_CF
, MSG_EM_AVR_CF
,
312 MSG_EM_FR30_CF
, MSG_EM_D10V_CF
,
313 MSG_EM_D30V_CF
, MSG_EM_V850_CF
,
314 MSG_EM_M32R_CF
, MSG_EM_MN10300_CF
,
315 MSG_EM_MN10200_CF
, MSG_EM_PJ_CF
,
316 MSG_EM_OPENRISC_CF
, MSG_EM_ARC_A5_CF
,
319 #if (EM_NUM != (EM_XTENSA + 1))
320 #error "EM_NUM has grown"
322 static const conv_ds_msg_t ds_mach_66_94_cf
= {
323 CONV_DS_MSG_INIT(EM_FX66
, mach_66_94_cf
) };
324 static const conv_ds_msg_t ds_mach_66_94_nf
= {
325 CONV_DS_MSG_INIT(EM_FX66
, mach_66_94_nf
) };
326 static const conv_ds_msg_t ds_mach_66_94_dmp
= {
327 CONV_DS_MSG_INIT(EM_FX66
, mach_66_94_dmp
) };
330 /* Build NULL terminated return arrays for each string style */
331 static const const conv_ds_t
*ds_cf
[] = {
332 CONV_DS_ADDR(ds_mach_0_11_cf
), CONV_DS_ADDR(ds_mach_15_22_cf
),
333 CONV_DS_ADDR(ds_mach_36_63_cf
), CONV_DS_ADDR(ds_mach_66_94_cf
),
336 static const const conv_ds_t
*ds_nf
[] = {
337 CONV_DS_ADDR(ds_mach_0_11_nf
), CONV_DS_ADDR(ds_mach_15_22_nf
),
338 CONV_DS_ADDR(ds_mach_36_63_nf
), CONV_DS_ADDR(ds_mach_66_94_nf
),
341 static const const conv_ds_t
*ds_dmp
[] = {
342 CONV_DS_ADDR(ds_mach_0_11_dmp
), CONV_DS_ADDR(ds_mach_15_22_dmp
),
343 CONV_DS_ADDR(ds_mach_36_63_dmp
),
344 CONV_DS_ADDR(ds_mach_66_94_dmp
), NULL
348 /* Select the strings to use */
349 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
350 case CONV_FMT_ALT_DUMP
:
351 case CONV_FMT_ALT_FILE
:
353 case CONV_FMT_ALT_NF
:
361 conv_ehdr_mach(Half machine
, Conv_fmt_flags_t fmt_flags
,
362 Conv_inv_buf_t
*inv_buf
)
364 return (conv_map_ds(ELFOSABI_NONE
, EM_NONE
, machine
,
365 ehdr_mach_strings(fmt_flags
), fmt_flags
, inv_buf
));
369 conv_iter_ehdr_mach(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
372 static const Val_desc extra_dmp_nf
[] = {
373 { EM_M32
, MSG_EM_M32_DMP
},
374 { EM_386
, MSG_EM_386_DMP
},
375 { EM_68K
, MSG_EM_68K_DMP
},
376 { EM_88K
, MSG_EM_88K_DMP
},
377 { EM_486
, MSG_EM_486_DMP
},
378 { EM_860
, MSG_EM_860_DMP
},
379 { EM_MIPS
, MSG_EM_MIPS_DMP
},
380 { EM_MIPS_RS3_LE
, MSG_EM_MIPS_RS3_LE_DMP
},
381 { EM_PPC
, MSG_EM_PPC_DMP
},
382 { EM_PPC64
, MSG_EM_PPC64_DMP
},
387 if (conv_iter_ds(ELFOSABI_NONE
, EM_NONE
,
388 ehdr_mach_strings(fmt_flags
), func
, uvalue
) == CONV_ITER_DONE
)
389 return (CONV_ITER_DONE
);
392 * For the NF style, we also supply a few of the traditional
393 * dump versions for iteration, but not for display.
395 if (CONV_TYPE_FMT_ALT(fmt_flags
) == CONV_FMT_ALT_NF
)
396 return (conv_iter_vd(extra_dmp_nf
, func
, uvalue
));
398 return (CONV_ITER_CONT
);
403 static const conv_ds_t
**
404 ehdr_eident_strings(Conv_fmt_flags_t fmt_flags
)
406 static const Msg eident_cf
[] = {
407 MSG_EI_MAG0_CF
, MSG_EI_MAG1_CF
,
408 MSG_EI_MAG2_CF
, MSG_EI_MAG3_CF
,
409 MSG_EI_CLASS_CF
, MSG_EI_DATA_CF
,
410 MSG_EI_VERSION_CF
, MSG_EI_OSABI_CF
,
413 static const Msg eident_nf
[] = {
414 MSG_EI_MAG0_NF
, MSG_EI_MAG1_NF
,
415 MSG_EI_MAG2_NF
, MSG_EI_MAG3_NF
,
416 MSG_EI_CLASS_NF
, MSG_EI_DATA_NF
,
417 MSG_EI_VERSION_NF
, MSG_EI_OSABI_NF
,
420 #if EI_PAD != (EI_ABIVERSION + 1)
421 error
"EI_PAD has grown. Update etypes[]"
423 static const conv_ds_msg_t ds_eident_cf
= {
424 CONV_DS_MSG_INIT(EI_MAG0
, eident_cf
) };
425 static const conv_ds_msg_t ds_eident_nf
= {
426 CONV_DS_MSG_INIT(EI_MAG0
, eident_nf
) };
428 /* Build NULL terminated return arrays for each string style */
429 static const const conv_ds_t
*ds_cf
[] = {
430 CONV_DS_ADDR(ds_eident_cf
), NULL
};
431 static const conv_ds_t
*ds_nf
[] = {
432 CONV_DS_ADDR(ds_eident_nf
), NULL
};
434 /* Select the strings to use */
435 return ((CONV_TYPE_FMT_ALT(fmt_flags
) == CONV_FMT_ALT_CF
) ?
440 conv_iter_ehdr_eident(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
443 return (conv_iter_ds(ELFOSABI_NONE
, EM_NONE
,
444 ehdr_eident_strings(fmt_flags
), func
, uvalue
));
447 static const conv_ds_t
**
448 ehdr_type_strings(Conv_fmt_flags_t fmt_flags
)
450 #define SOL ELFOSABI_SOLARIS, EM_NONE
452 static const Msg type_cf
[] = {
453 MSG_ET_NONE_CF
, MSG_ET_REL_CF
, MSG_ET_EXEC_CF
,
454 MSG_ET_DYN_CF
, MSG_ET_CORE_CF
456 static const Msg type_nf
[] = {
457 MSG_ET_NONE_NF
, MSG_ET_REL_NF
, MSG_ET_EXEC_NF
,
458 MSG_ET_DYN_NF
, MSG_ET_CORE_NF
460 static const Msg type_dmp
[] = {
461 MSG_ET_NONE_DMP
, MSG_ET_REL_DMP
, MSG_ET_EXEC_DMP
,
462 MSG_ET_DYN_DMP
, MSG_ET_CORE_DMP
464 #if ET_NUM != (ET_CORE + 1)
465 error
"ET_NUM has grown. Update types[]"
467 static const conv_ds_msg_t ds_type_cf
= {
468 CONV_DS_MSG_INIT(ET_NONE
, type_cf
) };
469 static const conv_ds_msg_t ds_type_nf
= {
470 CONV_DS_MSG_INIT(ET_NONE
, type_nf
) };
471 static const conv_ds_msg_t ds_type_dmp
= {
472 CONV_DS_MSG_INIT(ET_NONE
, type_dmp
) };
474 static const Val_desc2 type_osabi_cf
[] = {
475 { ET_SUNWPSEUDO
, SOL
, MSG_ET_SUNWPSEUDO_CF
},
478 static const Val_desc2 type_osabi_nf
[] = {
479 { ET_SUNWPSEUDO
, SOL
, MSG_ET_SUNWPSEUDO_NF
},
482 static const Val_desc2 type_osabi_dmp
[] = {
483 { ET_SUNWPSEUDO
, SOL
, MSG_ET_SUNWPSEUDO_DMP
},
486 #if ET_LOSUNW != ET_SUNWPSEUDO
487 error
"ET_LOSUNW has grown. Update type_osabi[]"
489 static const conv_ds_vd2_t ds_type_osabi_cf
= {
490 CONV_DS_VD2
, ET_LOOS
, ET_HIOS
, type_osabi_cf
};
491 static const conv_ds_vd2_t ds_type_osabi_nf
= {
492 CONV_DS_VD2
, ET_LOOS
, ET_HIOS
, type_osabi_nf
};
493 static const conv_ds_vd2_t ds_type_osabi_dmp
= {
494 CONV_DS_VD2
, ET_LOOS
, ET_HIOS
, type_osabi_dmp
};
497 /* Build NULL terminated return arrays for each string style */
498 static const const conv_ds_t
*ds_cf
[] = {
499 CONV_DS_ADDR(ds_type_cf
), CONV_DS_ADDR(ds_type_osabi_cf
),
501 static const conv_ds_t
*ds_nf
[] = {
502 CONV_DS_ADDR(ds_type_nf
), CONV_DS_ADDR(ds_type_osabi_nf
),
504 static const conv_ds_t
*ds_dmp
[] = {
505 CONV_DS_ADDR(ds_type_dmp
), CONV_DS_ADDR(ds_type_osabi_dmp
),
508 /* Select the strings to use */
509 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
510 case CONV_FMT_ALT_DUMP
:
512 case CONV_FMT_ALT_NF
:
522 conv_ehdr_type(uchar_t osabi
, Half etype
, Conv_fmt_flags_t fmt_flags
,
523 Conv_inv_buf_t
*inv_buf
)
525 return (conv_map_ds(osabi
, EM_NONE
, etype
,
526 ehdr_type_strings(fmt_flags
), fmt_flags
, inv_buf
));
530 conv_iter_ehdr_type(conv_iter_osabi_t osabi
, Conv_fmt_flags_t fmt_flags
,
531 conv_iter_cb_t func
, void *uvalue
)
533 return (conv_iter_ds(osabi
, EM_NONE
,
534 ehdr_type_strings(fmt_flags
), func
, uvalue
));
537 static const conv_ds_t
**
538 ehdr_vers_strings(Conv_fmt_flags_t fmt_flags
)
540 static const Msg versions_cf
[] = {
541 MSG_EV_NONE_CF
, MSG_EV_CURRENT_CF
543 static const Msg versions_nf
[] = {
544 MSG_EV_NONE_NF
, MSG_EV_CURRENT_NF
546 static const Msg versions_dmp
[] = {
547 MSG_EV_NONE_DMP
, MSG_EV_CURRENT_DMP
550 error
"EV_NUM has grown. Update versions[]"
552 static const conv_ds_msg_t ds_versions_cf
= {
553 CONV_DS_MSG_INIT(EV_NONE
, versions_cf
) };
554 static const conv_ds_msg_t ds_versions_nf
= {
555 CONV_DS_MSG_INIT(EV_NONE
, versions_nf
) };
556 static const conv_ds_msg_t ds_versions_dmp
= {
557 CONV_DS_MSG_INIT(EV_NONE
, versions_dmp
) };
559 /* Build NULL terminated return arrays for each string style */
560 static const const conv_ds_t
*ds_cf
[] = {
561 CONV_DS_ADDR(ds_versions_cf
), NULL
};
562 static const conv_ds_t
*ds_nf
[] = {
563 CONV_DS_ADDR(ds_versions_nf
), NULL
};
564 static const conv_ds_t
*ds_dmp
[] = {
565 CONV_DS_ADDR(ds_versions_dmp
), NULL
};
567 /* Select the strings to use */
568 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
569 case CONV_FMT_ALT_DUMP
:
571 case CONV_FMT_ALT_NF
:
579 conv_ehdr_vers(Word version
, Conv_fmt_flags_t fmt_flags
,
580 Conv_inv_buf_t
*inv_buf
)
582 return (conv_map_ds(ELFOSABI_NONE
, EM_NONE
, version
,
583 ehdr_vers_strings(fmt_flags
), fmt_flags
, inv_buf
));
587 conv_iter_ehdr_vers(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
590 return (conv_iter_ds(ELFOSABI_NONE
, EM_NONE
,
591 ehdr_vers_strings(fmt_flags
), func
, uvalue
));
595 conv_ehdr_sparc_flags_strings(Conv_fmt_flags_t fmt_flags
,
596 const conv_ds_msg_t
**mm_msg
, const Val_desc
**flag_desc
)
598 #define EFLAGSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
599 MSG_EF_SPARCV9_TSO_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
600 MSG_EF_SPARC_SUN_US1_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
601 MSG_EF_SPARC_HAL_R1_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
602 MSG_EF_SPARC_SUN_US3_CF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
603 CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
606 * Ensure that Conv_ehdr_flags_buf_t is large enough:
608 * EFLAGSZ is the real minimum size of the buffer required by
609 * conv_ehdr_flags(). However, Conv_ehdr_flags_buf_t uses
610 * CONV_EHDR_FLAG_BUFSIZE to set the buffer size. We do things
611 * this way because the definition of EFLAGSZ uses information
612 * that is not available in the environment of other programs
613 * that include the conv.h header file.
615 #if (CONV_EHDR_FLAGS_BUFSIZE != EFLAGSZ) && !defined(__lint)
616 #define REPORT_BUFSIZE EFLAGSZ
617 #include "report_bufsize.h"
618 #error "CONV_EHDR_FLAGS_BUFSIZE does not match EFLAGSZ"
621 static const Msg mm_flags_cf
[] = {
622 MSG_EF_SPARCV9_TSO_CF
, MSG_EF_SPARCV9_PSO_CF
,
623 MSG_EF_SPARCV9_RMO_CF
625 static const Msg mm_flags_nf
[] = {
626 MSG_EF_SPARCV9_TSO_NF
, MSG_EF_SPARCV9_PSO_NF
,
627 MSG_EF_SPARCV9_RMO_NF
629 static const conv_ds_msg_t ds_mm_flags_cf
= {
630 CONV_DS_MSG_INIT(EF_SPARCV9_TSO
, mm_flags_cf
) };
631 static const conv_ds_msg_t ds_mm_flags_nf
= {
632 CONV_DS_MSG_INIT(EF_SPARCV9_TSO
, mm_flags_nf
) };
635 static const Val_desc vda_cf
[] = {
636 { EF_SPARC_32PLUS
, MSG_EF_SPARC_32PLUS_CF
},
637 { EF_SPARC_SUN_US1
, MSG_EF_SPARC_SUN_US1_CF
},
638 { EF_SPARC_HAL_R1
, MSG_EF_SPARC_HAL_R1_CF
},
639 { EF_SPARC_SUN_US3
, MSG_EF_SPARC_SUN_US3_CF
},
642 static const Val_desc vda_nf
[] = {
643 { EF_SPARC_32PLUS
, MSG_EF_SPARC_32PLUS_NF
},
644 { EF_SPARC_SUN_US1
, MSG_EF_SPARC_SUN_US1_NF
},
645 { EF_SPARC_HAL_R1
, MSG_EF_SPARC_HAL_R1_NF
},
646 { EF_SPARC_SUN_US3
, MSG_EF_SPARC_SUN_US3_NF
},
650 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
652 *mm_msg
= &ds_mm_flags_cf
;
655 case CONV_FMT_ALT_NF
:
656 *mm_msg
= &ds_mm_flags_nf
;
663 * Make a string representation of the e_flags field.
666 conv_ehdr_flags(Half mach
, Word flags
, Conv_fmt_flags_t fmt_flags
,
667 Conv_ehdr_flags_buf_t
*flags_buf
)
669 static const char *leading_str_arr
[2];
670 static CONV_EXPN_FIELD_ARG conv_arg
= {
671 NULL
, sizeof (flags_buf
->buf
), leading_str_arr
};
674 const conv_ds_msg_t
*mm_msg
;
679 * Non-SPARC architectures presently provide no known flags.
681 if ((mach
!= EM_SPARCV9
) && (((mach
!= EM_SPARC
) &&
682 (mach
!= EM_SPARC32PLUS
)) || (flags
== 0)))
683 return (conv_invalid_val(&flags_buf
->inv_buf
, flags
,
686 conv_arg
.buf
= flags_buf
->buf
;
687 conv_ehdr_sparc_flags_strings(fmt_flags
, &mm_msg
, &vdp
);
688 conv_arg
.oflags
= conv_arg
.rflags
= flags
;
690 mm
= flags
& EF_SPARCV9_MM
;
691 lstr
= leading_str_arr
;
692 if ((mach
== EM_SPARCV9
) && (mm
<= mm_msg
->ds_topval
)) {
693 *lstr
++ = MSG_ORIG(mm_msg
->ds_msg
[mm
]);
694 conv_arg
.rflags
&= ~EF_SPARCV9_MM
;
698 (void) conv_expn_field(&conv_arg
, vdp
, fmt_flags
);
700 return (conv_arg
.buf
);
704 conv_iter_ehdr_flags(Half mach
, Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
708 if ((mach
== EM_SPARCV9
) || (mach
== EM_SPARC
) ||
709 (mach
== EM_SPARC32PLUS
) || (mach
== CONV_MACH_ALL
)) {
710 const conv_ds_msg_t
*ds_msg_mm
;
713 conv_ehdr_sparc_flags_strings(fmt_flags
, &ds_msg_mm
, &vdp
);
715 if (mach
== EM_SPARCV9
) {
716 const conv_ds_t
*ds
[2];
718 ds
[0] = CONV_DS_ADDR(ds_msg_mm
);
721 if (conv_iter_ds(ELFOSABI_NONE
, mach
, ds
,
722 func
, uvalue
) == CONV_ITER_DONE
)
723 return (CONV_ITER_DONE
);
726 return (conv_iter_vd(vdp
, func
, uvalue
));
729 return (CONV_ITER_CONT
);
732 static const conv_ds_t
**
733 ehdr_osabi_strings(Conv_fmt_flags_t fmt_flags
)
736 static const Msg osabi_0_3_cf
[] = {
737 MSG_OSABI_NONE_CF
, MSG_OSABI_HPUX_CF
,
738 MSG_OSABI_NETBSD_CF
, MSG_OSABI_LINUX_CF
740 static const Msg osabi_0_3_nf
[] = {
741 MSG_OSABI_NONE_NF
, MSG_OSABI_HPUX_NF
,
742 MSG_OSABI_NETBSD_NF
, MSG_OSABI_LINUX_NF
744 static const Msg osabi_0_3_dmp
[] = {
745 MSG_OSABI_NONE_DMP
, MSG_OSABI_HPUX_DMP
,
746 MSG_OSABI_NETBSD_DMP
, MSG_OSABI_LINUX_DMP
748 static const conv_ds_msg_t ds_osabi_0_3_cf
= {
749 CONV_DS_MSG_INIT(ELFOSABI_NONE
, osabi_0_3_cf
) };
750 static const conv_ds_msg_t ds_osabi_0_3_nf
= {
751 CONV_DS_MSG_INIT(ELFOSABI_NONE
, osabi_0_3_nf
) };
752 static const conv_ds_msg_t ds_osabi_0_3_dmp
= {
753 CONV_DS_MSG_INIT(ELFOSABI_NONE
, osabi_0_3_dmp
) };
756 static const Msg osabi_6_15_cf
[] = {
757 MSG_OSABI_SOLARIS_CF
, MSG_OSABI_AIX_CF
,
758 MSG_OSABI_IRIX_CF
, MSG_OSABI_FREEBSD_CF
,
759 MSG_OSABI_TRU64_CF
, MSG_OSABI_MODESTO_CF
,
760 MSG_OSABI_OPENBSD_CF
, MSG_OSABI_OPENVMS_CF
,
761 MSG_OSABI_NSK_CF
, MSG_OSABI_AROS_CF
763 static const Msg osabi_6_15_nf
[] = {
764 MSG_OSABI_SOLARIS_NF
, MSG_OSABI_AIX_NF
,
765 MSG_OSABI_IRIX_NF
, MSG_OSABI_FREEBSD_NF
,
766 MSG_OSABI_TRU64_NF
, MSG_OSABI_MODESTO_NF
,
767 MSG_OSABI_OPENBSD_NF
, MSG_OSABI_OPENVMS_NF
,
768 MSG_OSABI_NSK_NF
, MSG_OSABI_AROS_NF
770 static const Msg osabi_6_15_dmp
[] = {
771 MSG_OSABI_SOLARIS_DMP
, MSG_OSABI_AIX_DMP
,
772 MSG_OSABI_IRIX_DMP
, MSG_OSABI_FREEBSD_DMP
,
773 MSG_OSABI_TRU64_DMP
, MSG_OSABI_MODESTO_DMP
,
774 MSG_OSABI_OPENBSD_DMP
, MSG_OSABI_OPENVMS_DMP
,
775 MSG_OSABI_NSK_DMP
, MSG_OSABI_AROS_DMP
777 static const conv_ds_msg_t ds_osabi_6_15_cf
= {
778 CONV_DS_MSG_INIT(ELFOSABI_SOLARIS
, osabi_6_15_cf
) };
779 static const conv_ds_msg_t ds_osabi_6_15_nf
= {
780 CONV_DS_MSG_INIT(ELFOSABI_SOLARIS
, osabi_6_15_nf
) };
781 static const conv_ds_msg_t ds_osabi_6_15_dmp
= {
782 CONV_DS_MSG_INIT(ELFOSABI_SOLARIS
, osabi_6_15_dmp
) };
785 static const Val_desc osabi_misc_cf
[] = {
786 { ELFOSABI_ARM
, MSG_OSABI_ARM_CF
},
787 { ELFOSABI_STANDALONE
, MSG_OSABI_STANDALONE_CF
},
790 static const Val_desc osabi_misc_nf
[] = {
791 { ELFOSABI_ARM
, MSG_OSABI_ARM_NF
},
792 { ELFOSABI_STANDALONE
, MSG_OSABI_STANDALONE_NF
},
795 static const Val_desc osabi_misc_dmp
[] = {
796 { ELFOSABI_ARM
, MSG_OSABI_ARM_DMP
},
797 { ELFOSABI_STANDALONE
, MSG_OSABI_STANDALONE_DMP
},
800 static const conv_ds_vd_t ds_osabi_misc_cf
= {
801 CONV_DS_VD
, ELFOSABI_ARM
, ELFOSABI_STANDALONE
, osabi_misc_cf
};
802 static const conv_ds_vd_t ds_osabi_misc_nf
= {
803 CONV_DS_VD
, ELFOSABI_ARM
, ELFOSABI_STANDALONE
, osabi_misc_nf
};
804 static const conv_ds_vd_t ds_osabi_misc_dmp
= {
805 CONV_DS_VD
, ELFOSABI_ARM
, ELFOSABI_STANDALONE
, osabi_misc_dmp
};
807 /* Build NULL terminated return arrays for each string style */
808 static const const conv_ds_t
*ds_cf
[] = {
809 CONV_DS_ADDR(ds_osabi_0_3_cf
), CONV_DS_ADDR(ds_osabi_6_15_cf
),
810 CONV_DS_ADDR(ds_osabi_misc_cf
), NULL
};
811 static const const conv_ds_t
*ds_nf
[] = {
812 CONV_DS_ADDR(ds_osabi_0_3_nf
), CONV_DS_ADDR(ds_osabi_6_15_nf
),
813 CONV_DS_ADDR(ds_osabi_misc_nf
), NULL
};
814 static const const conv_ds_t
*ds_dmp
[] = {
815 CONV_DS_ADDR(ds_osabi_0_3_dmp
), CONV_DS_ADDR(ds_osabi_6_15_dmp
),
816 CONV_DS_ADDR(ds_osabi_misc_dmp
), NULL
};
818 /* Select the strings to use */
819 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
820 case CONV_FMT_ALT_DUMP
:
822 case CONV_FMT_ALT_NF
:
830 * Make a string representation of the e_ident[EI_OSABI] field.
833 conv_ehdr_osabi(uchar_t osabi
, Conv_fmt_flags_t fmt_flags
,
834 Conv_inv_buf_t
*inv_buf
)
836 return (conv_map_ds(ELFOSABI_NONE
, EM_NONE
, osabi
,
837 ehdr_osabi_strings(fmt_flags
), fmt_flags
, inv_buf
));
841 conv_iter_ehdr_osabi(Conv_fmt_flags_t fmt_flags
, conv_iter_cb_t func
,
844 if (conv_iter_ds(ELFOSABI_NONE
, EM_NONE
, ehdr_osabi_strings(fmt_flags
),
845 func
, uvalue
) == CONV_ITER_DONE
)
846 return (CONV_ITER_DONE
);
849 * ELFOSABI_NONE might have been better named ELFOSABI_SYSV. For the
850 * CF and NF sytles, we supply that name for 0 in addition to NONE.
852 switch (CONV_TYPE_FMT_ALT(fmt_flags
)) {
853 case CONV_FMT_ALT_CF
:
854 return ((* func
)(MSG_ORIG(MSG_OSABI_SYSV_CF
),
855 ELFOSABI_NONE
, uvalue
));
856 case CONV_FMT_ALT_NF
:
857 return ((* func
)(MSG_ORIG(MSG_OSABI_SYSV_NF
),
858 ELFOSABI_NONE
, uvalue
));
861 return (CONV_ITER_CONT
);
864 static const conv_ds_t
**
865 ehdr_abivers_strings(conv_iter_osabi_t osabi
, Conv_fmt_flags_t fmt_flags
)
867 static const Msg abiversions_cf
[] = {
868 MSG_EAV_SUNW_NONE_CF
, MSG_EAV_SUNW_CURRENT_CF
870 static const Msg abiversions_nf
[] = {
871 MSG_EAV_SUNW_NONE_NF
, MSG_EAV_SUNW_CURRENT_NF
873 #if EAV_SUNW_NUM != 2
874 error
"EAV_SUNW_NUM has grown. Update abiversions[]"
876 static const conv_ds_msg_t ds_abiversions_cf
= {
877 CONV_DS_MSG_INIT(EV_NONE
, abiversions_cf
) };
878 static const conv_ds_msg_t ds_abiversions_nf
= {
879 CONV_DS_MSG_INIT(EV_NONE
, abiversions_nf
) };
881 /* Build NULL terminated return arrays for each string style */
882 static const const conv_ds_t
*ds_cf
[] = {
883 CONV_DS_ADDR(ds_abiversions_cf
), NULL
};
884 static const conv_ds_t
*ds_nf
[] = {
885 CONV_DS_ADDR(ds_abiversions_nf
), NULL
};
887 /* For non-Solaris OSABI, we don't have symbolic names */
888 static const conv_ds_t
*ds_none
[] = { NULL
};
892 * Select the strings to use. This is a rare case where
893 * we don't treat ELFOSABI_NONE and ELFOSABI_SOLARIS
894 * as the same thing. We should never create a Solaris
895 * object tagged as ELFOSABI_NONE for which the abiversion
898 if ((osabi
== ELFOSABI_SOLARIS
) || (osabi
== CONV_OSABI_ALL
))
899 return ((CONV_TYPE_FMT_ALT(fmt_flags
) == CONV_FMT_ALT_NF
) ?
906 conv_ehdr_abivers(uchar_t osabi
, Word version
, Conv_fmt_flags_t fmt_flags
,
907 Conv_inv_buf_t
*inv_buf
)
909 return (conv_map_ds(osabi
, EM_NONE
, version
,
910 ehdr_abivers_strings(osabi
, fmt_flags
), fmt_flags
, inv_buf
));
914 conv_iter_ehdr_abivers(conv_iter_osabi_t osabi
, Conv_fmt_flags_t fmt_flags
,
915 conv_iter_cb_t func
, void *uvalue
)
917 return (conv_iter_ds(osabi
, EM_NONE
,
918 ehdr_abivers_strings(osabi
, fmt_flags
), func
, uvalue
));
922 * A generic means of returning additional information for a rejected file in
923 * terms of a string. ELFOSABI_SOLARIS is assummed.
926 conv_reject_desc(Rej_desc
* rej
, Conv_reject_desc_buf_t
*reject_desc_buf
,
929 ushort_t type
= rej
->rej_type
;
930 uint_t info
= rej
->rej_info
;
934 return (conv_ehdr_mach((Half
)info
, 0,
935 &reject_desc_buf
->inv_buf
));
937 return (conv_ehdr_class((uchar_t
)info
, 0,
938 &reject_desc_buf
->inv_buf
));
940 return (conv_ehdr_data((uchar_t
)info
, 0,
941 &reject_desc_buf
->inv_buf
));
943 return (conv_ehdr_type(ELFOSABI_SOLARIS
, (Half
)info
, 0,
944 &reject_desc_buf
->inv_buf
));
945 case SGS_REJ_BADFLAG
:
946 case SGS_REJ_MISFLAG
:
949 return (conv_ehdr_flags(mach
, (Word
)info
, 0,
950 &reject_desc_buf
->flags_buf
));
951 case SGS_REJ_UNKFILE
:
952 case SGS_REJ_ARCHIVE
:
955 case SGS_REJ_HWCAP_1
:
956 case SGS_REJ_SFCAP_1
:
957 case SGS_REJ_HWCAP_2
:
958 case SGS_REJ_MACHCAP
:
959 case SGS_REJ_PLATCAP
:
961 return ((const char *)rej
->rej_str
);
963 return (MSG_ORIG(MSG_STR_EMPTY
));
965 return (conv_invalid_val(&reject_desc_buf
->inv_buf
, info
,