openblt

a hobby OS from the late 90s
git clone http://frotz.net/git/openblt.git
Log | Files | Refs | LICENSE

i386.h (2252B)


      1 /* Copyright 1998-1999, Brian J. Swetland. All rights reserved.
      2 ** Distributed under the terms of the OpenBLT License
      3 */
      4 
      5 #ifndef _I386_H
      6 #define _I386_H
      7 
      8 typedef struct
      9 {
     10     uint16 link, __unused0;
     11     uint32 esp0;
     12     uint16 ss0,  __unused1;
     13     uint32 esp1;
     14     uint16 ss1,  __unused2;
     15     uint32 esp2;
     16     uint16 ss2,  __unused3;
     17     uint32 cr3,eip,eflags,eax,ecx,edx,ebx,esp,ebp,esi,edi;
     18     uint16 es,   __unused4;
     19     uint16 cs,   __unused5;
     20     uint16 ss,   __unused6;
     21     uint16 ds,   __unused7;
     22     uint16 fs,   __unused8;
     23     uint16 gs,   __unused9;
     24     uint16 ldts, __unused10;
     25     uint16 debugtrap, iomapbase;
     26 } TSS;
     27 
     28 typedef struct { uint32 edi, esi, ebp, esp, ebx, edx, ecx, eax; } regs;
     29 
     30 /* rights bits options */
     31 #define i386rPRESENT 0x80   /* segment is present */
     32 
     33 #define i386rDPL0    0x00
     34 #define i386rDPL1    0x20
     35 #define i386rDPL2    0x40
     36 #define i386rDPL3    0x60
     37 
     38 /* for Data/Code/TSS segments */
     39 #define i386rDATA    0x12   /* segment is data, read/write */
     40 #define i386rDATAro  0x10   /* segment is data, read only */
     41 #define i386rCODE    0x1A   /* segment is code, read/exec */
     42 #define i386rCODExo  0x18   /* segment is code, read only */
     43 
     44 #define i386rTSS     0x09   /* segment is an i386 TSS */
     45 
     46 /* gran bits options */
     47 #define i386g4K      0x80   /* segment gran is 4K (else 1B) */
     48 #define i386g32BIT   0x40   /* segment default is 32bit (else 16bit) */
     49 #define i386gAVL     0x10   /* segment AVL is set */
     50 
     51 void i386SetSegment(void *entry,
     52                     uint32 base, uint32 limit,
     53                     uint8 rights, uint8 gran);
     54 void i386SetTaskGate(void *entry, uint16 selector, uint8 rights);
     55 
     56 void i386ltr(uint32 selector);
     57 void i386lidt(uint32 base, uint32 limit);
     58 void i386lgdt(uint32 base, uint32 limit);
     59 uint32 *i386sgdt(uint32 *limit);
     60 
     61 #define I386_PAGING_ON() asm("push %eax; mov %cr0, %eax; orl $0x80000000,%eax ; mov %eax, %cr0 ; pop %eax");
     62 #define I386_PAGING_OFF() asm("push %eax; mov %cr0, %eax; andl $0x7FFFFFFF,%eax ; mov %eax, %cr0 ; pop %eax");
     63 
     64 void unmap_irqs(void);
     65 void remap_irqs(void);
     66 void unmask_irq(int irq);
     67 void mask_irq(int irq);
     68 void init_timer(void);
     69 
     70 void cli (void);
     71 void sti (void);
     72 void local_flush_tlb (void);
     73 void local_flush_pte (unsigned int addr);
     74 
     75 #endif /* _I386_H */
     76