cpufunc.h revision 5
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
6#include <sys/cdefs.h>
7#include <sys/types.h>
8
9#ifdef	__GNUC__
10
11static __inline int bdb(void)
12{
13	extern int bdb_exists;
14
15	if (!bdb_exists)
16		return (0);
17	__asm("int $3");
18	return (1);
19}
20
21static __inline void
22disable_intr(void)
23{
24	__asm __volatile("cli");
25}
26
27static __inline void
28enable_intr(void)
29{
30	__asm __volatile("sti");
31}
32
33/*
34 * This roundabout method of returning a u_char helps stop gcc-1.40 from
35 * generating unnecessary movzbl's.
36 */
37#define	inb(port)	((u_char) u_int_inb(port))
38
39static __inline u_int
40u_int_inb(u_int port)
41{
42	u_char	data;
43	/*
44	 * We use %%dx and not %1 here because i/o is done at %dx and not at
45	 * %edx, while gcc-2.2.2 generates inferior code (movw instead of movl)
46	 * if we tell it to load (u_short) port.
47	 */
48	__asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port));
49	return data;
50}
51
52static __inline void
53outb(u_int port, u_char data)
54{
55	register u_char	al asm("ax");
56
57	al = data;		/* help gcc-1.40's register allocator */
58	__asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port));
59}
60
61#else /* not __GNUC__ */
62
63int	bdb		__P((void));
64void	disable_intr	__P((void));
65void	enable_intr	__P((void));
66u_char	inb		__P((u_int port));
67void	outb		__P((u_int port, u_int data));	/* XXX - incompat */
68
69#endif	/* __GNUC__ */
70
71#define	really_u_int	int	/* XXX */
72#define	really_void	int	/* XXX */
73
74void	load_cr0	__P((u_int cr0));
75really_u_int	rcr0	__P((void));
76
77#ifdef notyet
78really_void	setidt	__P((int idx, /*XXX*/caddr_t func, int typ, int dpl));
79#endif
80
81#undef	really_u_int
82#undef	really_void
83