160193Storek /*
2*62431Sbostic  * Copyright (c) 1993
3*62431Sbostic  *	The Regents of the University of California.  All rights reserved.
460193Storek  *
560193Storek  * %sccs.include.redist.c%
660193Storek  */
760193Storek 
860193Storek #ifndef lint
9*62431Sbostic static char sccsid[] = "@(#)getdev.c	8.1 (Berkeley) 06/06/93";
1060193Storek #endif /* not lint */
1160193Storek 
1260193Storek #include <sys/types.h>
1360193Storek #include <sys/device.h>
1460193Storek 
1560193Storek #include <kvm.h>
1660193Storek 
1760193Storek #include "getdev.h"
1860193Storek 
1960193Storek extern kvm_t *kd;
2060193Storek 
2160193Storek extern void errexit __P((const char *, ...));
2260193Storek extern void kread __P((u_long, void *, size_t, char *));
2360193Storek 
2460193Storek /*
2560193Storek  * Read in devices and add those whose predicate matches.
2660193Storek  */
2760193Storek void
getdev(alladdr,take,add)2860193Storek getdev(alladdr, take, add)
2960193Storek 	u_long alladdr;
3060193Storek 	int (*take) __P((struct device *));
3160193Storek 	void (*add) __P((u_long, struct device *));
3260193Storek {
3360193Storek 	register u_long addr;
3460193Storek 	struct device dev, *alldevs;
3560193Storek 
3660193Storek 	kread(alladdr, &alldevs, sizeof(alldevs), "alldevs");
3760193Storek 	for (addr = (u_long)alldevs; addr != 0; addr = (u_long)dev.dv_next) {
3860193Storek 		kread(addr, &dev, sizeof(dev), "(device)");
3960193Storek 		if (take(&dev))
4060193Storek 			add(addr, &dev);
4160193Storek 	}
4260193Storek }
43