Back to index

glibc  2.9
Classes | Defines | Typedefs | Functions
i386.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  GDT_slot
struct  IDT_slot
struct  DTR_load_save_format

Defines

#define disable_intr(isrlevel)
#define enable_intr(isrlevel)
#define delay(_microseconds)
#define outport_byte(_port, _value)
#define outport_word(_port, _value)
#define outport_long(_port, _value)
#define inport_byte(_port, _value)
#define inport_word(_port, _value)
#define inport_long(_port, _value)
#define EXTERN   extern
#define get_GDTR(_gdtr_address)
#define get_GDT_slot(_gdtr_base, _segment, _slot_address)
#define set_GDT_slot(_gdtr_base, _segment, _slot_address)

Typedefs

typedef unsigned char unsigned8
typedef unsigned short unsigned16
typedef unsigned int unsigned32

Functions

static unsigned16 get_cs ()
static unsigned16 get_ds ()
static unsigned16 get_es ()
static unsigned16 get_ss ()
static unsigned16 get_fs ()
static unsigned16 get_gs ()
void * Logical_to_physical (unsigned16 segment, void *address)
void * Physical_to_logical (unsigned16 segment, void *address)
static void set_segment (unsigned16 segment, unsigned32 base, unsigned32 limit)

Class Documentation

struct GDT_slot

Definition at line 184 of file i386.h.

Class Members
unsigned16 base_0_15
unsigned8 base_16_23
unsigned8 base_24_31
unsigned16 limit_0_15
unsigned8 limit_16_19_granularity
unsigned8 type_dt_dpl_p
struct IDT_slot

Definition at line 198 of file i386.h.

Class Members
unsigned16 offset_0_15
unsigned16 offset_16_31
unsigned8 p_dpl
unsigned8 reserved
unsigned16 segment_selector
struct DTR_load_save_format

Definition at line 206 of file i386.h.

Class Members
unsigned16 limit
unsigned32 physical_address

Define Documentation

#define delay (   _microseconds)
Value:
{ \
    unsigned32 _counter; \
    \
    _counter = (_microseconds); \
    \
    asm volatile ( "0: nop;" \
                 " mov %0,%0 ;" \
                 " loop 0" : "=c" (_counter) \
                                  : "0"  (_counter) \
               ); \
    \
  }

Definition at line 51 of file i386.h.

#define disable_intr (   isrlevel)
Value:
{ (isrlevel) = 0; \
    asm volatile ( "pushf ; \                 pop  %0 ; \                 cli   " \
                  : "=r" ((isrlevel)) : "0" ((isrlevel)) ); \
  }

Definition at line 36 of file i386.h.

#define enable_intr (   isrlevel)
Value:
{ asm volatile ( "push %0 ; \                 popf " \
                  : "=r" ((isrlevel)) : "0" ((isrlevel)) ); \
  }

Definition at line 45 of file i386.h.

#define EXTERN   extern

Definition at line 222 of file i386.h.

#define get_GDT_slot (   _gdtr_base,
  _segment,
  _slot_address 
)
Value:
{ \
    register unsigned32  _gdt_slot  = (_gdtr_base) + (_segment); \
    register volatile void    *_slot      = (_slot_address); \
    register unsigned32  _temporary = 0; \
    \
    asm volatile( "movl %%gs:(%0),%1 ; \            movl %1,(%2) ; \            movl %%gs:4(%0),%1 ; \             movl %1,4(%2)"  \
                   : "=r" (_gdt_slot), "=r" (_temporary), "=r" (_slot) \
                   : "0"  (_gdt_slot), "1"  (_temporary), "2"  (_slot) \
              );  \
  }

Definition at line 244 of file i386.h.

#define get_GDTR (   _gdtr_address)
Value:
{ \
    void                        *_gdtr = (_gdtr_address); \
    \
    asm volatile( "sgdt   (%0)" : "=r" (_gdtr) : "0" (_gdtr) ); \
  }

Definition at line 237 of file i386.h.

#define inport_byte (   _port,
  _value 
)
Value:
{ register unsigned16 __port  = _port; \
     register unsigned8  __value = 0; \
     \
     asm volatile ( "inb %1,%0" : "=a" (__value), "=d" (__port) \
                            : "0"   (__value), "1"  (__port) \
                ); \
     _value = __value; \
   }

Definition at line 150 of file i386.h.

#define inport_long (   _port,
  _value 
)
Value:
{ register unsigned16 __port  = _port; \
     register unsigned32 __value = 0; \
     \
     asm volatile ( "inl %1,%0" : "=a" (__value), "=d" (__port) \
                            : "0"   (__value), "1"  (__port) \
                ); \
     _value = __value; \
   }

Definition at line 170 of file i386.h.

#define inport_word (   _port,
  _value 
)
Value:
{ register unsigned16 __port  = _port; \
     register unsigned16 __value = 0; \
     \
     asm volatile ( "inw %1,%0" : "=a" (__value), "=d" (__port) \
                            : "0"   (__value), "1"  (__port) \
                ); \
     _value = __value; \
   }

Definition at line 160 of file i386.h.

#define outport_byte (   _port,
  _value 
)
Value:
{ register unsigned16 __port  = _port; \
     register unsigned8  __value = _value; \
     \
     asm volatile ( "outb %0,%1" : "=a" (__value), "=d" (__port) \
                             : "0"   (__value), "1"  (__port) \
                ); \
   }

Definition at line 123 of file i386.h.

#define outport_long (   _port,
  _value 
)
Value:
{ register unsigned16 __port  = _port; \
     register unsigned32 __value = _value; \
     \
     asm volatile ( "outl %0,%1" : "=a" (__value), "=d" (__port) \
                             : "0"   (__value), "1"  (__port) \
                ); \
   }

Definition at line 141 of file i386.h.

#define outport_word (   _port,
  _value 
)
Value:
{ register unsigned16 __port  = _port; \
     register unsigned16 __value = _value; \
     \
     asm volatile ( "outw %0,%1" : "=a" (__value), "=d" (__port) \
                             : "0"   (__value), "1"  (__port) \
                ); \
   }

Definition at line 132 of file i386.h.

#define set_GDT_slot (   _gdtr_base,
  _segment,
  _slot_address 
)
Value:
{ \
    register unsigned32  _gdt_slot  = (_gdtr_base) + (_segment); \
    register volatile void    *_slot      = (_slot_address); \
    register unsigned32  _temporary = 0; \
    \
    asm volatile( "movl (%2),%1 ; \                 movl %1,%%gs:(%0) ; \              movl 4(%2),%1 ; \           movl %1,%%gs:4(%0) \              " \
                   : "=r" (_gdt_slot), "=r" (_temporary), "=r" (_slot) \
                   : "0"  (_gdt_slot), "1"  (_temporary), "2"  (_slot) \
              );  \
  }

Definition at line 259 of file i386.h.


Typedef Documentation

typedef unsigned short unsigned16

Definition at line 33 of file i386.h.

typedef unsigned int unsigned32

Definition at line 34 of file i386.h.

typedef unsigned char unsigned8

Definition at line 32 of file i386.h.


Function Documentation

static unsigned16 get_cs ( ) [inline, static]

Definition at line 67 of file i386.h.

{
  register unsigned16 segment = 0;

  asm volatile ( "movw %%cs,%0" : "=r" (segment) : "0" (segment) );

  return segment;
}
static unsigned16 get_ds ( ) [inline, static]

Definition at line 76 of file i386.h.

{
  register unsigned16 segment = 0;

  asm volatile ( "movw %%ds,%0" : "=r" (segment) : "0" (segment) );

  return segment;
}
static unsigned16 get_es ( ) [inline, static]

Definition at line 85 of file i386.h.

{
  register unsigned16 segment = 0;

  asm volatile ( "movw %%es,%0" : "=r" (segment) : "0" (segment) );

  return segment;
}
static unsigned16 get_fs ( ) [inline, static]

Definition at line 103 of file i386.h.

{
  register unsigned16 segment = 0;

  asm volatile ( "movw %%fs,%0" : "=r" (segment) : "0" (segment) );

  return segment;
}
static unsigned16 get_gs ( ) [inline, static]

Definition at line 112 of file i386.h.

{
  register unsigned16 segment = 0;

  asm volatile ( "movw %%gs,%0" : "=r" (segment) : "0" (segment) );

  return segment;
}
static unsigned16 get_ss ( ) [inline, static]

Definition at line 94 of file i386.h.

{
  register unsigned16 segment = 0;

  asm volatile ( "movw %%ss,%0" : "=r" (segment) : "0" (segment) );

  return segment;
}
void* Logical_to_physical ( unsigned16  segment,
void *  address 
)
void* Physical_to_logical ( unsigned16  segment,
void *  address 
)
static void set_segment ( unsigned16  segment,
unsigned32  base,
unsigned32  limit 
) [inline, static]

Definition at line 275 of file i386.h.

{
  struct DTR_load_save_format  gdtr;
  volatile struct GDT_slot     Gdt_slot;
  volatile struct GDT_slot    *gdt_slot = &Gdt_slot;
  unsigned16             tmp_segment = 0;
  unsigned32             limit_adjusted;


  /* load physical address of the GDT */

  get_GDTR( &gdtr );

  gdt_slot->type_dt_dpl_p  = 0x92;             /* present, dpl=0,      */
                                          /* application=1,       */
                                          /* type=data read/write */
  gdt_slot->limit_16_19_granularity = 0x40;    /* 32 bit segment       */

  limit_adjusted = limit;
  if ( limit > 4095 ) {
    gdt_slot->limit_16_19_granularity |= 0x80; /* set granularity bit */
    limit_adjusted /= 4096;
  }

  gdt_slot->limit_16_19_granularity |= (limit_adjusted >> 16) & 0xff;
  gdt_slot->limit_0_15               = limit_adjusted & 0xffff;

  gdt_slot->base_0_15  = base & 0xffff;
  gdt_slot->base_16_23 = (base >> 16) & 0xff;
  gdt_slot->base_24_31 = (base >> 24);

  set_GDT_slot( gdtr.physical_address, segment, gdt_slot );

  /* Now, reload all segment registers so the limit takes effect. */

  asm volatile( "movw %%ds,%0 ; movw %0,%%ds\n"
              "movw %%es,%0 ; movw %0,%%es\n"
              "movw %%fs,%0 ; movw %0,%%fs\n"
              "movw %%gs,%0 ; movw %0,%%gs\n"
              "movw %%ss,%0 ; movw %0,%%ss"
                 : "=r" (tmp_segment)
                 : "0"  (tmp_segment)
             );

}