@ -688,12 +688,14 @@ class TestFunctional(unittest.TestCase):
data = self . _DoReadFile ( ' 33_x86-start16.dts ' )
self . assertEqual ( X86_START16_DATA , data [ : len ( X86_START16_DATA ) ] )
def _RunMicrocodeTest ( self , dts_fname , nodtb_data ) :
def _RunMicrocodeTest ( self , dts_fname , nodtb_data , ucode_second = False ) :
""" Handle running a test for insertion of microcode
Args :
dts_fname : Name of test . dts file
nodtb_data : Data that we expect in the first section
ucode_second : True if the microsecond entry is second instead of
third
Returns :
Tuple :
@ -704,10 +706,16 @@ class TestFunctional(unittest.TestCase):
data = self . _DoReadFile ( dts_fname , True )
# Now check the device tree has no microcode
dtb_with_ucode = data [ len ( nodtb_data ) : ]
fdt_len = self . GetFdtLen ( dtb_with_ucode )
ucode_content = dtb_with_ucode [ fdt_len : ]
ucode_pos = len ( nodtb_data ) + fdt_len
if ucode_second :
ucode_content = data [ len ( nodtb_data ) : ]
ucode_pos = len ( nodtb_data )
dtb_with_ucode = ucode_content [ 16 : ]
fdt_len = self . GetFdtLen ( dtb_with_ucode )
else :
dtb_with_ucode = data [ len ( nodtb_data ) : ]
fdt_len = self . GetFdtLen ( dtb_with_ucode )
ucode_content = dtb_with_ucode [ fdt_len : ]
ucode_pos = len ( nodtb_data ) + fdt_len
fname = tools . GetOutputFilename ( ' test.dtb ' )
with open ( fname , ' wb ' ) as fd :
fd . write ( dtb_with_ucode )
@ -728,8 +736,8 @@ class TestFunctional(unittest.TestCase):
# expected position and size
pos_and_size = struct . pack ( ' <2L ' , 0xfffffe00 + ucode_pos ,
len ( ucode_data ) )
firs t = data [ : len ( nodtb_data ) ]
return firs t, pos_and_size
u_boo t = data [ : len ( nodtb_data ) ]
return u_boo t, pos_and_size
def testPackUbootMicrocode ( self ) :
""" Test that x86 microcode can be handled correctly
@ -892,23 +900,42 @@ class TestFunctional(unittest.TestCase):
data = self . _DoReadFile ( ' 48_x86-start16-spl.dts ' )
self . assertEqual ( X86_START16_SPL_DATA , data [ : len ( X86_START16_SPL_DATA ) ] )
def test PackUbootSplMicrocode( self ) :
""" Test that x86 microcode can be handled correctly in SPL
def _ PackUbootSplMicrocode( self , dts , ucode_second = False ) :
""" Helper function for microcode tests
We expect to see the following in the image , in order :
u - boot - spl - nodtb . bin with a microcode pointer inserted at the
correct place
u - boot . dtb with the microcode removed
the microcode
Args :
dts : Device tree file to use for test
ucode_second : True if the microsecond entry is second instead of
third
"""
# ELF file with a '_dt_ucode_base_size' symbol
with open ( self . TestFile ( ' u_boot_ucode_ptr ' ) ) as fd :
TestFunctional . _MakeInputFile ( ' spl/u-boot-spl ' , fd . read ( ) )
first , pos_and_size = self . _RunMicrocodeTest ( ' 49_x86_ucode_spl.dts ' ,
U_BOOT_SPL_NODTB_DATA )
first , pos_and_size = self . _RunMicrocodeTest ( dts , U_BOOT_SPL_NODTB_DATA ,
ucode_second = ucode_second )
self . assertEqual ( ' splnodtb with microc ' + pos_and_size +
' ter somewhere in here ' , first )
def testPackUbootSplMicrocode ( self ) :
""" Test that x86 microcode can be handled correctly in SPL """
self . _PackUbootSplMicrocode ( ' 49_x86_ucode_spl.dts ' )
def testPackUbootSplMicrocodeReorder ( self ) :
""" Test that order doesn ' t matter for microcode entries
This is the same as testPackUbootSplMicrocode but when we process the
u - boot - ucode entry we have not yet seen the u - boot - dtb - with - ucode
entry , so we reply on binman to try later .
"""
self . _PackUbootSplMicrocode ( ' 58_x86_ucode_spl_needs_retry.dts ' ,
ucode_second = True )
def testPackMrc ( self ) :
""" Test that an image with an MRC binary can be created """
data = self . _DoReadFile ( ' 50_intel_mrc.dts ' )
@ -971,5 +998,13 @@ class TestFunctional(unittest.TestCase):
00000000 00000004 rw - u - boot
''' , map_data)
def testUnknownContents ( self ) :
""" Test that obtaining the contents works as expected """
with self . assertRaises ( ValueError ) as e :
self . _DoReadFile ( ' 57_unknown_contents.dts ' , True )
self . assertIn ( " Section ' /binman ' : Internal error: Could not complete "
" processing of contents: remaining [<_testing.Entry__testing " ,
str ( e . exception ) )
if __name__ == " __main__ " :
unittest . main ( )