xref: /onnv-gate/usr/src/grub/grub-0.97/netboot/i386_elf.h (revision 8044:b3af80bbf173)
1*8044SWilliam.Kucharski@Sun.COM #ifndef I386_BITS_ELF_H
2*8044SWilliam.Kucharski@Sun.COM #define I386_BITS_ELF_H
3*8044SWilliam.Kucharski@Sun.COM 
4*8044SWilliam.Kucharski@Sun.COM #include "cpu.h"
5*8044SWilliam.Kucharski@Sun.COM 
6*8044SWilliam.Kucharski@Sun.COM #ifdef CONFIG_X86_64
7*8044SWilliam.Kucharski@Sun.COM /* ELF Defines for the 64bit version of the current architecture */
8*8044SWilliam.Kucharski@Sun.COM #define EM_CURRENT_64	EM_X86_64
9*8044SWilliam.Kucharski@Sun.COM #define EM_CURRENT_64_PRESENT ( \
10*8044SWilliam.Kucharski@Sun.COM 	CPU_FEATURE_P(cpu_info.x86_capability, LM) && \
11*8044SWilliam.Kucharski@Sun.COM 	CPU_FEATURE_P(cpu_info.x86_capability, PAE) && \
12*8044SWilliam.Kucharski@Sun.COM 	CPU_FEATURE_P(cpu_info.x86_capability, PSE))
13*8044SWilliam.Kucharski@Sun.COM 
14*8044SWilliam.Kucharski@Sun.COM #define ELF_CHECK_X86_64_ARCH(x) \
15*8044SWilliam.Kucharski@Sun.COM 	(EM_CURRENT_64_PRESENT && ((x).e_machine == EM_X86_64))
16*8044SWilliam.Kucharski@Sun.COM #define __unused_i386
17*8044SWilliam.Kucharski@Sun.COM #else
18*8044SWilliam.Kucharski@Sun.COM #define ELF_CHECK_X86_64_ARCH(x) 0
19*8044SWilliam.Kucharski@Sun.COM #define __unused_i386 __unused
20*8044SWilliam.Kucharski@Sun.COM #endif
21*8044SWilliam.Kucharski@Sun.COM 
22*8044SWilliam.Kucharski@Sun.COM 
23*8044SWilliam.Kucharski@Sun.COM /* ELF Defines for the current architecture */
24*8044SWilliam.Kucharski@Sun.COM #define	EM_CURRENT	EM_386
25*8044SWilliam.Kucharski@Sun.COM #define ELFDATA_CURRENT	ELFDATA2LSB
26*8044SWilliam.Kucharski@Sun.COM 
27*8044SWilliam.Kucharski@Sun.COM #define ELF_CHECK_I386_ARCH(x) \
28*8044SWilliam.Kucharski@Sun.COM 	(((x).e_machine == EM_386) || ((x).e_machine == EM_486))
29*8044SWilliam.Kucharski@Sun.COM 
30*8044SWilliam.Kucharski@Sun.COM #define ELF_CHECK_ARCH(x) \
31*8044SWilliam.Kucharski@Sun.COM 	((ELF_CHECK_I386_ARCH(x) || ELF_CHECK_X86_64_ARCH(x)) && \
32*8044SWilliam.Kucharski@Sun.COM 		((x).e_entry <= 0xffffffffUL))
33*8044SWilliam.Kucharski@Sun.COM 
34*8044SWilliam.Kucharski@Sun.COM #ifdef  IMAGE_FREEBSD
35*8044SWilliam.Kucharski@Sun.COM /*
36*8044SWilliam.Kucharski@Sun.COM  * FreeBSD has this rather strange "feature" of its design.
37*8044SWilliam.Kucharski@Sun.COM  * At some point in its evolution, FreeBSD started to rely
38*8044SWilliam.Kucharski@Sun.COM  * externally on private/static/debug internal symbol information.
39*8044SWilliam.Kucharski@Sun.COM  * That is, some of the interfaces that software uses to access
40*8044SWilliam.Kucharski@Sun.COM  * and work with the FreeBSD kernel are made available not
41*8044SWilliam.Kucharski@Sun.COM  * via the shared library symbol information (the .DYNAMIC section)
42*8044SWilliam.Kucharski@Sun.COM  * but rather the debug symbols.  This means that any symbol, not
43*8044SWilliam.Kucharski@Sun.COM  * just publicly defined symbols can be (and are) used by system
44*8044SWilliam.Kucharski@Sun.COM  * tools to make the system work.  (such as top, swapinfo, swapon,
45*8044SWilliam.Kucharski@Sun.COM  * etc)
46*8044SWilliam.Kucharski@Sun.COM  *
47*8044SWilliam.Kucharski@Sun.COM  * Even worse, however, is the fact that standard ELF loaders do
48*8044SWilliam.Kucharski@Sun.COM  * not know how to load the symbols since they are not within
49*8044SWilliam.Kucharski@Sun.COM  * an ELF PT_LOAD section.  The kernel needs these symbols to
50*8044SWilliam.Kucharski@Sun.COM  * operate so the following changes/additions to the boot
51*8044SWilliam.Kucharski@Sun.COM  * loading of EtherBoot have been made to get the kernel to load.
52*8044SWilliam.Kucharski@Sun.COM  * All of the changes are within IMAGE_FREEBSD such that the
53*8044SWilliam.Kucharski@Sun.COM  * extra/changed code only compiles when FREEBSD support is
54*8044SWilliam.Kucharski@Sun.COM  * enabled.
55*8044SWilliam.Kucharski@Sun.COM  */
56*8044SWilliam.Kucharski@Sun.COM 
57*8044SWilliam.Kucharski@Sun.COM /*
58*8044SWilliam.Kucharski@Sun.COM  * Section header for FreeBSD (debug symbol kludge!) support
59*8044SWilliam.Kucharski@Sun.COM  */
60*8044SWilliam.Kucharski@Sun.COM typedef struct {
61*8044SWilliam.Kucharski@Sun.COM 	Elf32_Word	sh_name;	/* Section name (index into the
62*8044SWilliam.Kucharski@Sun.COM 					   section header string table). */
63*8044SWilliam.Kucharski@Sun.COM 	Elf32_Word	sh_type;	/* Section type. */
64*8044SWilliam.Kucharski@Sun.COM 	Elf32_Word	sh_flags;	/* Section flags. */
65*8044SWilliam.Kucharski@Sun.COM 	Elf32_Addr	sh_addr;	/* Address in memory image. */
66*8044SWilliam.Kucharski@Sun.COM 	Elf32_Off	sh_offset;	/* Offset in file. */
67*8044SWilliam.Kucharski@Sun.COM 	Elf32_Size	sh_size;	/* Size in bytes. */
68*8044SWilliam.Kucharski@Sun.COM 	Elf32_Word	sh_link;	/* Index of a related section. */
69*8044SWilliam.Kucharski@Sun.COM 	Elf32_Word	sh_info;	/* Depends on section type. */
70*8044SWilliam.Kucharski@Sun.COM 	Elf32_Size	sh_addralign;	/* Alignment in bytes. */
71*8044SWilliam.Kucharski@Sun.COM 	Elf32_Size	sh_entsize;	/* Size of each entry in section. */
72*8044SWilliam.Kucharski@Sun.COM } Elf32_Shdr;
73*8044SWilliam.Kucharski@Sun.COM 
74*8044SWilliam.Kucharski@Sun.COM /* sh_type */
75*8044SWilliam.Kucharski@Sun.COM #define SHT_SYMTAB	2		/* symbol table section */
76*8044SWilliam.Kucharski@Sun.COM #define SHT_STRTAB	3		/* string table section */
77*8044SWilliam.Kucharski@Sun.COM 
78*8044SWilliam.Kucharski@Sun.COM /*
79*8044SWilliam.Kucharski@Sun.COM  * Module information subtypes (for the metadata that we need to build)
80*8044SWilliam.Kucharski@Sun.COM  */
81*8044SWilliam.Kucharski@Sun.COM #define MODINFO_END		0x0000		/* End of list */
82*8044SWilliam.Kucharski@Sun.COM #define MODINFO_NAME		0x0001		/* Name of module (string) */
83*8044SWilliam.Kucharski@Sun.COM #define MODINFO_TYPE		0x0002		/* Type of module (string) */
84*8044SWilliam.Kucharski@Sun.COM #define MODINFO_METADATA	0x8000		/* Module-specfic */
85*8044SWilliam.Kucharski@Sun.COM 
86*8044SWilliam.Kucharski@Sun.COM #define MODINFOMD_SSYM		0x0003		/* start of symbols */
87*8044SWilliam.Kucharski@Sun.COM #define MODINFOMD_ESYM		0x0004		/* end of symbols */
88*8044SWilliam.Kucharski@Sun.COM 
89*8044SWilliam.Kucharski@Sun.COM #endif	/* IMAGE_FREEBSD */
90*8044SWilliam.Kucharski@Sun.COM 
91*8044SWilliam.Kucharski@Sun.COM #endif /* I386_BITS_ELF_H */
92