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