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