1343171Sdimstatic inline uint8_t
2343171Sdiminb(uint16_t port)
3353358Sdim{
4353358Sdim        uint8_t rv;
5353358Sdim
6343171Sdim        __asm__ __volatile__("inb %1, %0" : "=a"(rv) : "d"(port));
7343171Sdim
8343171Sdim        return rv;
9343171Sdim}
10343171Sdim
11343171Sdimstatic inline uint32_t
12343171Sdiminl(uint16_t port)
13343171Sdim{
14343171Sdim        uint32_t rv;
15343171Sdim
16343171Sdim        __asm__ __volatile__("inl %1, %0" : "=a"(rv) : "d"(port));
17343171Sdim
18343171Sdim        return rv;
19360784Sdim}
20343171Sdim
21343171Sdimstatic inline void
22343171Sdimoutb(uint16_t port, uint8_t value)
23343171Sdim{
24360784Sdim
25360784Sdim        __asm__ __volatile__("outb %0, %1" :: "a"(value), "d"(port));
26343171Sdim}
27343171Sdim
28343171Sdimstatic inline void
29343171Sdimoutl(uint16_t port, uint32_t value)
30343171Sdim{
31343171Sdim
32343171Sdim        __asm__ __volatile__("outl %0, %1" :: "a"(value), "d"(port));
33343171Sdim}
34343171Sdim
35343171Sdimextern int spldepth;
36343171Sdim
37343171Sdimstatic inline void
38343171Sdimsplhigh(void)
39343171Sdim{
40343171Sdim
41343171Sdim	__asm__ __volatile__("cli");
42343171Sdim	spldepth++;
43343171Sdim}
44343171Sdim
45343171Sdimstatic inline void
46343171Sdimspl0(void)
47343171Sdim{
48343171Sdim
49343171Sdim	if (spldepth == 0)
50343171Sdim		bmk_platform_halt("out of interrupt depth!");
51343171Sdim	if (--spldepth == 0)
52343171Sdim		__asm__ __volatile__("sti");
53343171Sdim}
54343171Sdim
55343171Sdimstatic inline void
56343171Sdimhlt(void)
57343171Sdim{
58
59	__asm__ __volatile__("hlt");
60}
61
62static inline uint64_t
63rdtsc(void)
64{
65	uint64_t val;
66	unsigned long eax, edx;
67
68	__asm__ __volatile__("rdtsc" : "=a"(eax), "=d"(edx));
69	val = ((uint64_t)edx<<32)|(eax);
70	return val;
71}
72