nuclear@1: #ifndef ASMOPS_H_ nuclear@1: #define ASMOPS_H_ nuclear@1: nuclear@43: #include nuclear@43: nuclear@42: /* general purpose registers as they are pushed by pusha */ nuclear@42: struct registers { nuclear@42: uint32_t edi, esi, ebp, esp; nuclear@42: uint32_t ebx, edx, ecx, eax; nuclear@42: } __attribute__ ((packed)); nuclear@42: nuclear@10: #define enable_intr() asm volatile("sti") nuclear@10: #define disable_intr() asm volatile("cli") nuclear@10: #define halt_cpu() asm volatile("hlt") nuclear@10: nuclear@54: #define push_regs() asm volatile("pusha"); nuclear@54: #define pop_regs() asm volatile("popa"); nuclear@54: nuclear@1: #define inb(dest, port) asm volatile( \ nuclear@1: "inb %1, %0\n\t" \ nuclear@2: : "=a" ((unsigned char)(dest)) \ nuclear@2: : "dN" ((unsigned short)(port))) nuclear@1: nuclear@10: #define inw(dest, port) asm volatile( \ nuclear@10: "inw %1, %0\n\t" \ nuclear@2: : "=a" ((unsigned short)(dest)) \ nuclear@2: : "dN" ((unsigned short)(port))) nuclear@1: nuclear@1: #define inl(dest, port) asm volatile( \ nuclear@1: "inl %1, %0\n\t" \ nuclear@2: : "=a" ((unsigned long)(dest)) \ nuclear@2: : "dN" ((unsigned short)(port))) nuclear@1: nuclear@1: #define outb(src, port) asm volatile( \ nuclear@1: "outb %0, %1\n\t" \ nuclear@2: :: "a" ((unsigned char)(src)), "dN" ((unsigned short)(port))) nuclear@1: nuclear@10: #define outw(src, port) asm volatile( \ nuclear@10: "outw %0, %1\n\t" \ nuclear@2: :: "a" ((unsigned short)(src)), "dN" ((unsigned short)(port))) nuclear@1: nuclear@1: #define outl(src, port) asm volatile( \ nuclear@1: "outl %0, %1\n\t" \ nuclear@2: :: "a" ((unsigned long)(src)), "dN" ((unsigned short)(port))) nuclear@1: nuclear@36: #define iodelay() outb(0, 0x80) nuclear@36: nuclear@54: nuclear@1: #endif /* ASMOPS_H_ */