Module Name:    src
Committed By:   mrg
Date:           Sat Apr 17 01:53:58 UTC 2021

Modified Files:
        src/sys/arch/aarch64/aarch64: pmap.c
        src/sys/dev/usb: usbhist.h
        src/sys/sys: biohist.h kernhist.h
        src/sys/uvm: uvm_map.c uvm_pdaemon.c uvm_stat.h
        src/sys/uvm/pmap: pmap.c

Log Message:
remove KERNHIST_INIT_STATIC().  it stradles the line between usable
early in boot and broken early in boot by requiring a partly static
structure with another structure that must be present by the time
any uses are performed.  theoretically platform code could allocate
a chunk while seting up memory and assign it here, giving a dynamic
sizing for the entry list, but the reality is that all users have
a statically allocated entry list as well.

the existing KERNHIST_LINK_STATIC() is used in conjunction with
KERNHIST_INITIALIZER() instead.

this stops a NULL pointer deref when the _LOG() macro is called
before the storage is linked in, which happens with GCC 10 on OCTEON
with UVMHIST enabled, crashing in very early kernel init.


To generate a diff of this commit:
cvs rdiff -u -r1.103 -r1.104 src/sys/arch/aarch64/aarch64/pmap.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/usb/usbhist.h
cvs rdiff -u -r1.2 -r1.3 src/sys/sys/biohist.h
cvs rdiff -u -r1.25 -r1.26 src/sys/sys/kernhist.h
cvs rdiff -u -r1.386 -r1.387 src/sys/uvm/uvm_map.c
cvs rdiff -u -r1.131 -r1.132 src/sys/uvm/uvm_pdaemon.c
cvs rdiff -u -r1.54 -r1.55 src/sys/uvm/uvm_stat.h
cvs rdiff -u -r1.61 -r1.62 src/sys/uvm/pmap/pmap.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/arch/aarch64/aarch64/pmap.c
diff -u src/sys/arch/aarch64/aarch64/pmap.c:1.103 src/sys/arch/aarch64/aarch64/pmap.c:1.104
--- src/sys/arch/aarch64/aarch64/pmap.c:1.103	Tue Mar  9 16:40:59 2021
+++ src/sys/arch/aarch64/aarch64/pmap.c	Sat Apr 17 01:53:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.103 2021/03/09 16:40:59 ryo Exp $	*/
+/*	$NetBSD: pmap.c,v 1.104 2021/04/17 01:53:58 mrg Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.103 2021/03/09 16:40:59 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.104 2021/04/17 01:53:58 mrg Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_ddb.h"
@@ -68,7 +68,6 @@ __KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.1
 #define VPRINTF(...)	__nothing
 #endif
 
-UVMHIST_DEFINE(pmaphist);
 #ifdef UVMHIST
 
 #ifndef UVMHIST_PMAPHIST_SIZE
@@ -76,13 +75,14 @@ UVMHIST_DEFINE(pmaphist);
 #endif
 
 struct kern_history_ent pmaphistbuf[UVMHIST_PMAPHIST_SIZE];
+UVMHIST_DEFINE(pmaphist) = UVMHIST_INITIALIZER(pmaphist, pmaphistbuf);;
 
 static void
 pmap_hist_init(void)
 {
 	static bool inited = false;
 	if (inited == false) {
-		UVMHIST_INIT_STATIC(pmaphist, pmaphistbuf);
+		UVMHIST_LINK_STATIC(pmaphist);
 		inited = true;
 	}
 }

Index: src/sys/dev/usb/usbhist.h
diff -u src/sys/dev/usb/usbhist.h:1.6 src/sys/dev/usb/usbhist.h:1.7
--- src/sys/dev/usb/usbhist.h:1.6	Thu Aug 22 00:24:07 2019
+++ src/sys/dev/usb/usbhist.h	Sat Apr 17 01:53:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbhist.h,v 1.6 2019/08/22 00:24:07 mrg Exp $	*/
+/*	$NetBSD: usbhist.h,v 1.7 2021/04/17 01:53:58 mrg Exp $	*/
 
 /*
  * Copyright (c) 2012 Matthew R. Green
@@ -51,7 +51,6 @@ extern int usbdebug;
 #define USBHIST_DECL(NAME)		KERNHIST_DECL(NAME)
 #define USBHIST_DEFINE(NAME)		KERNHIST_DEFINE(NAME)
 #define USBHIST_INIT(NAME,N)		KERNHIST_INIT(NAME,N)
-#define USBHIST_INIT_STATIC(NAME,BUF)	KERNHIST_INIT_STATIC(NAME,BUF)
 #define USBHIST_LINK_STATIC(NAME)	KERNHIST_LINK_STATIC(NAME)
 #define USBHIST_LOGN(NAME,N,FMT,A,B,C,D)	do {		\
 	if ((NAME) >= (N)) {					\
@@ -88,7 +87,6 @@ USBHIST_DECL(usbhist);
 #define USBHIST_DECL(NAME)
 #define USBHIST_DEFINE(NAME)
 #define USBHIST_INIT(NAME,N)
-#define USBHIST_INIT_STATIC(NAME,BUF)
 #define USBHIST_LINK_STATIC(NAME)
 #define USBHIST_LOGN(N,NAME,FMT,A,B,C,D)	do { } while(0)
 #define USBHIST_LOGM(N,NAME,FMT,A,B,C,D)	do { } while(0)

Index: src/sys/sys/biohist.h
diff -u src/sys/sys/biohist.h:1.2 src/sys/sys/biohist.h:1.3
--- src/sys/sys/biohist.h:1.2	Tue Dec 27 04:12:34 2016
+++ src/sys/sys/biohist.h	Sat Apr 17 01:53:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: biohist.h,v 1.2 2016/12/27 04:12:34 pgoyette Exp $ */
+/*	$NetBSD: biohist.h,v 1.3 2021/04/17 01:53:58 mrg Exp $ */
 
 /*-
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -50,7 +50,6 @@
 #define BIOHIST_DECL(NAME)		KERNHIST_DECL(NAME)
 #define BIOHIST_DEFINE(NAME)		KERNHIST_DEFINE(NAME)
 #define BIOHIST_INIT(NAME,N)		KERNHIST_INIT(NAME,N)
-#define BIOHIST_INIT_STATIC(NAME,BUF)	KERNHIST_INIT_STATIC(NAME,BUF)
 #define BIOHIST_INITIALIZER(NAME,BUF)	KERNHIST_INITIALIZER(NAME,BUF)
 #define BIOHIST_LINK_STATIC(NAME)	KERNHIST_LINK_STATIC(NAME)
 #define BIOHIST_LOG(NAME,FMT,A,B,C,D)	KERNHIST_LOG(NAME,FMT,A,B,C,D)
@@ -68,7 +67,6 @@
 #define BIOHIST_DECL(NAME)
 #define BIOHIST_DEFINE(NAME)
 #define BIOHIST_INIT(NAME,N)
-#define BIOHIST_INIT_STATIC(NAME,BUF)
 #define BIOHIST_INITIALIZER(NAME,BUF)
 #define BIOHIST_LINK_STATIC(NAME)
 #define BIOHIST_LOG(NAME,FMT,A,B,C,D)

Index: src/sys/sys/kernhist.h
diff -u src/sys/sys/kernhist.h:1.25 src/sys/sys/kernhist.h:1.26
--- src/sys/sys/kernhist.h:1.25	Tue Aug 14 11:39:10 2018
+++ src/sys/sys/kernhist.h	Sat Apr 17 01:53:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: kernhist.h,v 1.25 2018/08/14 11:39:10 christos Exp $	*/
+/*	$NetBSD: kernhist.h,v 1.26 2021/04/17 01:53:58 mrg Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -132,7 +132,6 @@ LIST_HEAD(kern_history_head, kern_histor
 #define KERNHIST_DECL(NAME)
 #define KERNHIST_DEFINE(NAME)
 #define KERNHIST_INIT(NAME,N)
-#define KERNHIST_INIT_STATIC(NAME,BUF)
 #define KERNHIST_LOG(NAME,FMT,A,B,C,D)
 #define KERNHIST_CALLARGS(NAME,FMT,A,B,C,D)
 #define KERNHIST_CALLED(NAME)
@@ -177,18 +176,6 @@ do { \
 	/* BUF will inititalized to zeroes by being in .bss */ \
 }
 
-#define KERNHIST_INIT_STATIC(NAME,BUF) \
-do { \
-	(NAME).name = __STRING(NAME); \
-	(NAME).namelen = strlen(__STRING(NAME)); \
-	(NAME).n = sizeof(BUF) / sizeof(struct kern_history_ent); \
-	(NAME).f = 0; \
-	(NAME).e = (struct kern_history_ent *) (BUF); \
-	(NAME).s = 0; \
-	memset((NAME).e, 0, sizeof(struct kern_history_ent) * (NAME).n); \
-	KERNHIST_LINK_STATIC(NAME); \
-} while (/*CONSTCOND*/ 0)
-
 #ifndef KERNHIST_DELAY
 #define KERNHIST_DELAY	100000
 #endif

Index: src/sys/uvm/uvm_map.c
diff -u src/sys/uvm/uvm_map.c:1.386 src/sys/uvm/uvm_map.c:1.387
--- src/sys/uvm/uvm_map.c:1.386	Sat Mar 13 15:29:55 2021
+++ src/sys/uvm/uvm_map.c	Sat Apr 17 01:53:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_map.c,v 1.386 2021/03/13 15:29:55 skrll Exp $	*/
+/*	$NetBSD: uvm_map.c,v 1.387 2021/04/17 01:53:58 mrg Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.386 2021/03/13 15:29:55 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.387 2021/04/17 01:53:58 mrg Exp $");
 
 #include "opt_ddb.h"
 #include "opt_pax.h"
@@ -904,17 +904,13 @@ uvm_map_unreference_amap(struct vm_map_e
 void
 uvm_map_init(void)
 {
-#if defined(UVMHIST)
-	static struct kern_history_ent pdhistbuf[UVMHIST_PDHIST_SIZE];
-#endif
-
 	/*
 	 * first, init logging system.
 	 */
 
 	UVMHIST_FUNC(__func__);
 	UVMHIST_LINK_STATIC(maphist);
-	UVMHIST_INIT_STATIC(pdhist, pdhistbuf);
+	UVMHIST_LINK_STATIC(pdhist);
 	UVMHIST_CALLED(maphist);
 	UVMHIST_LOG(maphist,"<starting uvm map system>", 0, 0, 0, 0);
 

Index: src/sys/uvm/uvm_pdaemon.c
diff -u src/sys/uvm/uvm_pdaemon.c:1.131 src/sys/uvm/uvm_pdaemon.c:1.132
--- src/sys/uvm/uvm_pdaemon.c:1.131	Wed Nov  4 01:30:19 2020
+++ src/sys/uvm/uvm_pdaemon.c	Sat Apr 17 01:53:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_pdaemon.c,v 1.131 2020/11/04 01:30:19 chs Exp $	*/
+/*	$NetBSD: uvm_pdaemon.c,v 1.132 2021/04/17 01:53:58 mrg Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.131 2020/11/04 01:30:19 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.132 2021/04/17 01:53:58 mrg Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_readahead.h"
@@ -88,7 +88,8 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.
 #include <uvm/uvm_pgflcache.h>
 
 #ifdef UVMHIST
-UVMHIST_DEFINE(pdhist);
+static struct kern_history_ent pdhistbuf[UVMHIST_PDHIST_SIZE];
+UVMHIST_DEFINE(pdhist) = UVMHIST_INITIALIZER(pdhisthist, pdhistbuf);
 #endif
 
 /*

Index: src/sys/uvm/uvm_stat.h
diff -u src/sys/uvm/uvm_stat.h:1.54 src/sys/uvm/uvm_stat.h:1.55
--- src/sys/uvm/uvm_stat.h:1.54	Mon Apr 13 07:11:08 2020
+++ src/sys/uvm/uvm_stat.h	Sat Apr 17 01:53:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_stat.h,v 1.54 2020/04/13 07:11:08 skrll Exp $	*/
+/*	$NetBSD: uvm_stat.h,v 1.55 2021/04/17 01:53:58 mrg Exp $	*/
 
 /*
  * Copyright (c) 2011 Matthew R. Green
@@ -54,7 +54,6 @@
 #define UVMHIST_DECL(NAME)			KERNHIST_DECL(NAME)
 #define UVMHIST_DEFINE(NAME)			KERNHIST_DEFINE(NAME)
 #define UVMHIST_INIT(NAME,N)			KERNHIST_INIT(NAME,N)
-#define UVMHIST_INIT_STATIC(NAME,BUF)		KERNHIST_INIT_STATIC(NAME,BUF)
 #define UVMHIST_INITIALIZER(NAME,BUF)		KERNHIST_INITIALIZER(NAME,BUF)
 #define UVMHIST_LINK_STATIC(NAME)		KERNHIST_LINK_STATIC(NAME)
 #define UVMHIST_LOG(NAME,FMT,A,B,C,D)		KERNHIST_LOG(NAME,FMT,A,B,C,D)
@@ -67,7 +66,6 @@
 #define UVMHIST_DECL(NAME)
 #define UVMHIST_DEFINE(NAME)
 #define UVMHIST_INIT(NAME,N)
-#define UVMHIST_INIT_STATIC(NAME,BUF)
 #define UVMHIST_INITIALIZER(NAME,BUF)
 #define UVMHIST_LINK_STATIC(NAME)
 #define UVMHIST_LOG(NAME,FMT,A,B,C,D)

Index: src/sys/uvm/pmap/pmap.c
diff -u src/sys/uvm/pmap/pmap.c:1.61 src/sys/uvm/pmap/pmap.c:1.62
--- src/sys/uvm/pmap/pmap.c:1.61	Fri Mar 19 07:51:33 2021
+++ src/sys/uvm/pmap/pmap.c	Sat Apr 17 01:53:58 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.61 2021/03/19 07:51:33 skrll Exp $	*/
+/*	$NetBSD: pmap.c,v 1.62 2021/04/17 01:53:58 mrg Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.61 2021/03/19 07:51:33 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.62 2021/04/17 01:53:58 mrg Exp $");
 
 /*
  *	Manages physical address maps.
@@ -225,9 +225,9 @@ struct pmap_limits pmap_limits = {	/* VA
 static struct kern_history_ent pmapexechistbuf[10000];
 static struct kern_history_ent pmaphistbuf[10000];
 static struct kern_history_ent pmapsegtabhistbuf[1000];
-UVMHIST_DEFINE(pmapexechist);
-UVMHIST_DEFINE(pmaphist);
-UVMHIST_DEFINE(pmapsegtabhist);
+UVMHIST_DEFINE(pmapexechist) = UVMHIST_INITIALIZER(pmapexechist, pmapexechistbuf);
+UVMHIST_DEFINE(pmaphist) = UVMHIST_INITIALIZER(pmaphist, pmaphistbuf);
+UVMHIST_DEFINE(pmapsegtabhist) = UVMHIST_INITIALIZER(pmapsegtabhist, pmapsegtabhistbuf);
 #endif
 
 /*
@@ -604,9 +604,9 @@ pmap_bootstrap_common(void)
 void
 pmap_init(void)
 {
-	UVMHIST_INIT_STATIC(pmapexechist, pmapexechistbuf);
-	UVMHIST_INIT_STATIC(pmaphist, pmaphistbuf);
-	UVMHIST_INIT_STATIC(pmapsegtabhist, pmapsegtabhistbuf);
+	UVMHIST_LINK_STATIC(pmapexechist);
+	UVMHIST_LINK_STATIC(pmaphist);
+	UVMHIST_LINK_STATIC(pmapsegtabhist);
 
 	UVMHIST_FUNC(__func__);
 	UVMHIST_CALLED(pmaphist);

Reply via email to