00001 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #ifndef ZYGOMA_IA32_IDT_H_ 
00025 #define ZYGOMA_IA32_IDT_H_ 
00026 
00027 #include <config.h>
00028 #include <iosfwd>
00029 #include <list>
00030 #include <types.h>
00031 #include <vector>
00032 
00033 namespace Zygoma
00034 {
00035   namespace ia32
00036   {
00040     enum Faults
00041     {
00042       kFAULT_DIVIDE_ERROR = 0,    
00043       kFAULT_RESERVED_1 = 1,      
00044       kFAULT_NMI = 2,             
00045       kFAULT_BREAKPOINT = 3,      
00046       kFAULT_OVERFLOW = 4,        
00047       kFAULT_BOUND_EXCEEDED = 5,  
00048       kFAULT_INVALID_OPCODE = 6,  
00049       kFAULT_DEVICE_NOT_AVAILABLE,
00050       kFAULT_DOUBLE_FAULT = 8,    
00051       kFAULT_SEGMENT_OVERRUN = 9, 
00052       kFAULT_INVALID_TSS = 10,    
00053       kFAULT_SEGMENT_NOT_PRESENT, 
00054       kFAULT_STACK_SEGMENT_FAULT, 
00055       kFAULT_GENERAL_PROTECTION,  
00056       kFAULT_PAGE_FAULT = 14,     
00057       kFAULT_RESERVED_15,
00058       kFAULT_FPU_ERROR = 16,      
00059       kFAULT_ALIGNMENT_CHECK,     
00060       kFAULT_MACHINE_CHECK = 18,  
00061       kFAULT_SIMD_EXCEPTION = 19, 
00062       kFAULT_RESERVED_20
00063     };
00064 
00065 
00076     class InterruptGate
00077     {
00078     public:
00080       InterruptGate(u16 segment = 0,
00081                     u32 offset = 0,
00082                     u08 privilegeLevel = 0,
00083                     bool isTrap = false);
00084 
00086       std::ostream& printStream(std::ostream& ostr) const;
00087 
00088     private:
00089       u16 m_offset00_15;      
00090       u16 m_segment;
00091       u08 m_unused2;
00092       u08 m_type:3;               
00093       u08 m_size:1;               
00094       u08 m_isSystemDescriptor:1; 
00095       u08 m_privilegeLevel:2;
00096       u08 m_segmentIsPresent:1;   
00097       u16 m_offset16_31;
00098     } ZYGOMA_PACKED;
00099 
00100 
00107     inline std::ostream&
00108     operator<<(std::ostream& ostr, const InterruptGate& gate)
00109     {
00110       return gate.printStream(ostr);
00111     }
00112 
00113 
00118     typedef bool (*InterruptHandlerTrampoline)(int interruptNumber);
00119 
00120 
00168     class IDT
00169     {
00170       typedef std::list<InterruptHandlerTrampoline> InterruptHandlerChain;
00171       typedef std::vector<InterruptHandlerChain>    InterruptHandlerDispatchTable;
00172       typedef std::vector<InterruptGate>            InternalIdt;
00173 
00174     public:
00175       typedef InterruptGate               value_type;
00176       typedef InterruptGate&              reference;
00177       typedef const InterruptGate&        const_reference;
00178       typedef InternalIdt::iterator       iterator;
00179       typedef InternalIdt::const_iterator const_iterator;
00180       typedef std::ptrdiff_t              difference_type;
00181       typedef std::size_t                 size_type;
00182 
00183     public:
00184       IDT(int size);
00185 
00187       
00188 
00194       size_type
00195       size() const
00196       { return m_idt.size(); }
00197 
00203       bool
00204       empty() const
00205       { return m_idt.empty(); }
00206 
00207       
00208 
00210       
00211 
00214       iterator
00215       begin()
00216       {
00217         return m_idt.begin();
00218       }
00219 
00222       const_iterator
00223       begin() const
00224       {
00225         return m_idt.begin();
00226       }
00227 
00230       iterator
00231       end()
00232       {
00233         return m_idt.end();
00234       }
00235 
00238       const_iterator
00239       end() const
00240       {
00241         return m_idt.end();
00242       }
00243 
00244       
00245 
00246       void
00247       insert(unsigned int irq, const InterruptGate&);
00248 
00249       void
00250       dispatchInterrupt(int interruptNumber);
00251 
00253       void
00254       disableInterrupts();
00255 
00257       void
00258       enableInterrupts();
00259 
00261       std::ostream& printStream(std::ostream& ostr) const;
00262 
00263     private:
00264       IDT(const IDT&);              
00265       IDT& operator=(const IDT&);   
00266 
00267     private:
00268       InternalIdt                   m_idt;
00269       InterruptHandlerDispatchTable m_interruptHandlerDispatchTable;
00270     };
00271 
00272 
00279     inline std::ostream&
00280     operator<<(std::ostream& ostr, const IDT& idt)
00281     {
00282       return idt.printStream(ostr);
00283     }
00284 
00290     extern IDT* gIDT;
00291   } 
00292 } 
00293 
00294 #endif // ZYGOMA_IA32_IDT_H_