Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 May 2018 14:39:24 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r333411 - in head/sys: amd64/amd64 kern
Message-ID:  <201805091439.w49EdObK087561@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201805091439.w49EdObK087561>