1 /* $NetBSD: subr_kobj.c,v 1.14 2008/05/02 13:00:01 ad Exp $ */ 2 3 /*- 4 * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /*- 30 * Copyright (c) 1998-2000 Doug Rabson 31 * Copyright (c) 2004 Peter Wemm 32 * All rights reserved. 33 * 34 * Redistribution and use in source and binary forms, with or without 35 * modification, are permitted provided that the following conditions 36 * are met: 37 * 1. Redistributions of source code must retain the above copyright 38 * notice, this list of conditions and the following disclaimer. 39 * 2. Redistributions in binary form must reproduce the above copyright 40 * notice, this list of conditions and the following disclaimer in the 41 * documentation and/or other materials provided with the distribution. 42 * 43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 44 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 53 * SUCH DAMAGE. 54 */ 55 56 /* 57 * Kernel loader for ELF objects. 58 * 59 * TODO: adjust kmem_alloc() calls to avoid needless fragmentation. 60 */ 61 62 #include "opt_modular.h" 63 64 #include <sys/cdefs.h> 65 __KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.14 2008/05/02 13:00:01 ad Exp $"); 66 67 #define ELFSIZE ARCH_ELFSIZE 68 69 #include <sys/param.h> 70 #include <sys/systm.h> 71 #include <sys/kernel.h> 72 #include <sys/kmem.h> 73 #include <sys/proc.h> 74 #include <sys/namei.h> 75 #include <sys/vnode.h> 76 #include <sys/fcntl.h> 77 #include <sys/kobj.h> 78 #include <sys/ksyms.h> 79 #include <sys/lkm.h> 80 #include <sys/exec.h> 81 #include <sys/exec_elf.h> 82 83 #include <machine/stdarg.h> 84 85 #include <uvm/uvm_extern.h> 86 87 #ifdef MODULAR 88 89 typedef struct { 90 void *addr; 91 Elf_Off size; 92 int flags; 93 int sec; /* Original section */ 94 const char *name; 95 } progent_t; 96 97 typedef struct { 98 Elf_Rel *rel; 99 int nrel; 100 int sec; 101 size_t size; 102 } relent_t; 103 104 typedef struct { 105 Elf_Rela *rela; 106 int nrela; 107 int sec; 108 size_t size; 109 } relaent_t; 110 111 typedef enum kobjtype { 112 KT_UNSET, 113 KT_VNODE, 114 KT_MEMORY 115 } kobjtype_t; 116 117 struct kobj { 118 char ko_name[MAXLKMNAME]; 119 kobjtype_t ko_type; 120 void *ko_source; 121 ssize_t ko_memsize; 122 vaddr_t ko_address; /* Relocation address */ 123 Elf_Shdr *ko_shdr; 124 progent_t *ko_progtab; 125 relaent_t *ko_relatab; 126 relent_t *ko_reltab; 127 Elf_Sym *ko_symtab; /* Symbol table */ 128 char *ko_strtab; /* String table */ 129 char *ko_shstrtab; /* Section name string table */ 130 size_t ko_size; /* Size of text/data/bss */ 131 size_t ko_symcnt; /* Number of symbols */ 132 size_t ko_strtabsz; /* Number of bytes in string table */ 133 size_t ko_shstrtabsz; /* Number of bytes in scn str table */ 134 size_t ko_shdrsz; 135 int ko_nrel; 136 int ko_nrela; 137 int ko_nprogtab; 138 bool ko_ksyms; 139 bool ko_loaded; 140 }; 141 142 static int kobj_relocate(kobj_t); 143 static void kobj_error(const char *, ...); 144 static int kobj_read(kobj_t, void **, size_t, off_t); 145 static int kobj_read_bits(kobj_t, void *, size_t, off_t); 146 static void kobj_release_mem(kobj_t); 147 static void kobj_free(kobj_t, void *, size_t); 148 149 extern struct vm_map *lkm_map; 150 static const char *kobj_path = "/modules"; /* XXX ??? */ 151 152 /* 153 * kobj_open_file: 154 * 155 * Open an object located in the file system. 156 */ 157 int 158 kobj_open_file(kobj_t *kop, const char *filename) 159 { 160 struct nameidata nd; 161 kauth_cred_t cred; 162 char *path; 163 int error; 164 kobj_t ko; 165 166 cred = kauth_cred_get(); 167 168 ko = kmem_zalloc(sizeof(*ko), KM_SLEEP); 169 if (ko == NULL) { 170 return ENOMEM; 171 } 172 173 /* XXX where to look? */ 174 NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename); 175 error = vn_open(&nd, FREAD, 0); 176 if (error != 0) { 177 if (error != ENOENT) { 178 goto out; 179 } 180 path = PNBUF_GET(); 181 snprintf(path, MAXPATHLEN - 1, "%s/%s", kobj_path, 182 filename); 183 NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path); 184 error = vn_open(&nd, FREAD, 0); 185 if (error != 0) { 186 strlcat(path, ".o", MAXPATHLEN); 187 NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, path); 188 error = vn_open(&nd, FREAD, 0); 189 } 190 PNBUF_PUT(path); 191 if (error != 0) { 192 goto out; 193 } 194 } 195 196 out: 197 if (error != 0) { 198 kmem_free(ko, sizeof(*ko)); 199 } else { 200 ko->ko_type = KT_VNODE; 201 ko->ko_source = nd.ni_vp; 202 *kop = ko; 203 } 204 return error; 205 } 206 207 /* 208 * kobj_open_mem: 209 * 210 * Open a pre-loaded object already resident in memory. If size 211 * is not -1, the complete size of the object is known. 212 */ 213 int 214 kobj_open_mem(kobj_t *kop, void *base, ssize_t size) 215 { 216 kobj_t ko; 217 218 ko = kmem_zalloc(sizeof(*ko), KM_SLEEP); 219 if (ko == NULL) { 220 return ENOMEM; 221 } 222 223 ko->ko_type = KT_MEMORY; 224 ko->ko_source = base; 225 ko->ko_memsize = size; 226 *kop = ko; 227 228 return 0; 229 } 230 231 /* 232 * kobj_close: 233 * 234 * Close an open ELF object. If the object was not successfully 235 * loaded, it will be destroyed. 236 */ 237 void 238 kobj_close(kobj_t ko) 239 { 240 241 KASSERT(ko->ko_source != NULL); 242 243 switch (ko->ko_type) { 244 case KT_VNODE: 245 VOP_UNLOCK(ko->ko_source, 0); 246 vn_close(ko->ko_source, FREAD, kauth_cred_get()); 247 break; 248 case KT_MEMORY: 249 /* nothing */ 250 break; 251 default: 252 panic("kobj_close: unknown type"); 253 break; 254 } 255 256 ko->ko_source = NULL; 257 258 /* If the object hasn't been loaded, then destroy it. */ 259 if (!ko->ko_loaded) { 260 kobj_unload(ko); 261 } 262 } 263 264 /* 265 * kobj_load: 266 * 267 * Load an ELF object from the file system and link into the 268 * running kernel image. 269 */ 270 int 271 kobj_load(kobj_t ko) 272 { 273 Elf_Ehdr *hdr; 274 Elf_Shdr *shdr; 275 Elf_Sym *es; 276 vaddr_t mapbase; 277 size_t mapsize; 278 int error; 279 int symtabindex; 280 int symstrindex; 281 int nsym; 282 int pb, rl, ra; 283 int alignmask; 284 int i, j; 285 void *addr; 286 287 KASSERT(ko->ko_type != KT_UNSET); 288 KASSERT(ko->ko_source != NULL); 289 290 shdr = NULL; 291 mapsize = 0; 292 error = 0; 293 hdr = NULL; 294 295 /* 296 * Read the elf header from the file. 297 */ 298 error = kobj_read(ko, (void **)&hdr, sizeof(*hdr), 0); 299 if (error != 0) 300 goto out; 301 if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0) { 302 kobj_error("not an ELF object"); 303 error = ENOEXEC; 304 goto out; 305 } 306 307 if (hdr->e_ident[EI_VERSION] != EV_CURRENT || 308 hdr->e_version != EV_CURRENT) { 309 kobj_error("unsupported file version"); 310 error = ENOEXEC; 311 goto out; 312 } 313 if (hdr->e_type != ET_REL) { 314 kobj_error("unsupported file type"); 315 error = ENOEXEC; 316 goto out; 317 } 318 switch (hdr->e_machine) { 319 #if ELFSIZE == 32 320 ELF32_MACHDEP_ID_CASES 321 #else 322 ELF64_MACHDEP_ID_CASES 323 #endif 324 default: 325 kobj_error("unsupported machine"); 326 error = ENOEXEC; 327 goto out; 328 } 329 330 ko->ko_nprogtab = 0; 331 ko->ko_shdr = 0; 332 ko->ko_nrel = 0; 333 ko->ko_nrela = 0; 334 335 /* 336 * Allocate and read in the section header. 337 */ 338 ko->ko_shdrsz = hdr->e_shnum * hdr->e_shentsize; 339 if (ko->ko_shdrsz == 0 || hdr->e_shoff == 0 || 340 hdr->e_shentsize != sizeof(Elf_Shdr)) { 341 error = ENOEXEC; 342 goto out; 343 } 344 error = kobj_read(ko, (void **)&shdr, ko->ko_shdrsz, hdr->e_shoff); 345 if (error != 0) { 346 goto out; 347 } 348 ko->ko_shdr = shdr; 349 350 /* 351 * Scan the section header for information and table sizing. 352 */ 353 nsym = 0; 354 symtabindex = -1; 355 symstrindex = -1; 356 for (i = 0; i < hdr->e_shnum; i++) { 357 switch (shdr[i].sh_type) { 358 case SHT_PROGBITS: 359 case SHT_NOBITS: 360 ko->ko_nprogtab++; 361 break; 362 case SHT_SYMTAB: 363 nsym++; 364 symtabindex = i; 365 symstrindex = shdr[i].sh_link; 366 break; 367 case SHT_REL: 368 ko->ko_nrel++; 369 break; 370 case SHT_RELA: 371 ko->ko_nrela++; 372 break; 373 case SHT_STRTAB: 374 break; 375 } 376 } 377 if (ko->ko_nprogtab == 0) { 378 kobj_error("file has no contents"); 379 error = ENOEXEC; 380 goto out; 381 } 382 if (nsym != 1) { 383 /* Only allow one symbol table for now */ 384 kobj_error("file has no valid symbol table"); 385 error = ENOEXEC; 386 goto out; 387 } 388 if (symstrindex < 0 || symstrindex > hdr->e_shnum || 389 shdr[symstrindex].sh_type != SHT_STRTAB) { 390 kobj_error("file has invalid symbol strings"); 391 error = ENOEXEC; 392 goto out; 393 } 394 395 /* 396 * Allocate space for tracking the load chunks. 397 */ 398 if (ko->ko_nprogtab != 0) { 399 ko->ko_progtab = kmem_zalloc(ko->ko_nprogtab * 400 sizeof(*ko->ko_progtab), KM_SLEEP); 401 if (ko->ko_progtab == NULL) { 402 error = ENOMEM; 403 goto out; 404 } 405 } 406 if (ko->ko_nrel != 0) { 407 ko->ko_reltab = kmem_zalloc(ko->ko_nrel * 408 sizeof(*ko->ko_reltab), KM_SLEEP); 409 if (ko->ko_reltab == NULL) { 410 error = ENOMEM; 411 goto out; 412 } 413 } 414 if (ko->ko_nrela != 0) { 415 ko->ko_relatab = kmem_zalloc(ko->ko_nrela * 416 sizeof(*ko->ko_relatab), KM_SLEEP); 417 if (ko->ko_relatab == NULL) { 418 error = ENOMEM; 419 goto out; 420 } 421 } 422 if (symtabindex == -1) { 423 kobj_error("lost symbol table index"); 424 goto out; 425 } 426 427 /* 428 * Allocate space for and load the symbol table. 429 */ 430 ko->ko_symcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym); 431 if (ko->ko_symcnt == 0) { 432 kobj_error("no symbol table"); 433 goto out; 434 } 435 error = kobj_read(ko, (void **)&ko->ko_symtab, 436 ko->ko_symcnt * sizeof(Elf_Sym), 437 shdr[symtabindex].sh_offset); 438 if (error != 0) { 439 goto out; 440 } 441 442 /* 443 * Allocate space for and load the symbol strings. 444 */ 445 ko->ko_strtabsz = shdr[symstrindex].sh_size; 446 if (ko->ko_strtabsz == 0) { 447 kobj_error("no symbol strings"); 448 goto out; 449 } 450 error = kobj_read(ko, (void *)&ko->ko_strtab, ko->ko_strtabsz, 451 shdr[symstrindex].sh_offset); 452 if (error != 0) { 453 goto out; 454 } 455 456 /* 457 * Do we have a string table for the section names? 458 */ 459 if (hdr->e_shstrndx != 0 && shdr[hdr->e_shstrndx].sh_size != 0 && 460 shdr[hdr->e_shstrndx].sh_type == SHT_STRTAB) { 461 ko->ko_shstrtabsz = shdr[hdr->e_shstrndx].sh_size; 462 error = kobj_read(ko, (void *)&ko->ko_shstrtab, 463 shdr[hdr->e_shstrndx].sh_size, 464 shdr[hdr->e_shstrndx].sh_offset); 465 if (error != 0) { 466 goto out; 467 } 468 } 469 470 /* 471 * Size up code/data(progbits) and bss(nobits). 472 */ 473 alignmask = 0; 474 mapbase = 0; 475 for (i = 0; i < hdr->e_shnum; i++) { 476 switch (shdr[i].sh_type) { 477 case SHT_PROGBITS: 478 case SHT_NOBITS: 479 if (mapbase == 0) 480 mapbase = shdr[i].sh_offset; 481 alignmask = shdr[i].sh_addralign - 1; 482 mapsize += alignmask; 483 mapsize &= ~alignmask; 484 mapsize += shdr[i].sh_size; 485 break; 486 } 487 } 488 489 /* 490 * We know how much space we need for the text/data/bss/etc. 491 * This stuff needs to be in a single chunk so that profiling etc 492 * can get the bounds and gdb can associate offsets with modules. 493 */ 494 if (mapsize == 0) { 495 kobj_error("no text/data/bss"); 496 goto out; 497 } 498 if (ko->ko_type == KT_MEMORY) { 499 mapbase += (vaddr_t)ko->ko_source; 500 } else { 501 mapbase = uvm_km_alloc(lkm_map, round_page(mapsize), 502 0, UVM_KMF_WIRED | UVM_KMF_EXEC); 503 if (mapbase == 0) { 504 error = ENOMEM; 505 goto out; 506 } 507 } 508 ko->ko_address = mapbase; 509 ko->ko_size = mapsize; 510 511 /* 512 * Now load code/data(progbits), zero bss(nobits), allocate space 513 * for and load relocs 514 */ 515 pb = 0; 516 rl = 0; 517 ra = 0; 518 alignmask = 0; 519 for (i = 0; i < hdr->e_shnum; i++) { 520 switch (shdr[i].sh_type) { 521 case SHT_PROGBITS: 522 case SHT_NOBITS: 523 alignmask = shdr[i].sh_addralign - 1; 524 if (ko->ko_type == KT_MEMORY) { 525 addr = (void *)(shdr[i].sh_offset + 526 (vaddr_t)ko->ko_source); 527 if (((vaddr_t)addr & alignmask) != 0) { 528 kobj_error("section %d not aligned\n", 529 i); 530 goto out; 531 } 532 } else { 533 mapbase += alignmask; 534 mapbase &= ~alignmask; 535 addr = (void *)mapbase; 536 mapbase += shdr[i].sh_size; 537 } 538 ko->ko_progtab[pb].addr = addr; 539 if (shdr[i].sh_type == SHT_PROGBITS) { 540 ko->ko_progtab[pb].name = "<<PROGBITS>>"; 541 error = kobj_read_bits(ko, addr, 542 shdr[i].sh_size, shdr[i].sh_offset); 543 if (error != 0) { 544 goto out; 545 } 546 } else if (ko->ko_type == KT_MEMORY && 547 shdr[i].sh_size != 0) { 548 kobj_error("non-loadable BSS section in " 549 "pre-loaded module"); 550 goto out; 551 } else { 552 ko->ko_progtab[pb].name = "<<NOBITS>>"; 553 memset(addr, 0, shdr[i].sh_size); 554 } 555 ko->ko_progtab[pb].size = shdr[i].sh_size; 556 ko->ko_progtab[pb].sec = i; 557 if (ko->ko_shstrtab != NULL && shdr[i].sh_name != 0) { 558 ko->ko_progtab[pb].name = 559 ko->ko_shstrtab + shdr[i].sh_name; 560 } 561 562 /* Update all symbol values with the offset. */ 563 for (j = 0; j < ko->ko_symcnt; j++) { 564 es = &ko->ko_symtab[j]; 565 if (es->st_shndx != i) { 566 continue; 567 } 568 es->st_value += (Elf_Addr)addr; 569 } 570 pb++; 571 break; 572 case SHT_REL: 573 ko->ko_reltab[rl].size = shdr[i].sh_size; 574 ko->ko_reltab[rl].size -= 575 shdr[i].sh_size % sizeof(Elf_Rel); 576 if (ko->ko_reltab[rl].size != 0) { 577 ko->ko_reltab[rl].nrel = 578 shdr[i].sh_size / sizeof(Elf_Rel); 579 ko->ko_reltab[rl].sec = shdr[i].sh_info; 580 error = kobj_read(ko, 581 (void **)&ko->ko_reltab[rl].rel, 582 ko->ko_reltab[rl].size, 583 shdr[i].sh_offset); 584 if (error != 0) { 585 goto out; 586 } 587 } 588 rl++; 589 break; 590 case SHT_RELA: 591 ko->ko_relatab[ra].size = shdr[i].sh_size; 592 ko->ko_relatab[ra].size -= 593 shdr[i].sh_size % sizeof(Elf_Rela); 594 if (ko->ko_relatab[ra].size != 0) { 595 ko->ko_relatab[ra].nrela = 596 shdr[i].sh_size / sizeof(Elf_Rela); 597 ko->ko_relatab[ra].sec = shdr[i].sh_info; 598 error = kobj_read(ko, 599 (void **)&ko->ko_relatab[ra].rela, 600 shdr[i].sh_size, 601 shdr[i].sh_offset); 602 if (error != 0) { 603 goto out; 604 } 605 } 606 ra++; 607 break; 608 default: 609 break; 610 } 611 } 612 if (pb != ko->ko_nprogtab) { 613 panic("lost progbits"); 614 } 615 if (rl != ko->ko_nrel) { 616 panic("lost rel"); 617 } 618 if (ra != ko->ko_nrela) { 619 panic("lost rela"); 620 } 621 if (ko->ko_type != KT_MEMORY && mapbase != ko->ko_address + mapsize) { 622 panic("mapbase 0x%lx != address %lx + mapsize %ld (0x%lx)\n", 623 (long)mapbase, (long)ko->ko_address, (long)mapsize, 624 (long)ko->ko_address + mapsize); 625 } 626 627 /* 628 * Perform relocations. Done before registering with ksyms, 629 * which will pack our symbol table. 630 */ 631 error = kobj_relocate(ko); 632 if (error != 0) { 633 goto out; 634 } 635 636 /* 637 * Notify MD code that a module has been loaded. 638 */ 639 error = kobj_machdep(ko, (void *)ko->ko_address, ko->ko_size, true); 640 if (error != 0) { 641 kobj_error("machine dependent init failed"); 642 goto out; 643 } 644 ko->ko_loaded = true; 645 out: 646 kobj_release_mem(ko); 647 if (hdr != NULL) { 648 kobj_free(ko, hdr, sizeof(*hdr)); 649 } 650 651 return error; 652 } 653 654 /* 655 * kobj_unload: 656 * 657 * Unload an object previously loaded by kobj_load(). 658 */ 659 void 660 kobj_unload(kobj_t ko) 661 { 662 int error; 663 664 KASSERT(ko->ko_progtab == NULL); 665 KASSERT(ko->ko_shstrtab == NULL); 666 667 if (ko->ko_address != 0 && ko->ko_type != KT_MEMORY) { 668 uvm_km_free(lkm_map, ko->ko_address, round_page(ko->ko_size), 669 UVM_KMF_WIRED); 670 } 671 if (ko->ko_ksyms == true) { 672 ksyms_delsymtab(ko->ko_name); 673 } 674 if (ko->ko_symtab != NULL) { 675 kobj_free(ko, ko->ko_symtab, ko->ko_symcnt * sizeof(Elf_Sym)); 676 } 677 if (ko->ko_strtab != NULL) { 678 kobj_free(ko, ko->ko_strtab, ko->ko_strtabsz); 679 } 680 if (ko->ko_progtab != NULL) { 681 kobj_free(ko, ko->ko_progtab, ko->ko_nprogtab * 682 sizeof(*ko->ko_progtab)); 683 ko->ko_progtab = NULL; 684 } 685 if (ko->ko_shstrtab) { 686 kobj_free(ko, ko->ko_shstrtab, ko->ko_shstrtabsz); 687 ko->ko_shstrtab = NULL; 688 } 689 690 /* 691 * Notify MD code that a module has been unloaded. 692 */ 693 if (ko->ko_loaded) { 694 error = kobj_machdep(ko, (void *)ko->ko_address, ko->ko_size, 695 false); 696 if (error != 0) { 697 kobj_error("machine dependent deinit failed"); 698 } 699 } 700 701 kmem_free(ko, sizeof(*ko)); 702 } 703 704 /* 705 * kobj_stat: 706 * 707 * Return size and load address of an object. 708 */ 709 void 710 kobj_stat(kobj_t ko, vaddr_t *address, size_t *size) 711 { 712 713 if (address != NULL) { 714 *address = ko->ko_address; 715 } 716 if (size != NULL) { 717 *size = ko->ko_size; 718 } 719 } 720 721 /* 722 * kobj_set_name: 723 * 724 * Set an object's name. Used only for symbol table lookups. 725 * May only be called after the module is loaded. 726 */ 727 int 728 kobj_set_name(kobj_t ko, const char *name) 729 { 730 int error; 731 732 KASSERT(ko->ko_loaded); 733 734 strlcpy(ko->ko_name, name, sizeof(ko->ko_name)); 735 736 /* 737 * Now that we know the name, register the symbol table. 738 */ 739 error = ksyms_addsymtab(ko->ko_name, ko->ko_symtab, ko->ko_symcnt * 740 sizeof(Elf_Sym), ko->ko_strtab, ko->ko_strtabsz); 741 if (error != 0) { 742 kobj_error("unable to register module symbol table"); 743 } else { 744 ko->ko_ksyms = true; 745 } 746 747 return error; 748 } 749 750 /* 751 * kobj_find_section: 752 * 753 * Given a section name, search the loaded object and return 754 * virtual address if present and loaded. 755 */ 756 int 757 kobj_find_section(kobj_t ko, const char *name, void **addr, size_t *size) 758 { 759 int i; 760 761 KASSERT(ko->ko_progtab != NULL); 762 763 for (i = 0; i < ko->ko_nprogtab; i++) { 764 if (strcmp(ko->ko_progtab[i].name, name) == 0) { 765 if (addr != NULL) { 766 *addr = ko->ko_progtab[i].addr; 767 } 768 if (size != NULL) { 769 *size = ko->ko_progtab[i].size; 770 } 771 return 0; 772 } 773 } 774 775 return ENOENT; 776 } 777 778 /* 779 * kobj_release_mem: 780 * 781 * Release object data not needed after loading. 782 */ 783 static void 784 kobj_release_mem(kobj_t ko) 785 { 786 int i; 787 788 for (i = 0; i < ko->ko_nrel; i++) { 789 if (ko->ko_reltab[i].rel) { 790 kobj_free(ko, ko->ko_reltab[i].rel, 791 ko->ko_reltab[i].size); 792 } 793 } 794 for (i = 0; i < ko->ko_nrela; i++) { 795 if (ko->ko_relatab[i].rela) { 796 kobj_free(ko, ko->ko_relatab[i].rela, 797 ko->ko_relatab[i].size); 798 } 799 } 800 if (ko->ko_reltab != NULL) { 801 kobj_free(ko, ko->ko_reltab, ko->ko_nrel * 802 sizeof(*ko->ko_reltab)); 803 ko->ko_reltab = NULL; 804 ko->ko_nrel = 0; 805 } 806 if (ko->ko_relatab != NULL) { 807 kobj_free(ko, ko->ko_relatab, ko->ko_nrela * 808 sizeof(*ko->ko_relatab)); 809 ko->ko_relatab = NULL; 810 ko->ko_nrela = 0; 811 } 812 if (ko->ko_shdr != NULL) { 813 kobj_free(ko, ko->ko_shdr, ko->ko_shdrsz); 814 ko->ko_shdr = NULL; 815 } 816 } 817 818 /* 819 * kobj_sym_lookup: 820 * 821 * Symbol lookup function to be used when the symbol index 822 * is known (ie during relocation). 823 */ 824 uintptr_t 825 kobj_sym_lookup(kobj_t ko, uintptr_t symidx) 826 { 827 const Elf_Sym *sym; 828 const char *symbol; 829 int error; 830 u_long addr; 831 832 /* Don't even try to lookup the symbol if the index is bogus. */ 833 if (symidx >= ko->ko_symcnt) 834 return 0; 835 836 sym = ko->ko_symtab + symidx; 837 838 /* Quick answer if there is a definition included. */ 839 if (sym->st_shndx != SHN_UNDEF) { 840 return sym->st_value; 841 } 842 843 /* If we get here, then it is undefined and needs a lookup. */ 844 switch (ELF_ST_BIND(sym->st_info)) { 845 case STB_LOCAL: 846 /* Local, but undefined? huh? */ 847 kobj_error("local symbol undefined"); 848 return 0; 849 850 case STB_GLOBAL: 851 /* Relative to Data or Function name */ 852 symbol = ko->ko_strtab + sym->st_name; 853 854 /* Force a lookup failure if the symbol name is bogus. */ 855 if (*symbol == 0) { 856 kobj_error("bad symbol name"); 857 return 0; 858 } 859 860 error = ksyms_getval(NULL, symbol, &addr, KSYMS_ANY); 861 if (error != 0) { 862 kobj_error("symbol %s undefined", symbol); 863 return (uintptr_t)0; 864 } 865 return (uintptr_t)addr; 866 867 case STB_WEAK: 868 kobj_error("weak symbols not supported\n"); 869 return 0; 870 871 default: 872 return 0; 873 } 874 } 875 876 /* 877 * kobj_findbase: 878 * 879 * Return base address of the given section. 880 */ 881 static uintptr_t 882 kobj_findbase(kobj_t ko, int sec) 883 { 884 int i; 885 886 for (i = 0; i < ko->ko_nprogtab; i++) { 887 if (sec == ko->ko_progtab[i].sec) { 888 return (uintptr_t)ko->ko_progtab[i].addr; 889 } 890 } 891 return 0; 892 } 893 894 /* 895 * kobj_relocate: 896 * 897 * Resolve all relocations for the loaded object. 898 */ 899 static int 900 kobj_relocate(kobj_t ko) 901 { 902 const Elf_Rel *rellim; 903 const Elf_Rel *rel; 904 const Elf_Rela *relalim; 905 const Elf_Rela *rela; 906 const Elf_Sym *sym; 907 uintptr_t base; 908 int i, error; 909 uintptr_t symidx; 910 911 /* 912 * Perform relocations without addend if there are any. 913 */ 914 for (i = 0; i < ko->ko_nrel; i++) { 915 rel = ko->ko_reltab[i].rel; 916 if (rel == NULL) { 917 continue; 918 } 919 rellim = rel + ko->ko_reltab[i].nrel; 920 base = kobj_findbase(ko, ko->ko_reltab[i].sec); 921 if (base == 0) { 922 panic("lost base for e_reltab"); 923 } 924 for (; rel < rellim; rel++) { 925 symidx = ELF_R_SYM(rel->r_info); 926 if (symidx >= ko->ko_symcnt) { 927 continue; 928 } 929 sym = ko->ko_symtab + symidx; 930 error = kobj_reloc(ko, base, rel, false, 931 ELF_ST_BIND(sym->st_info) == STB_LOCAL); 932 if (error != 0) { 933 return ENOENT; 934 } 935 } 936 } 937 938 /* 939 * Perform relocations with addend if there are any. 940 */ 941 for (i = 0; i < ko->ko_nrela; i++) { 942 rela = ko->ko_relatab[i].rela; 943 if (rela == NULL) { 944 continue; 945 } 946 relalim = rela + ko->ko_relatab[i].nrela; 947 base = kobj_findbase(ko, ko->ko_relatab[i].sec); 948 if (base == 0) { 949 panic("lost base for e_relatab"); 950 } 951 for (; rela < relalim; rela++) { 952 symidx = ELF_R_SYM(rela->r_info); 953 if (symidx >= ko->ko_symcnt) { 954 continue; 955 } 956 sym = ko->ko_symtab + symidx; 957 error = kobj_reloc(ko, base, rela, true, 958 ELF_ST_BIND(sym->st_info) == STB_LOCAL); 959 if (error != 0) { 960 return ENOENT; 961 } 962 } 963 } 964 965 return 0; 966 } 967 968 /* 969 * kobj_error: 970 * 971 * Utility function: log an error. 972 */ 973 static void 974 kobj_error(const char *fmt, ...) 975 { 976 va_list ap; 977 978 va_start(ap, fmt); 979 printf("WARNING: linker error: "); 980 vprintf(fmt, ap); 981 printf("\n"); 982 va_end(ap); 983 } 984 985 /* 986 * kobj_read: 987 * 988 * Utility function: read from the object. 989 */ 990 static int 991 kobj_read(kobj_t ko, void **basep, size_t size, off_t off) 992 { 993 size_t resid; 994 void *base; 995 int error; 996 997 KASSERT(ko->ko_source != NULL); 998 999 switch (ko->ko_type) { 1000 case KT_VNODE: 1001 base = kmem_alloc(size, KM_SLEEP); 1002 if (base == NULL) { 1003 error = ENOMEM; 1004 break; 1005 } 1006 error = vn_rdwr(UIO_READ, ko->ko_source, base, size, off, 1007 UIO_SYSSPACE, IO_NODELOCKED, curlwp->l_cred, &resid, 1008 curlwp); 1009 if (error == 0 && resid != 0) { 1010 kmem_free(base, size); 1011 error = EINVAL; 1012 } 1013 break; 1014 case KT_MEMORY: 1015 if (ko->ko_memsize != -1 && off + size > ko->ko_memsize) { 1016 kobj_error("kobj_read: preloaded object short"); 1017 error = EINVAL; 1018 base = NULL; 1019 } else { 1020 base = (uint8_t *)ko->ko_source + off; 1021 error = 0; 1022 } 1023 break; 1024 default: 1025 panic("kobj_read: invalid type"); 1026 } 1027 1028 *basep = base; 1029 return error; 1030 } 1031 1032 /* 1033 * kobj_read_bits: 1034 * 1035 * Utility function: load a section from the object. 1036 */ 1037 static int 1038 kobj_read_bits(kobj_t ko, void *base, size_t size, off_t off) 1039 { 1040 size_t resid; 1041 int error; 1042 1043 KASSERT(ko->ko_source != NULL); 1044 1045 switch (ko->ko_type) { 1046 case KT_VNODE: 1047 error = vn_rdwr(UIO_READ, ko->ko_source, base, size, off, 1048 UIO_SYSSPACE, IO_NODELOCKED, curlwp->l_cred, &resid, 1049 curlwp); 1050 if (error == 0 && resid != 0) { 1051 error = EINVAL; 1052 } 1053 break; 1054 case KT_MEMORY: 1055 if (ko->ko_memsize != -1 && off + size > ko->ko_memsize) { 1056 kobj_error("kobj_read_bits: preloaded object short"); 1057 error = EINVAL; 1058 } else if ((uint8_t *)base != (uint8_t *)ko->ko_source + off) { 1059 kobj_error("kobj_read_bits: object not aligned"); 1060 kobj_error("source=%p base=%p off=%d size=%zd", 1061 ko->ko_source, base, (int)off, size); 1062 error = EINVAL; 1063 } else { 1064 /* Nothing to do. Loading in-situ. */ 1065 error = 0; 1066 } 1067 break; 1068 default: 1069 panic("kobj_read: invalid type"); 1070 } 1071 1072 return error; 1073 } 1074 1075 /* 1076 * kobj_free: 1077 * 1078 * Utility function: free memory if it was allocated from the heap. 1079 */ 1080 static void 1081 kobj_free(kobj_t ko, void *base, size_t size) 1082 { 1083 1084 if (ko->ko_type != KT_MEMORY) 1085 kmem_free(base, size); 1086 } 1087 1088 #else /* MODULAR */ 1089 1090 int 1091 kobj_open_file(kobj_t *kop, const char *name) 1092 { 1093 1094 return ENOSYS; 1095 } 1096 1097 int 1098 kobj_open_mem(kobj_t *kop, void *base, ssize_t size) 1099 { 1100 1101 return ENOSYS; 1102 } 1103 1104 void 1105 kobj_close(kobj_t ko) 1106 { 1107 1108 panic("not modular"); 1109 } 1110 1111 int 1112 kobj_load(kobj_t ko) 1113 { 1114 1115 panic("not modular"); 1116 } 1117 1118 void 1119 kobj_unload(kobj_t ko) 1120 { 1121 1122 panic("not modular"); 1123 } 1124 1125 void 1126 kobj_stat(kobj_t ko, vaddr_t *base, size_t *size) 1127 { 1128 1129 panic("not modular"); 1130 } 1131 1132 int 1133 kobj_set_name(kobj_t ko, const char *name) 1134 { 1135 1136 panic("not modular"); 1137 } 1138 1139 int 1140 kobj_find_section(kobj_t ko, const char *name, void **addr, size_t *size) 1141 { 1142 1143 panic("not modular"); 1144 } 1145 1146 #endif /* MODULAR */ 1147