cpufunc.h revision 879
11573Srgrimes/*
21573Srgrimes * Functions to provide access to special i386 instructions.
31573Srgrimes * XXX - bezillions more are defined in locore.s but are not declared anywhere.
41573Srgrimes *
51573Srgrimes *	$Id: cpufunc.h,v 1.5 1993/11/25 01:31:07 wollman Exp $
61573Srgrimes */
71573Srgrimes
81573Srgrimes#ifndef _MACHINE_CPUFUNC_H_
91573Srgrimes#define _MACHINE_CPUFUNC_H_ 1
101573Srgrimes
111573Srgrimes#include <sys/cdefs.h>
121573Srgrimes#include <sys/types.h>
131573Srgrimes
141573Srgrimes#ifdef	__GNUC__
151573Srgrimes
161573Srgrimesstatic inline int bdb(void)
171573Srgrimes{
181573Srgrimes	extern int bdb_exists;
191573Srgrimes
201573Srgrimes	if (!bdb_exists)
211573Srgrimes		return (0);
221573Srgrimes	__asm("int $3");
231573Srgrimes	return (1);
241573Srgrimes}
251573Srgrimes
261573Srgrimesstatic inline void
271573Srgrimesdisable_intr(void)
2864243Skris{
2964243Skris	__asm __volatile("cli");
301573Srgrimes}
311573Srgrimes
321573Srgrimesstatic inline void
331573Srgrimesenable_intr(void)
341573Srgrimes{
351573Srgrimes	__asm __volatile("sti");
361573Srgrimes}
377151Sphk
381573Srgrimes/*
397764Sjoerg * This roundabout method of returning a u_char helps stop gcc-1.40 from
407764Sjoerg * generating unnecessary movzbl's.
411573Srgrimes */
421573Srgrimes#define	inb(port)	((u_char) u_int_inb(port))
431573Srgrimes
441573Srgrimesstatic inline u_int
457151Sphku_int_inb(u_int port)
467764Sjoerg{
471573Srgrimes	u_char	data;
481573Srgrimes	/*
497764Sjoerg	 * We use %%dx and not %1 here because i/o is done at %dx and not at
507764Sjoerg	 * %edx, while gcc-2.2.2 generates inferior code (movw instead of movl)
517764Sjoerg	 * if we tell it to load (u_short) port.
527764Sjoerg	 */
531573Srgrimes	__asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port));
541573Srgrimes	return data;
551573Srgrimes}
561573Srgrimes
577764Sjoergstatic inline void
587764Sjoergoutb(u_int port, u_char data)
597764Sjoerg{
607764Sjoerg	register u_char	al asm("ax");
617764Sjoerg
627764Sjoerg	al = data;		/* help gcc-1.40's register allocator */
637764Sjoerg	__asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port));
647764Sjoerg}
657764Sjoerg
667764Sjoergstatic inline
677764Sjoergint
687764Sjoergimin(a, b)
697764Sjoerg	int a, b;
707764Sjoerg{
717764Sjoerg
727764Sjoerg	return (a < b ? a : b);
737764Sjoerg}
747764Sjoerg
757764Sjoergstatic inline
767764Sjoergint
777764Sjoergimax(a, b)
787764Sjoerg	int a, b;
797764Sjoerg{
807764Sjoerg
817764Sjoerg	return (a > b ? a : b);
827764Sjoerg}
837764Sjoerg
847764Sjoergstatic inline
857764Sjoergunsigned int
867764Sjoergmin(a, b)
877764Sjoerg	unsigned int a, b;
887764Sjoerg{
897764Sjoerg
907764Sjoerg	return (a < b ? a : b);
917764Sjoerg}
927764Sjoerg
937764Sjoergstatic inline
947764Sjoergunsigned int
957764Sjoergmax(a, b)
967764Sjoerg	unsigned int a, b;
977764Sjoerg{
987764Sjoerg
997764Sjoerg	return (a > b ? a : b);
1007764Sjoerg}
1017764Sjoerg
1027764Sjoergstatic inline
1037764Sjoerglong
1047764Sjoerglmin(a, b)
1057764Sjoerg	long a, b;
1067764Sjoerg{
1077764Sjoerg
1087764Sjoerg	return (a < b ? a : b);
1097764Sjoerg}
1107764Sjoerg
1117764Sjoergstatic inline
1127764Sjoerglong
1137764Sjoerglmax(a, b)
1147764Sjoerg	long a, b;
1157764Sjoerg{
1167764Sjoerg
1177764Sjoerg	return (a > b ? a : b);
1187764Sjoerg}
1197764Sjoerg
1207764Sjoergstatic inline
1217764Sjoergunsigned long
1227764Sjoergulmin(a, b)
1237764Sjoerg	unsigned long a, b;
1247764Sjoerg{
1257764Sjoerg
1267764Sjoerg	return (a < b ? a : b);
1277764Sjoerg}
1287764Sjoerg
1297764Sjoergstatic inline
1307764Sjoergunsigned long
1317764Sjoergulmax(a, b)
1327764Sjoerg	unsigned long a, b;
1337764Sjoerg{
1347764Sjoerg
1357764Sjoerg	return (a > b ? a : b);
1367764Sjoerg}
1377764Sjoerg
1387764Sjoergstatic inline
1397764Sjoergint
1407764Sjoergffs(mask)
1417764Sjoerg	register long mask;
1427764Sjoerg{
1437764Sjoerg	register int bit;
1447764Sjoerg
1457764Sjoerg	if (!mask)
1467764Sjoerg		return(0);
14764243Skris	for (bit = 1;; ++bit) {
14864243Skris		if (mask&0x01)
1497764Sjoerg			return(bit);
1507764Sjoerg		mask >>= 1;
1517764Sjoerg	}
1527764Sjoerg}
1537764Sjoerg
1547764Sjoergstatic inline
1557764Sjoergint
1567764Sjoergbcmp(v1, v2, len)
1577764Sjoerg	void *v1, *v2;
1587764Sjoerg	register unsigned len;
1597764Sjoerg{
1607764Sjoerg	register u_char *s1 = v1, *s2 = v2;
1617764Sjoerg
1627764Sjoerg	while (len--)
1637764Sjoerg		if (*s1++ != *s2++)
1647764Sjoerg			return (1);
1657764Sjoerg	return (0);
1667764Sjoerg}
1677764Sjoerg
1687764Sjoergstatic inline
1697764Sjoergsize_t
1707764Sjoergstrlen(s1)
1717764Sjoerg	register const char *s1;
1727764Sjoerg{
1738870Srgrimes	register size_t len;
1747764Sjoerg
1757764Sjoerg	for (len = 0; *s1++ != '\0'; len++)
1767764Sjoerg		;
1777764Sjoerg	return (len);
1787764Sjoerg}
1797764Sjoerg
1807764Sjoergstruct quehead {
1817764Sjoerg	struct quehead *qh_link;
1827764Sjoerg	struct quehead *qh_rlink;
1837764Sjoerg};
1847764Sjoerg
1857764Sjoergstatic inline void
1867764Sjoerginsque(void *a, void *b)
1877764Sjoerg{
1887764Sjoerg	register struct quehead *element = a, *head = b;
1897764Sjoerg	element->qh_link = head->qh_link;
1908870Srgrimes	head->qh_link = (struct quehead *)element;
1917764Sjoerg	element->qh_rlink = (struct quehead *)head;
1927764Sjoerg	((struct quehead *)(element->qh_link))->qh_rlink
1937764Sjoerg	  = (struct quehead *)element;
1947764Sjoerg}
1957764Sjoerg
1967764Sjoergstatic inline void
1977764Sjoergremque(void *a)
1987764Sjoerg{
1997764Sjoerg	register struct quehead *element = a;
2007764Sjoerg	((struct quehead *)(element->qh_link))->qh_rlink = element->qh_rlink;
2017764Sjoerg	((struct quehead *)(element->qh_rlink))->qh_link = element->qh_link;
2027764Sjoerg	element->qh_rlink = 0;
2037764Sjoerg}
2047764Sjoerg
2057764Sjoerg#else /* not __GNUC__ */
2067764Sjoergextern	void insque __P((void *, void *));
2077764Sjoergextern	void remque __P((void *));
2087764Sjoerg
2097764Sjoergint	bdb		__P((void));
2107764Sjoergvoid	disable_intr	__P((void));
2117764Sjoergvoid	enable_intr	__P((void));
2127764Sjoergu_char	inb		__P((u_int port));
2137764Sjoergvoid	outb		__P((u_int port, u_int data));	/* XXX - incompat */
2147764Sjoerg
2157764Sjoerg#endif	/* __GNUC__ */
2167764Sjoerg
2177764Sjoergvoid	load_cr0	__P((u_int cr0));
2187764Sjoergu_int	rcr0	__P((void));
2197764Sjoergvoid load_cr3(u_long);
2207764Sjoergu_long rcr3(void);
2217764Sjoergu_long rcr2(void);
2227764Sjoerg
2237764Sjoergvoid	setidt	__P((int, void (*)(), int, int));
2247764Sjoergextern u_long kvtop(void *);
2257764Sjoergextern void tlbflush(void);
2267764Sjoergextern void outw(int /*u_short*/, int /*u_short*/); /* XXX inline!*/
2277764Sjoergextern void outsb(int /*u_short*/, caddr_t, size_t);
2287764Sjoergextern void outsw(int /*u_short*/, caddr_t, size_t);
2297764Sjoergextern void insw(int /*u_short*/, caddr_t, size_t);
2307764Sjoergextern void fillw(int /*u_short*/, caddr_t, size_t);
2317764Sjoerg
2327764Sjoerg#endif /* _MACHINE_CPUFUNC_H_ */
2337764Sjoerg