Files
codezero/scripts/cml/generate_container_cml.py
Amit Mahajan 92645be6ff KMI patch for devel branch on bahadir's repo.
Important points:
----------------
1. Works fine for pb926 + qemu.

2. Scan code logic for kryboard is not complete.
We just have generic keys and shift working.

3. Mouse scancodes are collected but not decoded.

4. Right now we are doing enable_irq(), just before we go for waiting
again for new irqs. This is not correct but we had latency issues.
This needs to be fixed immediately.

5. Also it seems like the notify_clot count should be an atomic
variable. Needs to be discussed.
2010-03-30 16:17:15 +05:30

116 lines
3.2 KiB
Python
Executable File

#! /usr/bin/env python2.6
# -*- mode: python; coding: utf-8; -*-
#
# Codezero -- a microkernel for embedded systems.
#
# Copyright © 2009 B Labs Ltd
#
import os, sys, shelve, glob
from os.path import join
from string import Template
PROJRELROOT = '../../'
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), PROJRELROOT)))
sys.path.append(os.path.abspath("../"))
from config.projpaths import *
from config.configuration import *
containers_menu = \
'''
menu containers_menu
CAPABILITIES
CONTAINERS%
'''
default_number_of_containers = \
'''
default CONTAINERS from 1
'''
containers_constraint = \
'''
unless CONTAINERS > %d suppress cont%d_menu
'''
def add_container_constraint(cid):
cml_string = ""
if cid == 0:
return ""
cml_string = containers_constraint % (cid, cid)
return cml_string
device_suppress_rule = \
'''
when CONT${CONTID}_CAP_DEVICE_${DEVNAME}_USE == y suppress
'''
device_suppress_sym = \
'''\tcont${CONTID}_cap_device_${DEVNAME_LOWER}
'''
devices = ['UART1', 'UART2', 'UART3', 'TIMER1', 'KEYBOARD0', 'MOUSE0']
#
# When a symbol is used by a single container, sometimes it is
# necessary to hide it in other containers. This cannot be
# achieved statically but rather needs to be autogenerated
# depending on the number of containers used.
#
def generate_container_suppress_rules(ncont):
finalstr = ''
# For each device on the platform
for devname in devices:
# Generate rule for each container
for cont in range(ncont):
# Create string templates
rule_templ = Template(device_suppress_rule)
sym_templ = Template(device_suppress_sym)
rulestr = rule_templ.substitute(CONTID = cont, DEVNAME = devname)
symstr = ''
# Fill for each container
for other_cont in range(ncont):
if other_cont == cont:
continue
symstr += sym_templ.substitute(CONTID = other_cont, DEVNAME_LOWER = devname.lower())
finalstr += rulestr + symstr + "\n"
return finalstr
def generate_container_cml(arch, ncont):
print "Autogenerating new rule file"
fbody = ""
with open(join(CML2_CONFIG_SRCDIR, arch + '.ruleset')) as in_ruleset:
fbody += in_ruleset.read()
# Add container visibility constraint
for cont in range(ncont):
fbody += add_container_constraint(cont)
# Generate the containers menu with as many entries as containers
fbody += containers_menu
for cont in range(ncont):
fbody += '\tcont%d_menu\n' % cont
fbody += default_number_of_containers
# Generate inter-container suppression rules for as many rules as containers
fbody += generate_container_suppress_rules(ncont)
# Write each container's rules
for cont in range(ncont):
with open(CML2_CONT_DEFFILE, "rU") as contdefs:
defbody = contdefs.read()
defbody = defbody.replace("%\n", "%%\n")
fbody += defbody % { 'cn' : cont }
# Write the result to output rules file.
with open(CML2_AUTOGEN_RULES, "w+") as out_cml:
out_cml.write(fbody)
return CML2_AUTOGEN_RULES
if __name__ == "__main__":
generate_container_cml('arm', 4)