コード例 #1
0
ファイル: elfloader.py プロジェクト: zsipos/seL4
def run(tree: fdt.FdtParser, hardware: rule.HardwareYaml,
        config: config.Config, args: argparse.Namespace):
    devices = tree.get_elfloader_devices()
    cpu_info = get_elfloader_cpus(tree, devices)

    max_reg = 1
    device_info = []
    for dev in devices:
        obj = {
            'compat': hardware.get_matched_compatible(dev),
            'path': dev.path,
            'regions': dev.get_regions()
        }
        max_reg = max(len(obj['regions']), max_reg)

        device_info.append(obj)

    device_info.sort(key=lambda a: a['compat'])

    template = Environment(loader=BaseLoader,
                           trim_blocks=True,
                           lstrip_blocks=True).from_string(HEADER_TEMPLATE)

    template_args = dict(
        builtins.__dict__, **{
            'cpus': cpu_info,
            'devices': device_info,
            'max_reg': max_reg,
            'uses_psci': any([c['enable_method'] == 'psci' for c in cpu_info])
        })

    data = template.render(template_args)
    args.elfloader_out.write(data)
    args.elfloader_out.close()
コード例 #2
0
def get_kernel_devices(tree: FdtParser, hw_yaml: HardwareYaml) -> (List, Dict):
    '''
    Given a device tree and a set of rules, returns a tuple (groups, offsets).

    Groups is a list of 'KernelRegionGroups', each of which represents a single
    contiguous region of memory that is associated with a device.
    Offsets is a dict of offset -> label, where label is the name given to the
    kernel for that address (e.g. SERIAL_PPTR) and offset is the offset from
    KDEV_BASE at which it's mapped.
    '''
    kernel_devices = tree.get_kernel_devices()

    kernel_offset = 0
    groups = []
    for dev in kernel_devices:
        dev_rule = hw_yaml.get_rule(dev)
        new_regions = dev_rule.get_regions(dev)
        for reg in new_regions:
            if reg in groups:
                other = groups[groups.index(reg)]
                other.take_labels(reg)
            else:
                groups.append(reg)

    offsets = {}
    for group in groups:
        kernel_offset = group.set_kernel_offset(kernel_offset)
        offsets.update(group.get_labelled_addresses())
    return (groups, offsets)
コード例 #3
0
def get_kernel_devices(tree: fdt.FdtParser, rules: rule.HardwareYaml):
    kernel_devices = tree.get_kernel_devices()

    groups = []
    for dev in kernel_devices:
        rule = rules.get_rule(dev)
        groups += rule.get_regions(dev)

    return groups
コード例 #4
0
ファイル: yaml.py プロジェクト: sunnybird/seL4
def get_kernel_devices(tree: FdtParser, hw_yaml: HardwareYaml):
    kernel_devices = tree.get_kernel_devices()

    groups = []
    for dev in kernel_devices:
        rule = hw_yaml.get_rule(dev)
        groups += rule.get_regions(dev)

    return groups
コード例 #5
0
def main(args: argparse.Namespace):
    ''' Parse the DT and hardware config YAML and run each
    selected output method. '''
    cfg = config.get_arch_config(args.arch, args.addrspace_max)
    parsed_dt = fdt.FdtParser(args.dtb)
    rules = yaml.load(args.hardware_config, Loader=yaml.FullLoader)
    schema = yaml.load(args.hardware_schema, Loader=yaml.FullLoader)
    validate_rules(rules, schema)
    hardware = HardwareYaml(rules, cfg)

    arg_dict = vars(args)
    for t in sorted(OUTPUTS.keys()):
        if arg_dict[t]:
            OUTPUTS[t].run(parsed_dt, hardware, cfg, args)
コード例 #6
0
ファイル: compat_strings.py プロジェクト: sunnybird/seL4
def run(tree: FdtParser, hw_yaml: HardwareYaml, config: Config,
        args: argparse.Namespace):
    if not args.compat_strings_out:
        raise ValueError(
            'You need to specify a compat-strings-out to use compat strings output'
        )
    chosen = tree.get_kernel_devices()

    compatibles = set()
    for dev in chosen:
        compatibles.add(hw_yaml.get_matched_compatible(dev))

    args.compat_strings_out.write(';'.join(sorted(compatibles)) + ';\n')
    args.compat_strings_out.close()
コード例 #7
0
def get_interrupts(tree: FdtParser, hw_yaml: HardwareYaml) -> List:
    ''' Get dict of interrupts, {label: KernelInterrupt} from the DT and hardware rules. '''
    kernel_devices = tree.get_kernel_devices()

    irqs = []
    for dev in kernel_devices:
        dev_rule = hw_yaml.get_rule(dev)
        if len(dev_rule.interrupts.items()) > 0:
            irqs += dev_rule.get_interrupts(tree, dev)

    ret = {}
    for irq in irqs:
        if irq.label in ret:
            if irq.prio > ret[irq.label].prio:
                ret[irq.label] = irq
        else:
            ret[irq.label] = irq

    ret = list(ret.values())
    ret.sort(key=lambda a: a.label)
    return ret
コード例 #8
0
def get_interrupts(tree: fdt.FdtParser, rules: rule.HardwareYaml):
    ''' Get dict of interrupts, {label: KernelInterrupt} from the DT and hardware rules. '''
    kernel_devices = tree.get_kernel_devices()

    irqs = []
    for dev in kernel_devices:
        dev_rule = rules.get_rule(dev)
        print(f"interrupts for device {dev.path}")
        irqs += dev_rule.get_interrupts(tree, dev)

    ret = {}
    for irq in irqs:
        if irq.label in ret:
            if irq.prio > ret[irq.label].prio:
                ret[irq.label] = irq
        else:
            ret[irq.label] = irq

    ret = list(ret.values())
    ret.sort(key=lambda a: a.label)
    return ret