Module Name: src Committed By: riastradh Date: Sat Oct 15 15:28:23 UTC 2022
Modified Files: src/sys/kern: subr_kobj.c Log Message: kobj(9): Rephrase kobj_load and kobj_affix positively. Write error cases as branches, normal cases as straight-line code. Side effect: One fewer call to kobj_jettison in case of error in kobj_affix, but it already calls kobj_jettison once in the error case via kobj_unload, which does kobj_jettison itself, and kobj_jettison is idempotent. No functional change intended. To generate a diff of this commit: cvs rdiff -u -r1.72 -r1.73 src/sys/kern/subr_kobj.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_kobj.c diff -u src/sys/kern/subr_kobj.c:1.72 src/sys/kern/subr_kobj.c:1.73 --- src/sys/kern/subr_kobj.c:1.72 Sat Oct 15 15:27:20 2022 +++ src/sys/kern/subr_kobj.c Sat Oct 15 15:28:23 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_kobj.c,v 1.72 2022/10/15 15:27:20 riastradh Exp $ */ +/* $NetBSD: subr_kobj.c,v 1.73 2022/10/15 15:28:23 riastradh Exp $ */ /* * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.72 2022/10/15 15:27:20 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.73 2022/10/15 15:28:23 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_modular.h" @@ -610,10 +610,13 @@ kobj_load(kobj_t ko) * symbols will be done by kobj_affix(). */ error = kobj_checksyms(ko, false); - if (error == 0) { - error = kobj_relocate(ko, true); - } - out: + if (error) + goto out; + + error = kobj_relocate(ko, true); + if (error) + goto out; +out: if (hdr != NULL) { kobj_free(ko, hdr, sizeof(*hdr)); } @@ -731,21 +734,22 @@ kobj_affix(kobj_t ko, const char *name) /* Cache addresses of undefined symbols. */ error = kobj_checksyms(ko, true); + if (error) + goto out; /* Now do global relocations. */ - if (error == 0) - error = kobj_relocate(ko, false); + error = kobj_relocate(ko, false); + if (error) + goto out; /* * Now that we know the name, register the symbol table. * Do after global relocations because ksyms will pack * the table. */ - if (error == 0) { - ksyms_modload(ko->ko_name, ko->ko_symtab, ko->ko_symcnt * - sizeof(Elf_Sym), ko->ko_strtab, ko->ko_strtabsz); - ko->ko_ksyms = true; - } + ksyms_modload(ko->ko_name, ko->ko_symtab, + ko->ko_symcnt * sizeof(Elf_Sym), ko->ko_strtab, ko->ko_strtabsz); + ko->ko_ksyms = true; /* Jettison unneeded memory post-link. */ kobj_jettison(ko); @@ -755,47 +759,55 @@ kobj_affix(kobj_t ko, const char *name) * * Most architectures use this opportunity to flush their caches. */ - if (error == 0 && ko->ko_text_address != 0) { + if (ko->ko_text_address != 0) { error = kobj_machdep(ko, (void *)ko->ko_text_address, ko->ko_text_size, true); - if (error != 0) + if (error) { kobj_error(ko, "machine dependent init failed (text)" " %d", error); + goto out; + } } - if (error == 0 && ko->ko_data_address != 0) { + if (ko->ko_data_address != 0) { error = kobj_machdep(ko, (void *)ko->ko_data_address, ko->ko_data_size, true); - if (error != 0) + if (error) { kobj_error(ko, "machine dependent init failed (data)" " %d", error); + goto out; + } } - if (error == 0 && ko->ko_rodata_address != 0) { + if (ko->ko_rodata_address != 0) { error = kobj_machdep(ko, (void *)ko->ko_rodata_address, ko->ko_rodata_size, true); - if (error != 0) + if (error) { kobj_error(ko, "machine dependent init failed (rodata)" " %d", error); + goto out; + } } - if (error == 0) { - ko->ko_loaded = true; + ko->ko_loaded = true; - /* Change the memory protections, when needed. */ - if (ko->ko_text_address != 0) { - uvm_km_protect(module_map, ko->ko_text_address, - ko->ko_text_size, VM_PROT_READ|VM_PROT_EXECUTE); - } - if (ko->ko_rodata_address != 0) { - uvm_km_protect(module_map, ko->ko_rodata_address, - ko->ko_rodata_size, VM_PROT_READ); - } - } else { + /* Change the memory protections, when needed. */ + if (ko->ko_text_address != 0) { + uvm_km_protect(module_map, ko->ko_text_address, + ko->ko_text_size, VM_PROT_READ|VM_PROT_EXECUTE); + } + if (ko->ko_rodata_address != 0) { + uvm_km_protect(module_map, ko->ko_rodata_address, + ko->ko_rodata_size, VM_PROT_READ); + } + + /* Success! */ + error = 0; + +out: if (error) { /* If there was an error, destroy the whole object. */ kobj_unload(ko); } - return error; }