mirror of
https://github.com/drasko/codezero.git
synced 2026-01-12 10:53:16 +01:00
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.
116 lines
3.2 KiB
Python
Executable File
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)
|
|
|