/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- inb
 - insl
 - outb
 - outw
 - outsl
 - stosb
 - stosl
 - lgdt
 - lidt
 - ltr
 - readeflags
 - loadgs
 - cli
 - sti
 - xchg
 - rcr2
 - lcr3
 
   1 // Routines to let C code use special x86 instructions.
   2 
   3 static inline uchar
   4 inb(ushort port)
   5 {
   6   uchar data;
   7 
   8   asm volatile("in %1,%0" : "=a" (data) : "d" (port));
   9   return data;
  10 }
  11 
  12 static inline void
  13 insl(int port, void *addr, int cnt)
  14 {
  15   asm volatile("cld; rep insl" :
  16                "=D" (addr), "=c" (cnt) :
  17                "d" (port), "0" (addr), "1" (cnt) :
  18                "memory", "cc");
  19 }
  20 
  21 static inline void
  22 outb(ushort port, uchar data)
  23 {
  24   asm volatile("out %0,%1" : : "a" (data), "d" (port));
  25 }
  26 
  27 static inline void
  28 outw(ushort port, ushort data)
  29 {
  30   asm volatile("out %0,%1" : : "a" (data), "d" (port));
  31 }
  32 
  33 static inline void
  34 outsl(int port, const void *addr, int cnt)
  35 {
  36   asm volatile("cld; rep outsl" :
  37                "=S" (addr), "=c" (cnt) :
  38                "d" (port), "0" (addr), "1" (cnt) :
  39                "cc");
  40 }
  41 
  42 static inline void
  43 stosb(void *addr, int data, int cnt)
  44 {
  45   asm volatile("cld; rep stosb" :
  46                "=D" (addr), "=c" (cnt) :
  47                "0" (addr), "1" (cnt), "a" (data) :
  48                "memory", "cc");
  49 }
  50 
  51 static inline void
  52 stosl(void *addr, int data, int cnt)
  53 {
  54   asm volatile("cld; rep stosl" :
  55                "=D" (addr), "=c" (cnt) :
  56                "0" (addr), "1" (cnt), "a" (data) :
  57                "memory", "cc");
  58 }
  59 
  60 struct segdesc;
  61 
  62 static inline void
  63 lgdt(struct segdesc *p, int size)
  64 {
  65   volatile ushort pd[3];
  66 
  67   pd[0] = size-1;
  68   pd[1] = (uint)p;
  69   pd[2] = (uint)p >> 16;
  70 
  71   asm volatile("lgdt (%0)" : : "r" (pd));
  72 }
  73 
  74 struct gatedesc;
  75 
  76 static inline void
  77 lidt(struct gatedesc *p, int size)
  78 {
  79   volatile ushort pd[3];
  80 
  81   pd[0] = size-1;
  82   pd[1] = (uint)p;
  83   pd[2] = (uint)p >> 16;
  84 
  85   asm volatile("lidt (%0)" : : "r" (pd));
  86 }
  87 
  88 static inline void
  89 ltr(ushort sel)
  90 {
  91   asm volatile("ltr %0" : : "r" (sel));
  92 }
  93 
  94 static inline uint
  95 readeflags(void)
  96 {
  97   uint eflags;
  98   asm volatile("pushfl; popl %0" : "=r" (eflags));
  99   return eflags;
 100 }
 101 
 102 static inline void
 103 loadgs(ushort v)
 104 {
 105   asm volatile("movw %0, %%gs" : : "r" (v));
 106 }
 107 
 108 static inline void
 109 cli(void)
 110 {
 111   asm volatile("cli");
 112 }
 113 
 114 static inline void
 115 sti(void)
 116 {
 117   asm volatile("sti");
 118 }
 119 
 120 static inline uint
 121 xchg(volatile uint *addr, uint newval)
 122 {
 123   uint result;
 124   
 125   // The + in "+m" denotes a read-modify-write operand.
 126   asm volatile("lock; xchgl %0, %1" :
 127                "+m" (*addr), "=a" (result) :
 128                "1" (newval) :
 129                "cc");
 130   return result;
 131 }
 132 
 133 static inline uint
 134 rcr2(void)
 135 {
 136   uint val;
 137   asm volatile("movl %%cr2,%0" : "=r" (val));
 138   return val;
 139 }
 140 
 141 static inline void
 142 lcr3(uint val) 
 143 {
 144   asm volatile("movl %0,%%cr3" : : "r" (val));
 145 }
 146 
 147 //PAGEBREAK: 36
 148 // Layout of the trap frame built on the stack by the
 149 // hardware and by trapasm.S, and passed to trap().
 150 struct trapframe {
 151   // registers as pushed by pusha
 152   uint edi;
 153   uint esi;
 154   uint ebp;
 155   uint oesp;      // useless & ignored
 156   uint ebx;
 157   uint edx;
 158   uint ecx;
 159   uint eax;
 160 
 161   // rest of trap frame
 162   ushort gs;
 163   ushort padding1;
 164   ushort fs;
 165   ushort padding2;
 166   ushort es;
 167   ushort padding3;
 168   ushort ds;
 169   ushort padding4;
 170   uint trapno;
 171 
 172   // below here defined by x86 hardware
 173   uint err;
 174   uint eip;
 175   ushort cs;
 176   ushort padding5;
 177   uint eflags;
 178 
 179   // below here only when crossing rings, such as from user to kernel
 180   uint esp;
 181   ushort ss;
 182   ushort padding6;
 183 };