svn commit: r333411 - in head/sys: amd64/amd64 kern
Konstantin Belousov
kib at FreeBSD.org
Wed May 9 14:39:25 UTC 2018
Author: kib
Date: Wed May 9 14:39:24 2018
New Revision: 333411
URL: https://svnweb.freebsd.org/changeset/base/333411
Log:
Avoid calls to bzero() before ireloc.
Evaluate cpu_stdext_feature early to have moved link_elf_ireloc() see
correct flags, most important is SMAP.
Tested by: mjg
Sponsored by: The FreeBSD Foundation
Differential revision: https://reviews.freebsd.org/D15367
Modified:
head/sys/amd64/amd64/machdep.c
head/sys/kern/link_elf.c
Modified: head/sys/amd64/amd64/machdep.c
==============================================================================
--- head/sys/amd64/amd64/machdep.c Wed May 9 14:38:07 2018 (r333410)
+++ head/sys/amd64/amd64/machdep.c Wed May 9 14:39:24 2018 (r333411)
@@ -1556,19 +1556,24 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
TSRAW(&thread0, TS_ENTER, __func__, NULL);
- /*
- * This may be done better later if it gets more high level
- * components in it. If so just link td->td_proc here.
- */
- proc_linkup0(&proc0, &thread0);
-
kmdp = init_ops.parse_preload_data(modulep);
identify_cpu1();
identify_hypervisor();
+ /*
+ * hw.cpu_stdext_disable is ignored by the call, it will be
+ * re-evaluted by the below call to finishidentcpu().
+ */
+ identify_cpu2();
- /* link_elf_ireloc(kmdp); */
+ link_elf_ireloc(kmdp);
+ /*
+ * This may be done better later if it gets more high level
+ * components in it. If so just link td->td_proc here.
+ */
+ proc_linkup0(&proc0, &thread0);
+
/* Init basic tunables, hz etc */
init_param1();
@@ -1753,7 +1758,6 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
cninit();
amd64_kdb_init();
}
- link_elf_ireloc(kmdp);
getmemsize(kmdp, physfree);
init_param2(physmem);
Modified: head/sys/kern/link_elf.c
==============================================================================
--- head/sys/kern/link_elf.c Wed May 9 14:38:07 2018 (r333410)
+++ head/sys/kern/link_elf.c Wed May 9 14:39:24 2018 (r333411)
@@ -1692,9 +1692,15 @@ link_elf_ireloc(caddr_t kmdp)
{
struct elf_file eff;
elf_file_t ef;
+ volatile char *c;
+ size_t i;
ef = &eff;
- bzero(ef, sizeof(*ef));
+
+ /* Do not use bzero/memset before ireloc is done. */
+ for (c = (char *)ef, i = 0; i < sizeof(*ef); i++)
+ c[i] = 0;
+
ef->modptr = kmdp;
ef->dynamic = (Elf_Dyn *)&_DYNAMIC;
parse_dynamic(ef);
More information about the svn-src-all
mailing list