Overview   API Reference  

i440fx_config_space.hpp

00001 #if !defined(__I440FX_CONFIG_SPACE_HPP__)
00002 #define __I440FX_CONFIG_SPACE_HPP__
00003 
00004 //
00005 // local includes
00006 //
00007 #include "core/machine/pci/pci_config_space.hpp"
00008 
00014 struct __packed(i440fx_config_space) : public pci_config_header64
00015 {
00016     static const uint8_t MAX_PAM_REGISTERS = 7;
00017 
00018     //
00019     // these registers are defined but useless for software emulation
00020     //
00021     uint8_t unused40_58[0x58-sizeof(pci_config_header64)+1];
00022 
00023     //
00024     // Programmable Attribute Map (PAM) registers at offsets: 0x59 - 0x5f
00025     //
00026     union pam
00027     {
00028         uint8_t raw;
00029 
00030         struct __packed()
00031         {
00032           #if LITTLE_ENDIAN_BITFIELD
00033             unsigned enable_read        : 1;    // bit 0
00034             unsigned enable_write       : 1;    // bit 1
00035             unsigned reserved2_3        : 2;    // bit 2-3
00036             unsigned enable_read2       : 1;    // bit 4
00037             unsigned enable_write2      : 1;    // bit 5
00038             unsigned reserved6_7        : 2;    // bit 6-7
00039           #elif BIG_ENDIAN_BITFIELD
00040             unsigned reserved6_7        : 2;    // bit 6-7
00041             unsigned enable_write2      : 1;    // bit 5
00042             unsigned enable_read2       : 1;    // bit 4
00043             unsigned reserved2_3        : 2;    // bit 2-3
00044             unsigned enable_write       : 1;    // bit 1
00045             unsigned enable_read        : 1;    // bit 0
00046           #else
00047             #error unknown bitfield order. fix this.
00048           #endif
00049         };
00050 
00051         ACCESS_FUNCTORS(pam&, uint8_t, raw)
00052         NUMERIC_ACCESS_OPERATORS(pam&, uint8_t, raw)
00053         INCREMENT_OPERATORS(pam, raw)
00054     } pam[7];
00055 
00056     //
00057     // reserved or useless
00058     //
00059     uint8_t unused60_71[0x71-0x5f];
00060 
00061     //
00062     // System Management RAM (SMRAM) control register at offset: 0x72
00063     //
00064     union smram
00065     {
00066         uint8_t raw;
00067 
00068         struct __packed()
00069         {
00070           #if LITTLE_ENDIAN_BITFIELD
00071             unsigned space_base_segment : 3;    // bit 0-2
00072             unsigned enable             : 1;    // bit 3
00073             unsigned lock_space         : 1;    // bit 4
00074             unsigned close_space        : 1;    // bit 5
00075             unsigned open_space         : 1;    // bit 6
00076             unsigned reserved7          : 1;    // bit 7
00077           #elif BIG_ENDIAN_BITFIELD
00078             unsigned reserved7          : 1;    // bit 7
00079             unsigned open_space         : 1;    // bit 6
00080             unsigned close_space        : 1;    // bit 5
00081             unsigned lock_space         : 1;    // bit 4
00082             unsigned enable             : 1;    // bit 3
00083             unsigned space_base_segment : 3;    // bit 0-2
00084           #else
00085             #error unknown bitfield order. fix this.
00086           #endif
00087         };
00088 
00089         ACCESS_FUNCTORS(smram&, uint8_t, raw)
00090         NUMERIC_ACCESS_OPERATORS(smram&, uint8_t, raw)
00091         INCREMENT_OPERATORS(smram, raw)
00092     } smram;
00093 
00094     //
00095     // dito: reserved or useless
00096     //
00097     uint8_t unused73_ff[0xff-0x72];
00098 
00099     //
00100     // constructor
00101     //
00102     i440fx_config_space(void)
00103     {
00104         memset(this, 0, static_unsigned_min<sizeof(i440fx_config_space), 256>::value);
00105     }
00106 };
00107 
00108 static_assert(sizeof(i440fx_config_space) == 256, "i440fx_config_space's size must be 256");
00109 
00110 #endif
00111 
00112 // ***** end of source ***** //
00113 

L4vmm Reference Manual, written by Mario Schwalbe  © 2006-2008