mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #9021 from naveenkaje/fix_part_size_check
tools: check that part size is not exceeding region sizepull/9639/head
commit
645c1cebb5
|
|
@ -411,7 +411,7 @@ def _fill_header(region_list, current_region):
|
||||||
return header
|
return header
|
||||||
|
|
||||||
|
|
||||||
def merge_region_list(region_list, destination, notify, padding=b'\xFF'):
|
def merge_region_list(region_list, destination, notify, config, padding=b'\xFF'):
|
||||||
"""Merge the region_list into a single image
|
"""Merge the region_list into a single image
|
||||||
|
|
||||||
Positional Arguments:
|
Positional Arguments:
|
||||||
|
|
@ -435,6 +435,13 @@ def merge_region_list(region_list, destination, notify, padding=b'\xFF'):
|
||||||
notify.info(" Filling region %s with %s" % (region.name, region.filename))
|
notify.info(" Filling region %s with %s" % (region.name, region.filename))
|
||||||
part = intelhex_offset(region.filename, offset=region.start)
|
part = intelhex_offset(region.filename, offset=region.start)
|
||||||
part.start_addr = None
|
part.start_addr = None
|
||||||
|
# Normally, we assume that part.maxddr() can be beyond
|
||||||
|
# end of rom. However, if the size is restricted with config, do check.
|
||||||
|
if config.target.restrict_size is not None:
|
||||||
|
part_size = (part.maxaddr() - part.minaddr()) + 1
|
||||||
|
if part_size > region.size:
|
||||||
|
raise ToolException("Contents of region %s does not fit"
|
||||||
|
% region.name)
|
||||||
merged.merge(part)
|
merged.merge(part)
|
||||||
|
|
||||||
# Hex file can have gaps, so no padding needed. While other formats may
|
# Hex file can have gaps, so no padding needed. While other formats may
|
||||||
|
|
@ -555,13 +562,13 @@ def build_project(src_paths, build_path, target, toolchain_name,
|
||||||
for r in region_list]
|
for r in region_list]
|
||||||
res = "%s.%s" % (join(build_path, name),
|
res = "%s.%s" % (join(build_path, name),
|
||||||
getattr(toolchain.target, "OUTPUT_EXT", "bin"))
|
getattr(toolchain.target, "OUTPUT_EXT", "bin"))
|
||||||
merge_region_list(region_list, res, notify)
|
merge_region_list(region_list, res, notify, toolchain.config)
|
||||||
update_regions = [
|
update_regions = [
|
||||||
r for r in region_list if r.name in UPDATE_WHITELIST
|
r for r in region_list if r.name in UPDATE_WHITELIST
|
||||||
]
|
]
|
||||||
if update_regions:
|
if update_regions:
|
||||||
update_res = join(build_path, generate_update_filename(name, toolchain.target))
|
update_res = join(build_path, generate_update_filename(name, toolchain.target))
|
||||||
merge_region_list(update_regions, update_res, notify)
|
merge_region_list(update_regions, update_res, notify, toolchain.config)
|
||||||
res = (res, update_res)
|
res = (res, update_res)
|
||||||
else:
|
else:
|
||||||
res = (res, None)
|
res = (res, None)
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,14 @@ limitations under the License.
|
||||||
import unittest
|
import unittest
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from mock import patch, MagicMock
|
from mock import patch, MagicMock
|
||||||
from tools.build_api import prepare_toolchain, build_project, build_library
|
from tools.build_api import prepare_toolchain, build_project, build_library, merge_region_list
|
||||||
from tools.resources import Resources
|
from tools.resources import Resources
|
||||||
from tools.toolchains import TOOLCHAINS
|
from tools.toolchains import TOOLCHAINS
|
||||||
from tools.notifier.mock import MockNotifier
|
from tools.notifier.mock import MockNotifier
|
||||||
|
from tools.config import Region
|
||||||
|
from tools.utils import ToolException
|
||||||
|
from intelhex import IntelHex
|
||||||
|
import intelhex
|
||||||
"""
|
"""
|
||||||
Tests for build_api.py
|
Tests for build_api.py
|
||||||
"""
|
"""
|
||||||
|
|
@ -240,5 +243,36 @@ class BuildApiTests(unittest.TestCase):
|
||||||
self.assertEqual(args[1]['app_config'], None,
|
self.assertEqual(args[1]['app_config'], None,
|
||||||
"prepare_toolchain was called with an incorrect app_config")
|
"prepare_toolchain was called with an incorrect app_config")
|
||||||
|
|
||||||
|
@patch('tools.build_api.intelhex_offset')
|
||||||
|
@patch('tools.config')
|
||||||
|
def test_merge_region_no_fit(self, mock_config, mock_intelhex_offset):
|
||||||
|
"""
|
||||||
|
Test that merge region fails as expected when part size overflows region size.
|
||||||
|
"""
|
||||||
|
max_addr = 87444
|
||||||
|
# create a dummy hex file with above max_addr
|
||||||
|
mock_intelhex_offset.return_value = IntelHex({0:2, max_addr:0})
|
||||||
|
|
||||||
|
# create application and post-application regions and merge.
|
||||||
|
region_application = Region("application", 10000, 86000, True, "random.hex")
|
||||||
|
region_post_application = Region("postapplication", 100000, 90000, False, None)
|
||||||
|
|
||||||
|
notify = MockNotifier()
|
||||||
|
region_list = [region_application, region_post_application]
|
||||||
|
# path to store the result in, should not get used as we expect exception.
|
||||||
|
res = "./"
|
||||||
|
mock_config.target.restrict_size = 90000
|
||||||
|
toolexception = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
merge_region_list(region_list, res, notify, mock_config)
|
||||||
|
except ToolException:
|
||||||
|
toolexception = True
|
||||||
|
except Exception as e:
|
||||||
|
print("%s %s" % (e.message, e.args))
|
||||||
|
|
||||||
|
self.assertTrue(toolexception, "Expected ToolException not raised")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue