📄 x86.h
字号:
// Special assembly routines to access x86-specific// hardware instructions.static __inline ucharinb(int port){ uchar data; __asm __volatile("inb %w1,%0" : "=a" (data) : "d" (port)); return data;}static __inline voidinsl(int port, void *addr, int cnt){ __asm __volatile("cld\n\trepne\n\tinsl" : "=D" (addr), "=c" (cnt) : "d" (port), "0" (addr), "1" (cnt) : "memory", "cc");}static __inline voidoutb(int port, uchar data){ __asm __volatile("outb %0,%w1" : : "a" (data), "d" (port));}static __inline voidoutw(int port, ushort data){ __asm __volatile("outw %0,%w1" : : "a" (data), "d" (port));}static __inline voidoutsl(int port, const void *addr, int cnt){ __asm __volatile("cld\n\trepne\n\toutsl" : "=S" (addr), "=c" (cnt) : "d" (port), "0" (addr), "1" (cnt) : "cc");}struct segdesc;static __inline voidlgdt(struct segdesc *p, int size){ volatile ushort pd[3]; pd[0] = size-1; pd[1] = (uint)p; pd[2] = (uint)p >> 16; asm volatile("lgdt (%0)" : : "g" (pd));}struct gatedesc;static __inline voidlidt(struct gatedesc *p, int size){ volatile ushort pd[3]; pd[0] = size-1; pd[1] = (uint)p; pd[2] = (uint)p >> 16; asm volatile("lidt (%0)" : : "g" (pd));}static __inline voidltr(ushort sel){ __asm __volatile("ltr %0" : : "r" (sel));}static __inline uintread_eflags(void){ uint eflags; __asm __volatile("pushfl; popl %0" : "=r" (eflags)); return eflags;}static __inline voidwrite_eflags(uint eflags){ __asm __volatile("pushl %0; popfl" : : "r" (eflags));}static __inline voidcpuid(uint info, uint *eaxp, uint *ebxp, uint *ecxp, uint *edxp){ uint eax, ebx, ecx, edx; asm volatile("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (info)); if(eaxp) *eaxp = eax; if(ebxp) *ebxp = ebx; if(ecxp) *ecxp = ecx; if(edxp) *edxp = edx;}static __inline uintcmpxchg(uint oldval, uint newval, volatile uint* lock_addr){ uint result; __asm__ __volatile__("lock; cmpxchgl %2, %0" : "+m" (*lock_addr), "=a" (result) : "r"(newval), "1"(oldval) : "cc"); return result;}static __inline voidcli(void){ __asm__ volatile("cli");}static __inline voidsti(void){ __asm__ volatile("sti");}// Layout of the trap frame on the stack upon entry to trap.struct trapframe { // registers as pushed by pusha uint edi; uint esi; uint ebp; uint oesp; // useless & ignored uint ebx; uint edx; uint ecx; uint eax; // rest of trap frame ushort es; ushort padding1; ushort ds; ushort padding2; uint trapno; // below here defined by x86 hardware uint err; uint eip; ushort cs; ushort padding3; uint eflags; // below here only when crossing rings, such as from user to kernel uint esp; ushort ss; ushort padding4;};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -