x86.h

来自「美国mit操作系统课程所用的一个教学操作系统xv6」· C头文件 代码 · 共 156 行

H
156
字号
// Routines to let C code use special x86 instructions.static inline ucharinb(ushort port){  uchar data;  asm volatile("in %1,%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(ushort port, uchar data){  asm volatile("out %0,%1" : : "a" (data), "d" (port));}static inline voidoutw(ushort port, ushort data){  asm volatile("out %0,%1" : : "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");}static inline uintread_ebp(void){  uint ebp;    asm volatile("movl %%ebp, %0" : "=a" (ebp));  return ebp;}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)" : : "r" (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)" : : "r" (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 uintxchg(volatile uint *addr, uint newval){  uint result;    // The + in "+m" denotes a read-modify-write operand.  asm volatile("lock; xchgl %0, %1" :               "+m" (*addr), "=a" (result) :               "1" (newval) :               "cc");  return result;}static inline voidcli(void){  asm volatile("cli");}static inline voidsti(void){  asm volatile("sti");}// Layout of the trap frame built on the stack by the// hardware and by trapasm.S, and passed 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 + =
减小字号Ctrl + -
显示快捷键?