⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x86.h

📁 美国mit操作系统课程所用的一个教学操作系统xv6
💻 H
字号:
// 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -