1/* $NetBSD: subr_kobj.c,v 1.78 2023/04/28 07:33:57 skrll Exp $ */ 2 3/* 4 * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software developed for The NetBSD Foundation 8 * by Andrew Doran. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32/* 33 * Copyright (c) 1998-2000 Doug Rabson 34 * Copyright (c) 2004 Peter Wemm 35 * All rights reserved. 36 * 37 * Redistribution and use in source and binary forms, with or without 38 * modification, are permitted provided that the following conditions 39 * are met: 40 * 1. Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * 2. Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in the 44 * documentation and/or other materials provided with the distribution. 45 * 46 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 47 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 48 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 49 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 50 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 51 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 52 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 53 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 54 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 55 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 56 * SUCH DAMAGE. 57 */ 58 59/* 60 * Kernel loader for ELF objects. 61 * 62 * TODO: adjust kmem_alloc() calls to avoid needless fragmentation. 63 */ 64 65#include <sys/cdefs.h> 66__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.78 2023/04/28 07:33:57 skrll Exp $"); 67 68#ifdef _KERNEL_OPT 69#include "opt_modular.h" 70#endif 71 72#include <sys/kobj_impl.h> 73 74#ifdef MODULAR 75 76#include <sys/param.h> 77 78#include <sys/kernel.h> 79#include <sys/kmem.h> 80#include <sys/ksyms.h> 81#include <sys/module.h> 82#include <sys/proc.h> 83 84#include <uvm/uvm_extern.h> 85 86#define kobj_error(_kobj, ...) \ 87 kobj_out(__func__, __LINE__, _kobj, __VA_ARGS__) 88 89static int kobj_relocate(kobj_t, bool); 90static int kobj_checksyms(kobj_t, bool); 91static void kobj_out(const char *, int, kobj_t, const char *, ...) 92 __printflike(4, 5); 93static void kobj_jettison(kobj_t); 94static void kobj_free(kobj_t, void *, size_t); 95static void kobj_close(kobj_t); 96static int kobj_read_mem(kobj_t, void **, size_t, off_t, bool); 97static void kobj_close_mem(kobj_t); 98 99/* 100 * kobj_load_mem: 101 * 102 * Load an object already resident in memory. If size is not -1, 103 * the complete size of the object is known. 104 */ 105int 106kobj_load_mem(kobj_t *kop, const char *name, void *base, ssize_t size) 107{ 108 kobj_t ko; 109 110 ko = kmem_zalloc(sizeof(*ko), KM_SLEEP); 111 ko->ko_type = KT_MEMORY; 112 kobj_setname(ko, name); 113 ko->ko_source = base; 114 ko->ko_memsize = size; 115 ko->ko_read = kobj_read_mem; 116 ko->ko_close = kobj_close_mem; 117 118 *kop = ko; 119 return kobj_load(ko); 120} 121 122/* 123 * kobj_close: 124 * 125 * Close an open ELF object. 126 */ 127static void 128kobj_close(kobj_t ko) 129{ 130 131 if (ko->ko_source == NULL) { 132 return; 133 } 134 135 ko->ko_close(ko); 136 ko->ko_source = NULL; 137} 138 139static void 140kobj_close_mem(kobj_t ko) 141{ 142 143 return; 144} 145 146/* 147 * kobj_load: 148 * 149 * Load an ELF object and prepare to link into the running kernel 150 * image. 151 */ 152int 153kobj_load(kobj_t ko) 154{ 155 Elf_Ehdr *hdr; 156 Elf_Shdr *shdr; 157 Elf_Sym *es; 158 vaddr_t map_text_base; 159 vaddr_t map_data_base; 160 vaddr_t map_rodata_base; 161 size_t map_text_size; 162 size_t map_data_size; 163 size_t map_rodata_size; 164 int error; 165 int symtabindex; 166 int symstrindex; 167 int nsym; 168 int pb, rl, ra; 169 int alignmask; 170 int i, j; 171 void *addr; 172 173 KASSERT(ko->ko_type != KT_UNSET); 174 KASSERT(ko->ko_source != NULL); 175 176 shdr = NULL; 177 error = 0; 178 hdr = NULL; 179 180 /* 181 * Read the elf header from the file. 182 */ 183 error = ko->ko_read(ko, (void **)&hdr, sizeof(*hdr), 0, true); 184 if (error != 0) { 185 kobj_error(ko, "read failed %d", error); 186 goto out; 187 } 188 if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0) { 189 kobj_error(ko, "not an ELF object"); 190 error = ENOEXEC; 191 goto out; 192 } 193 194 if (hdr->e_ident[EI_VERSION] != EV_CURRENT || 195 hdr->e_version != EV_CURRENT) { 196 kobj_error(ko, "unsupported file version %d", 197 hdr->e_ident[EI_VERSION]); 198 error = ENOEXEC; 199 goto out; 200 } 201 if (hdr->e_type != ET_REL) { 202 kobj_error(ko, "unsupported file type %d", hdr->e_type); 203 error = ENOEXEC; 204 goto out; 205 } 206 switch (hdr->e_machine) { 207#if ELFSIZE == 32 208 ELF32_MACHDEP_ID_CASES 209#elif ELFSIZE == 64 210 ELF64_MACHDEP_ID_CASES 211#else 212#error not defined 213#endif 214 default: 215 kobj_error(ko, "unsupported machine %d", hdr->e_machine); 216 error = ENOEXEC; 217 goto out; 218 } 219 220 ko->ko_nprogtab = 0; 221 ko->ko_shdr = 0; 222 ko->ko_nrel = 0; 223 ko->ko_nrela = 0; 224 225 /* 226 * Allocate and read in the section header. 227 */ 228 if (hdr->e_shnum == 0 || hdr->e_shnum > ELF_MAXSHNUM || 229 hdr->e_shoff == 0 || hdr->e_shentsize != sizeof(Elf_Shdr)) { 230 kobj_error(ko, "bad sizes"); 231 error = ENOEXEC; 232 goto out; 233 } 234 ko->ko_shdrsz = hdr->e_shnum * sizeof(Elf_Shdr); 235 error = ko->ko_read(ko, (void **)&shdr, ko->ko_shdrsz, hdr->e_shoff, 236 true); 237 if (error != 0) { 238 kobj_error(ko, "read failed %d", error); 239 goto out; 240 } 241 ko->ko_shdr = shdr; 242 243 /* 244 * Scan the section header for information and table sizing. 245 */ 246 nsym = 0; 247 symtabindex = symstrindex = -1; 248 for (i = 0; i < hdr->e_shnum; i++) { 249 switch (shdr[i].sh_type) { 250 case SHT_PROGBITS: 251 case SHT_NOBITS: 252 ko->ko_nprogtab++; 253 break; 254 case SHT_SYMTAB: 255 nsym++; 256 symtabindex = i; 257 symstrindex = shdr[i].sh_link; 258 break; 259 case SHT_REL: 260 if (shdr[shdr[i].sh_info].sh_type != SHT_PROGBITS) 261 continue; 262 ko->ko_nrel++; 263 break; 264 case SHT_RELA: 265 if (shdr[shdr[i].sh_info].sh_type != SHT_PROGBITS) 266 continue; 267 ko->ko_nrela++; 268 break; 269 case SHT_STRTAB: 270 break; 271 } 272 } 273 if (ko->ko_nprogtab == 0) { 274 kobj_error(ko, "file has no contents"); 275 error = ENOEXEC; 276 goto out; 277 } 278 if (nsym != 1) { 279 /* Only allow one symbol table for now */ 280 kobj_error(ko, "file has no valid symbol table"); 281 error = ENOEXEC; 282 goto out; 283 } 284 KASSERT(symtabindex != -1); 285 KASSERT(symstrindex != -1); 286 287 if (symstrindex == SHN_UNDEF || symstrindex >= hdr->e_shnum || 288 shdr[symstrindex].sh_type != SHT_STRTAB) { 289 kobj_error(ko, "file has invalid symbol strings"); 290 error = ENOEXEC; 291 goto out; 292 } 293 294 /* 295 * Allocate space for tracking the load chunks. 296 */ 297 if (ko->ko_nprogtab != 0) { 298 ko->ko_progtab = kmem_zalloc(ko->ko_nprogtab * 299 sizeof(*ko->ko_progtab), KM_SLEEP); 300 if (ko->ko_progtab == NULL) { 301 error = ENOMEM; 302 kobj_error(ko, "out of memory"); 303 goto out; 304 } 305 } 306 if (ko->ko_nrel != 0) { 307 ko->ko_reltab = kmem_zalloc(ko->ko_nrel * 308 sizeof(*ko->ko_reltab), KM_SLEEP); 309 if (ko->ko_reltab == NULL) { 310 error = ENOMEM; 311 kobj_error(ko, "out of memory"); 312 goto out; 313 } 314 } 315 if (ko->ko_nrela != 0) { 316 ko->ko_relatab = kmem_zalloc(ko->ko_nrela * 317 sizeof(*ko->ko_relatab), KM_SLEEP); 318 if (ko->ko_relatab == NULL) { 319 error = ENOMEM; 320 kobj_error(ko, "out of memory"); 321 goto out; 322 } 323 } 324 325 /* 326 * Allocate space for and load the symbol table. 327 */ 328 ko->ko_symcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym); 329 if (ko->ko_symcnt == 0) { 330 kobj_error(ko, "no symbol table"); 331 error = ENOEXEC; 332 goto out; 333 } 334 error = ko->ko_read(ko, (void **)&ko->ko_symtab, 335 ko->ko_symcnt * sizeof(Elf_Sym), 336 shdr[symtabindex].sh_offset, true); 337 if (error != 0) { 338 kobj_error(ko, "read failed %d", error); 339 goto out; 340 } 341 342 /* 343 * Allocate space for and load the symbol strings. 344 */ 345 ko->ko_strtabsz = shdr[symstrindex].sh_size; 346 if (ko->ko_strtabsz == 0) { 347 kobj_error(ko, "no symbol strings"); 348 error = ENOEXEC; 349 goto out; 350 } 351 error = ko->ko_read(ko, (void *)&ko->ko_strtab, ko->ko_strtabsz, 352 shdr[symstrindex].sh_offset, true); 353 if (error != 0) { 354 kobj_error(ko, "read failed %d", error); 355 goto out; 356 } 357 358 /* 359 * Adjust module symbol namespace, if necessary (e.g. with rump) 360 */ 361 error = kobj_renamespace(ko->ko_symtab, ko->ko_symcnt, 362 &ko->ko_strtab, &ko->ko_strtabsz); 363 if (error != 0) { 364 kobj_error(ko, "renamespace failed %d", error); 365 goto out; 366 } 367 368 /* 369 * Do we have a string table for the section names? 370 */ 371 if (hdr->e_shstrndx != SHN_UNDEF) { 372 if (hdr->e_shstrndx >= hdr->e_shnum) { 373 kobj_error(ko, "bad shstrndx"); 374 error = ENOEXEC; 375 goto out; 376 } 377 if (shdr[hdr->e_shstrndx].sh_size != 0 && 378 shdr[hdr->e_shstrndx].sh_type == SHT_STRTAB) { 379 ko->ko_shstrtabsz = shdr[hdr->e_shstrndx].sh_size; 380 error = ko->ko_read(ko, (void **)&ko->ko_shstrtab, 381 shdr[hdr->e_shstrndx].sh_size, 382 shdr[hdr->e_shstrndx].sh_offset, true); 383 if (error != 0) { 384 kobj_error(ko, "read failed %d", error); 385 goto out; 386 } 387 } 388 } 389 390 /* 391 * Size up code/data(progbits) and bss(nobits). 392 */ 393 alignmask = 0; 394 map_text_size = 0; 395 map_data_size = 0; 396 map_rodata_size = 0; 397 for (i = 0; i < hdr->e_shnum; i++) { 398 if (shdr[i].sh_type != SHT_PROGBITS && 399 shdr[i].sh_type != SHT_NOBITS) 400 continue; 401 alignmask = shdr[i].sh_addralign - 1; 402 if ((shdr[i].sh_flags & SHF_EXECINSTR)) { 403 map_text_size += alignmask; 404 map_text_size &= ~alignmask; 405 map_text_size += shdr[i].sh_size; 406 } else if (!(shdr[i].sh_flags & SHF_WRITE)) { 407 map_rodata_size += alignmask; 408 map_rodata_size &= ~alignmask; 409 map_rodata_size += shdr[i].sh_size; 410 } else { 411 map_data_size += alignmask; 412 map_data_size &= ~alignmask; 413 map_data_size += shdr[i].sh_size; 414 } 415 } 416 417 if (map_text_size == 0) { 418 kobj_error(ko, "no text"); 419 error = ENOEXEC; 420 goto out; 421 } 422 423 if (map_data_size != 0) { 424 map_data_base = uvm_km_alloc(module_map, round_page(map_data_size), 425 0, UVM_KMF_WIRED); 426 if (map_data_base == 0) { 427 kobj_error(ko, "out of memory"); 428 error = ENOMEM; 429 goto out; 430 } 431 ko->ko_data_address = map_data_base; 432 ko->ko_data_size = map_data_size; 433 } else { 434 map_data_base = 0; 435 ko->ko_data_address = 0; 436 ko->ko_data_size = 0; 437 } 438 439 if (map_rodata_size != 0) { 440 map_rodata_base = uvm_km_alloc(module_map, round_page(map_rodata_size), 441 0, UVM_KMF_WIRED); 442 if (map_rodata_base == 0) { 443 kobj_error(ko, "out of memory"); 444 error = ENOMEM; 445 goto out; 446 } 447 ko->ko_rodata_address = map_rodata_base; 448 ko->ko_rodata_size = map_rodata_size; 449 } else { 450 map_rodata_base = 0; 451 ko->ko_rodata_address = 0; 452 ko->ko_rodata_size = 0; 453 } 454 455 map_text_base = uvm_km_alloc(module_map, round_page(map_text_size), 456 0, UVM_KMF_WIRED | UVM_KMF_EXEC); 457 if (map_text_base == 0) { 458 kobj_error(ko, "out of memory"); 459 error = ENOMEM; 460 goto out; 461 } 462 ko->ko_text_address = map_text_base; 463 ko->ko_text_size = map_text_size; 464 465 /* 466 * Now load code/data(progbits), zero bss(nobits), allocate space 467 * for and load relocs 468 */ 469 pb = 0; 470 rl = 0; 471 ra = 0; 472 alignmask = 0; 473 for (i = 0; i < hdr->e_shnum; i++) { 474 switch (shdr[i].sh_type) { 475 case SHT_PROGBITS: 476 case SHT_NOBITS: 477 alignmask = shdr[i].sh_addralign - 1; 478 if ((shdr[i].sh_flags & SHF_EXECINSTR)) { 479 map_text_base += alignmask; 480 map_text_base &= ~alignmask; 481 addr = (void *)map_text_base; 482 map_text_base += shdr[i].sh_size; 483 } else if (!(shdr[i].sh_flags & SHF_WRITE)) { 484 map_rodata_base += alignmask; 485 map_rodata_base &= ~alignmask; 486 addr = (void *)map_rodata_base; 487 map_rodata_base += shdr[i].sh_size; 488 } else { 489 map_data_base += alignmask; 490 map_data_base &= ~alignmask; 491 addr = (void *)map_data_base; 492 map_data_base += shdr[i].sh_size; 493 } 494 495 ko->ko_progtab[pb].addr = addr; 496 if (shdr[i].sh_type == SHT_PROGBITS) { 497 ko->ko_progtab[pb].name = "<<PROGBITS>>"; 498 error = ko->ko_read(ko, &addr, 499 shdr[i].sh_size, shdr[i].sh_offset, false); 500 if (error != 0) { 501 kobj_error(ko, "read failed %d", error); 502 goto out; 503 } 504 } else { /* SHT_NOBITS */ 505 ko->ko_progtab[pb].name = "<<NOBITS>>"; 506 memset(addr, 0, shdr[i].sh_size); 507 } 508 509 ko->ko_progtab[pb].size = shdr[i].sh_size; 510 ko->ko_progtab[pb].sec = i; 511 if (ko->ko_shstrtab != NULL && shdr[i].sh_name != 0) { 512 ko->ko_progtab[pb].name = 513 ko->ko_shstrtab + shdr[i].sh_name; 514 } 515 516 /* Update all symbol values with the offset. */ 517 for (j = 0; j < ko->ko_symcnt; j++) { 518 es = &ko->ko_symtab[j]; 519 if (es->st_shndx != i) { 520 continue; 521 } 522 es->st_value += (Elf_Addr)addr; 523 } 524 pb++; 525 break; 526 case SHT_REL: 527 if (shdr[shdr[i].sh_info].sh_type != SHT_PROGBITS) 528 break; 529 ko->ko_reltab[rl].size = shdr[i].sh_size; 530 ko->ko_reltab[rl].size -= 531 shdr[i].sh_size % sizeof(Elf_Rel); 532 if (ko->ko_reltab[rl].size != 0) { 533 ko->ko_reltab[rl].nrel = 534 shdr[i].sh_size / sizeof(Elf_Rel); 535 ko->ko_reltab[rl].sec = shdr[i].sh_info; 536 error = ko->ko_read(ko, 537 (void **)&ko->ko_reltab[rl].rel, 538 ko->ko_reltab[rl].size, 539 shdr[i].sh_offset, true); 540 if (error != 0) { 541 kobj_error(ko, "read failed %d", 542 error); 543 goto out; 544 } 545 } 546 rl++; 547 break; 548 case SHT_RELA: 549 if (shdr[shdr[i].sh_info].sh_type != SHT_PROGBITS) 550 break; 551 ko->ko_relatab[ra].size = shdr[i].sh_size; 552 ko->ko_relatab[ra].size -= 553 shdr[i].sh_size % sizeof(Elf_Rela); 554 if (ko->ko_relatab[ra].size != 0) { 555 ko->ko_relatab[ra].nrela = 556 shdr[i].sh_size / sizeof(Elf_Rela); 557 ko->ko_relatab[ra].sec = shdr[i].sh_info; 558 error = ko->ko_read(ko, 559 (void **)&ko->ko_relatab[ra].rela, 560 shdr[i].sh_size, 561 shdr[i].sh_offset, true); 562 if (error != 0) { 563 kobj_error(ko, "read failed %d", error); 564 goto out; 565 } 566 } 567 ra++; 568 break; 569 default: 570 break; 571 } 572 } 573 if (pb != ko->ko_nprogtab) { 574 panic("%s:%d: %s: lost progbits", __func__, __LINE__, 575 ko->ko_name); 576 } 577 if (rl != ko->ko_nrel) { 578 panic("%s:%d: %s: lost rel", __func__, __LINE__, 579 ko->ko_name); 580 } 581 if (ra != ko->ko_nrela) { 582 panic("%s:%d: %s: lost rela", __func__, __LINE__, 583 ko->ko_name); 584 } 585 if (map_text_base != ko->ko_text_address + map_text_size) { 586 panic("%s:%d: %s: map_text_base 0x%lx != address %lx " 587 "+ map_text_size %ld (0x%lx)\n", 588 __func__, __LINE__, ko->ko_name, (long)map_text_base, 589 (long)ko->ko_text_address, (long)map_text_size, 590 (long)ko->ko_text_address + map_text_size); 591 } 592 if (map_data_base != ko->ko_data_address + map_data_size) { 593 panic("%s:%d: %s: map_data_base 0x%lx != address %lx " 594 "+ map_data_size %ld (0x%lx)\n", 595 __func__, __LINE__, ko->ko_name, (long)map_data_base, 596 (long)ko->ko_data_address, (long)map_data_size, 597 (long)ko->ko_data_address + map_data_size); 598 } 599 if (map_rodata_base != ko->ko_rodata_address + map_rodata_size) { 600 panic("%s:%d: %s: map_rodata_base 0x%lx != address %lx " 601 "+ map_rodata_size %ld (0x%lx)\n", 602 __func__, __LINE__, ko->ko_name, (long)map_rodata_base, 603 (long)ko->ko_rodata_address, (long)map_rodata_size, 604 (long)ko->ko_rodata_address + map_rodata_size); 605 } 606 607 /* 608 * Perform local relocations only. Relocations relating to global 609 * symbols will be done by kobj_affix(). 610 */ 611 error = kobj_checksyms(ko, false); 612 if (error) 613 goto out; 614 615 error = kobj_relocate(ko, true); 616 if (error) 617 goto out; 618out: 619 if (hdr != NULL) { 620 kobj_free(ko, hdr, sizeof(*hdr)); 621 } 622 kobj_close(ko); 623 if (error != 0) { 624 kobj_unload(ko); 625 } 626 627 return error; 628} 629 630static void 631kobj_unload_notify(kobj_t ko, vaddr_t addr, size_t size, const char *note) 632{ 633 if (addr == 0) 634 return; 635 636 int error = kobj_machdep(ko, (void *)addr, size, false); 637 if (error) 638 kobj_error(ko, "machine dependent deinit failed (%s) %d", 639 note, error); 640} 641 642#define KOBJ_SEGMENT_NOTIFY(ko, what) \ 643 kobj_unload_notify(ko, (ko)->ko_ ## what ## _address, \ 644 (ko)->ko_ ## what ## _size, # what); 645 646#define KOBJ_SEGMENT_FREE(ko, what) \ 647 do \ 648 if ((ko)->ko_ ## what ## _address != 0) \ 649 uvm_km_free(module_map, (ko)->ko_ ## what ## _address, \ 650 round_page((ko)->ko_ ## what ## _size), UVM_KMF_WIRED); \ 651 while (/*CONSTCOND*/ 0) 652 653/* 654 * kobj_unload: 655 * 656 * Unload an object previously loaded by kobj_load(). 657 */ 658void 659kobj_unload(kobj_t ko) 660{ 661 kobj_close(ko); 662 kobj_jettison(ko); 663 664 665 /* 666 * Notify MD code that a module has been unloaded. 667 */ 668 if (ko->ko_loaded) { 669 KOBJ_SEGMENT_NOTIFY(ko, text); 670 KOBJ_SEGMENT_NOTIFY(ko, data); 671 KOBJ_SEGMENT_NOTIFY(ko, rodata); 672 } 673 674 KOBJ_SEGMENT_FREE(ko, text); 675 KOBJ_SEGMENT_FREE(ko, data); 676 KOBJ_SEGMENT_FREE(ko, rodata); 677 678 if (ko->ko_ksyms == true) { 679 ksyms_modunload(ko->ko_name); 680 } 681 if (ko->ko_symtab != NULL) { 682 kobj_free(ko, ko->ko_symtab, ko->ko_symcnt * sizeof(Elf_Sym)); 683 } 684 if (ko->ko_strtab != NULL) { 685 kobj_free(ko, ko->ko_strtab, ko->ko_strtabsz); 686 } 687 if (ko->ko_progtab != NULL) { 688 kobj_free(ko, ko->ko_progtab, ko->ko_nprogtab * 689 sizeof(*ko->ko_progtab)); 690 ko->ko_progtab = NULL; 691 } 692 if (ko->ko_shstrtab) { 693 kobj_free(ko, ko->ko_shstrtab, ko->ko_shstrtabsz); 694 ko->ko_shstrtab = NULL; 695 } 696 697 kmem_free(ko, sizeof(*ko)); 698} 699 700/* 701 * kobj_stat: 702 * 703 * Return size and load address of an object. 704 */ 705int 706kobj_stat(kobj_t ko, vaddr_t *address, size_t *size) 707{ 708 709 if (address != NULL) { 710 *address = ko->ko_text_address; 711 } 712 if (size != NULL) { 713 *size = ko->ko_text_size; 714 } 715 return 0; 716} 717 718/* 719 * kobj_affix: 720 * 721 * Set an object's name and perform global relocs. May only be 722 * called after the module and any requisite modules are loaded. 723 */ 724int 725kobj_affix(kobj_t ko, const char *name) 726{ 727 int error; 728 729 KASSERT(ko->ko_ksyms == false); 730 KASSERT(ko->ko_loaded == false); 731 732 kobj_setname(ko, name); 733 734 /* Cache addresses of undefined symbols. */ 735 error = kobj_checksyms(ko, true); 736 if (error) 737 goto out; 738 739 /* Now do global relocations. */ 740 error = kobj_relocate(ko, false); 741 if (error) 742 goto out; 743 744 /* 745 * Now that we know the name, register the symbol table. 746 * Do after global relocations because ksyms will pack 747 * the table. 748 */ 749 ksyms_modload(ko->ko_name, ko->ko_symtab, 750 ko->ko_symcnt * sizeof(Elf_Sym), ko->ko_strtab, ko->ko_strtabsz); 751 ko->ko_ksyms = true; 752 753 /* Jettison unneeded memory post-link. */ 754 kobj_jettison(ko); 755 756 /* 757 * Notify MD code that a module has been loaded. 758 * 759 * Most architectures use this opportunity to flush their caches. 760 */ 761 if (ko->ko_text_address != 0) { 762 error = kobj_machdep(ko, (void *)ko->ko_text_address, 763 ko->ko_text_size, true); 764 if (error) { 765 kobj_error(ko, "machine dependent init failed (text)" 766 " %d", error); 767 goto out; 768 } 769 } 770 771 if (ko->ko_data_address != 0) { 772 error = kobj_machdep(ko, (void *)ko->ko_data_address, 773 ko->ko_data_size, true); 774 if (error) { 775 kobj_error(ko, "machine dependent init failed (data)" 776 " %d", error); 777 goto out; 778 } 779 } 780 781 if (ko->ko_rodata_address != 0) { 782 error = kobj_machdep(ko, (void *)ko->ko_rodata_address, 783 ko->ko_rodata_size, true); 784 if (error) { 785 kobj_error(ko, "machine dependent init failed (rodata)" 786 " %d", error); 787 goto out; 788 } 789 } 790 791 ko->ko_loaded = true; 792 793 /* Change the memory protections, when needed. */ 794 if (ko->ko_text_address != 0) { 795 uvm_km_protect(module_map, ko->ko_text_address, 796 ko->ko_text_size, VM_PROT_READ|VM_PROT_EXECUTE); 797 } 798 if (ko->ko_rodata_address != 0) { 799 uvm_km_protect(module_map, ko->ko_rodata_address, 800 ko->ko_rodata_size, VM_PROT_READ); 801 } 802 803 /* Success! */ 804 error = 0; 805 806out: if (error) { 807 /* If there was an error, destroy the whole object. */ 808 kobj_unload(ko); 809 } 810 return error; 811} 812 813/* 814 * kobj_find_section: 815 * 816 * Given a section name, search the loaded object and return 817 * virtual address if present and loaded. 818 */ 819int 820kobj_find_section(kobj_t ko, const char *name, void **addr, size_t *size) 821{ 822 int i; 823 824 KASSERT(ko->ko_progtab != NULL); 825 826 for (i = 0; i < ko->ko_nprogtab; i++) { 827 if (strcmp(ko->ko_progtab[i].name, name) == 0) { 828 if (addr != NULL) { 829 *addr = ko->ko_progtab[i].addr; 830 } 831 if (size != NULL) { 832 *size = ko->ko_progtab[i].size; 833 } 834 return 0; 835 } 836 } 837 838 return ENOENT; 839} 840 841/* 842 * kobj_jettison: 843 * 844 * Release object data not needed after performing relocations. 845 */ 846static void 847kobj_jettison(kobj_t ko) 848{ 849 int i; 850 851 if (ko->ko_reltab != NULL) { 852 for (i = 0; i < ko->ko_nrel; i++) { 853 if (ko->ko_reltab[i].rel) { 854 kobj_free(ko, ko->ko_reltab[i].rel, 855 ko->ko_reltab[i].size); 856 } 857 } 858 kobj_free(ko, ko->ko_reltab, ko->ko_nrel * 859 sizeof(*ko->ko_reltab)); 860 ko->ko_reltab = NULL; 861 ko->ko_nrel = 0; 862 } 863 if (ko->ko_relatab != NULL) { 864 for (i = 0; i < ko->ko_nrela; i++) { 865 if (ko->ko_relatab[i].rela) { 866 kobj_free(ko, ko->ko_relatab[i].rela, 867 ko->ko_relatab[i].size); 868 } 869 } 870 kobj_free(ko, ko->ko_relatab, ko->ko_nrela * 871 sizeof(*ko->ko_relatab)); 872 ko->ko_relatab = NULL; 873 ko->ko_nrela = 0; 874 } 875 if (ko->ko_shdr != NULL) { 876 kobj_free(ko, ko->ko_shdr, ko->ko_shdrsz); 877 ko->ko_shdr = NULL; 878 } 879} 880 881const Elf_Sym * 882kobj_symbol(kobj_t ko, uintptr_t symidx) 883{ 884 885 return ko->ko_symtab + symidx; 886} 887 888 889/* 890 * kobj_sym_lookup: 891 * 892 * Symbol lookup function to be used when the symbol index 893 * is known (ie during relocation). 894 */ 895int 896kobj_sym_lookup(kobj_t ko, uintptr_t symidx, Elf_Addr *val) 897{ 898 const Elf_Sym *sym; 899 const char *symbol; 900 901 sym = ko->ko_symtab + symidx; 902 903 if (symidx == SHN_ABS || symidx == 0) { 904 *val = (uintptr_t)sym->st_value; 905 return 0; 906 } else if (symidx >= ko->ko_symcnt) { 907 /* 908 * Don't even try to lookup the symbol if the index is 909 * bogus. 910 */ 911 kobj_error(ko, "symbol index %ju out of range", 912 (uintmax_t)symidx); 913 return EINVAL; 914 } 915 916 /* Quick answer if there is a definition included. */ 917 if (sym->st_shndx != SHN_UNDEF) { 918 *val = (uintptr_t)sym->st_value; 919 return 0; 920 } 921 922 /* If we get here, then it is undefined and needs a lookup. */ 923 switch (ELF_ST_BIND(sym->st_info)) { 924 case STB_LOCAL: 925 /* Local, but undefined? huh? */ 926 kobj_error(ko, "local symbol @%ju undefined", 927 (uintmax_t)symidx); 928 return EINVAL; 929 930 case STB_GLOBAL: 931 /* Relative to Data or Function name */ 932 symbol = ko->ko_strtab + sym->st_name; 933 934 /* Force a lookup failure if the symbol name is bogus. */ 935 if (*symbol == 0) { 936 kobj_error(ko, "bad symbol @%ju name", 937 (uintmax_t)symidx); 938 return EINVAL; 939 } 940 if (sym->st_value == 0) { 941 kobj_error(ko, "%s @%ju: bad value", symbol, 942 (uintmax_t)symidx); 943 return EINVAL; 944 } 945 946 *val = (uintptr_t)sym->st_value; 947 return 0; 948 949 case STB_WEAK: 950 kobj_error(ko, "weak symbol @%ju not supported", 951 (uintmax_t)symidx); 952 return EINVAL; 953 954 default: 955 kobj_error(ko, "bad binding %#x for symbol @%ju", 956 ELF_ST_BIND(sym->st_info), (uintmax_t)symidx); 957 return EINVAL; 958 } 959} 960 961/* 962 * kobj_findbase: 963 * 964 * Return base address of the given section. 965 */ 966static uintptr_t 967kobj_findbase(kobj_t ko, int sec) 968{ 969 int i; 970 971 for (i = 0; i < ko->ko_nprogtab; i++) { 972 if (sec == ko->ko_progtab[i].sec) { 973 return (uintptr_t)ko->ko_progtab[i].addr; 974 } 975 } 976 return 0; 977} 978 979/* 980 * kobj_checksyms: 981 * 982 * Scan symbol table for duplicates or resolve references to 983 * external symbols. 984 */ 985static int 986kobj_checksyms(kobj_t ko, bool undefined) 987{ 988 unsigned long rval; 989 Elf_Sym *sym, *ksym, *ms; 990 const char *name; 991 int error; 992 993 error = 0; 994 995 for (ms = (sym = ko->ko_symtab) + ko->ko_symcnt; sym < ms; sym++) { 996 /* Check validity of the symbol. */ 997 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL || 998 sym->st_name == 0) 999 continue; 1000 if (undefined != (sym->st_shndx == SHN_UNDEF)) { 1001 continue; 1002 } 1003 1004 /* 1005 * Look it up. Don't need to lock, as it is known that 1006 * the symbol tables aren't going to change (we hold 1007 * module_lock). 1008 */ 1009 name = ko->ko_strtab + sym->st_name; 1010 if (ksyms_getval_unlocked(NULL, name, &ksym, &rval, 1011 KSYMS_EXTERN) != 0) { 1012 if (undefined) { 1013 kobj_error(ko, "symbol `%s' not found", 1014 name); 1015 error = ENOEXEC; 1016 } 1017 continue; 1018 } 1019 1020 /* Save values of undefined globals. */ 1021 if (undefined) { 1022 if (ksym->st_shndx == SHN_ABS) { 1023 sym->st_shndx = SHN_ABS; 1024 } 1025 sym->st_value = (Elf_Addr)rval; 1026 continue; 1027 } 1028 1029 /* Check (and complain) about differing values. */ 1030 if (sym->st_value == rval) { 1031 continue; 1032 } 1033 if (strcmp(name, "_bss_start") == 0 || 1034 strcmp(name, "__bss_start") == 0 || 1035 strcmp(name, "_bss_end__") == 0 || 1036 strcmp(name, "__bss_end__") == 0 || 1037 strcmp(name, "_edata") == 0 || 1038 strcmp(name, "_end") == 0 || 1039 strcmp(name, "__end") == 0 || 1040 strcmp(name, "__end__") == 0 || 1041 strncmp(name, "__start_link_set_", 17) == 0 || 1042 strncmp(name, "__stop_link_set_", 16) == 0) { 1043 continue; 1044 } 1045 kobj_error(ko, "global symbol `%s' redefined", 1046 name); 1047 error = ENOEXEC; 1048 } 1049 1050 return error; 1051} 1052 1053/* 1054 * kobj_relocate: 1055 * 1056 * Resolve relocations for the loaded object. 1057 */ 1058static int 1059kobj_relocate(kobj_t ko, bool local) 1060{ 1061 const Elf_Rel *rellim; 1062 const Elf_Rel *rel; 1063 const Elf_Rela *relalim; 1064 const Elf_Rela *rela; 1065 const Elf_Sym *sym; 1066 uintptr_t base; 1067 int i, error; 1068 uintptr_t symidx; 1069 1070 /* 1071 * Perform relocations without addend if there are any. 1072 */ 1073 for (i = 0; i < ko->ko_nrel; i++) { 1074 rel = ko->ko_reltab[i].rel; 1075 if (rel == NULL) { 1076 continue; 1077 } 1078 rellim = rel + ko->ko_reltab[i].nrel; 1079 base = kobj_findbase(ko, ko->ko_reltab[i].sec); 1080 if (base == 0) { 1081 panic("%s:%d: %s: lost base for e_reltab[%d] sec %d", 1082 __func__, __LINE__, ko->ko_name, i, 1083 ko->ko_reltab[i].sec); 1084 } 1085 for (; rel < rellim; rel++) { 1086 symidx = ELF_R_SYM(rel->r_info); 1087 if (symidx >= ko->ko_symcnt) { 1088 continue; 1089 } 1090 sym = ko->ko_symtab + symidx; 1091 /* Skip non-local symbols in the first pass (local == TRUE) */ 1092 if (local && (ELF_ST_BIND(sym->st_info) != STB_LOCAL)) { 1093 continue; 1094 } 1095 error = kobj_reloc(ko, base, rel, false, local); 1096 if (error != 0) { 1097 kobj_error(ko, "unresolved rel relocation " 1098 "@%#jx type=%d symidx=%d", 1099 (intmax_t)rel->r_offset, 1100 (int)ELF_R_TYPE(rel->r_info), 1101 (int)ELF_R_SYM(rel->r_info)); 1102 return ENOEXEC; 1103 } 1104 } 1105 } 1106 1107 /* 1108 * Perform relocations with addend if there are any. 1109 */ 1110 for (i = 0; i < ko->ko_nrela; i++) { 1111 rela = ko->ko_relatab[i].rela; 1112 if (rela == NULL) { 1113 continue; 1114 } 1115 relalim = rela + ko->ko_relatab[i].nrela; 1116 base = kobj_findbase(ko, ko->ko_relatab[i].sec); 1117 if (base == 0) { 1118 panic("%s:%d: %s: lost base for e_relatab[%d] sec %d", 1119 __func__, __LINE__, ko->ko_name, i, 1120 ko->ko_relatab[i].sec); 1121 } 1122 for (; rela < relalim; rela++) { 1123 symidx = ELF_R_SYM(rela->r_info); 1124 if (symidx >= ko->ko_symcnt) { 1125 continue; 1126 } 1127 sym = ko->ko_symtab + symidx; 1128 /* Skip non-local symbols in the first pass (local == TRUE) */ 1129 if (local && (ELF_ST_BIND(sym->st_info) != STB_LOCAL)) { 1130 continue; 1131 } 1132 error = kobj_reloc(ko, base, rela, true, local); 1133 if (error != 0) { 1134 kobj_error(ko, "unresolved rela relocation " 1135 "@%#jx type=%d symidx=%d", 1136 (intmax_t)rela->r_offset, 1137 (int)ELF_R_TYPE(rela->r_info), 1138 (int)ELF_R_SYM(rela->r_info)); 1139 return ENOEXEC; 1140 } 1141 } 1142 } 1143 1144 return 0; 1145} 1146 1147/* 1148 * kobj_out: 1149 * 1150 * Utility function: log an error. 1151 */ 1152static void 1153kobj_out(const char *fname, int lnum, kobj_t ko, const char *fmt, ...) 1154{ 1155 va_list ap; 1156 1157 printf("%s, %d: [%s]: linker error: ", fname, lnum, ko->ko_name); 1158 va_start(ap, fmt); 1159 vprintf(fmt, ap); 1160 va_end(ap); 1161 printf("\n"); 1162} 1163 1164static int 1165kobj_read_mem(kobj_t ko, void **basep, size_t size, off_t off, 1166 bool allocate) 1167{ 1168 void *base = *basep; 1169 int error = 0; 1170 1171 KASSERT(ko->ko_source != NULL); 1172 1173 if (off < 0) { 1174 kobj_error(ko, "negative offset %lld", 1175 (unsigned long long)off); 1176 error = EINVAL; 1177 base = NULL; 1178 goto out; 1179 } else if (ko->ko_memsize != -1 && 1180 (size > ko->ko_memsize || off > ko->ko_memsize - size)) { 1181 kobj_error(ko, "preloaded object short"); 1182 error = EINVAL; 1183 base = NULL; 1184 goto out; 1185 } 1186 1187 if (allocate) 1188 base = kmem_alloc(size, KM_SLEEP); 1189 1190 /* Copy the section */ 1191 memcpy(base, (uint8_t *)ko->ko_source + off, size); 1192 1193out: if (allocate) 1194 *basep = base; 1195 return error; 1196} 1197 1198/* 1199 * kobj_free: 1200 * 1201 * Utility function: free memory if it was allocated from the heap. 1202 */ 1203static void 1204kobj_free(kobj_t ko, void *base, size_t size) 1205{ 1206 1207 kmem_free(base, size); 1208} 1209 1210void 1211kobj_setname(kobj_t ko, const char *name) 1212{ 1213 const char *d = name, *dots = ""; 1214 size_t len, dlen; 1215 1216 for (char *s = module_base; *d == *s; d++, s++) 1217 continue; 1218 1219 if (d == name) 1220 name = ""; 1221 else 1222 name = "%M"; 1223 dlen = strlen(d); 1224 len = dlen + strlen(name); 1225 if (len >= sizeof(ko->ko_name)) { 1226 len = (len - sizeof(ko->ko_name)) + 5; /* dots + NUL */ 1227 if (dlen >= len) { 1228 d += len; 1229 dots = "/..."; 1230 } 1231 } 1232 snprintf(ko->ko_name, sizeof(ko->ko_name), "%s%s%s", name, dots, d); 1233} 1234 1235#else /* MODULAR */ 1236 1237int 1238kobj_load_mem(kobj_t *kop, const char *name, void *base, ssize_t size) 1239{ 1240 1241 return ENOSYS; 1242} 1243 1244void 1245kobj_unload(kobj_t ko) 1246{ 1247 1248 panic("not modular"); 1249} 1250 1251int 1252kobj_stat(kobj_t ko, vaddr_t *base, size_t *size) 1253{ 1254 1255 return ENOSYS; 1256} 1257 1258int 1259kobj_affix(kobj_t ko, const char *name) 1260{ 1261 1262 panic("not modular"); 1263} 1264 1265int 1266kobj_find_section(kobj_t ko, const char *name, void **addr, size_t *size) 1267{ 1268 1269 panic("not modular"); 1270} 1271 1272void 1273kobj_setname(kobj_t ko, const char *name) 1274{ 1275 1276 panic("not modular"); 1277} 1278 1279#endif /* MODULAR */ 1280