sys: use globals for the ELF kernel and module type strings

Initialize the globals with macros so we can use the same values in the
loader.

Also remove unnecessary "elfN module" checks.

Reviewed by: imp, kib
Pull Request: https://github.com/freebsd/freebsd-src/pull/1394
This commit is contained in:
Ahmad Khalifa
2024-08-24 18:12:52 +03:00
committed by Warner Losh
parent 707136024f
commit 4d213c595a
8 changed files with 28 additions and 19 deletions
+4 -4
View File
@@ -356,12 +356,12 @@ fake_preload_metadata(struct arm_boot_params *abp __unused, void *dtb_ptr,
fake_preload[i++] = MODINFO_NAME;
fake_preload[i++] = strlen("kernel") + 1;
strcpy((char*)&fake_preload[i++], "kernel");
strcpy((char *)&fake_preload[i++], "kernel");
i += 1;
fake_preload[i++] = MODINFO_TYPE;
fake_preload[i++] = strlen("elf kernel") + 1;
strcpy((char*)&fake_preload[i++], "elf kernel");
i += 2;
fake_preload[i++] = strlen(preload_kerntype) + 1;
strcpy((char *)&fake_preload[i], preload_kerntype);
i += howmany(fake_preload[i - 1], sizeof(uint32_t));
fake_preload[i++] = MODINFO_ADDR;
fake_preload[i++] = sizeof(vm_offset_t);
fake_preload[i++] = KERNVIRTADDR;
+1 -1
View File
@@ -98,7 +98,7 @@ fake_preload_metadata(void *dtb_ptr, size_t dtb_size)
PRELOAD_PUSH_STRING("kernel");
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_TYPE);
PRELOAD_PUSH_STRING("elf kernel");
PRELOAD_PUSH_STRING(preload_kerntype);
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_ADDR);
PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t));
+1 -3
View File
@@ -895,9 +895,7 @@ link_elf_link_preload(linker_class_t cls, const char *filename,
sizeptr = preload_search_info(modptr, MODINFO_SIZE);
dynptr = preload_search_info(modptr,
MODINFO_METADATA | MODINFOMD_DYNAMIC);
if (type == NULL ||
(strcmp(type, "elf" __XSTRING(__ELF_WORD_SIZE) " module") != 0 &&
strcmp(type, "elf module") != 0))
if (type == NULL || strcmp(type, preload_modtype) != 0)
return (EFTYPE);
if (baseptr == NULL || sizeptr == NULL || dynptr == NULL)
return (EINVAL);
+1 -4
View File
@@ -365,11 +365,8 @@ link_elf_link_preload(linker_class_t cls, const char *filename,
MODINFOMD_ELFHDR);
shdr = (Elf_Shdr *)preload_search_info(modptr, MODINFO_METADATA |
MODINFOMD_SHDR);
if (type == NULL || (strcmp(type, "elf" __XSTRING(__ELF_WORD_SIZE)
" obj module") != 0 &&
strcmp(type, "elf obj module") != 0)) {
if (type == NULL || strcmp(type, preload_modtype_obj) != 0)
return (EFTYPE);
}
if (baseptr == NULL || sizeptr == NULL || hdr == NULL ||
shdr == NULL)
return (EINVAL);
+5 -1
View File
@@ -46,10 +46,14 @@
vm_offset_t preload_addr_relocate = 0;
caddr_t preload_metadata, preload_kmdp;
const char preload_modtype[] = MODTYPE;
const char preload_kerntype[] = KERNTYPE;
const char preload_modtype_obj[] = MODTYPE_OBJ;
void
preload_initkmdp(bool fatal)
{
preload_kmdp = preload_search_by_type("elf kernel");
preload_kmdp = preload_search_by_type(preload_kerntype);
if (preload_kmdp == NULL && fatal)
panic("unable to find kernel metadata");
+4 -5
View File
@@ -644,15 +644,14 @@ fake_preload_metadata(void) {
fake_preload[i++] = MODINFO_NAME;
fake_preload[i++] = strlen("kernel") + 1;
strcpy((char*)&fake_preload[i], "kernel");
strcpy((char *)&fake_preload[i], "kernel");
/* ['k' 'e' 'r' 'n'] ['e' 'l' '\0' ..] */
i += 2;
fake_preload[i++] = MODINFO_TYPE;
fake_preload[i++] = strlen("elf kernel") + 1;
strcpy((char*)&fake_preload[i], "elf kernel");
/* ['e' 'l' 'f' ' '] ['k' 'e' 'r' 'n'] ['e' 'l' '\0' ..] */
i += 3;
fake_preload[i++] = strlen(preload_kerntype) + 1;
strcpy((char *)&fake_preload[i], preload_kerntype);
i += howmany(fake_preload[i - 1], sizeof(uint32_t));
#ifdef __powerpc64__
/* Padding -- Fields start on u_long boundaries */
+1 -1
View File
@@ -365,7 +365,7 @@ fake_preload_metadata(struct riscv_bootparams *rvbp)
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_NAME);
PRELOAD_PUSH_STRING("kernel");
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_TYPE);
PRELOAD_PUSH_STRING("elf kernel");
PRELOAD_PUSH_STRING(preload_kerntype);
PRELOAD_PUSH_VALUE(uint32_t, MODINFO_ADDR);
PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t));
+11
View File
@@ -220,6 +220,14 @@ void linker_kldload_unbusy(int flags);
#endif /* _KERNEL */
/*
* ELF file types
*/
#define KERNTYPE_MB "elf multiboot kernel"
#define KERNTYPE "elf kernel"
#define MODTYPE_OBJ "elf obj module"
#define MODTYPE "elf module"
/*
* Module information subtypes
*/
@@ -273,6 +281,9 @@ void linker_kldload_unbusy(int flags);
*/
extern vm_offset_t preload_addr_relocate;
extern caddr_t preload_metadata, preload_kmdp;
extern const char preload_modtype[];
extern const char preload_kerntype[];
extern const char preload_modtype_obj[];
extern void * preload_fetch_addr(caddr_t _mod);
extern size_t preload_fetch_size(caddr_t _mod);