|
@@ -714,7 +714,95 @@ class TestFunctional(unittest.TestCase):
|
|
|
self.assertEqual('nodtb with microcode' + pos_and_size +
|
|
|
' somewhere in here', first)
|
|
|
|
|
|
+ def testPackUbootSingleMicrocode(self):
|
|
|
+ """Test that x86 microcode can be handled correctly with fdt_normal.
|
|
|
+ """
|
|
|
+ self._RunPackUbootSingleMicrocode(False)
|
|
|
+
|
|
|
+ def testPackUbootSingleMicrocodeFallback(self):
|
|
|
+ """Test that x86 microcode can be handled correctly with fdt_fallback.
|
|
|
+
|
|
|
+ This only supports collating the microcode.
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ old_val = fdt_select.UseFallback(True)
|
|
|
+ self._RunPackUbootSingleMicrocode(True)
|
|
|
+ finally:
|
|
|
+ fdt_select.UseFallback(old_val)
|
|
|
+
|
|
|
def testUBootImg(self):
|
|
|
"""Test that u-boot.img can be put in a file"""
|
|
|
data = self._DoReadFile('36_u_boot_img.dts')
|
|
|
self.assertEqual(U_BOOT_IMG_DATA, data)
|
|
|
+
|
|
|
+ def testNoMicrocode(self):
|
|
|
+ """Test that a missing microcode region is detected"""
|
|
|
+ with self.assertRaises(ValueError) as e:
|
|
|
+ self._DoReadFile('37_x86_no_ucode.dts', True)
|
|
|
+ self.assertIn("Node '/binman/u-boot-dtb-with-ucode': No /microcode "
|
|
|
+ "node found in ", str(e.exception))
|
|
|
+
|
|
|
+ def testMicrocodeWithoutNode(self):
|
|
|
+ """Test that a missing u-boot-dtb-with-ucode node is detected"""
|
|
|
+ with self.assertRaises(ValueError) as e:
|
|
|
+ self._DoReadFile('38_x86_ucode_missing_node.dts', True)
|
|
|
+ self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Cannot find "
|
|
|
+ "microcode region u-boot-dtb-with-ucode", str(e.exception))
|
|
|
+
|
|
|
+ def testMicrocodeWithoutNode2(self):
|
|
|
+ """Test that a missing u-boot-ucode node is detected"""
|
|
|
+ with self.assertRaises(ValueError) as e:
|
|
|
+ self._DoReadFile('39_x86_ucode_missing_node2.dts', True)
|
|
|
+ self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Cannot find "
|
|
|
+ "microcode region u-boot-ucode", str(e.exception))
|
|
|
+
|
|
|
+ def testMicrocodeWithoutPtrInElf(self):
|
|
|
+ """Test that a U-Boot binary without the microcode symbol is detected"""
|
|
|
+ # ELF file without a '_dt_ucode_base_size' symbol
|
|
|
+ if not fdt_select.have_libfdt:
|
|
|
+ return
|
|
|
+ try:
|
|
|
+ with open(self.TestFile('u_boot_no_ucode_ptr')) as fd:
|
|
|
+ TestFunctional._MakeInputFile('u-boot', fd.read())
|
|
|
+
|
|
|
+ with self.assertRaises(ValueError) as e:
|
|
|
+ self._RunPackUbootSingleMicrocode(False)
|
|
|
+ self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Cannot locate "
|
|
|
+ "_dt_ucode_base_size symbol in u-boot", str(e.exception))
|
|
|
+
|
|
|
+ finally:
|
|
|
+ # Put the original file back
|
|
|
+ with open(self.TestFile('u_boot_ucode_ptr')) as fd:
|
|
|
+ TestFunctional._MakeInputFile('u-boot', fd.read())
|
|
|
+
|
|
|
+ def testMicrocodeNotInImage(self):
|
|
|
+ """Test that microcode must be placed within the image"""
|
|
|
+ with self.assertRaises(ValueError) as e:
|
|
|
+ self._DoReadFile('40_x86_ucode_not_in_image.dts', True)
|
|
|
+ self.assertIn("Node '/binman/u-boot-with-ucode-ptr': Microcode "
|
|
|
+ "pointer _dt_ucode_base_size at fffffe14 is outside the "
|
|
|
+ "image ranging from 00000000 to 0000002e", str(e.exception))
|
|
|
+
|
|
|
+ def testWithoutMicrocode(self):
|
|
|
+ """Test that we can cope with an image without microcode (e.g. qemu)"""
|
|
|
+ with open(self.TestFile('u_boot_no_ucode_ptr')) as fd:
|
|
|
+ TestFunctional._MakeInputFile('u-boot', fd.read())
|
|
|
+ data, dtb = self._DoReadFileDtb('44_x86_optional_ucode.dts', True)
|
|
|
+
|
|
|
+ # Now check the device tree has no microcode
|
|
|
+ self.assertEqual(U_BOOT_NODTB_DATA, data[:len(U_BOOT_NODTB_DATA)])
|
|
|
+ second = data[len(U_BOOT_NODTB_DATA):]
|
|
|
+
|
|
|
+ fdt_len = self.GetFdtLen(second)
|
|
|
+ self.assertEqual(dtb, second[:fdt_len])
|
|
|
+
|
|
|
+ used_len = len(U_BOOT_NODTB_DATA) + fdt_len
|
|
|
+ third = data[used_len:]
|
|
|
+ self.assertEqual(chr(0) * (0x200 - used_len), third)
|
|
|
+
|
|
|
+ def testUnknownPosSize(self):
|
|
|
+ """Test that microcode must be placed within the image"""
|
|
|
+ with self.assertRaises(ValueError) as e:
|
|
|
+ self._DoReadFile('41_unknown_pos_size.dts', True)
|
|
|
+ self.assertIn("Image '/binman': Unable to set pos/size for unknown "
|
|
|
+ "entry 'invalid-entry'", str(e.exception))
|