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

📄 x86.h

📁 类unix 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 + -