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