i440fx_config_space.hpp
00001 #if !defined(__I440FX_CONFIG_SPACE_HPP__)
00002 #define __I440FX_CONFIG_SPACE_HPP__
00003
00004
00005
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
00020
00021 uint8_t unused40_58[0x58-sizeof(pci_config_header64)+1];
00022
00023
00024
00025
00026 union pam
00027 {
00028 uint8_t raw;
00029
00030 struct __packed()
00031 {
00032 #if LITTLE_ENDIAN_BITFIELD
00033 unsigned enable_read : 1;
00034 unsigned enable_write : 1;
00035 unsigned reserved2_3 : 2;
00036 unsigned enable_read2 : 1;
00037 unsigned enable_write2 : 1;
00038 unsigned reserved6_7 : 2;
00039 #elif BIG_ENDIAN_BITFIELD
00040 unsigned reserved6_7 : 2;
00041 unsigned enable_write2 : 1;
00042 unsigned enable_read2 : 1;
00043 unsigned reserved2_3 : 2;
00044 unsigned enable_write : 1;
00045 unsigned enable_read : 1;
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
00058
00059 uint8_t unused60_71[0x71-0x5f];
00060
00061
00062
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;
00072 unsigned enable : 1;
00073 unsigned lock_space : 1;
00074 unsigned close_space : 1;
00075 unsigned open_space : 1;
00076 unsigned reserved7 : 1;
00077 #elif BIG_ENDIAN_BITFIELD
00078 unsigned reserved7 : 1;
00079 unsigned open_space : 1;
00080 unsigned close_space : 1;
00081 unsigned lock_space : 1;
00082 unsigned enable : 1;
00083 unsigned space_base_segment : 3;
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
00096
00097 uint8_t unused73_ff[0xff-0x72];
00098
00099
00100
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
00113