#!@pathpython@ # -*- python -*- # Copyright (c) 2005-2006 Arched Rock Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the Arched Rock Corporation nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE # # Copyright (c) 2006-2007 Intel Corporation # All rights reserved. # # This file is distributed under the terms in the attached INTEL-LICENSE # file. If you do not find these files, copies can be found by writing to # Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, # 94704. Attention: Intel License Inquiry. # @author Jonathan Hui # @author David Gay # # $Revision$ # $Date$ # from re import match from sys import * from xml.dom import * from xml.dom.minidom import * from subprocess import Popen, PIPE def error_exit( s ): stderr.write( "ERROR: " + s + "\n" ) exit( 2 ) def expand_path( path ): substrs = path.split( "%" ) path = substrs[0] i = 1 while i < len( substrs ): if substrs[i] == "": # There was a %%, leading to a blank substring, and the next string # should just be appended path += "%" i = i + 1 if i < len( substrs ): path += substrs[i] else: # The first character of the string is the one that followed % c = substrs[i][0] if c == 'p': sub = platform elif c == 'P': sub = platformdir elif c == 'T': sub = Popen( ["ncc", "-print-tosdir"], stdout=PIPE ).communicate( )[0] sub = sub[:-1] # remove newline else: nfail( "unknown include-path substitution character " + c ) path += sub path += substrs[i][1:] i = i + 1 return path NUM_SECTORS = 16 SECTOR_SIZE = 65536 volumes = {} volumeNames = [] volumeSizes = [] volumeOffsets = [] freeSectors = NUM_SECTORS*[ True ] if len( argv ) == 2: platformdir = argv[1] # This gives the whole string when there's no / in platformdir platform = platformdir[platformdir.rfind( "/" ) + 1:] elif len( argv ) == 1: platformdir = "" platform = "" else: error_exit( "Usage: tos-storage-stm25p " ) def volumeparse( file, fname, depth ): if depth > 10: error_exit( "include nesting too deep - check for cycles" ) try: dom = parse( file ) except xml.parsers.expat.ExpatError: error_exit( fname + " is not a valid input file" ) except IOError: error_exit( "couldn't open file " + fname ) # extract information for volume in dom.documentElement.getElementsByTagName( "volume" ): name = volume.getAttribute( "name" ) size = volume.getAttribute( "size" ) base = volume.getAttribute( "base" ) if name == "": error_exit( "volume has no name" ) elif not match( "^[a-zA-Z0-9_]+$", name ): error_exit( "volume has invalid name '%s'" % name ) elif volumes.has_key( name ): error_exit( "duplicate volume definition '%s'" % name ) else: volumes[ name ] = "blah" if size == "": error_exit( "volume '%s' has no size" % name ) try: size = int( size ) except ValueError: error_exit( "volume '%s' has invalid size" % name ) if base != "": try: base = int( base ) except ValueError: error_exit( "volume '%s' has invalid base" % name ) if ( size & ( SECTOR_SIZE - 1 ) ) != 0: error_exit( "size of volume '%s' is not a multiple of %d" % \ ( name, SECTOR_SIZE ) ) if base != "" and ( base & ( SECTOR_SIZE - 1 ) ) != 0: error_exit( "base of volume '%s' is not a multiple of %d" % \ ( name, SECTOR_SIZE ) ) volumeNames.append( "VOLUME_" + name ) volumeSizes.append( size / SECTOR_SIZE ) if base == "": volumeOffsets.append( -1 ) else: base = base / SECTOR_SIZE size = size / SECTOR_SIZE volumeOffsets.append( base ) for i in range( size ): freeSectors[ i + base ] = False for include in dom.documentElement.getElementsByTagName( "include" ): included = include.firstChild if included != None and included.nodeType == included.TEXT_NODE: included = expand_path( included.data ) volumeparse( included, "(file %s)" % included, depth + 1 ) else: error_exit( "invalid include directive " + fname ) dom.unlink( ) volumeparse( stdin, "(standard input)", 0 ) # allocate with first fit policy for i in range( len( volumeOffsets ) ): size = volumeSizes[ i ] if volumeOffsets[ i ] == -1: for j in range( NUM_SECTORS ): if freeSectors[ j ]: size -= 1 if size == 0: volumeOffsets[ i ] = j - ( volumeSizes[ i ] - 1 ) break else: size = volumeSizes[ i ] if volumeOffsets[ i ] == -1: raise "Unable to satisfy allocation request." else: for j in range( volumeSizes[ i ] ): freeSectors[ volumeOffsets[ i ] + j ] = False # output C file print "#ifndef __STORAGE_VOLUME_H__" print "#define __STORAGE_VOLUME_H__" print "" print "#include \"Stm25p.h\"" print "" for i in range( len( volumeNames ) ): print "#define %s %d" % ( volumeNames[ i ], i ) print "" print "static const stm25p_volume_info_t STM25P_VMAP[ %d ] = {" % \ len( volumeNames ) for i in range( len( volumeNames ) ): print " { base : %d, size : %d }," % \ ( volumeOffsets[ i ], volumeSizes[ i ] ) print "};" print "" print "#endif"