def set_tcb_caps(ast, obj_space, cspaces, elfs, options, **_): arch = lookup_architecture(options.architecture) assembly = ast.assembly for group, space in cspaces.items(): cnode = space.cnode for index, tcb in [(k, v.referent) for (k, v) in cnode.slots.items() if v is not None and isinstance(v.referent, TCB)]: perspective = Perspective(tcb=tcb.name, group=group) # Finalise the CNode so that we know what its absolute size will # be. Note that we are assuming no further caps will be added to # the CNode after this point. cnode.finalise_size() # Allow the user to override CNode sizes with the 'cnode_size_bits' # attribute. cnode_size = assembly.configuration[group].get('cnode_size_bits') if cnode_size is not None: try: if isinstance(cnode_size, six.string_types): size = int(cnode_size, 0) else: size = cnode_size except ValueError: raise Exception('illegal value for CNode size for %s' % group) if size < cnode.size_bits: raise Exception('%d-bit CNode specified for %s, but this ' 'CSpace needs to be at least %d bits' % (size, group, cnode.size_bits)) cnode.size_bits = size cspace = Cap(cnode) cspace.set_guard_size(arch.word_size_bits() - cnode.size_bits) tcb['cspace'] = cspace pd = None pd_name = perspective['pd'] pds = [x for x in obj_space.spec.objs if x.name == pd_name] if len(pds) > 1: raise Exception('Multiple PDs found for %s' % group) elif len(pds) == 1: pd, = pds tcb['vspace'] = Cap(pd) # If no PD was found we were probably just not passed any ELF files # in this pass. if perspective['pool']: # This TCB is part of the (cap allocator's) TCB pool. continue
def set_tcb_caps(ast, obj_space, cspaces, elfs, options, **_): assembly = find_assembly(ast) for group, space in cspaces.items(): cnode = space.cnode for index, tcb in [(k, v.referent) for (k, v) in cnode.slots.items() \ if v is not None and isinstance(v.referent, TCB)]: perspective = Perspective(tcb=tcb.name, group=group) # Finalise the CNode so that we know what its absolute size will # be. Note that we are assuming no further caps will be added to # the CNode after this point. cnode.finalise_size() # Allow the user to override CNode sizes with the 'cnode_size_bits' # attribute. cnode_size = assembly.configuration[group].get('cnode_size_bits') if cnode_size is not None: try: if isinstance(cnode_size, str): size = int(cnode_size, 0) else: size = cnode_size except ValueError: raise Exception('illegal value for CNode size for %s' % \ group) if size < cnode.size_bits: raise Exception('%d-bit CNode specified for %s, but this ' \ 'CSpace needs to be at least %d bits' % \ (size, group, cnode.size_bits)) cnode.size_bits = size cspace = Cap(cnode) cspace.set_guard_size(32 - cnode.size_bits) tcb['cspace'] = cspace elf_name = perspective['elf_name'] pd = None pd_name = perspective['pd'] pds = [x for x in obj_space.spec.objs if x.name == pd_name] if len(pds) > 1: raise Exception('Multiple PDs found for %s' % group) elif len(pds) == 1: pd, = pds tcb['vspace'] = Cap(pd) # If no PD was found we were probably just not passed any ELF files # in this pass. if perspective['pool']: # This TCB is part of the (cap allocator's) TCB pool. continue elf = elfs.get(elf_name) if pd and elf: ipc_symbol = perspective['ipc_buffer_symbol'] # Find the IPC buffer's virtual address. assert get_symbol_size(elf, ipc_symbol) == PAGE_SIZE * 3 ipc_vaddr = get_symbol_vaddr(elf, ipc_symbol) + PAGE_SIZE # Relate this virtual address to a PT. pt_index = page_table_index(get_elf_arch(elf), ipc_vaddr, options.hyp) if pt_index not in pd: raise Exception('IPC buffer of TCB %s in group %s does ' \ 'not appear to be backed by a frame' % (tcb.name, group)) pt = pd[pt_index].referent # Continue on to infer the physical frame. p_index = page_index(get_elf_arch(elf), ipc_vaddr, options.hyp) if p_index not in pt: raise Exception('IPC buffer of TCB %s in group %s does ' \ 'not appear to be backed by a frame' % (tcb.name, group)) frame = pt[p_index].referent tcb['ipc_buffer_slot'] = Cap(frame, True, True, False) # RW
def set_tcb_caps(ast, obj_space, cspaces, elfs, *_): for group, space in cspaces.items(): cnode = space.cnode for index, cap in cnode.slots.items(): if cap is None: continue tcb = cap.referent if not isinstance(tcb, TCB): continue perspective = Perspective(tcb=tcb.name, group=group) # Finalise the CNode so that we know what its absolute size will # be. Note that we are assuming no further caps will be added to # the CNode after this point. cnode.finalise_size() cspace = Cap(cnode) cspace.set_guard_size(32 - cnode.size_bits) tcb['cspace'] = cspace elf_name = perspective['elf_name'] pd = None pd_name = perspective['pd'] pds = filter(lambda x: x.name == pd_name, obj_space.spec.objs) if len(pds) > 1: raise Exception('Multiple PDs found for %s' % group) elif len(pds) == 1: pd, = pds tcb['vspace'] = Cap(pd) # If no PD was found we were probably just not passed any ELF files # in this pass. if perspective['pool']: # This TCB is part of the (cap allocator's) TCB pool. continue elf = elfs.get(elf_name) if pd and elf: ipc_symbol = perspective['ipc_buffer_symbol'] # Find the IPC buffer's virtual address. assert get_symbol_size(elf, ipc_symbol) == PAGE_SIZE * 3 ipc_vaddr = get_symbol_vaddr(elf, ipc_symbol) + PAGE_SIZE # Relate this virtual address to a PT. pt_index = page_table_index(get_elf_arch(elf), ipc_vaddr) if pt_index not in pd: raise Exception('IPC buffer of TCB %s in group %s does ' \ 'not appear to be backed by a frame' % (tcb.name, group)) pt = pd[pt_index].referent # Continue on to infer the physical frame. p_index = page_index(get_elf_arch(elf), ipc_vaddr) if p_index not in pt: raise Exception('IPC buffer of TCB %s in group %s does ' \ 'not appear to be backed by a frame' % (tcb.name, group)) frame = pt[p_index].referent tcb['ipc_buffer_slot'] = Cap(frame, True, True, True) # RWG