Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions python-capdl-tool/capdl/Allocator.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ def __init__(self, name, vspace_root):
self.name = name
self.vspace_root = vspace_root
self._symbols = {}
self._external_regions = {}
self._regions = {}

def add_symbol_with_caps(self, symbol, sizes, caps):
Expand Down Expand Up @@ -311,6 +312,29 @@ def get_symbols_and_clear(self):
self._symbols = None
return symbols

def add_external_region_with_caps(self, vaddr, sizes, caps):
'''
Specify the caps and sizes to use for a region outside of the ELF file.
Objects that the caps refer to should have been allocated by an
ObjectAllocator otherwise they might not end up in the final CDL spec
file.

It should be possible for the frames to be mapped into the address
space at the given vaddr in a sensible way. Therefore alignment of
vaddr should be compatible with the array of frames provided.
'''
self._external_regions[vaddr] = (sizes, caps)

def get_external_regions_and_clear(self):
'''
This function is used for converting symbols into virtual addresses with
an elf file. Resulting regions should be added back via add_region_with_caps
This sets the internal symbols structure to None to prevent usages after.
'''
external_regions = self._external_regions
self._external_regions = None
return external_regions

def add_region_with_caps(self, vaddr, sizes, caps):
'''
This is the same as add_symbol_with_caps but uses a specific address in
Expand Down
5 changes: 5 additions & 0 deletions python-capdl-tool/capdl/ELF.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ def get_pages(self, infer_asid=True, pd=None, use_large_frames=True, addr_space=
"Symbol (%s:%d) must have same or greater size than supplied cap range (%d)" % (
symbol, self.get_symbol_size(symbol), sum(sizes))
existing_pages.append((self.get_symbol_vaddr(symbol), sizes, caps))
for (vaddr, (sizes, caps)) in iteritems(addr_space.get_external_regions_and_clear()):
existing_pages.append((vaddr, sizes, caps))
for (size, cap) in zip(sizes, caps):
pages.add_page(vaddr, read=cap.read, write=cap.write, size=size)
vaddr += size

existing_pages.sort(key=lambda phys_addr: phys_addr[0])
self.check_alignment(existing_pages)
Expand Down
Loading