blob: 26cff2d1e33045f6f4469718ba900484ef647425 [file] [log] [blame]
# Copyright 2021 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import subprocess
from autotest_lib.client.bin import test
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
class firmware_CbfsMcache(test.test):
"""Validates that the CBFS metadata cache didn't overflow."""
version = 1
MCACHE_MAGIC_FULL = b'FULL'
MCACHE_MAGIC_END = b'$END'
CBMEM_RO_MCACHE = b'524d5346'
CBMEM_RW_MCACHE = b'574d5346'
def cbmem(self, *args):
"""Runs 'cbmem' utility with specified arguments and returns output."""
# Cannot use utils.run because it force-decodes stdout as UTF-8.
return subprocess.check_output(('cbmem', ) + args)
def has_mcache(self):
"""Returns true iff there's an RO MCACHE section in CBMEM."""
return self.CBMEM_RO_MCACHE in self.cbmem('-l')
def check_mcache(self, cbmem_id, name):
"""Fail if the cbmem_id mcache wasn't terminated with an END token."""
mcache = self.cbmem('-r', cbmem_id)
if mcache[-4:] == self.MCACHE_MAGIC_FULL:
raise error.TestFail("CBFS %s mcache overflowed!" % name)
if mcache[-4:] != self.MCACHE_MAGIC_END:
raise error.TestError(
"CBFS %s mcache ends with invalid token (%s)!" %
mcache[-4:].__repr__())
def run_once(self):
"""Fail if mcaches exists and wasn't terminated with an END token."""
if utils.get_board() == 'volteer':
raise error.TestNAError("Skipped on Volteer, see b/187561710.")
if not self.has_mcache():
raise error.TestNAError("This platform doesn't use CBFS mcache.")
self.check_mcache(self.CBMEM_RO_MCACHE, "RO")
self.check_mcache(self.CBMEM_RW_MCACHE, "RW")