Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Mar 2006 23:10:17 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 94276 for review
Message-ID:  <200603292310.k2TNAH6x080206@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=94276

Change 94276 by jhb@jhb_slimer on 2006/03/29 23:10:05

	If USE_SET is not defined (turned off for amd64 for now), then ask
	the linker to lookup our set of events for us instead of assuming
	that ld(1) will do all the heavy-lifting for us.  Evil I am.

Affected files ...

.. //depot/projects/smpng/sys/modules/crash2/crash2.c#5 edit

Differences ...

==== //depot/projects/smpng/sys/modules/crash2/crash2.c#5 (text+ko) ====

@@ -47,6 +47,7 @@
 #include <sys/kdb.h>
 #include <sys/kernel.h>
 #include <sys/kthread.h>
+#include <sys/linker.h>
 #include <sys/lock.h>
 #include <sys/module.h>
 #include <sys/mutex.h>
@@ -60,6 +61,10 @@
 
 #define	NTHREADS	4
 
+#ifndef __amd64__
+#define	USE_SET
+#endif
+
 typedef void (*event_handler)(void);
 
 struct crash2_event {
@@ -67,7 +72,9 @@
 	event_handler ev_handler[NTHREADS];
 };
 
+#ifdef USE_SET
 SET_DECLARE(crash2_event_set, struct crash2_event);
+#endif
 
 #define CRASH2_EVENT(name, func, ...)					\
 	_CRASH2_EVENT(name, __LINE__, func , ## __VA_ARGS__)
@@ -78,8 +85,16 @@
 	    { name, { func , ## __VA_ARGS__ } };			\
 	DATA_SET(crash2_event_set, crash2_event_ ## line)
 
+#ifdef USE_SET
 #define	MAX_EVENT	SET_COUNT(crash2_event_set)
+#else
+#define	MAX_EVENT	event_max
+#endif
 
+#ifndef USE_SET
+static int event_max;
+static struct crash2_event **event_start, **event_stop;
+#endif
 static struct cv event_cv;
 static struct mtx event_mtx;
 static struct proc *kthread[NTHREADS];
@@ -164,11 +179,19 @@
 {
 	struct crash2_event **ev;
 
+#ifdef USE_SET
 	SET_FOREACH(ev, crash2_event_set) {
+#else
+	for (ev = event_start; ev < event_stop; ev++) {
+#endif
 		/* Skip null event 0. */
 		if ((*ev)->ev_name == NULL)
 			continue;
+#ifdef USE_SET
 		printf("%4td  %s\n", ev - SET_BEGIN(crash2_event_set),
+#else
+		printf("%4td  %s\n", ev - event_start,
+#endif
 		    (*ev)->ev_name);
 	}
 }
@@ -240,7 +263,11 @@
 			printf("crash2[%d]: event %d is not defined!\n", i, ev);
 			continue;
 		}
+#ifdef USE_SET
 		evp = SET_ITEM(crash2_event_set, ev);
+#else
+		evp = event_start[ev];
+#endif
 		if (evp->ev_handler[i])
 			evp->ev_handler[i]();		
 		mtx_lock(&event_mtx);
@@ -317,6 +344,12 @@
 
 	switch (cmd) {
 	case MOD_LOAD:
+#ifndef USE_SET
+		error = linker_file_lookup_set(module_file(module),
+		    "crash2_event_set", &event_start, &event_stop, &event_max);
+		if (error)
+			break;
+#endif
 		error = load(arg);
 		break;
 	case MOD_UNLOAD:



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