cpufunc.h revision 798
1/*
2 * Functions to provide access to special i386 instructions.
3 * XXX - bezillions more are defined in locore.s but are not declared anywhere.
4 *
5 *	$Id: cpufunc.h,v 1.4 1993/11/07 17:42:47 wollman Exp $
6 */
7
8#ifndef _MACHINE_CPUFUNC_H_
9#define _MACHINE_CPUFUNC_H_ 1
10
11#include <sys/cdefs.h>
12#include <sys/types.h>
13
14#ifdef	__GNUC__
15
16static inline int bdb(void)
17{
18	extern int bdb_exists;
19
20	if (!bdb_exists)
21		return (0);
22	__asm("int $3");
23	return (1);
24}
25
26static inline void
27disable_intr(void)
28{
29	__asm __volatile("cli");
30}
31
32static inline void
33enable_intr(void)
34{
35	__asm __volatile("sti");
36}
37
38/*
39 * This roundabout method of returning a u_char helps stop gcc-1.40 from
40 * generating unnecessary movzbl's.
41 */
42#define	inb(port)	((u_char) u_int_inb(port))
43
44static inline u_int
45u_int_inb(u_int port)
46{
47	u_char	data;
48	/*
49	 * We use %%dx and not %1 here because i/o is done at %dx and not at
50	 * %edx, while gcc-2.2.2 generates inferior code (movw instead of movl)
51	 * if we tell it to load (u_short) port.
52	 */
53	__asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port));
54	return data;
55}
56
57static inline void
58outb(u_int port, u_char data)
59{
60	register u_char	al asm("ax");
61
62	al = data;		/* help gcc-1.40's register allocator */
63	__asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port));
64}
65
66static inline
67int
68imin(a, b)
69	int a, b;
70{
71
72	return (a < b ? a : b);
73}
74
75static inline
76int
77imax(a, b)
78	int a, b;
79{
80
81	return (a > b ? a : b);
82}
83
84static inline
85unsigned int
86min(a, b)
87	unsigned int a, b;
88{
89
90	return (a < b ? a : b);
91}
92
93static inline
94unsigned int
95max(a, b)
96	unsigned int a, b;
97{
98
99	return (a > b ? a : b);
100}
101
102static inline
103long
104lmin(a, b)
105	long a, b;
106{
107
108	return (a < b ? a : b);
109}
110
111static inline
112long
113lmax(a, b)
114	long a, b;
115{
116
117	return (a > b ? a : b);
118}
119
120static inline
121unsigned long
122ulmin(a, b)
123	unsigned long a, b;
124{
125
126	return (a < b ? a : b);
127}
128
129static inline
130unsigned long
131ulmax(a, b)
132	unsigned long a, b;
133{
134
135	return (a > b ? a : b);
136}
137
138static inline
139int
140ffs(mask)
141	register long mask;
142{
143	register int bit;
144
145	if (!mask)
146		return(0);
147	for (bit = 1;; ++bit) {
148		if (mask&0x01)
149			return(bit);
150		mask >>= 1;
151	}
152}
153
154static inline
155int
156bcmp(v1, v2, len)
157	void *v1, *v2;
158	register unsigned len;
159{
160	register u_char *s1 = v1, *s2 = v2;
161
162	while (len--)
163		if (*s1++ != *s2++)
164			return (1);
165	return (0);
166}
167
168static inline
169size_t
170strlen(s1)
171	register const char *s1;
172{
173	register size_t len;
174
175	for (len = 0; *s1++ != '\0'; len++)
176		;
177	return (len);
178}
179
180#else /* not __GNUC__ */
181
182int	bdb		__P((void));
183void	disable_intr	__P((void));
184void	enable_intr	__P((void));
185u_char	inb		__P((u_int port));
186void	outb		__P((u_int port, u_int data));	/* XXX - incompat */
187
188#endif	/* __GNUC__ */
189
190#define	really_u_int	int	/* XXX */
191#define	really_void	int	/* XXX */
192
193void	load_cr0	__P((u_int cr0));
194really_u_int	rcr0	__P((void));
195
196#ifdef notyet
197really_void	setidt	__P((int idx, /*XXX*/caddr_t func, int typ, int dpl));
198#endif
199
200#undef	really_u_int
201#undef	really_void
202
203#endif /* _MACHINE_CPUFUNC_H_ */
204