vector-uefi/fd/tool/chipsec/chipset.py
#!/usr/local/bin/python
#CHIPSEC: Platform Security Assessment Framework
#Copyright (c) 2010-2014, Intel Corporation
#
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; Version 2.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
#Contact information:
#chipsec@intel.com
#
# -------------------------------------------------------------------------------
#
# CHIPSEC: Platform Hardware Security Assessment Framework
# (c) 2010-2012 Intel Corporation
#
# -------------------------------------------------------------------------------
## \addtogroup core
# __chipsec/chipset.py__ -- Contains platform identification functions
#
#
__version__ = '1.0'
import sys
import collections
from chipsec.helper.oshelper import OsHelper, OsHelperError
from chipsec.hal.pci import Pci
from chipsec.hal.physmem import Memory
from chipsec.hal.msr import Msr
from chipsec.hal.ucode import Ucode
from chipsec.hal.io import PortIO
from chipsec.hal.cpuid import CpuID
from chipsec.cfg.common import Cfg
from chipsec.logger import logger
#_importlib = True
#try: import importlib
#except ImportError: _importlib = False
#
##################################################################################
# Functionality defining current chipset
##################################################################################
CHIPSET_ID_COMMON = -1
CHIPSET_ID_UNKNOWN = 0
CHIPSET_ID_SNB = 1
CHIPSET_ID_JKT = 2
CHIPSET_ID_IVB = 3
CHIPSET_ID_IVT = 4
CHIPSET_ID_HSW = 5
CHIPSET_ID_BYT = 6
CHIPSET_CODE_COMMON = 'COMMON'
CHIPSET_CODE_UNKNOWN = ''
CHIPSET_CODE_SNB = 'SNB'
CHIPSET_CODE_JKT = 'JKT'
CHIPSET_CODE_IVB = 'IVB'
CHIPSET_CODE_IVT = 'IVT'
CHIPSET_CODE_HSW = 'HSW'
CHIPSET_CODE_BYT = 'BYT'
VID_INTEL = 0x8086
# PCI 0/0/0 Device IDs
Chipset_Dictionary = {
# DID : Data Dictionary
# 2nd Generation Core Processor Family (Sandy Bridge)
0x0100 : {'name' : 'Sandy Bridge', 'id' : CHIPSET_ID_SNB , 'code' : CHIPSET_CODE_SNB, 'longname' : 'Desktop 2nd Generation Core Processor (Sandy Bridge CPU / Cougar Point PCH)' },
0x0104 : {'name' : 'Sandy Bridge', 'id' : CHIPSET_ID_SNB , 'code' : CHIPSET_CODE_SNB, 'longname' : 'Mobile 2nd Generation Core Processor (Sandy Bridge CPU / Cougar Point PCH)' },
0x0108 : {'name' : 'Sandy Bridge', 'id' : CHIPSET_ID_SNB , 'code' : CHIPSET_CODE_SNB, 'longname' : 'Intel Xeon Processor E3-1200 (Sandy Bridge CPU, C200 Series PCH)' },
0x3C00 : {'name' : 'Jaketown', 'id' : CHIPSET_ID_JKT, 'code' : CHIPSET_CODE_JKT, 'longname' : 'Server 2nd Generation Core Processor (Jaketown CPU / Patsburg PCH)'},
# 3rd Generation Core Processor Family (Ivy Bridge)
0x0150 : {'name' : 'Ivy Bridge', 'id' : CHIPSET_ID_IVB , 'code' : CHIPSET_CODE_IVB, 'longname' : 'Desktop 3rd Generation Core Processor (Ivy Bridge CPU / Panther Point PCH)' },
0x0154 : {'name' : 'Ivy Bridge', 'id' : CHIPSET_ID_IVB , 'code' : CHIPSET_CODE_IVB, 'longname' : 'Mobile 3rd Generation Core Processor (Ivy Bridge CPU / Panther Point PCH)' },
0x0158 : {'name' : 'Ivy Bridge', 'id' : CHIPSET_ID_IVB , 'code' : CHIPSET_CODE_IVB, 'longname' : 'Intel Xeon Processor E3-1200 v2 (Ivy Bridge CPU, C200/C216 Series PCH)' },
0x0E00 : {'name' : 'Ivytown', 'id' : CHIPSET_ID_IVT, 'code' : CHIPSET_CODE_IVT, 'longname' : 'Server 3rd Generation Core Procesor (Ivytown CPU / Patsburg PCH)'},
# 4th Generation Core Processor Family (Haswell)
0x0C00 : {'name' : 'Haswell', 'id' : CHIPSET_ID_HSW , 'code' : CHIPSET_CODE_HSW, 'longname' : 'Desktop 4th Generation Core Processor (Haswell CPU / Lynx Point PCH)' },
0x0C04 : {'name' : 'Haswell', 'id' : CHIPSET_ID_HSW , 'code' : CHIPSET_CODE_HSW, 'longname' : 'Mobile 4th Generation Core Processor (Haswell M/H / Lynx Point PCH)' },
0x0C08 : {'name' : 'Haswell', 'id' : CHIPSET_ID_HSW , 'code' : CHIPSET_CODE_HSW, 'longname' : 'Intel Xeon Processor E3-1200 v3 (Haswell CPU, C220 Series PCH)' },
0x0A00 : {'name' : 'Haswell', 'id' : CHIPSET_ID_HSW , 'code' : CHIPSET_CODE_HSW, 'longname' : '4th Generation Core Processor (Haswell U/Y)' },
0x0A04 : {'name' : 'Haswell', 'id' : CHIPSET_ID_HSW , 'code' : CHIPSET_CODE_HSW, 'longname' : '4th Generation Core Processor (Haswell U/Y)' },
0x0A08 : {'name' : 'Haswell', 'id' : CHIPSET_ID_HSW , 'code' : CHIPSET_CODE_HSW, 'longname' : '4th Generation Core Processor (Haswell U/Y)' },
# Bay Trail SoC
0x0F00 : {'name' : 'Baytrail', 'id' : CHIPSET_ID_BYT , 'code' : CHIPSET_CODE_BYT, 'longname' : 'Bay Trail' },
}
try:
from custom_chipsets import *
except :
pass
Chipset_Code = dict( [(Chipset_Dictionary[ _did ]['code'], _did) for _did in Chipset_Dictionary] )
def print_supported_chipsets():
codes_dict = collections.defaultdict(list)
for _did in Chipset_Dictionary: codes_dict[ Chipset_Dictionary[ _did ]['code'] ].append( _did )
logger().log( "\nSupported platforms:\n" )
logger().log( "DID | Name | Code | Long Name" )
logger().log( "-------------------------------------------------------------------------------------" )
for _code in sorted(codes_dict):
for _did in codes_dict[_code]:
logger().log( " %-#6x | %-14s | %-6s | %-40s" % (_did, Chipset_Dictionary[_did]['name'], _code.lower(), Chipset_Dictionary[_did]['longname']) )
AVAILABLE_MODULES = dict( [(Chipset_Dictionary[ _did ]['id'], []) for _did in Chipset_Dictionary] )
AVAILABLE_MODULES[ CHIPSET_ID_COMMON ] = []
DISABLED_MODULES = dict( [(Chipset_Dictionary[ _did ]['id'], []) for _did in Chipset_Dictionary] )
DISABLED_MODULES[ CHIPSET_ID_COMMON ] = []
class UnknownChipsetError (RuntimeError):
pass
class Chipset:
def __init__(self, helper=None):
if helper is None:
self.helper = OsHelper()
else:
self.helper = helper
self.vid = 0
self.did = 0
self.code = CHIPSET_CODE_UNKNOWN
self.longname = "Unrecognized Platform"
self.id = CHIPSET_ID_UNKNOWN
self.Cfg = Cfg()
#
# Initializing 'basic primitive' HAL components
# (HAL components directly using native OS helper functionality)
#
self.pci = Pci ( self.helper )
self.mem = Memory ( self.helper )
self.msr = Msr ( self.helper )
self.ucode = Ucode ( self.helper )
self.io = PortIO ( self.helper )
self.cpuid = CpuID ( self.helper )
#
# All HAL components which use above 'basic primitive' HAL components
# should be instantiated in modules/utilcmd with an instance of chipset
# Example of initializing second order HAL component (UEFI in uefi_cmd.py):
# cs = cs()
# self.uefi = UEFI( cs )
#
def init( self, platform_code, start_svc ):
if start_svc: self.helper.start()
if not platform_code:
vid_did = self.pci.read_dword( 0, 0, 0, 0 )
self.vid = vid_did & 0xFFFF
self.did = (vid_did >> 16) & 0xFFFF
if VID_INTEL != self.vid: raise UnknownChipsetError, ('UnsupportedPlatform: Vendor ID = 0x%04X' % self.vid)
else:
if Chipset_Code.has_key( platform_code ): self.code = platform_code.lower()
else: raise UnknownChipsetError, ('UnsupportedPlatform: code: %s' % platform_code)
self.vid = VID_INTEL
self.did = Chipset_Code[ platform_code ]
if Chipset_Dictionary.has_key( self.did ):
data_dict = Chipset_Dictionary[ self.did ]
self.code = data_dict['code'].lower()
self.longname = data_dict['longname']
self.id = data_dict['id']
else:
raise UnknownChipsetError, ('UnsupportedPlatform: Device ID = 0x%04X' % self.did)
self.init_cfg()
def init_cfg(self):
if self.code and '' != self.code:
try:
exec 'from chipsec.cfg.' + self.code + ' import *'
logger().log_good( "imported platform specific configuration: chipsec.cfg.%s" % self.code )
exec 'self.Cfg = ' +self.code + '()'
except ImportError, msg:
if logger().VERBOSE: logger().log( "[*] Couldn't import chipsec.cfg.%s\n%s" % ( self.code, str(msg) ) )
def destroy( self, start_svc ):
self.stop( start_svc )
#self.helper.destroy()
def stop( self, start_svc ):
if start_svc:
self.helper.stop()
def get_chipset_id(self):
return self.id
def get_chipset_code(self):
return self.code
def get_chipset_name(self, id ):
return self.longname
def print_chipset(self):
logger().log( "Platform: %s\n VID: %04X\n DID: %04X" % (self.longname, self.vid, self.did))
def add_available_module(self, module_name, platform_code):
chipset_id = CHIPSET_ID_UNKNOWN
if Chipset_Code.has_key( platform_code ):
chipset_id = Chipset_Dictionary[ Chipset_Code[ platform_code] ]['id']
elif platform_code == CHIPSET_CODE_COMMON:
chipset_id = CHIPSET_ID_COMMON
AVAILABLE_MODULES[ chipset_id ].append( module_name )
#print AVAILABLE_MODULES
from chipsec.helper.oshelper import helper
_chipset = Chipset( helper() )
def cs():
return _chipset