[LinuxBIOS] buildROM

Jordan Crouse jordan.crouse at amd.com
Wed May 2 01:34:00 CEST 2007


As promised, this is a patch to turn the current buildROM build environment
in to the next generation build system.

For those of you who don't know what buildROM is - it started life as a 
series of Makefiles that build the Linux-As-Bootloader (LAB) image for
early versions of One Laptop Per Child platforms.  The goal is to 
consolidate all the effort into a single makefile
that knows how to build the payload, build LinuxBIOS, and construct
the ROM.

This generation of buildROM takes that concept further - it is now kconfig
based, and understands how to build multiple payloads for a number of different
platforms (and adding new payloads and platforms is very easy).  In addition
to LAB, buildROM can now build etherboot, FILO, memtest, OFW and straight
kernel payloads.  It can also be configured to include a custom payload,
so you can feed it the .ELF of your choice.

I'm rather happy with buildROM right now - we've been building memtest,
FILO and etherboot images to test the Geode LX with very little effort.
Please give it a try, and let me know what you find.

This patch is against the SVN tree at:

svn://openbios.org/buildrom/buildrom-devel/buildrom

Jordan

-- 
Jordan Crouse
Senior Linux Engineer
Advanced Micro Devices, Inc.
<www.amd.com/embeddedprocessors>
-------------- next part --------------
Extend the current version of buildROM into the next generation.

Signed-off-by: Jordan Crouse <jordan.crouse at amd.com>

Index: buildrom/bin/checklibs.pl
===================================================================
--- buildrom.orig/bin/checklibs.pl	2007-05-01 14:29:43.000000000 -0600
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,243 +0,0 @@
-#!/usr/bin/perl
-
-# Written by Jordan Crouse (jordan at cosmicpenguin.net)
-# With assistance from Erik Andersen (andersee at codepoet.org)
-#
-# Released under the General Public License
-
-# This script will examine all of the libraries in a target
-# directory, and verify that all the nessesary libraries are
-# in place.
-#
-# There are four different modes to this script: 
-#
-# ./checklibs.pl --copy [TARGET] [SOURCE] ....
-# Copy all the nessesary libraries (and symlinks from the 
-# source directory(ies) to [TARGET]/lib
-
-# ./checklibs.pl --list [TARGET]
-# List all of the required libraries in the target directory
-
-# ./checklibs.pl --verify [TARGET]
-# See if any files in [TARGET]/lib are unnessesary
-
-# ./checklibs.pl --files [TARGET]
-# Show all of the binary files / shared libraries, and list
-# the libraries that they depend on 
-#
-# Any of the above modes accept --silent to make them quiet
-# Specifying --script only makes sense for --verify - it lists the unneeded libraries as a 
-# list, suitable for using in scripts
-
-use strict;
-use File::Find;
-use File::Basename;
-use Getopt::Long;
-
-my $ACTION_COPY=0;
-my $ACTION_LIST=1;
-my $ACTION_VERIFY=2;
-my $ACTION_FILES=3;
-
-my $action = -1;
-my $silent = 0;
-my $script = 0;
-
-my @options = ("copy" => sub { $action = $ACTION_COPY; },
-	       "list" => sub { $action = $ACTION_LIST; },
-	       "verify" => sub { $action = $ACTION_VERIFY; },
-	       "files" => sub { $action = $ACTION_FILES; },
-	       "script" => \$script,
-	       "silent" => \$silent);
-
-GetOptions(@options);
-
-die "Error - you must specify an action\n" if ($action == -1);
-
-my (@libs) = ();
-
-my ($targetdir) = $ARGV[0]; # Always the first non option item 
-my ($file) = "";
-my ($pwd) = $ENV{'PWD'};
-my (%filea);
-my ($ldd) = "/usr/bin/ldd";
-
-if (defined($ENV{'LDD'})) {	
-	$ldd = $ENV{'LDD'};
-}
-
-die "Couldn't find $ldd!" unless (-f $ldd);
-
-print "Getting files in $targetdir..\n" if (!$silent);
-
-# For every binary in the tree, get the list of libraries
-
-find sub {  
-
-    if ( -f $_ && ! -d $_ ) {
-	my $res;
-	$file = "$File::Find::name";
-
-	$res = `file $file`;
-	if ( $res ) { 
-	    if ($res =~ /ELF/ ) {	
-
-		if (! /statically/ ) {
-		    $_ = `$ldd $file 2> /dev/null`;
-		    while( /[ \t]*(.*) => (.*)/g ) {
-			my $lib = basename($1);
-			next if (ord($lib) > 128);
-			push(@libs, $lib);
-			push @{ $filea{$lib} }, $file;
-		    }
-		}
-	    }
-
-	}
-    }
-}, $targetdir;
-
-
-# Now, keep going through the list, and add any new dependancies
-
-my($libdir) = "$targetdir/lib";
-my (%seen) = ();
-my (@uniqlibs) = grep { ! $seen{$_} ++ } @libs;
-
-foreach $_ ( @uniqlibs ) {
-    my @local = split(/ /, $_);
-    
-    $file = "$libdir/$local[0]";
-    
-    # ldd reaches through symbolic links  
-    my($r) = `$ldd $file 2> /dev/null`;
-
-    while($r =~ /[ \t]*(.*) => (.*)/g ) {
-	my $f = $1;
-        my ($base) = basename($f);
-
-	if ( ! $seen{$base} ) { 
-	    push(@uniqlibs, $base);
-	    $seen{$base}++;
-	}
-    }
-}
-my(@sortlibs) = sort @uniqlibs;
-
-if ($action == $ACTION_COPY) { copy_libraries(); }
-elsif ($action == $ACTION_LIST) { list_libraries(); }
-elsif ($action == $ACTION_VERIFY) { verify_libraries(); }
-elsif ($action == $ACTION_FILES) { show_files(); }
-
-sub show_files {
-    foreach (keys %filea) {
-	my $first = 0;
-	print "$_:  ";
-	foreach my $f (@{ $filea{$_} }) {
-	    print "," if ($first++);
-	    print basename($f);
-	}
-	print "\n";
-    }
-}
-
-# For each file in the target directory, see if we need it or not
-
-sub verify_libraries {
-    my (@dirlist);
-
-    opendir(DIR, $libdir);
-    @dirlist = grep { ! -d "$libdir/$_" } readdir(DIR);
-    closedir(DIR);
-
-    foreach my $f (@dirlist) {
-	my ($found) = 0;
-
-	foreach my $l (@sortlibs) {
-	    my ($libfile) = "$libdir/$l";
-	    if ($l eq basename($f)) {
-		$found = 1;
-		last;
-	    }
-	    if (-l $libfile) {
-		my ($link) = readlink $libfile;
-		if (basename($link) eq basename($f)) {
-		    $found = 1;
-		    last;
-		}
-	    }
-	}
-
-	if (!$found) {
-	    if ($script) {
-		print "$f\n";
-	    } else {
-		print "File $f is not needed by the current tree\n";
-	    }
-	}
-    } 
-}
-
-sub list_libraries {
-   foreach $_ ( @sortlibs) {
-       my ($libfile) = "$libdir/$_";
-       print "$_: ";
-
-       if (-l $libfile) {
-	   my ($link) = basename(readlink $libfile);
-	   print " $_ => $link";
-       }
-       elsif (-f $libfile) {
-	   print " $_";
-       }
-       else { print "*NOT FOUND*"; }
-       print "\n";
-   }
-}
-
-sub copy_libraries {
-    my @copylibs;
-    my $dir;
-    my $lib;
-
-    for(my $i = 1; $i <= $#ARGV; $i++) {
-	push @copylibs, $ARGV[$i];
-    }
-
-    my (@args) = ("cp", "-a", "", "");
-
-    print "Copying needed libraries:\n" if (!$silent);
-    
-    COPYLIB: foreach $lib ( @sortlibs) {
-      LIBS: foreach $dir (@copylibs) {
-	  my $file = "$dir/$lib";
-	  
-	  next LIBS unless (-e $file || -l $file);
-
-	  my ($libfile) = "$dir/$lib";
-	  my $stat = 0;
-	  
-	  my ($libname) = basename($libfile);
-
-	  $args[2] = "$libfile";
-	  $args[3] = "$targetdir/lib";
-	  print "Copying $libname...\n" if (!$silent);
-	  system(@args);
-
-	  if (-l $libfile) {
-	      my $targetlink = readlink $libfile;
-		  
-	      if (-e "$dir/$targetlink") { 		 
-		  $args[2] = "$dir/$targetlink";
-		  $args[3] = "$targetdir/lib";
-		  print "Copying $dir/$targetlink...\n" if (!$silent);
-		  system(@args);
-	      }
-	  }
-
-	  next COPYLIB;
-      }
-    }
-}  
-
-
Index: buildrom/bin/doquilt.sh
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/bin/doquilt.sh	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,32 @@
+#!/bin/bash
+# This script sets up the quilt directory and patches the package
+
+DIR=$1; shift
+
+# if the .pc directory already exists, then we will boldy assume
+# that quilt has been previously applied.  Aggressively restore the tree
+# to pristine
+
+if [ -d $DIR/.pc ]; then
+	pushd $DIR > /dev/null
+	quilt pop -qaf > /dev/null 2>&1
+	popd > /dev/null
+fi
+
+mkdir -p $DIR/patches
+echo "# $DIR quilt series" > $DIR/patches/series
+
+# If there are no patches to apply, fail cleanly
+
+if [ $# -eq 0 ]; then
+	exit 0
+fi
+
+while [ $# -gt 0 ]; do
+    echo `basename $1` >> $DIR/patches/series
+    cp $1 $DIR/patches
+    shift
+done
+
+cd $DIR
+quilt push -qa
Index: buildrom/bin/fetchgit.sh
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/bin/fetchgit.sh	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Check out or update a GIT repository
+
+URL=$1
+DIR=$2
+TAG=$3
+TARBALL=$4
+
+# If the base git directory doesn't exist, then we need to clone it
+
+if [ ! -d $DIR/git ]; then 
+	echo "Cloning $URL..."
+	git-clone --bare $URL $DIR/git
+	if [ $? -ne 0 ]; then
+		echo "Couldn't clone $URL."
+		exit 1
+	fi
+fi
+
+# Fetch the latest and greatest bits
+
+export GIT_DIR=$DIR/git
+
+git-fetch $URL
+git-fetch --tags $URL
+git-prune-packed
+git-pack-redundant --all | xargs -r rm
+
+# Make the tarball 
+git-tar-tree $TAG git | gzip > $TARBALL
Index: buildrom/bin/fetchsvn.sh
===================================================================
--- buildrom.orig/bin/fetchsvn.sh	2007-05-01 14:29:43.000000000 -0600
+++ buildrom/bin/fetchsvn.sh	2007-05-01 17:21:24.000000000 -0600
@@ -4,30 +4,28 @@
 URL=$1
 DIR=$2
 REV=$3
-
-BASE=`dirname $DIR`
+TARBALL=$4
 
 # Simple case - the repository doesn't exist
 
-if [ ! -d $DIR/.svn ]; then
-	(cd $BASE; \
-	svn co -r $REV $URL || {
-		echo "Couldn't get the repository."
+if [ ! -d $DIR/svn/.svn ]; then
+	echo "Fetching $URL..."	
+	svn co -r $REV $URL $DIR/svn
+	if [ $? -ne 0 ]; then
+		echo "Couldn't fetch the code from $URL"
 		exit 1
-	})
-
-	exit 0
-fi
-
-CURREV=`svn info $DIR | grep "Last Changed Rev" | awk '{ print $4 }'`
-
-if [ $CURREV -ne $REV ]; then
-	(cd $DIR; \
-	svn update -r $REV $URL || {
-		echo "Couldn't update the repository."
-		exit 1
-	})
-
-        exit 0
+	fi	
+else
+	CURREV=`svn info $DIR/svn | grep "Last Changed Rev" | awk '{ print $4 }'`
+
+	if [ $CURREV -ne $REV ]; then
+		(cd $DIR/svn; \
+		echo "Updating from $CURREV to $REV"
+		svn update -r $REV || {
+			echo "Couldn't update the repository."
+			exit 1
+		})
+	fi
 fi
 
+tar -C $DIR -zcf $TARBALL svn 
Index: buildrom/bin/getsig.sh
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/bin/getsig.sh	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# These should be fairly static - we can make them dynamic if we have to
+
+START="FFFC0"
+LEN="16"
+
+STR_BEGIN=`dc -e "16 i FFFC0 p"`
+STR_END=`expr $(STR_BEGIN) + $(LEN)`
+
+IN=$1
+
+if [ -z "$IN" -o -z "$SIG" ]; then
+	echo "usage:  ./getsig.sh <rom>"
+	exit 1
+fi
+
+dd if=$IN bs=1 skip=$STR_BEGIN count=$LEN 2>/dev/null
Index: buildrom/bin/mklibs.py
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/bin/mklibs.py	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,626 @@
+#! /usr/bin/python
+
+# mklibs.py: An automated way to create a minimal /lib/ directory.
+#
+# Copyright 2001 by Falk Hueffner <falk at debian.org>
+#                 & Goswin Brederlow <goswin.brederlow at student.uni-tuebingen.de>
+#
+# mklibs.sh by Marcus Brinkmann <Marcus.Brinkmann at ruhr-uni-bochum.de>
+# used as template
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+# HOW IT WORKS
+#
+# - Gather all unresolved symbols and libraries needed by the programs
+#   and reduced libraries
+# - Gather all symbols provided by the already reduced libraries
+#   (none on the first pass)
+# - If all symbols are provided we are done
+# - go through all libraries and remember what symbols they provide
+# - go through all unresolved/needed symbols and mark them as used
+# - for each library:
+#   - find pic file (if not present copy and strip the so)
+#   - compile in only used symbols
+#   - strip
+# - back to the top
+
+# TODO
+# * complete argument parsing as given as comment in main
+
+import commands
+import string
+import re
+import sys
+import os
+import glob
+import getopt
+from stat import *
+
+########################## Generic Macros ###########################
+
+DEBUG_QUIET   = 0
+DEBUG_NORMAL  = 1
+DEBUG_VERBOSE = 2
+DEBUG_SPAM    = 3
+
+debuglevel = DEBUG_NORMAL
+
+def debug(level, *msg):
+    if debuglevel >= level:
+        print string.join(msg)
+
+# A simple set class. It should be replaced with the standard sets.Set
+# type as soon as Python 2.3 is out.
+class Set:
+    def __init__(self):
+        self.__dict = {}
+
+    def add(self, obj):
+        self.__dict[obj] = 1
+
+    def contains(self, obj):
+        return self.__dict.has_key(obj)
+
+    def merge(self, s):
+        for e in s.elems():
+            self.add(e)
+
+    def elems(self):
+        return self.__dict.keys()
+
+    def size(self):
+        return len(self.__dict)
+
+    def __eq__(self, other):
+        return self.__dict == other.__dict
+
+    def __str__(self):
+        return `self.__dict.keys()`
+
+    def __repr__(self):
+        return `self.__dict.keys()`
+
+# return a list of lines of output of the command
+def command(command, *args):
+    debug(DEBUG_SPAM, "calling", command, string.join(args))
+    (status, output) = commands.getstatusoutput(command + ' ' + string.join(args))
+    if os.WEXITSTATUS(status) != 0:
+        if(debuglevel < DEBUG_SPAM):
+            print "Failed command: ", command, string.join(args)
+        print "Returned " +  str(os.WEXITSTATUS(status)) + " (" + output + ")"
+        if debuglevel >= DEBUG_VERBOSE:
+            raise Exception
+        sys.exit(1)
+    return string.split(output, '\n')
+
+# Filter a list according to a regexp containing a () group. Return
+# a Set.
+def regexpfilter(list, regexp, groupnr = 1):
+    pattern = re.compile(regexp)
+    result = Set()
+    for x in list:
+        match = pattern.match(x)
+        if match:
+            result.add(match.group(groupnr))
+
+    return result
+
+##################### Library Handling ##############################
+#
+# This section handles libraries, lib_path searching, the soname and
+# symlink mess, and should really be made into an object
+#
+
+libraries = {} # map from inode to filename (full name, relative to root)
+    
+# update the libraries global with new inodes 
+# Only uses the canonical name, and creates a link from the given
+# name to the canonical name
+def add_dependencies(obj):
+    if not os.access(obj, os.R_OK):
+        raise "Cannot find object file: " + obj
+    output = command(target + "objdump", "--private-headers", obj)
+    depends = regexpfilter(output, ".*NEEDED\s*(\S+)$")
+    debug(DEBUG_VERBOSE, obj + " uses libraries " + string.join(depends.elems(),", "))
+    
+    for library in depends.elems():
+	full_path = find_lib(library, root)
+	if not full_path or not os.access(root + full_path, os.R_OK):
+	    # perhaps the library only exists in the destination
+	    full_path = find_lib(library, dest)
+	    if full_path:
+		present_symbols.merge(provided_symbols(dest + full_path))
+	    else:
+		raise "Cannot find library: " + library + " for object " + obj
+	else:
+	    add_library(full_path)
+
+def add_library(library):
+        # add the library to the list, unless it's a duplicate
+        inode = os.stat(root + library).st_ino
+        if libraries.has_key(inode):
+            debug(DEBUG_SPAM, library, "is link to", libraries[inode])
+        else:
+            libraries[inode] = canonical_name(library)
+	
+	# create a link from this name to the canonical one
+	if libraries[inode] == library:
+	    pass # this is the canonical name
+	elif os.path.dirname(library) == os.path.dirname(libraries[inode]):
+	    symlink(dest + library, os.path.basename(libraries[inode]))
+	else:
+	    symlink(dest + library, libraries[inode]) # must use an absolute name
+
+# Find complete path of a library, by searching in lib_path
+# This is done relative to aroot
+def find_lib(lib, aroot):
+    if lib[0] == '/':
+	if os.access(aroot + lib, os.F_OK):
+	    return lib
+	debug(DEBUG_QUIET, "WARNING: %s does not exist" % lib)
+    else:
+	for path in lib_path:
+	    if os.access(aroot + path + lib, os.F_OK):
+		return path + lib
+	debug(DEBUG_QUIET, "WARNING: %s not found in search path" % lib, \
+	      string.join(lib_path, ":"))
+	
+    return ""
+
+# returns the canonical name of this library
+# First it searches for a valid SONAME: the file must exist
+# Then it tries following symlinks
+def canonical_name(so_file):
+    soname_data = regexpfilter(command(target + "readelf", "--all", "-W", root + so_file),
+                               ".*SONAME.*\[(.*)\].*")
+    canon = ""
+
+    if soname_data.elems():
+	soname = soname_data.elems()[0]
+	canon = find_lib(soname, root)
+
+    if not canon:
+	canon = resolve_link(so_file)
+	
+    if canon:
+	debug(DEBUG_SPAM, "Canonical name of", so_file, "is", soname)
+	return canon
+    
+    return so_file
+     
+# Return real target of a symlink (all relative to root)
+def resolve_link(file):
+    debug(DEBUG_SPAM, "resolving", file)
+    while S_ISLNK(os.lstat(root + file)[ST_MODE]):
+        new_file = os.readlink(root + file)
+        if new_file[0] != "/":
+            file = os.path.join(os.path.dirname(file), new_file)
+        else:
+            file = new_file
+    debug(DEBUG_SPAM, "resolved to", file)
+    return file
+
+# Return a Set of symbols provided by an object
+def provided_symbols(obj):
+    if not os.access(obj, os.R_OK):
+        raise "Cannot find lib" + obj
+
+    result = Set()
+    debug(DEBUG_SPAM, "Checking provided_symbols for", obj)
+    output = command(target + "readelf", "-s", "-W", obj)
+    for line in output:
+        match = symline_regexp.match(line)
+        if match:
+            bind, ndx, name = match.groups()
+            if bind != "LOCAL" and not ndx in ("UND", "ABS"):
+                debug(DEBUG_SPAM, obj, "provides", name)
+                result.add(name)
+    return result
+
+# Find a PIC archive for the library
+# this is either an archive of the form base_name_pic.a or
+# base_name.a with a _GLOBAL_OFFSET_TABLE_
+def find_pic(lib):
+    base_name = so_pattern.match(lib).group(1)
+    for path in lib_path:
+	full = root + path + base_name + "_pic.a"
+	debug(DEBUG_SPAM, "checking", full)
+        for file in glob.glob(full):
+            if os.access(file, os.F_OK):
+                return file
+    for path in lib_path:
+	for file in glob.glob(root + path + base_name + ".a"):
+	    relocs = command(target + "objdump", "-r", file)
+            # this must be size() > 1 to avoid stripping libdl
+	    if os.access(file, os.F_OK) and regexpfilter(relocs,"(.*_GLOBAL_OFFSET_TABLE_)").size() > 1:
+               return file
+    return ""
+
+# Find a PIC .map file for the library
+def find_pic_map(lib):
+    base_name = so_pattern.match(lib).group(1)
+    for path in lib_path:
+        for file in glob.glob(root + path + "/" + base_name + "_pic.map"):
+            if os.access(file, os.F_OK):
+                return file
+    return ""
+
+
+# Return a list of libraries the passed objects depend on. The
+# libraries are in "-lfoo" format suitable for passing to gcc.
+def library_depends_gcc_libnames(obj):
+    if not os.access(obj, os.R_OK):
+        raise "Cannot find lib: " + obj
+    output = command(target + "objdump", "--private-headers", obj)
+    output = regexpfilter(output, ".*NEEDED\s*lib(\S+)\.so.*$")
+    if not output.elems():
+        return ""
+    else:
+        return "-l" + string.join(output.elems(), " -l")
+
+# Scan readelf output. Example:
+# Num:    Value          Size Type    Bind   Vis      Ndx Name
+#   1: 000000012002ab48   168 FUNC    GLOBAL DEFAULT  UND strchr at GLIBC_2.0 (2)
+symline_regexp = \
+    re.compile("\s*\d+: .+\s+\d+\s+\w+\s+(\w+)+\s+\w+\s+(\w+)\s+([^\s@]+)")
+
+############################### Misc Functions ######################
+    
+def add_object(obj):
+    inode = os.stat(obj)[ST_INO]
+    if objects.has_key(inode):
+        debug(DEBUG_SPAM, obj, "is a hardlink to", objects[inode])
+    elif script_pattern.match(open(obj).read(256)):
+        debug(DEBUG_SPAM, obj, "is a script")
+    else:
+        objects[inode] = obj
+	add_dependencies(obj)
+     
+	# Check for rpaths
+	rpath_val = rpath(obj)
+	if rpath_val:
+	    if root:
+		if debuglevel >= DEBUG_VERBOSE:
+		    print "Adding rpath " + string.join(rpath_val, ":") + " for " + obj
+	    else:
+		print "warning: " + obj + " may need rpath, but --root not specified"
+	    lib_path.extend(rpath_val)
+
+# Return a Set of rpath strings for the passed object
+def rpath(obj):
+    if not os.access(obj, os.R_OK):
+        raise "Cannot find lib: " + obj
+    output = command(target + "objdump", "--private-headers", obj)
+    return map(lambda x: x + "/", regexpfilter(output, ".*RPATH\s*(\S+)$").elems())
+
+# Return undefined symbols in an object as a Set of tuples (name, weakness)
+# Besides all undefined symbols, all weak symbols must be included
+# because 
+def undefined_symbols(obj):
+    if not os.access(obj, os.R_OK):
+        raise "Cannot find lib" + obj
+
+    result = Set()
+    output = command(target + "readelf", "-s", "-W", obj)
+    for line in output:
+        match = symline_regexp.match(line)
+        if match:
+            bind, ndx, name = match.groups()
+            if bind != "LOCAL" and ndx == "UND":
+                comment = ""
+                if bind == "WEAK":
+                    comment = "(weak)"
+                debug(DEBUG_SPAM, obj, "requires", name, comment)
+                result.add((name, bind == "WEAK"))
+    return result
+
+
+def usage(was_err):
+    if was_err:
+        outfd = sys.stderr
+    else:
+        outfd = sys.stdout
+    print >> outfd, "Usage: mklibs [OPTION]... -d DEST FILE ..."
+    print >> outfd, "Make a set of minimal libraries for FILE(s) in DEST."
+    print >> outfd, "" 
+    print >> outfd, "  -d, --dest-dir DIRECTORY     create libraries in DIRECTORY"
+    print >> outfd, "  -D, --no-default-lib         omit default libpath (", string.join(default_lib_path, " : "), ")"
+    print >> outfd, "  -L DIRECTORY[:DIRECTORY]...  add DIRECTORY(s) to the library search path"
+    print >> outfd, "      --ldlib LDLIB            use LDLIB for the dynamic linker"
+    print >> outfd, "      --libc-extras-dir DIRECTORY  look for libc extra files in DIRECTORY"
+    print >> outfd, "      --target TARGET          prepend TARGET- to the gcc and binutils calls"
+    print >> outfd, "      --root ROOT              search in ROOT for library paths"
+    print >> outfd, "  -v, --verbose                explain more (usable multiple times)"
+    print >> outfd, "  -h, --help                   display this help and exit"
+    sys.exit(was_err)
+	
+def version(vers):
+    print "mklibs: version ",vers
+    print ""
+
+#################################### main ###########################
+## Usage: ./mklibs.py [OPTION]... -d DEST FILE ...
+## Make a set of minimal libraries for FILE ... in directory DEST.
+## 
+## Options:
+##   -L DIRECTORY               Add DIRECTORY to library search path.
+##   -D, --no-default-lib       Do not use default lib directories of /lib:/usr/lib
+##   -n, --dry-run              Don't actually run any commands; just print them.
+##   -v, --verbose              Print additional progress information. (can use twice)
+##   -V, --version              Print the version number and exit.
+##   -h, --help                 Print this help and exit.
+##   --ldlib                    Name of dynamic linker (overwrites environment variable ldlib)
+##   --libc-extras-dir          Directory for libc extra files
+##   --target                   Use as prefix for gcc or binutils calls
+## 
+##   -d, --dest-dir DIRECTORY   Create libraries in DIRECTORY.
+## 
+## Required arguments for long options are also mandatory for the short options.
+
+# Clean the environment
+vers="0.12"
+os.environ['LC_ALL'] = "C"
+
+# Argument parsing
+opts = "L:DnvVhd:r:"
+longopts = ["no-default-lib", "dry-run", "verbose", "version", "help",
+            "dest-dir=", "ldlib=", "target=", "root="]
+
+# some global variables
+lib_rpath = []
+lib_path = []
+dest = "DEST"
+ldlib = "LDLIB"
+include_default_lib_path = True
+default_lib_path = ["/lib", "/usr/lib", "/usr/X11R6/lib"]
+target = ""
+root = ""
+so_pattern = re.compile("(?:.*/)*((lib|ld)[^/]*?)(-[.\d]*)?\.so(\.[^/]]+)*")
+script_pattern = re.compile("^#!\s*/")
+
+try:
+    optlist, proglist = getopt.getopt(sys.argv[1:], opts, longopts)
+except getopt.GetoptError, msg:
+    print >> sys.stderr, msg
+    usage(1)
+
+for opt, arg in optlist:
+    if opt in ("-v", "--verbose"):
+        if debuglevel < DEBUG_SPAM:
+            debuglevel = debuglevel + 1
+    elif opt == "-L":
+        lib_path.extend(string.split(arg, ":"))
+    elif opt in ("-d", "--dest-dir"):
+        dest = arg
+    elif opt in ("-D", "--no-default-lib"):
+        include_default_lib_path = False
+    elif opt == "--ldlib":
+        ldlib = arg
+    elif opt == "--target":
+        target = arg + "-"
+    elif opt in ("-r", "--root"):
+        root = arg
+    elif opt in ("--help", "-h"):
+         usage(0)
+         sys.exit(0)
+    elif opt in ("--version", "-V"):
+        version(vers)
+        sys.exit(0)
+    else:
+        print "WARNING: unknown option: " + opt + "\targ: " + arg
+
+if include_default_lib_path:
+    lib_path.extend(default_lib_path)
+
+lib_path = map(lambda dir: dir + "/", lib_path)
+
+if ldlib == "LDLIB":
+    ldlib = os.getenv("ldlib")
+
+cflags = os.getenv("CFLAGS")
+
+objects = {}  # map from inode to filename (relative to current directory, or absolute)
+present_symbols = Set()
+
+for prog in proglist:
+    add_object(prog)
+    
+basenames = map(lambda full: full[string.rfind(full, '/') + 1:], objects.values())
+debug(DEBUG_VERBOSE, "Objects:", string.join(basenames))
+
+if not ldlib:
+    pattern = re.compile(".*Requesting program interpreter:.*/([^\]/]+).*")
+    for obj in objects.values():
+        output = command(target + "readelf", "--program-headers", obj)
+        for x in output:
+             match = pattern.match(x)
+             if match:
+                 ldlib = match.group(1)
+                 break
+        if ldlib:
+             ldlib = find_lib(ldlib, root)
+
+
+if not ldlib:
+    sys.exit("E: Dynamic linker not found, aborting.")
+else:
+    debug(DEBUG_NORMAL, "Using", ldlib, "as dynamic linker.")
+    add_library(ldlib)
+
+root = root + "/"
+dest = dest + "/"
+os.umask(0022)
+
+passnr = 1
+needed_symbols = Set()              # Set of (name, weakness-flag)
+
+# FIXME: on i386 this is undefined but not marked UND
+# I don't know how to detect those symbols but this seems
+# to be the only one and including it on alpha as well
+# doesn't hurt. I guess all archs can live with this.
+needed_symbols.add(("sys_siglist", 1))
+
+while True:
+    debug(DEBUG_NORMAL, "library reduction pass", `passnr`)
+
+    passnr = passnr + 1
+
+    # Gather all already reduced libraries and treat them as objects as well
+    for lib in libraries.values():
+        obj = dest + lib + "-stripped"
+        
+    # calculate what symbols are present/needed in objects
+    previous_count = needed_symbols.size()
+    for obj in objects.values():
+        needed_symbols.merge(undefined_symbols(obj))
+        present_symbols.merge(provided_symbols(obj))
+    
+    # what needed symbols are not present?
+    num_unresolved = 0
+    num_weak = 0
+    unresolved = Set()
+    for (symbol, is_weak) in needed_symbols.elems():
+        if not present_symbols.contains(symbol):
+            comment = ""
+            if(is_weak):
+                comment = "(weak)"
+                num_weak += 1
+            debug(DEBUG_SPAM, "unresolved", symbol, comment)
+            unresolved.add((symbol, is_weak))
+            num_unresolved += 1
+
+    debug (DEBUG_NORMAL, `needed_symbols.size()`, "symbols,",
+           `num_unresolved`, "unresolved", "(" + `num_weak`, " weak)")
+
+    if num_unresolved == 0:
+        break
+
+    # if this pass has no more needed symbols, verify all remaining
+    # symbols are weak
+    if previous_count == needed_symbols.size():
+        if num_weak != num_unresolved:
+            print "Unresolved symbols:",
+            for (symbol, is_weak) in unresolved.elems():
+                if not is_weak:
+                    print symbol,
+            print
+            raise Exception
+        break
+
+    library_symbols = {}
+    library_symbols_used = {}
+    symbol_provider = {}
+
+    # Calculate all symbols each library provides
+    inodes = {}
+    for library in libraries.values():
+        path = root + library
+
+	symbols = provided_symbols(path)
+        library_symbols[library] = Set()
+        library_symbols_used[library] = Set()    
+        for symbol in symbols.elems():
+            if symbol_provider.has_key(symbol):
+                # in doubt, prefer symbols from libc
+                if re.match("^libc[\.-]", library):
+                    library_symbols[library].add(symbol)
+                    symbol_provider[symbol] = library
+                else:
+                    debug(DEBUG_SPAM, "duplicate symbol", symbol, "in", 
+                          symbol_provider[symbol], "and", library)
+            else:
+                library_symbols[library].add(symbol)
+                symbol_provider[symbol] = library
+
+    # which symbols are actually used from each lib
+    for (symbol, is_weak) in needed_symbols.elems():
+        if symbol_provider.has_key(symbol):
+            lib = symbol_provider[symbol]
+            library_symbols_used[lib].add(symbol)
+
+    # reduce libraries
+    for library in libraries.values():
+        stripped = dest + library + "-stripped"
+            
+        # make the directory to hold the library
+        try:
+            os.makedirs(os.path.dirname(dest + library));
+        except:
+            pass
+
+        pic_file = find_pic(library)
+        if not pic_file:
+            # No pic file, so we have to use the .so file, no reduction
+            debug(DEBUG_NORMAL, "copying", library, " (no pic file found)")
+            command(target + "objcopy", "--strip-unneeded -R .note -R .comment",
+                    root + library, dest + library + "-stripped")
+        else:
+            # we have a pic file, recompile
+            debug(DEBUG_SPAM, "extracting from:", pic_file, "library:", library)
+            base_name = so_pattern.match(library).group(1)
+            
+            if base_name == "libc" and find_lib(ldlib, root):
+                # force dso_handle.os to be included, otherwise reduced libc
+                # may segfault in ptmalloc_init due to undefined weak reference
+                extra_flags = root + find_lib(ldlib, root) + " -u __dso_handle"
+            else:
+                extra_flags = ""
+            map_file = find_pic_map(library)
+            if map_file:
+                extra_flags = extra_flags + " -Wl,--version-script=" + map_file
+            if library_symbols_used[library].elems():
+                joined_symbols = "-u" + string.join(library_symbols_used[library].elems(), " -u")
+            else:
+                joined_symbols = ""
+            # compile in only used symbols
+            command(target + "gcc",
+                cflags + " -nostdlib -nostartfiles -shared -Wl,-soname=" + os.path.basename(library),\
+                joined_symbols,
+                "-o", dest + "tmp-so",
+                pic_file,
+                extra_flags,
+                "-lgcc",
+                "-L" + string.join(map(lambda orig: dest + orig, lib_path), " -L"), \
+                "-L" + string.join(map(lambda orig: root + orig, lib_path), " -L"), \
+                library_depends_gcc_libnames(root + library))
+            # strip result
+            command(target + "objcopy", "--strip-unneeded -R .note -R .comment",
+                      dest + "tmp-so",
+                      dest + library + "-stripped")
+            ## DEBUG
+            debug(DEBUG_VERBOSE, "reducing", library, "\t", 
+                  "original:", `os.stat(root + library)[ST_SIZE]`,
+                  "reduced:", `os.stat(dest + "tmp-so")[ST_SIZE]`,
+                  "stripped:", `os.stat(stripped)[ST_SIZE]`)
+	    debug(DEBUG_SPAM, "using: " + string.join(library_symbols_used[library].elems()))
+            
+	    os.remove(dest + "tmp-so")
+
+        # add the library to the list of objects (if not there already)
+        if stripped not in objects.values():
+            debug(DEBUG_VERBOSE, "adding object", stripped)
+	    add_object(stripped)
+    
+# Finalising libs and cleaning up
+for lib in libraries.values():
+    os.rename(dest + lib + "-stripped", dest + lib)
+
+# Make sure the dynamic linker is present and is executable
+if ldlib:
+    debug(DEBUG_NORMAL, "stripping and copying dynamic linker.")
+    command(target + "objcopy", "--strip-unneeded -R .note -R .comment",
+            root + ldlib, dest + ldlib)
+    os.chmod(dest + ldlib, 0755)
Index: buildrom/bin/setsig.sh
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/bin/setsig.sh	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+# These should be fairly static - we can make them dynamic if we have to
+
+START="FFFC0"
+LEN="16"
+
+STR_BEGIN=`dc -e "16 i FFFC0 p"`
+STR_END=`expr $STR_BEGIN + $LEN`
+
+IN=$1
+SIG=$2
+OUT=$3
+
+if [ -z "$IN" -o -z "$SIG" ]; then
+	echo "usage:  ./setsig.sh <input> <sig> <output>"
+	exit 1
+fi
+
+if [ -z "$OUT" ]; then
+	OUTPUT=/dev/stdout
+fi
+
+dd if=$IN bs=$STR_BEGIN count=1 > $OUT 2>/dev/null
+echo -n "$SIG" >> $OUT
+dd if=$IN bs=$STR_END skip=1 >> $OUT 2>/dev/null
Index: buildrom/bin/verify-rom.sh
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/bin/verify-rom.sh	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+ROM=$1
+if [ -z "$ROM" ]; then
+	echo "usage: ./verify-rom.sh <rom>"
+	exit 1
+fi
+
+echo -n "EC:  "
+dd if=$ROM bs=1 count=64k 2> /dev/null | md5sum | awk '{print $1}'
+
+echo -n "VSA: "
+dd if=$ROM bs=1 skip=64k count=64k 2> /dev/null | md5sum | awk '{print $1}'
Index: buildrom/config/payloads/Config.in
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/Config.in	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,123 @@
+# This menu selects the desired packages for the Linux as bootloader
+# payload
+
+menu "Payload Configuration"
+
+choice
+	prompt "Desired payload"
+	default PAYLOAD_KERNEL
+	help
+	  Buildrom can build a number of different payloads for the ROM
+
+config PAYLOAD_CUSTOM
+	bool "Custom Payload"
+	select PAYLOAD
+
+config PAYLOAD_ETHERBOOT
+	bool "Etherboot"
+	select PAYLOAD
+
+config PAYLOAD_FILO
+	bool "FILO"
+	select PAYLOAD
+
+config PAYLOAD_KERNEL
+	bool "Linux kernel payload"
+	select PAYLOAD
+
+config PAYLOAD_LAB
+	bool "Linux As Bootloader"
+	select PAYLOAD
+
+config PAYLOAD_OFW
+	bool "OpenFirmware"
+	select PAYLOAD
+
+config PAYLOAD_MEMTEST
+	bool "Memtest86+"
+	select PAYLOAD
+
+endchoice
+
+menu "Custom Payload"
+depends PAYLOAD_CUSTOM
+config CUSTOM_PAYLOAD
+	string "Custom payload filename"
+	default ""
+	help
+	  Specify a filename for the custom ELF payload you wish to attach
+	  to the ROM.  You can also specify the custom payload with the
+	  CUSTOM_PAYLOAD environment variable.
+
+endmenu
+ 
+menu "Kernel Configuration"
+depends PAYLOAD_KERNEL
+
+config CMDLINE
+	string "Kernel command line"
+	default ""
+	help
+	  Specify the kernel command line to use for the kernel.  This is
+	  passed to mkelfimage when the kernel is built.
+endmenu
+
+menu "LAB Configuration"
+depends PAYLOAD_LAB
+
+config KBL_KEXEC_ONLY
+	bool
+	default n
+
+config KBL
+	bool "Reduced size kexec-tools"
+	default y
+	select KBL_KEXEC_ONLY
+	help
+	  Say 'Y' here to include the the Kexec Bootloader as a cheep
+	  substitute for kexec-tools
+
+config BUSYBOX
+	bool "Busybox"
+	default y
+	help
+	  Say 'Y' here to include the busybox tools
+
+config BOOTMENU
+	bool "Bootmenu"
+	default y
+	help
+	  Say 'Y' here to include the bootmenu selector
+	
+config OLPCFLASH
+	bool "OLPC flash utility"
+	depends PLATFORM_OLPC
+	default y
+	help
+	  Say 'Y' here to include the OLPC flash utility
+
+endmenu
+
+menu "Memtest86 Configuration"
+depends PAYLOAD_MEMTEST
+
+config MEMTEST_SERIAL
+       bool "Configure memtest for serial output"
+       default y
+       help
+         Turn on serial output for memtest86+
+
+endmenu
+
+menu "Etherboot Configuration"
+depends PAYLOAD_ETHERBOOT
+
+config ETHERBOOT_DRIVER
+	string "Etherboot NIC driver to support"
+	default "rtl8139"
+	help
+	  Specify the etherboot NIC driver to build a ROM for.  See the
+	  Etherboot project for more details
+
+endmenu
+endmenu
Index: buildrom/config/payloads/custom.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/custom.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,9 @@
+# Common configuration options
+
+PAYLOAD_BUILD=
+
+ifneq ($(CUSTOM_PAYLOAD),)
+PAYLOAD_ELF=$(CUSTOM_PAYLOAD)
+else
+PAYLOAD_ELF=$(subst ",,$(CONFIG_CUSTOM_PAYLOAD))
+endif
Index: buildrom/config/payloads/etherboot.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/etherboot.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,10 @@
+# Configuration file for the etherboot payload
+
+# Common configuration options
+
+PAYLOAD_BUILD=scripts/Makefile.generic
+
+PAYLOAD_ELF=$(OUTPUT_DIR)/etherboot-payload.elf
+PAYLOAD_COMPRESSED=$(OUTPUT_DIR)/etherboot-payload.elf.lzma
+
+PAYLOAD-y=etherboot
Index: buildrom/config/payloads/filo.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/filo.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,10 @@
+# Configuration file for the etherboot payload
+
+# Common configuration options
+
+PAYLOAD_BUILD=scripts/Makefile.generic
+
+PAYLOAD_ELF=$(OUTPUT_DIR)/filo-payload.elf
+PAYLOAD_COMPRESSED=$(OUTPUT_DIR)/filo-payload.elf.lzma
+
+PAYLOAD-y=filo
Index: buildrom/config/payloads/kernel.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/kernel.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,19 @@
+# Configuration options for the kernel payload option
+
+# General options for all platforms
+
+PAYLOAD_BUILD=scripts/Makefile.kernel
+
+### Payload specific configuration
+
+COMMAND_LINE=$(CONFIG_CMDLINE)
+
+###########################################
+# You shouldn't change anything under this point
+###########################################
+
+PAYLOAD_ELF=$(OUTPUT_DIR)/kernel-payload.elf
+PAYLOAD_COMPRESSED=$(OUTPUT_DIR)/kernel-payload.elf.lzma
+
+PAYLOAD-y= kernel
+HOSTTOOLS-y = mkelfimage
Index: buildrom/config/payloads/lab.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/lab.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,33 @@
+# Configuration options for the Linux As Bootloader (LAB) payload
+
+# General options for all platforms
+
+PAYLOAD_BUILD=scripts/Makefile.lab
+
+### Payload specific configuration
+
+# Specify the default command line for the image
+COMMAND_LINE=console=ttyS0,115200 mem=119m rdinit=/linuxrc
+
+# This is the version string printed during boot.
+
+ifeq ($(CONFIG_PLATFORM_OLPC),y)
+ROM_VERSION=BTest_$(FIRMWARE_REVISION)
+else
+ROM_VERSION="BuildROM L-A-B V1.0"
+endif
+
+###########################################
+# You shouldn't change anything under this point
+###########################################
+
+PAYLOAD_ELF=$(OUTPUT_DIR)/lab-payload.elf
+PAYLOAD_COMPRESSED=$(OUTPUT_DIR)/lab-payload.elf.lzma
+
+PAYLOAD-y= kernel uclibc
+PAYLOAD-$(CONFIG_KBL) += kexec-boot-loader
+PAYLOAD-$(CONFIG_BUSYBOX) += busybox
+PAYLOAD-$(CONFIG_BOOTMENU) += bootmenu
+PAYLOAD-$(CONFIG_OLPCFLASH) += olpcflash
+
+HOSTTOOLS-y = mkelfimage unifdef
Index: buildrom/config/payloads/memtest.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/memtest.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,10 @@
+# Configuration file for the etherboot payload
+
+# Common configuration options
+
+PAYLOAD_BUILD=scripts/Makefile.generic
+
+PAYLOAD_ELF=$(OUTPUT_DIR)/memtest-payload.elf
+PAYLOAD_COMPRESSED=$(OUTPUT_DIR)/memtest-payload.elf.lzma
+
+PAYLOAD-y=memtest
Index: buildrom/config/payloads/ofw.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/ofw.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,15 @@
+# Configuration options for the OpenFirmware payload
+
+# Common configuration options
+
+PAYLOAD_BUILD=scripts/Makefile.ofw
+
+OFW_SVN_URL=svn://openbios.org/openfirmware
+OFW_SVN_TAG=146
+
+PAYLOAD_ELF=$(OUTPUT_DIR)/ofw-payload.elf
+# LZMA isn't allowed for OFW, so no need to defined a COMPRESSSED
+# target
+
+PAYLOAD-y=ofw
+HOSTTOOLS-y=crc32sum
Index: buildrom/config/payloads/payloads.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/payloads/payloads.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,54 @@
+# This will include the correct configuration for the
+# selected payload 
+
+# These are default settings that may be overridden by
+# the individual platform settings at the bottom
+
+# This will select the Makefile that actually builds the 
+# payload - this is included at the bottom of the main Makefile
+#
+
+PAYLOAD_BUILD=
+PAYLOAD_ELF=
+PAYLOAD_COMPRESSED=
+PAYLOAD_TARGET=
+
+### Include the correct payload configuration
+
+PCONF-y=
+PCONF-$(CONFIG_PAYLOAD_LAB) = lab.conf
+PCONF-$(CONFIG_PAYLOAD_ETHERBOOT) = etherboot.conf
+PCONF-$(CONFIG_PAYLOAD_FILO) = filo.conf
+PCONF-$(CONFIG_PAYLOAD_OFW) = ofw.conf
+PCONF-$(CONFIG_PAYLOAD_MEMTEST) = memtest.conf
+PCONF-$(CONFIG_PAYLOAD_KERNEL) = kernel.conf
+PCONF-$(CONFIG_PAYLOAD_CUSTOM) = custom.conf
+
+include $(CONFIG_DIR)/payloads/$(PCONF-y)
+
+# Add LZMA if it is enabled
+HOSTTOOLS-$(CONFIG_USE_LZMA) += lzma
+
+# Sanity check
+
+ifeq ($(PAYLOAD_ELF),)
+$(error You must specify a ELF target)
+endif
+
+ifeq ($(CONFIG_USE_LZMA),y)
+ifeq ($(PAYLOAD_COMPRESSED),)
+$(error You must specify a compressed target)
+endif
+endif
+
+# Set the payload target (if it wasn't set by the config - warning
+# there be dragons here if everything isn't aligned)
+
+ifeq ($(PAYLOAD_TARGET),)
+ifeq ($(CONFIG_USE_LZMA),y)
+PAYLOAD_TARGET=$(PAYLOAD_COMPRESSED)
+else
+PAYLOAD_TARGET=$(PAYLOAD_ELF)
+endif
+endif
+
Index: buildrom/config/platforms/Config.in
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/platforms/Config.in	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,18 @@
+menu "Platform Configuration"
+
+choice
+	prompt "Platform target for the ROM"
+	default PLATFORM_NORWICH
+	help
+	  Select the target to build the LinuxBIOS ROM for
+
+config PLATFORM_NORWICH
+       bool "AMD Geode LX 'Norwich'"
+       select PLATFORM
+
+config PLATFORM_OLPC
+       bool "OLPC Laptop"
+       select PLATFORM
+
+endchoice
+endmenu
Index: buildrom/config/platforms/norwich.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/platforms/norwich.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,39 @@
+# Support for the AMD Geode 'norwich' platform
+# This should really work for any LX platform
+
+#### Platform configuration
+
+CC=gcc
+STRIP=strip
+AS=as
+
+TARGET_ARCH=i586
+CFLAGS_platform = 
+
+# Targets
+
+KERNEL_MK=$(PACKAGE_DIR)/kernel/norwich-kernel.mk
+LINUXBIOS_MK=$(PACKAGE_DIR)/linuxbios/norwich-linuxbios.mk
+
+# kernel configuration (for LAB)
+
+KERNEL_VERSION=2.6.20.2
+KERNEL_CONFIG=$(PACKAGE_DIR)/kernel/conf/norwich-defconfig
+UCLIBC_ARCH=i386
+
+# Etherboot configuration
+ETHERBOOT_ARCH=i386
+
+# LinuxBIOS configuration
+
+LINUXBIOS_VENDOR=amd
+LINUXBIOS_BOARD=norwich
+LINUXBIOS_CONFIG=Config.lb
+LINUXBIOS_TDIR=norwich
+LINUXBIOS_TAG=2376
+LINUXBIOS_ROM_NAME=norwich.rom
+
+# FILO configuration
+
+FILO_CONFIG=norwich-Config
+
Index: buildrom/config/platforms/olpc.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/platforms/olpc.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,86 @@
+# Configuration file for the OLPC platform
+
+# Basic platform configuration
+
+CC=gcc
+STRIP=strip
+AS=as
+
+MACHINE_ARCH=i586
+CFLAGS_platform = -fpic -m32
+ASFLAGS_platform = -32
+
+# Targets
+LINUXBIOS_MK=$(PACKAGE_DIR)/linuxbios/olpc-linuxbios.mk
+KERNEL_MK=$(PACKAGE_DIR)/linuxbios/olpc-kernel.mk
+
+#### Kernel configuration
+
+KERNEL_VERSION=2.6.18-rc4-olpc1
+KERNEL_TAG=1d386c71d46aed41683be5644f397c4fbfbc4d3f
+KERNEL_CONFIG=$(PACKAGE_DIR)/kernel/conf/defconfig-olpc
+
+# The following components are used to create the firmware signature in
+# the ROM.  see README.signature for information about how this is 
+# constructed.
+
+# The firmware model is a 6 byte string that identifies the model
+# This should stay static for the entire CL1 run.
+
+FIRMWARE_MODEL=CL1
+
+# The firmware revision is a 7 byte string that identifies the current
+# version.  The first three bytes of this will be repeated at the end of
+# the string, but that will be pulled out automatically
+# I set this now from a script that calls make
+# I wanted the default to be something non-offical but the boot scripts
+# in the build system look for the Q2A to determine that we are on an
+# OLPC (opposed to QEmu) So I have to have the Q2A. 
+
+FIRMWARE_REVISION = Q2B43
+
+# This is the version number for the embedded controller code pulled
+# in during the LinuxBIOS bulid
+
+EC_VER=B43
+
+# These are LinuxBIOS flags that may be useful
+
+LINUXBIOS_CAS25=y
+LINUXBIOS_ENABLE_FS2=y
+
+# If you uncomment and fill this in then it will override the firmware thats
+# # pulled from dev.laptop.org
+#
+#EC_FIRMWARE_OVERRIDE=PQ2B11T.bin
+
+#### You probably shouldn't change anything under this point
+
+LINUXBIOS_VENDOR=olpc
+LINUXBIOS_BOARD=rev_a
+LINUXBIOS_CONFIG=Config.SPI.lb
+LINUXBIOS_TDIR=rev_a_1M
+LINUXBIOS_ROM_NAME=linuxbios.rom
+
+LINUXBIOS_TAG=f6ec588df29f39a9b3db7fcbde2181d79ff7c5bd
+
+EC_FIRMWARE_URL=http://dev.laptop.org/pub/ec
+
+ifeq ($(PAYLOAD_LAB),y)
+LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/dcon-detect.patch
+endif
+
+ifeq ($(LINUXBIOS_CAS25),y)
+LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/CL2.5.patch
+LINUXBIOS_CL2_MARKER=_CL2.5
+endif
+
+ifeq ($(LINUXBIOS_ENABLE_FS2),y)
+LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/disable_swapsifs.patch
+endif
+
+ifeq ($(EC_FIRMWARE_OVERRIDE),)
+EC_FIRMWARE_REV=ec_v$(EC_VER).img
+else
+EC_FIRMWARE_REV=$(EC_FIRMWARE_OVERRIDE)
+endif
Index: buildrom/config/platforms/platforms.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/config/platforms/platforms.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,12 @@
+# This will include the correct configuration for the
+# selected platform 
+
+LINUXBIOS_MK=$(PACKAGE_DIR)/linuxbios/generic-linuxbios.mk
+
+##Include the correct platform configuration
+
+PLATFORM-y=
+PLATFORM-$(CONFIG_PLATFORM_NORWICH) = norwich.conf
+PLATFORM-$(CONFIG_PLATFORM_OLPC) = olpc.conf
+
+include $(CONFIG_DIR)/platforms/$(PLATFORM-y)
Index: buildrom/Config.in
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/Config.in	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,57 @@
+# The base kbuild file for buildrom
+
+mainmenu "Buildrom Configuration"
+
+config HAVE_DOT_CONFIG
+	bool
+	default y
+
+config VERBOSE
+	bool "See the build output on stdout"
+	default n
+	help
+	  See the entire build output on stdout.  Otherwise, it will
+	  be saved off in a series of logs
+
+config ADVANCED
+	bool "Enable advanced operations"
+	default n
+	help
+	  Allow yourself to do advanced developer things
+
+menu "LinuxBIOS configuration"
+
+config USE_LZMA
+	bool "Enable LZMA compression"
+	depends !PAYLOAD_OFW
+	default y
+	help
+	  Allow LZMA compression for the payload.  This doesn't work
+	  for OFW.
+
+
+config LB_USE_BUILD
+	bool "Specify a LinuxBIOS build dir"
+	depends ADVANCED
+	default n
+	help
+	  Say 'y' here to specify an existing directory to build 
+	  LinuxBIOS from - this is useful if you have local development
+	  tree you wish to work from
+
+config LB_BUILDDIR
+	string "LinuxBIOS build directory"
+	depends LB_USE_BUILD
+
+endmenu
+
+config PLATFORM
+	bool
+	default n
+
+config PAYLOAD
+	bool
+	default n
+
+source config/platforms/Config.in
+source config/payloads/Config.in
Index: buildrom/Config.mk
===================================================================
--- buildrom.orig/Config.mk	2007-05-01 14:29:44.000000000 -0600
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,73 +0,0 @@
-# This is the configuration for the build system
-
-# Uncomment this to see the output from the package builds
-#VERBOSE=y
-
-# Specify the commandline to use with mkelfimage
-COMMAND_LINE=console=ttyS0,115200 video=gxfb:1024x768 mem=119m rdinit=/linuxrc
-
-# Uncomment the packages you want from the following list
-# Say 'y' here to build Marcelo's kexec-boot-loader
-INITRD_KBL=y
-
-# Say 'y' here to use it as a cheap substitute for kexec-tools
-KBL_KEXEC_ONLY=y
-
-# Say 'y' here to build busybox
-INITRD_BUSYBOX=y
-
-# Say 'y' here to build wireless tools
-#INITRD_WIRELESS=n
-
-# Say 'y' here to build the bootmenu
-INITRD_BOOTMENU=y
-
-# Say 'y' here to build uclibc as a shared library (probably a savings
-# win if you selected more then one of the above)
-UCLIBC_DYNAMIC=y
-
-# say 'y' here to build a full rom image (minus the vsa)
-LINUXBIOS_PACKAGE=y
-
-#### Payload selection
-
-# Uncomment this to select the old school elf target
-PAYLOAD_TARGET=$(OUTPUT_DIR)/olpc-payload.elf
-
-# Uncomment this to select the NRV2B compressed payload
-# NOTE!  This doesn't work right now!
-#PAYLOAD_TARGET=$(OUTPUT_DIR)/olpc-payload.elf.nrv2b
-
-###########################################
-# You shouldn't change anything under this point
-###########################################
-
-# Note:  An astute person would note that this is very inefficent - 
-# we should use the INITRD_PACKAGES-$(INITRD_BUSYBOX) += busybox trick.
-
-TARGETS=payload
-INITRD_PACKAGES=
-
-ifeq ($(INITRD_KBL), y)
-INITRD_PACKAGES += kexec-boot-loader
-endif
-
-ifeq ($(INITRD_BUSYBOX),y)
-INITRD_PACKAGES += busybox
-endif
-
-ifeq ($(INITRD_WIRELESS),y)
-INITRD_PACKAGES += wireless-tools
-endif
-
-ifeq ($(INITRD_BOOTMENU),y)
-INITRD_PACKAGES += bootmenu
-endif
-
-ifeq ($(INITRD_KEXEC_TOOLS),y)
-INITRD_PACKAGES += kexec-tools
-endif
-
-ifeq ($(LINUXBIOS_PACKAGE), y)
-TARGETS += linuxbios
-endif
Index: buildrom/Makefile
===================================================================
--- buildrom.orig/Makefile	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/Makefile	2007-05-01 17:21:24.000000000 -0600
@@ -1,73 +1,97 @@
 BASE_DIR=$(shell pwd)
 
-include Config.mk
-include Vars.mk
-
-PKGLIST=uclibc kernel $(INITRD_PACKAGES)
+SCRIPT_DIR=$(BASE_DIR)/scripts
+KCONFIG_DIR=$(SCRIPT_DIR)/kconfig
+CONFIG_DIR=$(BASE_DIR)/config
+
+SOURCE_DIR=$(BASE_DIR)/sources
+BUILD_DIR=$(BASE_DIR)/work
+INITRD_DIR=$(BASE_DIR)/initrd-rootfs
+STAGING_DIR=$(BASE_DIR)/staging
+SKELETON_DIR=$(BASE_DIR)/skeleton
+OUTPUT_DIR=$(BASE_DIR)/deploy
+PACKAGE_DIR=$(BASE_DIR)/packages
+BIN_DIR=$(BASE_DIR)/bin
+
+ifeq (.config, $(wildcard .config))
+dot-config := 1
+else
+dot-config := 0
+config-targets := 1
+endif
 
-ifeq ($(LINUXBIOS_PACKAGE),y)
-PKGLIST += linuxbios
+ifneq ($(filter config %config,$(MAKECMDGOALS)),)
+config-targets := 1
+dot-config := 0
 endif
 
-PKG_clean=$(patsubst %, %-clean, $(PKGLIST))
-PKG_distclean=$(patsubst %, %-distclean, $(PKGLIST))
+ifeq ($(dot-config),0)
+all: .config
 
-# Payload target should be defined in Config.mk - but if it makes it here,
-# then just select the default
+.config: oldconfig
+	@echo "Configuration completed - type make to build your ROM"
+else
+-include .config
 
-PAYLOAD_TARGET ?= $(OUTPUT_DIR)/olpc-payload.elf
+include $(CONFIG_DIR)/platforms/platforms.conf
+include $(CONFIG_DIR)/payloads/payloads.conf
 
-all: $(TARGETS)
+# Include the global settings and other checks
+include $(SCRIPT_DIR)/Build.settings
 
-payload: $(PAYLOAD_TARGET)
+# Construct the list of packages we will be building
+
+PKGLIST = linuxbios $(PAYLOAD-y) $(HOSTTOOLS-y) 
+
+# Construct the various targets
 
-$(OUTPUT_DIR)/initrd.uncompressed: uclibc $(INITRD_PACKAGES)
-	@ cp -af $(SKELETON_DIR)/* $(INITRD_DIR)
-	@ chmod 0755 $(INITRD_DIR)/linuxrc
-
-	@ echo "Cleaning unneeded libraries..."
-	@ ( export LDD="$(STAGING_DIR)/bin/ldd"; \
-	    for file in `$(BASE_DIR)/bin/checklibs.pl \
-	    --verify --silent --script $(INITRD_DIR)`; \
-	    do rm $(INITRD_DIR)/lib/$$file; done )
-
-	@ echo "Building the initrd..."
-	@ install -d $(OUTPUT_DIR)
-	@ cd $(INITRD_DIR); find . | cpio -o -H newc 2> /dev/null > $@
-
-$(OUTPUT_DIR)/initrd: $(OUTPUT_DIR)/initrd.uncompressed
-	@  gzip -9 -c -n $< > $@
-
-# Note that we refuse to continue if the ELF image is too big
-
-$(OUTPUT_DIR)/olpc-payload-uncompressed.elf: kernel $(OUTPUT_DIR)/initrd.uncompressed mkelfimage
-	@ echo "Building the uncompressed ELF payload..."
-	@ rm -f $@
-	@ $(STAGING_DIR)/sbin/mkelfImage --command-line="$(COMMAND_LINE)" \
-	--ramdisk=$(OUTPUT_DIR)/initrd.uncompressed \
-	$(OUTPUT_DIR)/vmlinux $@
-	@ chmod 0644 $@
-
-$(OUTPUT_DIR)/olpc-payload.elf: kernel $(OUTPUT_DIR)/initrd mkelfimage
-	@ echo "Building the ELF payload..."
-	@ rm -f $@
-	@ $(STAGING_DIR)/sbin/mkelfImage --command-line="$(COMMAND_LINE)" \
-	--ramdisk=$(OUTPUT_DIR)/initrd $(OUTPUT_DIR)/bzImage $@
-	@ chmod 0644 $@
-	@ $(BIN_DIR)/checkrom.sh $@
-
-$(OUTPUT_DIR)/olpc-payload.elf.nrv2b: nrv2b $(OUTPUT_DIR)/olpc-payload-uncompressed.elf
-	@ echo "Compressing the ELF payload with nrv2b..."
-	@ $(STAGING_DIR)/bin/nrv2b e \
-	$(OUTPUT_DIR)/olpc-payload-uncompressed.elf \
-	2>/dev/null $@
-	@ $(BIN_DIR)/checkrom.sh $@
+PKG_clean=$(patsubst %, %-clean, $(PKGLIST))
+PKG_distclean=$(patsubst %, %-distclean, $(PKGLIST))
+
+all: $(HOSTTOOLS-y) payload linuxbios
+
+payload: $(PAYLOAD_TARGET)
 
 clean: $(PKG_clean)
 	@ rm -rf $(INITRD_DIR) $(OUTPUT_DIR)
 
 distclean:  $(PKG_distclean)
 	@ rm -rf $(OUTPUT_DIR) $(STAGING_DIR) $(INITRD_DIR)	
+	@ rm -f $(BASE_DIR).config
+
+# Include the payload builder
 
-# Finally, include all of the package targets
-include $(PACKAGE_DIR)/*/*.mk
+ifneq ($(PAYLOAD_BUILD),)
+include $(PAYLOAD_BUILD)
+endif
+
+# The following code gets all the make targets, but filters out the kernel
+# targets which are implicitly set by the platform configuration
+
+MKTARGETS:= $(shell ls $(PACKAGE_DIR)/*/*.mk)
+
+include $(filter-out $(PACKAGE_DIR)/kernel/% $(PACKAGE_DIR)/linuxbios/%,$(MKTARGETS)) 
+
+include $(KERNEL_MK) $(LINUXBIOS_MK)
+
+endif
+
+super-distclean: 
+	@ make -C $(KCONFIG_DIR) clean
+	@ rm -rf $(BUILD_DIR)
+	@ rm -f .config tmpconfig.h .kconfig.d .config.old
+
+ifeq ($(config-targets),1)
+
+$(KCONFIG_DIR)/conf:
+	make -C $(KCONFIG_DIR) conf
+
+textconfig: $(KCONFIG_DIR)/conf
+	@$(KCONFIG_DIR)/conf $(BASE_DIR)/Config.in
+
+oldconfig: $(KCONFIG_DIR)/conf
+	@$(KCONFIG_DIR)/conf -o $(BASE_DIR)/Config.in
+
+defconfig: $(KCONFIG_DIR)/conf
+	@$(KCONFIG_DIR)/conf -d $(BASE_DIR)/Config.in
+endif
Index: buildrom/packages/bin/README
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/bin/README	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,4 @@
+This directory contains the binary bits that make up various parts of the 
+ROM:
+
+olpc_vsa.64k.bin - VSA code for the ROM.  Stored from 32k to 64k in the ROM.
Index: buildrom/packages/bin/README.md5sums
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/bin/README.md5sums	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1 @@
+fdf7a6ed9f3d27b901b87e30dce5a14d  olpc_vsa.64k.bin
Index: buildrom/packages/bootmenu/bootmenu.mk
===================================================================
--- buildrom.orig/packages/bootmenu/bootmenu.mk	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/packages/bootmenu/bootmenu.mk	2007-05-01 17:21:24.000000000 -0600
@@ -1,11 +1,11 @@
-BOOTMENU_URL=http://crank.laptop.org/~jcrouse/
-BOOTMENU_SOURCE=bootmenu-0.1.tar.gz
+BOOTMENU_URL=http://dev.laptop.org/~jcrouse/bootmenu
+BOOTMENU_SOURCE=bootmenu-0.3.tar.gz
 BOOTMENU_DIR=$(BUILD_DIR)/bootmenu
-BOOTMENU_SRC_DIR=$(BOOTMENU_DIR)/bootmenu-0.1
+BOOTMENU_SRC_DIR=$(BOOTMENU_DIR)/bootmenu-0.3
 BOOTMENU_STAMP_DIR=$(BOOTMENU_DIR)/stamps
 BOOTMENU_LOG_DIR=$(BOOTMENU_DIR)/logs
 
-ifeq ($(VERBOSE),y)
+ifeq ($(CONFIG_VERBOSE),y)
 BOOTMENU_BUILD_LOG=/dev/stdout
 BOOTMENU_INSTALL_LOG=/dev/stdout
 else
@@ -24,14 +24,15 @@
 
 $(BOOTMENU_SRC_DIR)/bootmenu: $(BOOTMENU_STAMP_DIR)/.unpacked
 	@ echo "Building bootmenu..."
-	@ $(MAKE) -C $(BOOTMENU_SRC_DIR) > $(BOOTMENU_BUILD_LOG) 2>&1
+	$(MAKE) LDFLAGS="$(CROSS_CFLAGS) $(LDFLAGS)" -C $(BOOTMENU_SRC_DIR) > $(BOOTMENU_BUILD_LOG) 2>&1
 
 $(INITRD_DIR)/bin/bootmenu: $(BOOTMENU_SRC_DIR)/bootmenu
 	@ install -d $(INITRD_DIR)/bin
 	@ install -m 0755 $(BOOTMENU_SRC_DIR)/bootmenu \
 	$(INITRD_DIR)/bin/bootmenu
-	@ install -d $(INITRD_DIR)/bin/images
-	@ install -m 0644 $(BOOTMENU_SRC_DIR)/images/*.ppm $(INITRD_DIR)/bin/images
+	@ $(STRIPCMD) $(INITRD_DIR)/bin/bootmenu
+	@ install -d $(INITRD_DIR)/images
+	@ install -m 0644 $(BOOTMENU_SRC_DIR)/images/*.ppm $(INITRD_DIR)/images
 
 $(BOOTMENU_STAMP_DIR) $(BOOTMENU_LOG_DIR):
 	@ mkdir -p $@
@@ -45,3 +46,7 @@
 bootmenu-distclean:
 	@ rm -rf $(BOOTMENU_DIR)/*
 
+bootmenu-bom:
+	@ echo "Package: bootmenu"
+	@ echo "Source: $(BOOTMENU_URL)/$(BOOTMENU_SOURCE)"
+	@ echo ""
Index: buildrom/packages/busybox/busybox.mk
===================================================================
--- buildrom.orig/packages/busybox/busybox.mk	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/packages/busybox/busybox.mk	2007-05-01 17:21:24.000000000 -0600
@@ -4,8 +4,10 @@
 BUSYBOX_SRC_DIR=$(BUSYBOX_DIR)/busybox-1.1.3
 BUSYBOX_STAMP_DIR=$(BUSYBOX_DIR)/stamps
 BUSYBOX_LOG_DIR=$(BUSYBOX_DIR)/logs
+BUSYBOX_PATCHES=$(PACKAGE_DIR)/busybox/testfix.patch $(PACKAGE_DIR)/busybox/regex.patch
+BUSYBOX_PATCHES += $(PACKAGE_DIR)/busybox/ipaddress.patch
 
-ifeq ($(VERBOSE),y)
+ifeq ($(CONFIG_VERBOSE),y)
 BUSYBOX_BUILD_LOG=/dev/stdout
 BUSYBOX_INSTALL_LOG=/dev/stdout
 else
@@ -21,13 +23,20 @@
 	@ echo "Unpacking busybox..."
 	@ tar -C $(BUSYBOX_DIR) -jxf $(SOURCE_DIR)/$(BUSYBOX_SOURCE)
 	@ touch $@	
-	
-$(BUSYBOX_SRC_DIR)/.config: $(BUSYBOX_STAMP_DIR)/.unpacked
+
+$(BUSYBOX_STAMP_DIR)/.patched: $(BUSYBOX_STAMP_DIR)/.unpacked
+	@ echo "Patching busybox..."
+	@ $(BIN_DIR)/doquilt.sh $(BUSYBOX_SRC_DIR) $(BUSYBOX_PATCHES)
+	@ touch $@
+
+$(BUSYBOX_SRC_DIR)/.config: $(BUSYBOX_STAMP_DIR)/.patched
 	@ cp $(PACKAGE_DIR)/busybox/conf/defconfig $@
 
 $(BUSYBOX_SRC_DIR)/busybox: $(BUSYBOX_SRC_DIR)/.config
 	@ echo "Building busybox..."
-	@ ( unset CFLAGS; export EXTRA_CFLAGS="$(CFLAGS)"; \
+	@ ( unset CFLAGS; unset LDFLAGS; \
+	export EXTRA_CFLAGS="$(CFLAGS)";\
+	export LDFLAGS="$(LDFLAGS_orig)";\
 	$(MAKE) -C $(BUSYBOX_SRC_DIR) VERBOSE=y \
 	LIBRARIES="$(LIBS)" all > $(BUSYBOX_BUILD_LOG) 2>&1)
 
@@ -47,4 +56,7 @@
 busybox-distclean:
 	@ rm -rf $(BUSYBOX_DIR)/*
 
-.PHONY: busybox-message
+busybox-bom:
+	@ echo "Package: busybox"
+	@ echo "Source: $(BUSYBOX_URL)/$(BUSYBOX_SOURCE)"
+	@ echo ""
Index: buildrom/packages/busybox/conf/defconfig
===================================================================
--- buildrom.orig/packages/busybox/conf/defconfig	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/packages/busybox/conf/defconfig	2007-05-01 17:21:24.000000000 -0600
@@ -185,7 +185,7 @@
 # CONFIG_TTY is not set
 # CONFIG_UNAME is not set
 # CONFIG_UNIQ is not set
-# CONFIG_USLEEP is not set
+CONFIG_USLEEP=y
 # CONFIG_UUDECODE is not set
 # CONFIG_UUENCODE is not set
 # CONFIG_WATCH is not set
@@ -219,7 +219,7 @@
 # CONFIG_DUMPKMAP is not set
 # CONFIG_LOADFONT is not set
 # CONFIG_LOADKMAP is not set
-# CONFIG_OPENVT is not set
+CONFIG_OPENVT=y
 # CONFIG_RESET is not set
 # CONFIG_SETCONSOLE is not set
 # CONFIG_SETKEYCODES is not set
@@ -229,8 +229,8 @@
 #
 # CONFIG_MKTEMP is not set
 # CONFIG_PIPE_PROGRESS is not set
-# CONFIG_READLINK is not set
-# CONFIG_FEATURE_READLINK_FOLLOW is not set
+CONFIG_READLINK=y
+CONFIG_FEATURE_READLINK_FOLLOW=y
 CONFIG_RUN_PARTS=y
 # CONFIG_START_STOP_DAEMON is not set
 # CONFIG_WHICH is not set
@@ -342,7 +342,7 @@
 #
 # Linux System Utilities
 #
-# CONFIG_DMESG is not set
+CONFIG_DMESG=y
 CONFIG_FBSET=y
 CONFIG_FEATURE_FBSET_FANCY=y
 # CONFIG_FEATURE_FBSET_READMODE is not set
@@ -558,7 +558,7 @@
 # CONFIG_ASH_READ_NCHARS is not set
 # CONFIG_ASH_READ_TIMEOUT is not set
 CONFIG_ASH_ALIAS=y
-# CONFIG_ASH_MATH_SUPPORT is not set
+CONFIG_ASH_MATH_SUPPORT=y
 # CONFIG_ASH_MATH_SUPPORT_64 is not set
 CONFIG_ASH_GETOPTS=y
 CONFIG_ASH_CMDCMD=y
Index: buildrom/packages/busybox/ipaddress.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/busybox/ipaddress.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,71 @@
+Index: busybox-1.1.3/networking/libiproute/ip_common.h
+===================================================================
+--- busybox-1.1.3.orig/networking/libiproute/ip_common.h	2006-03-22 14:16:18.000000000 -0700
++++ busybox-1.1.3/networking/libiproute/ip_common.h	2006-10-24 15:05:27.000000000 -0600
+@@ -1,5 +1,7 @@
+ #ifndef _IP_COMMON_H
+ #define _IP_COMMON_H 1
++
++
+ extern int preferred_family;
+ extern char * _SL_;
+ 
+Index: busybox-1.1.3/networking/libiproute/ipaddress.c
+===================================================================
+--- busybox-1.1.3.orig/networking/libiproute/ipaddress.c	2006-03-22 14:16:18.000000000 -0700
++++ busybox-1.1.3/networking/libiproute/ipaddress.c	2006-10-24 15:05:51.000000000 -0600
+@@ -21,6 +21,8 @@
+ 
+ #include <net/if.h>
+ #include <net/if_arp.h>
++#include <linux/if_link.h>
++#include <linux/if_addr.h>
+ 
+ #include "rt_names.h"
+ #include "utils.h"
+@@ -28,6 +30,11 @@
+ 
+ #include "libbb.h"
+ 
++#define IFLA_MAX (__IFLA_MAX - 1)
++
++#define IFLA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
++#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
++
+ static struct
+ {
+ 	int ifindex;
+@@ -225,7 +232,7 @@
+ 		return 0;
+ 
+ 	memset(rta_tb, 0, sizeof(rta_tb));
+-	parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
++	parse_rtattr(rta_tb, IFA_MAX, TA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
+ 
+ 	if (!rta_tb[IFA_LOCAL])
+ 		rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS];
+@@ -575,7 +582,7 @@
+ 				if (filter.pfx.family || filter.label) {
+ 					struct rtattr *tb[IFA_MAX+1];
+ 					memset(tb, 0, sizeof(tb));
+-					parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), IFA_PAYLOAD(n));
++					parse_rtattr(tb, IFA_MAX, TA_RTA(ifa), TA_PAYLOAD(n));
+ 					if (!tb[IFA_LOCAL])
+ 						tb[IFA_LOCAL] = tb[IFA_ADDRESS];
+ 
+Index: busybox-1.1.3/networking/libiproute/ll_map.c
+===================================================================
+--- busybox-1.1.3.orig/networking/libiproute/ll_map.c	2006-03-22 14:16:18.000000000 -0700
++++ busybox-1.1.3/networking/libiproute/ll_map.c	2006-10-24 15:05:40.000000000 -0600
+@@ -18,6 +18,11 @@
+ #include "libnetlink.h"
+ #include "ll_map.h"
+ 
++#define IFLA_MAX (__IFLA_MAX - 1)
++
++#define IFLA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
++#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
++
+ struct idxmap
+ {
+ 	struct idxmap * next;
Index: buildrom/packages/busybox/regex.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/busybox/regex.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,33 @@
+Index: busybox-1.1.3/libbb/Makefile.in
+===================================================================
+--- busybox-1.1.3.orig/libbb/Makefile.in	2006-08-27 18:47:30.000000000 -0600
++++ busybox-1.1.3/libbb/Makefile.in	2006-08-27 18:52:49.000000000 -0600
+@@ -29,7 +29,7 @@
+ 	safe_strncpy.c setup_environment.c sha1.c simplify_path.c \
+ 	trim.c u_signal_names.c vdprintf.c verror_msg.c \
+ 	vherror_msg.c vperror_msg.c wfopen.c xconnect.c xgetcwd.c xstat.c \
+-	xgethostbyname.c xgethostbyname2.c xreadlink.c xregcomp.c xgetlarg.c \
++	xgethostbyname.c xgethostbyname2.c xreadlink.c xgetlarg.c \
+ 	get_terminal_width_height.c fclose_nonstdin.c fflush_stdout_and_exit.c \
+ 	getopt_ulflags.c default_error_retval.c wfopen_input.c speed_table.c \
+ 	perror_nomsg_and_die.c perror_nomsg.c skip_whitespace.c bb_askpass.c \
+@@ -48,6 +48,19 @@
+ LIBBB-$(CONFIG_SU)+= correct_password.c
+ LIBBB-$(CONFIG_LOGIN)+= correct_password.c
+ 
++# We shouldn't build xregcomp.c if we don't need it - this ensures we don't
++# require regex.h to be in the include dir even if we don't need it thereby
++# allowing us to build busybox even if uclibc regex support is disabled.
++
++regex-y=
++
++regex-$(CONFIG_AWK) += xregcomp.c
++regex-$(CONFIG_SED) += xregcomp.c
++regex-$(CONFIG_LESS) += xregcomp.c
++regex-$(CONFIG_DEVFSD) += xregcomp.c
++
++# Sort has the happy side efect of returning a unique list
++LIBBB-y += $(sort $(regex-y))
+ 
+ LIBBB-y:=$(patsubst %,$(srcdir)/%,$(LIBBB-y))
+ 
Index: buildrom/packages/busybox/testfix.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/busybox/testfix.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,18 @@
+Index: busybox-1.1.3/coreutils/test.c
+===================================================================
+--- busybox-1.1.3.orig/coreutils/test.c	2006-08-22 08:28:57.000000000 -0600
++++ busybox-1.1.3/coreutils/test.c	2006-08-22 08:40:01.000000000 -0600
+@@ -540,8 +540,11 @@
+ static void initialize_group_array(void)
+ {
+ 	ngroups = getgroups(0, NULL);
+-	group_array = xrealloc(group_array, ngroups * sizeof(gid_t));
+-	getgroups(ngroups, group_array);
++
++	if (ngroups > 0) {
++		group_array = xrealloc(group_array, ngroups * sizeof(gid_t));
++		getgroups(ngroups, group_array);
++	}
+ }
+ 
+ /* Return non-zero if GID is one that we have in our groups list. */
Index: buildrom/packages/crc32sum/crc32sum.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/crc32sum/crc32sum.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,49 @@
+CRC32SUM_URL=http://dev.laptop.org/~rsmith
+CRC32SUM_SOURCE=crc32sum_0.1.0.tar.gz
+CRC32SUM_DIR=$(BUILD_DIR)/crc32sum
+CRC32SUM_SRC_DIR=$(CRC32SUM_DIR)/crc32sum_0.1.0
+CRC32SUM_STAMP_DIR=$(CRC32SUM_DIR)/stamps
+CRC32SUM_LOG_DIR=$(CRC32SUM_DIR)/logs
+
+ifeq ($(CONFIG_VERBOSE),y)
+CRC32SUM_BUILD_LOG=/dev/stdout
+CRC32SUM_CONFIG_LOG=/dev/stdout
+else
+CRC32SUM_BUILD_LOG=$(CRC32SUM_LOG_DIR)/build.log
+CRC32SUM_CONFIG_LOG=$(CRC32SUM_LOG_DIR)/config.log
+endif
+
+$(SOURCE_DIR)/$(CRC32SUM_SOURCE):
+	@ mkdir -p $(SOURCE_DIR)
+	@ wget -P $(SOURCE_DIR) $(CRC32SUM_URL)/$(CRC32SUM_SOURCE)
+
+$(CRC32SUM_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(CRC32SUM_SOURCE)
+	@ echo "Unpacking crc32sum..."
+	@ tar -C $(CRC32SUM_DIR) -zxf $(SOURCE_DIR)/$(CRC32SUM_SOURCE)
+	@ touch $@	
+
+$(CRC32SUM_SRC_DIR)/crc32sum: $(CRC32SUM_STAMP_DIR)/.unpacked
+	@ echo "Building crc32sum..."
+	@ ( export CC=$(HOST_CC); export CFLAGS=$(HOST_CFLAGS); \
+	  export LDFLAGS=$(HOST_LDFLAGS); unset LIBS; \
+	  $(MAKE) -C $(CRC32SUM_SRC_DIR) all > $(CRC32SUM_BUILD_LOG) 2>&1)
+
+$(STAGING_DIR)/bin/crc32sum: $(CRC32SUM_SRC_DIR)/crc32sum
+	@ install -d $(STAGING_DIR)/bin
+	@ install -m 0755 $< $@
+
+$(CRC32SUM_STAMP_DIR) $(CRC32SUM_LOG_DIR):
+	@ mkdir -p $@
+
+crc32sum: $(CRC32SUM_STAMP_DIR) $(CRC32SUM_LOG_DIR) $(STAGING_DIR)/bin/crc32sum
+
+crc32sum-clean:
+	@ $(MAKE) -C $(CRC32SUM_SRC_DIR) clean > /dev/null 2>&1
+
+crc32sum-distclean:
+	@ rm -rf $(CRC32SUM_DIR)/*
+
+crc32sum-bom:
+	echo "Package: crc32sum"
+	echo "Source: $(CRC32SUM_URL)/$(CRC32SUM_SOURCE)"
+	echo ""
Index: buildrom/packages/etherboot/conf/Config.i386
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/etherboot/conf/Config.i386	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,22 @@
+
+CFLAGS+=	-DLINUXBIOS -DCONFIG_TSC_CURRTICKS  -DCONSOLE_SERIAL -DCOMCONSOLE=0x3f8 -DCOMPRESERVE -DCONFIG_PCI_DIRECT -DELF_IMAGE 
+
+CFLAGS+= -fstrength-reduce -fomit-frame-pointer -march=i386
+GCC_VERSION	 = $(subst ., ,$(shell $(CC) -dumpversion))
+GCC_MAJORVERSION = $(firstword $(GCC_VERSION))
+ifeq ($(GCC_MAJORVERSION),2)
+CFLAGS+=	-malign-jumps=1 -malign-loops=1 -malign-functions=1
+else
+CFLAGS+=	-falign-jumps=1 -falign-loops=1 -falign-functions=1
+endif
+GCC_MINORVERSION = $(word 2, $(GCC_VERSION))
+ifneq ($(GCC_MINORVERSION),4)
+CFLAGS+=	-mcpu=i386
+endif
+
+LDFLAGS+=	-N
+
+ifeq "$(shell uname -s)" "FreeBSD"
+CFLAGS+=	-DIMAGE_FREEBSD -DELF_IMAGE -DAOUT_IMAGE
+endif
+
Index: buildrom/packages/etherboot/conf/Config.main
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/etherboot/conf/Config.main	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,32 @@
+CFLAGS+=	-DCONFIG_PCI -DCONFIG_ISA
+CFLAGS+=	-DASK_BOOT=3 -DBOOT_FIRST=BOOT_NIC
+
+ifdef	INCLUDE_FILO
+CFLAGS+=	-DCONFIG_FILO
+endif
+
+CFLAGS+=	-DALLOW_ONLY_ENCAPSULATED
+CFLAGS+=	-DBACKOFF_LIMIT=7 -DCONGESTED
+CFLAGS+=	-DTAGGED_IMAGE -DELF_IMAGE
+CFLAGS+=	-DDOWNLOAD_PROTO_TFTP
+
+HOST_CC=	gcc
+CPP=		gcc -E -Wp,-Wall
+RM=		rm -f
+TOUCH=		touch
+PERL=		/usr/bin/perl
+CC=		gcc
+AS=		as
+LD=		ld
+SIZE=		size
+AR=		ar
+RANLIB=		ranlib
+OBJCOPY=	objcopy
+
+CFLAGS+=	-Os -ffreestanding
+CFLAGS+=	-Wall -W -Wno-format
+CFLAGS+=	$(EXTRA_CFLAGS)
+ASFLAGS+=	$(EXTRA_ASFLAGS)
+LDFLAGS+=	$(EXTRA_LDFLAGS)
+
+BIN=bin
Index: buildrom/packages/etherboot/etherboot.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/etherboot/etherboot.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,63 @@
+ETHERBOOT_URL=http://internap.dl.sourceforge.net/sourceforge/etherboot
+ETHERBOOT_SOURCE=etherboot-5.4.3.tar.bz2
+ETHERBOOT_DIR=$(BUILD_DIR)/etherboot
+ETHERBOOT_SRC_DIR=$(ETHERBOOT_DIR)/etherboot-5.4.3/src
+ETHERBOOT_STAMP_DIR=$(ETHERBOOT_DIR)/stamps
+ETHERBOOT_LOG_DIR=$(ETHERBOOT_DIR)/logs
+
+ETHERBOOT_PATCHES += $(PACKAGE_DIR)/etherboot/patches/fix-realmode-stack.patch
+
+# Filter the quotes off the config string
+ETHERBOOT_DRIVER := $(shell echo $(CONFIG_ETHERBOOT_DRIVER) | sed -e s:\"::g)
+ETHERBOOT_OUTPUT=$(ETHERBOOT_SRC_DIR)/bin/$(ETHERBOOT_DRIVER).zelf
+
+ifeq ($(CONFIG_VERBOSE),y)
+ETHERBOOT_BUILD_LOG=/dev/stdout
+ETHERBOOT_INSTALL_LOG=/dev/stdout
+else
+ETHERBOOT_BUILD_LOG=$(ETHERBOOT_LOG_DIR)/build.log
+ETHERBOOT_INSTALL_LOG=$(ETHERBOOT_LOG_DIR)/install.log
+endif
+
+$(SOURCE_DIR)/$(ETHERBOOT_SOURCE):
+	@ mkdir -p $(SOURCE_DIR)
+	@ wget -P $(SOURCE_DIR) $(ETHERBOOT_URL)/$(ETHERBOOT_SOURCE)
+
+$(ETHERBOOT_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(ETHERBOOT_SOURCE)
+	@ echo "Unpacking etherboot..."
+	@ tar -C $(ETHERBOOT_DIR) -jxf $(SOURCE_DIR)/$(ETHERBOOT_SOURCE)
+	@ touch $@	
+
+$(ETHERBOOT_STAMP_DIR)/.patched: $(ETHERBOOT_STAMP_DIR)/.unpacked
+	@ echo "Patching etherboot..."
+	@ $(BIN_DIR)/doquilt.sh $(ETHERBOOT_SRC_DIR)/.. $(ETHERBOOT_PATCHES)
+	@ touch $@
+
+$(ETHERBOOT_STAMP_DIR)/.configured: $(ETHERBOOT_STAMP_DIR)/.patched
+	@ cp $(PACKAGE_DIR)/etherboot/conf/Config.main \
+	$(ETHERBOOT_SRC_DIR)/Config
+	@ cp $(PACKAGE_DIR)/etherboot/conf/Config.$(ETHERBOOT_ARCH) \
+	$(ETHERBOOT_SRC_DIR)/arch/$(ETHERBOOT_ARCH)/Config
+	@ touch $@
+
+$(ETHERBOOT_OUTPUT): $(ETHERBOOT_STAMP_DIR)/.configured
+	@ echo "Building etherboot..."
+	@ ( unset CFLAGS; export EXTRA_CFLAGS="$(CFLAGS)"; \
+	unset ASFLAGS; export EXTRA_ASFLAGS="$(ASFLAGS)"; \
+	unset LDFLAGS; \
+	$(MAKE) -C $(ETHERBOOT_SRC_DIR) ARCH=$(ETHERBOOT_ARCH) \
+	bin/$(ETHERBOOT_DRIVER).zelf > $(ETHERBOOT_BUILD_LOG) 2>&1)
+
+$(ETHERBOOT_STAMP_DIR) $(ETHERBOOT_LOG_DIR):
+	@ mkdir -p $@
+
+etherboot: $(ETHERBOOT_STAMP_DIR) $(ETHERBOOT_LOG_DIR) $(ETHERBOOT_OUTPUT) 
+	@ mkdir -p $(OUTPUT_DIR)
+	@ cp $(ETHERBOOT_OUTPUT) $(PAYLOAD_TARGET)
+
+etherboot-clean:
+	@ echo "Cleaning etherboot..."
+	@ $(MAKE) -C $(ETHERBOOT_SRC_DIR) clean > /dev/null 2>&1
+
+etherboot-distclean:
+	@ rm -rf $(ETHERBOOT_DIR)/*
Index: buildrom/packages/etherboot/patches/fix-realmode-stack.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/etherboot/patches/fix-realmode-stack.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,14 @@
+Index: etherboot-5.4.3/src/include/etherboot.h
+===================================================================
+--- etherboot-5.4.3.orig/src/include/etherboot.h	2007-04-23 20:22:10.000000000 -0600
++++ etherboot-5.4.3/src/include/etherboot.h	2007-04-23 20:22:23.000000000 -0600
+@@ -327,7 +327,9 @@
+ 
+ /* basemem.c */
+ extern uint32_t get_free_base_memory ( void );
++#ifndef LINUXBIOS
+ extern void allot_real_mode_stack ( void );
++#endif
+ extern void forget_real_mode_stack ( void );
+ extern void * allot_base_memory ( size_t );
+ extern void forget_base_memory ( void*, size_t );
Index: buildrom/packages/filo/conf/norwich-Config
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/filo/conf/norwich-Config	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,101 @@
+# !!! NOTE !!!
+# Do NOT add spaces or comments at the end of option lines.
+# It confuses some versions of make.
+
+# Use grub instead of autoboot?
+USE_GRUB = 1
+
+# Grub menu.lst path
+MENULST_FILE = "hda2:/boot/menu.lst"
+# Via Epia-MII CF boot:
+#MENULST_FILE = "hde1:/boot/filo/menu.lst"
+
+# time before default menu.lst is chosen. Set to 0 to ignore
+MENULST_TIMEOUT = 0
+
+# Image filename for automatic boot and optional command line parameter
+AUTOBOOT_FILE = "hda1:/vmlinuz root=/dev/hda1 console=tty0 console=ttyS0,115200"
+#AUTOBOOT_FILE = "mem at 0xfff80000"
+#AUTOBOOT_FILE = "hde1 at 0"
+#AUTOBOOT_FILE = "uda1:/vmlinuz.elf"
+
+# Time in second before booting AUTOBOOT_FILE
+AUTOBOOT_DELAY = 2
+
+# Driver for hard disk, CompactFlash, and CD-ROM on IDE bus
+IDE_DISK = 1
+
+# Add a short delay when polling status registers 
+# (required on some broken SATA controllers)
+# NOTE: Slows down access significantly, so disable 
+# whenever possible.
+#IDE_DISK_POLL_DELAY = 1
+
+# Use PCMCIA compact flash on Via Epia MII10000 and MII6000E
+# This device is referred to as hde.
+#PCMCIA_CF = 1
+
+# Driver for USB Storage
+# USB_DISK = 1
+
+# VGA text console
+# VGA_CONSOLE = 1
+# PC_KEYBOARD = 1
+
+# Serial console 
+SERIAL_CONSOLE = 1
+SERIAL_IOBASE = 0x3f8
+# if SERIAL_SPEED is commented out, the speed will not be changed.
+#SERIAL_SPEED = 115200
+
+# Filesystems
+FSYS_EXT2FS = 1
+FSYS_FAT = 1
+#FSYS_JFS = 1
+#FSYS_MINIX = 1
+FSYS_REISERFS = 1
+#FSYS_XFS = 1
+FSYS_ISO9660 = 1
+
+# Support for boot disk image in bootable CD-ROM (El Torito)
+ELTORITO = 1
+
+# PCI support
+SUPPORT_PCI = 1
+
+# Enable this to scan PCI busses above bus 0
+# AMD64 based boards do need this.
+PCI_BRUTE_SCAN = 1
+
+# Sound support (needs SUPPORT_PCI)
+#SUPPORT_SOUND = 1
+
+# Sound drivers
+#VIA_SOUND = 1
+
+# Debugging
+#DEBUG_ALL = 1
+#DEBUG_ELFBOOT = 1
+#DEBUG_ELFNOTE = 1
+#DEBUG_LINUXBIOS = 1
+#DEBUG_MALLOC = 1
+#DEBUG_MULTIBOOT = 1
+#DEBUG_SEGMENT = 1
+#DEBUG_SYS_INFO = 1
+#DEBUG_TIMER = 1
+#DEBUG_BLOCKDEV = 1
+#DEBUG_PCI = 1
+#DEBUG_VIA_SOUND = 1
+#DEBUG_LINUXLOAD = 1
+#DEBUG_IDE = 1
+#DEBUG_USB = 1
+#DEBUG_ELTORITO = 1
+
+# i386 options
+
+# Loader for standard Linux kernel image, a.k.a. /vmlinuz
+LINUX_LOADER = 1
+
+# Boot FILO from Multiboot loader (eg. GRUB)
+#MULTIBOOT_IMAGE = 1
+
Index: buildrom/packages/filo/filo.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/filo/filo.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,61 @@
+FILO_URL=svn://80.190.231.112/filo/trunk/filo-0.5
+FILO_TAG=34
+
+FILO_DIR=$(BUILD_DIR)/filo
+FILO_SRC_DIR=$(FILO_DIR)/svn
+FILO_STAMP_DIR=$(FILO_DIR)/stamps
+FILO_LOG_DIR=$(FILO_DIR)/logs
+
+FILO_PATCHES=$(PACKAGE_DIR)/filo/patches/make.patch
+
+ifeq ($(CONFIG_VERBOSE),y)
+FILO_FETCH_LOG=/dev/stdout
+FILO_BUILD_LOG=/dev/stdout
+FILO_INSTALL_LOG=/dev/stdout
+else
+FILO_BUILD_LOG=$(FILO_LOG_DIR)/build.log
+FILO_INSTALL_LOG=$(FILO_LOG_DIR)/install.log
+FILO_FETCH_LOG=$(FILO_LOG_DIR)/fetch.log
+endif
+
+FILO_TARBALL=filo-svn-$(FILO_TAG).tar.gz
+
+$(SOURCE_DIR)/$(FILO_TARBALL): 
+	@ mkdir -p $(SOURCE_DIR)/filo
+	@ $(BIN_DIR)/fetchsvn.sh $(FILO_URL) $(SOURCE_DIR)/linuxbios \
+	$(FILO_TAG) $(SOURCE_DIR)/$(FILO_TARBALL) \
+	> $(FILO_FETCH_LOG) 2>&1
+
+$(FILO_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(FILO_TARBALL)
+	@ echo "Unpacking busybox..."
+	@ tar -C $(FILO_DIR) -zxf $(SOURCE_DIR)/$(FILO_TARBALL)
+	@ touch $@      
+
+$(FILO_STAMP_DIR)/.patched: $(FILO_STAMP_DIR)/.unpacked
+	@ echo "Patching filo..."
+	@ $(BIN_DIR)/doquilt.sh $(FILO_SRC_DIR) $(FILO_PATCHES)
+	@ touch $@
+
+$(FILO_STAMP_DIR)/.configured: $(FILO_STAMP_DIR)/.patched
+	@ make -C $(FILO_SRC_DIR) config > $(FILO_BUILD_LOG) 2>&1
+	@ cp $(PACKAGE_DIR)/filo/conf/$(FILO_CONFIG) $(FILO_SRC_DIR)/Config
+	@ touch $@
+
+$(FILO_SRC_DIR)/filo.elf: $(FILO_STAMP_DIR)/.configured
+	@ echo "Building filo..."
+	@ make -C $(FILO_SRC_DIR) filo.elf > $(FILO_BUILD_LOG) 2>&1
+
+$(FILO_STAMP_DIR) $(FILO_LOG_DIR):
+	@ mkdir -p $@
+
+filo: $(FILO_STAMP_DIR) $(FILO_LOG_DIR) $(FILO_SRC_DIR)/filo.elf
+	@ mkdir -p $(OUTPUT_DIR)
+	@ cp $(FILO_SRC_DIR)/filo.elf $(PAYLOAD_TARGET)
+
+filo-clean:
+	@ echo "Cleaning filo..."
+	@ $(MAKE) -C $(FILO_SRC_DIR) clean > /dev/null 2>&1
+
+filo-distclean:
+	@ rm -rf $(FILO_DIR)/*
+
Index: buildrom/packages/filo/patches/make.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/filo/patches/make.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,26 @@
+Index: svn/makerules
+===================================================================
+--- svn.orig/makerules	2007-05-01 02:15:06.000000000 -0600
++++ svn/makerules	2007-05-01 02:15:45.000000000 -0600
+@@ -6,7 +6,7 @@
+ GCCINCDIR = $(shell $(CC) -print-search-dirs | head -n 1 | cut -d' ' -f2)include
+ CPPFLAGS = -nostdinc -imacros $(TOPDIR)/config.h -I$(TOPDIR)/include -I$(GCCINCDIR) -MD
+ # grub part needs no-strict-aliasing!
+-CFLAGS = -Wall -Os -fomit-frame-pointer -fno-common -ffreestanding \
++CFLAGS_extra = -Wall -Os -fomit-frame-pointer -fno-common -ffreestanding \
+ 	 -fno-strict-aliasing -Wno-pointer-sign -Wno-unused 
+ 
+ ASFLAGS = -D__ASSEMBLY__
+@@ -30,10 +30,10 @@
+ -include *.d
+ 
+ %.o: %.c $(TOPDIR)/config.h
+-	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
++	$(CC) $(CFLAGS) $(CFLAGS_extra) $(CPPFLAGS) -c $< -o $@
+ 
+ %.s: %.c $(TOPDIR)/config.h
+-	$(CC) $(CFLAGS) $(CPPFLAGS) -S $< -o $@
++	$(CC) $(CFLAGS) $(CFLAGS_extra) $(CPPFLAGS) -S $< -o $@
+ 
+ %.o: %.S $(TOPDIR)/config.h
+ 	$(CC) $(ASFLAGS) $(CPPFLAGS) -c $< -o $@
Index: buildrom/packages/fwsig/fwsig.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/fwsig/fwsig.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,133 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#define FIRMWARE_SIG_OFFSET 0xffc0
+#define FIRMWARE_SIG_SIZE   16
+
+void usage(void) {
+  printf("usage: <file> [sig]\n");
+  printf("- Read or write the firmware signature of the file.\n");
+  printf("- if no signature is provided, then read it from the file.\n");
+  printf("- otherwise, write it into the file.\n");
+}
+
+int openfile(const char *filename, int flags) {
+
+  int fd = open(filename, O_RDONLY);
+  struct stat s;
+
+  if (fd == -1) {
+    printf("Couldn't open %s for reading.\n", filename);    
+    return -1;
+  }
+
+  if (fstat(fd, &s)) {
+    printf("Couldn't stat %s\n", filename);
+    goto error;
+  }
+
+  if (s.st_size < (FIRMWARE_SIG_OFFSET + FIRMWARE_SIG_SIZE)) {
+    printf("Oops - %s is too small for this operation.\n", filename);
+    goto error;
+  }
+  
+  return fd;
+
+ error:
+  close(fd);
+  return -1;
+}
+
+int read_sig(const char *filename) {
+
+  int ret;
+  int fd = openfile(filename, O_RDONLY);
+  char sig[FIRMWARE_SIG_SIZE + 1];
+
+  if (fd == -1)
+    return -1;
+
+  ret = lseek(fd, FIRMWARE_SIG_OFFSET, SEEK_SET);
+
+  if (ret == -1) {
+    printf("Couldn't seek to %d in %s\n", FIRMWARE_SIG_OFFSET, filename);
+    goto error;
+  }
+
+  memset(sig, 0, FIRMWARE_SIG_SIZE + 1);
+  ret = read(fd, sig, FIRMWARE_SIG_SIZE);
+
+  if (ret == 0) 
+    printf("%s: \"%16s\"\n", filename, sig);
+  else
+    printf("Error while reading the signature.\n");
+
+ error:
+  close(fd);
+  return ret;
+}
+
+int write_sig(const char *filename, const char *sig) {
+
+  int ret;
+  char temp[FIRMWARE_SIG_SIZE + 1];
+  int fd = openfile(filename, O_RDONLY);
+  int i;
+
+  if (fd == -1)
+    return -1;
+
+  ret = lseek(fd, FIRMWARE_SIG_OFFSET, SEEK_SET);
+
+  if (ret == -1) {
+    printf("Couldn't seek to %d in %s\n", FIRMWARE_SIG_OFFSET, filename);
+    goto error;
+  }
+
+  strncpy(temp, sig, FIRMWARE_SIG_SIZE);
+
+  if (strlen(sig) < FIRMWARE_SIG_SIZE) {
+    printf("*** WARNING - the firmware signature is less then %d bytes.\n", FIRMWARE_SIG_SIZE);
+    printf("              It will be padded - this may not have the inteded effect you want.\n");
+
+
+    for(i = strlen(sig); i < FIRMWARE_SIG_SIZE; i++)
+      temp[i] = ' ';
+
+    temp[i] = 0;
+  }
+  else if (strlen(sig) > FIRMWARE_SIG_SIZE) {
+    printf("*** WARNING - the firmware signature is less then %d bytes.\n", FIRMWARE_SIG_SIZE);
+    printf("              It will be truncated - this may not have the inteded effect you want.\n");
+    temp[FIRMWARE_SIG_SIZE] = 0;
+  }
+  
+  ret = write(fd, sig, FIRMWARE_SIG_SIZE);
+
+  if (ret)
+    printf("Error while writing the signature.\n");
+
+ error:
+  close(fd);
+  return ret;
+}
+  
+int main(int argc, char **argv) {
+
+  int ret = 1;
+
+  if (argc < 2) 
+    usage();
+  else if (argc == 2) 
+    ret = read_sig(argv[1]);
+  else 
+    ret = write_sig(argv[1], argv[2]);
+  
+  return ret;
+}
+
+  
Index: buildrom/packages/kernel/conf/defconfig
===================================================================
--- buildrom.orig/packages/kernel/conf/defconfig	2007-05-01 14:29:43.000000000 -0600
+++ buildrom/packages/kernel/conf/defconfig	2007-05-01 17:21:24.000000000 -0600
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-rc2
-# Tue Jul 25 11:01:08 2006
+# Linux kernel version: 2.6.19-rc2
+# Thu Oct 26 15:18:22 2006
 #
 CONFIG_X86_32=y
 CONFIG_GENERIC_TIME=y
@@ -27,18 +27,19 @@
 #
 # General setup
 #
-CONFIG_LOCALVERSION="jhc"
+CONFIG_LOCALVERSION="rev_a_20060926-1"
 # CONFIG_LOCALVERSION_AUTO is not set
 # CONFIG_SWAP is not set
 # CONFIG_SYSVIPC is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_SYSCTL is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_IKCONFIG is not set
 # CONFIG_RELAY is not set
 CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_UID16 is not set
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+# CONFIG_SYSCTL_SYSCALL is not set
 # CONFIG_KALLSYMS is not set
 # CONFIG_HOTPLUG is not set
 CONFIG_PRINTK=y
@@ -50,6 +51,23 @@
 # CONFIG_SHMEM is not set
 # CONFIG_SLAB is not set
 CONFIG_VM_EVENT_COUNTERS=y
+# CONFIG_AIO is not set
+# CONFIG_CONSOLE_TRANSLATIONS is not set
+# CONFIG_XATTR is not set
+# CONFIG_FILE_LOCKING is not set
+# CONFIG_PCI_QUIRKS is not set
+# CONFIG_CRC32_TABLES is not set
+CONFIG_PROCESSOR_SELECT=y
+# CONFIG_CPU_SUP_INTEL is not set
+CONFIG_CPU_SUP_CYRIX=y
+CONFIG_CPU_SUP_NSC=y
+# CONFIG_CPU_SUP_AMD is not set
+# CONFIG_CPU_SUP_CENTAUR is not set
+# CONFIG_CPU_SUP_TRANSMETA is not set
+# CONFIG_CPU_SUP_RISE is not set
+# CONFIG_CPU_SUP_NEXGEN is not set
+# CONFIG_CPU_SUP_UMC is not set
+CONFIG_CRC32_CALC=y
 CONFIG_TINY_SHMEM=y
 CONFIG_BASE_SMALL=1
 CONFIG_SLOB=y
@@ -62,6 +80,7 @@
 #
 # Block layer
 #
+CONFIG_BLOCK=y
 # CONFIG_LBD is not set
 # CONFIG_BLK_DEV_IO_TRACE is not set
 # CONFIG_LSF is not set
@@ -159,6 +178,7 @@
 CONFIG_ARCH_FLATMEM_ENABLE=y
 CONFIG_ARCH_SPARSEMEM_ENABLE=y
 CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -206,10 +226,12 @@
 # CONFIG_PCI_GOANY is not set
 CONFIG_PCI_DIRECT=y
 # CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCI_MULTITHREAD_PROBE is not set
 CONFIG_ISA_DMA_API=y
 # CONFIG_ISA is not set
 # CONFIG_MCA is not set
 # CONFIG_SCx200 is not set
+CONFIG_OLPC=y
 
 #
 # PCCARD (PCMCIA/CardBus) support
@@ -249,7 +271,80 @@
 #
 # Memory Technology Devices (MTD)
 #
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_TS5500 is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+CONFIG_MTD_NAND=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+CONFIG_MTD_NAND_CAFE=y
+CONFIG_MTD_NAND_CS553X=y
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
 
 #
 # Parallel port support
@@ -277,6 +372,13 @@
 # CONFIG_CDROM_PKTCDVD is not set
 
 #
+# Misc devices
+#
+# CONFIG_IBM_ASM is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
 # ATA/ATAPI/MFM/RLL support
 #
 # CONFIG_IDE is not set
@@ -286,6 +388,7 @@
 #
 # CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=y
+# CONFIG_SCSI_NETLINK is not set
 # CONFIG_SCSI_PROC_FS is not set
 
 #
@@ -306,11 +409,12 @@
 # CONFIG_SCSI_LOGGING is not set
 
 #
-# SCSI Transport Attributes
+# SCSI Transports
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
 
 #
 # SCSI low-level drivers
@@ -322,12 +426,13 @@
 # CONFIG_SCSI_AIC7XXX is not set
 # CONFIG_SCSI_AIC7XXX_OLD is not set
 # CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
 # CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
 # CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_SATA is not set
 # CONFIG_SCSI_HPTIOP is not set
 # CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_DMX3191D is not set
@@ -337,10 +442,11 @@
 # CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_INITIO is not set
 # CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
 # CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
 # CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
 # CONFIG_SCSI_LPFC is not set
 # CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
@@ -348,6 +454,11 @@
 # CONFIG_SCSI_DEBUG is not set
 
 #
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
 # Multi-device support (RAID and LVM)
 #
 # CONFIG_MD is not set
@@ -383,6 +494,7 @@
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -397,11 +509,12 @@
 # Input Device Drivers
 #
 CONFIG_INPUT_KEYBOARD=y
-# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_SUNKBD is not set
 # CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
@@ -410,7 +523,13 @@
 #
 # Hardware I/O ports
 #
-# CONFIG_SERIO is not set
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
 
 #
@@ -492,6 +611,7 @@
 #
 # Dallas's 1-wire bus
 #
+# CONFIG_W1 is not set
 
 #
 # Hardware Monitoring support
@@ -500,15 +620,9 @@
 # CONFIG_HWMON_VID is not set
 
 #
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-
-#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
 
 #
 # Digital Video Broadcasting Devices
@@ -534,7 +648,6 @@
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_VGA16 is not set
-# CONFIG_FB_IMAC is not set
 # CONFIG_FB_HGA is not set
 # CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_NVIDIA is not set
@@ -553,8 +666,7 @@
 # CONFIG_FB_TRIDENT is not set
 CONFIG_FB_GEODE=y
 CONFIG_FB_GEODE_GX=y
-CONFIG_FB_GEODE_GX_SET_FBSIZE=y
-CONFIG_FB_GEODE_GX_FBSIZE=0x800000
+# CONFIG_FB_GEODE_GX_DCON is not set
 # CONFIG_FB_GEODE_GX1 is not set
 # CONFIG_FB_VIRTUAL is not set
 
@@ -599,7 +711,7 @@
 #
 # Miscellaneous USB options
 #
-# CONFIG_USB_DEVICEFS is not set
+CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_OTG is not set
@@ -607,7 +719,10 @@
 #
 # USB Host Controller Drivers
 #
-# CONFIG_USB_EHCI_HCD is not set
+CONFIG_USB_EHCI_HCD=y
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
 # CONFIG_USB_ISP116X_HCD is not set
 CONFIG_USB_OHCI_HCD=y
 # CONFIG_USB_OHCI_BIG_ENDIAN is not set
@@ -638,6 +753,7 @@
 # CONFIG_USB_STORAGE_SDDR55 is not set
 # CONFIG_USB_STORAGE_JUMPSHOT is not set
 # CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
 # CONFIG_USB_LIBUSUAL is not set
 
 #
@@ -686,6 +802,7 @@
 #
 # CONFIG_USB_EMI62 is not set
 # CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
@@ -693,11 +810,14 @@
 # CONFIG_USB_LED is not set
 # CONFIG_USB_CYPRESS_CY7C63 is not set
 # CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGETKIT is not set
-# CONFIG_USB_PHIDGETSERVO is not set
+# CONFIG_USB_PHIDGET is not set
 # CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
 # CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
 # CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
 
 #
 # USB DSL modem support
@@ -758,13 +878,14 @@
 # File systems
 #
 CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
 # CONFIG_EXT2_FS_XIP is not set
 # CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 # CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
 # CONFIG_INOTIFY is not set
@@ -792,6 +913,7 @@
 #
 CONFIG_PROC_FS=y
 # CONFIG_PROC_KCORE is not set
+# CONFIG_PROC_SYSCTL is not set
 CONFIG_SYSFS=y
 # CONFIG_TMPFS is not set
 # CONFIG_HUGETLBFS is not set
@@ -809,6 +931,16 @@
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+CONFIG_JFFS2_SUMMARY=y
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -837,12 +969,14 @@
 #
 CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
 # CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_FS is not set
 # CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 CONFIG_EARLY_PRINTK=y
 # CONFIG_DOUBLEFAULT is not set
 
@@ -858,16 +992,14 @@
 # CONFIG_CRYPTO is not set
 
 #
-# Hardware crypto devices
-#
-
-#
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_X86_BIOS_REBOOT=y
Index: buildrom/packages/kernel/conf/defconfig-norwich
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/conf/defconfig-norwich	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,1425 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20.2
+# Fri Apr 20 14:29:31 2007
+#
+CONFIG_X86_32=y
+CONFIG_GENERIC_TIME=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_SEMAPHORE_SLEEPERS=y
+CONFIG_X86=y
+CONFIG_MMU=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_DMI=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
+#
+# Processor type and features
+#
+# CONFIG_SMP is not set
+CONFIG_X86_PC=y
+# CONFIG_X86_ELAN is not set
+# CONFIG_X86_VOYAGER is not set
+# CONFIG_X86_NUMAQ is not set
+# CONFIG_X86_SUMMIT is not set
+# CONFIG_X86_BIGSMP is not set
+# CONFIG_X86_VISWS is not set
+# CONFIG_X86_GENERICARCH is not set
+# CONFIG_X86_ES7000 is not set
+# CONFIG_PARAVIRT is not set
+# CONFIG_M386 is not set
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586TSC is not set
+# CONFIG_M586MMX is not set
+# CONFIG_M686 is not set
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+# CONFIG_MCORE2 is not set
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP2 is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MGEODEGX1 is not set
+CONFIG_MGEODE_LX=y
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_X86_GENERIC is not set
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_XADD=y
+CONFIG_X86_L1_CACHE_SHIFT=5
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_INVLPG=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_POPAD_OK=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+CONFIG_X86_USE_3DNOW=y
+CONFIG_X86_TSC=y
+# CONFIG_HPET_TIMER is not set
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_X86_UP_APIC is not set
+# CONFIG_X86_MCE is not set
+CONFIG_VM86=y
+# CONFIG_TOSHIBA is not set
+# CONFIG_I8K is not set
+# CONFIG_X86_REBOOTFIXUPS is not set
+# CONFIG_MICROCODE is not set
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+
+#
+# Firmware Drivers
+#
+# CONFIG_EDD is not set
+# CONFIG_DELL_RBU is not set
+# CONFIG_DCDBAS is not set
+# CONFIG_NOHIGHMEM is not set
+CONFIG_HIGHMEM4G=y
+# CONFIG_HIGHMEM64G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_HIGHMEM=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+# CONFIG_HIGHPTE is not set
+# CONFIG_MATH_EMULATION is not set
+# CONFIG_MTRR is not set
+# CONFIG_EFI is not set
+CONFIG_SECCOMP=y
+CONFIG_HZ_100=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+CONFIG_PHYSICAL_START=0x100000
+# CONFIG_RELOCATABLE is not set
+CONFIG_PHYSICAL_ALIGN=0x100000
+# CONFIG_COMPAT_VDSO is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+
+#
+# Power management options (ACPI, APM)
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SYSFS_DEPRECATED=y
+# CONFIG_SOFTWARE_SUSPEND is not set
+
+#
+# ACPI (Advanced Configuration and Power Interface) Support
+#
+CONFIG_ACPI=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_SLEEP_PROC_FS=y
+# CONFIG_ACPI_SLEEP_PROC_SLEEP is not set
+# CONFIG_ACPI_AC is not set
+# CONFIG_ACPI_BATTERY is not set
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_VIDEO=m
+# CONFIG_ACPI_HOTKEY is not set
+CONFIG_ACPI_FAN=m
+# CONFIG_ACPI_DOCK is not set
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_ASUS is not set
+CONFIG_ACPI_IBM=m
+# CONFIG_ACPI_IBM_DOCK is not set
+# CONFIG_ACPI_TOSHIBA is not set
+CONFIG_ACPI_BLACKLIST_YEAR=0
+# CONFIG_ACPI_DEBUG is not set
+CONFIG_ACPI_EC=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_SYSTEM=y
+CONFIG_X86_PM_TIMER=y
+# CONFIG_ACPI_CONTAINER is not set
+# CONFIG_ACPI_SBS is not set
+
+#
+# APM (Advanced Power Management) BIOS Support
+#
+# CONFIG_APM is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+CONFIG_PCI_GODIRECT=y
+# CONFIG_PCI_GOANY is not set
+CONFIG_PCI_DIRECT=y
+# CONFIG_PCIEPORTBUS is not set
+CONFIG_ISA_DMA_API=y
+# CONFIG_ISA is not set
+# CONFIG_MCA is not set
+# CONFIG_SCx200 is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=m
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_SERIAL=m
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+# CONFIG_PARPORT_GSC is not set
+# CONFIG_PARPORT_AX88796 is not set
+CONFIG_PARPORT_1284=y
+
+#
+# Plug and Play support
+#
+CONFIG_PNP=y
+# CONFIG_PNP_DEBUG is not set
+
+#
+# Protocols
+#
+CONFIG_PNPACPI=y
+
+#
+# Block devices
+#
+CONFIG_BLK_DEV_FD=y
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=y
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_IBM_ASM is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_MSI_LAPTOP is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+# CONFIG_BLK_DEV_HD_IDE is not set
+CONFIG_BLK_DEV_IDEDISK=y
+CONFIG_IDEDISK_MULTI_MODE=y
+CONFIG_BLK_DEV_IDECD=y
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_IDEPNP is not set
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_BLK_DEV_GENERIC=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_RZ1000 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+# CONFIG_IDEDMA_PCI_AUTO is not set
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+CONFIG_BLK_DEV_AMD74XX=y
+# CONFIG_BLK_DEV_ATIIXP is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_CS5535 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_JMICRON is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+# CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_IT821X is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SIS5513 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_IDE_ARM is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+CONFIG_SCSI_SCAN_ASYNC=y
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Macintosh device drivers
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+CONFIG_NET_PCI=y
+# CONFIG_PCNET32 is not set
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_B44 is not set
+# CONFIG_FORCEDETH is not set
+# CONFIG_DGRS is not set
+CONFIG_EEPRO100=m
+CONFIG_E100=m
+# CONFIG_FEALNX is not set
+CONFIG_NATSEMI=m
+# CONFIG_NE2K_PCI is not set
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+CONFIG_E1000=m
+# CONFIG_E1000_NAPI is not set
+# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+CONFIG_NS83820=m
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+CONFIG_R8169=m
+# CONFIG_R8169_NAPI is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
+CONFIG_TIGON3=m
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PARKBD is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_PNP=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_PRINTER is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_HW_RANDOM_INTEL is not set
+# CONFIG_HW_RANDOM_AMD is not set
+CONFIG_HW_RANDOM_GEODE=y
+# CONFIG_HW_RANDOM_VIA is not set
+# CONFIG_NVRAM is not set
+CONFIG_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_SONYPI is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_MWAVE is not set
+# CONFIG_PC8736x_GPIO is not set
+# CONFIG_NSC_GPIO is not set
+CONFIG_CS5535_GPIO=y
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_HPET is not set
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PROSAVAGE is not set
+# CONFIG_I2C_SAVAGE4 is not set
+CONFIG_SCx200_ACB=y
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VOODOO3 is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 is not set
+# CONFIG_SENSORS_EEPROM is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FIRMWARE_EDID is not set
+CONFIG_FB=y
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ARC is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_VESA is not set
+# CONFIG_FB_HGA is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_I810 is not set
+# CONFIG_FB_INTEL is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_CYBLA is not set
+# CONFIG_FB_TRIDENT is not set
+CONFIG_FB_GEODE=y
+# CONFIG_FB_GEODE_GX is not set
+# CONFIG_FB_GEODE_GX1 is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+# CONFIG_VIDEO_SELECT is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+# CONFIG_LOGO_LINUX_CLUT224 is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+CONFIG_BACKLIGHT_DEVICE=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_SUSPEND is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=y
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
+# CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET_MII is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_USB_MON is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+# CONFIG_EDAC is not set
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+CONFIG_DMA_ENGINE=y
+
+#
+# DMA Clients
+#
+CONFIG_NET_DMA=y
+
+#
+# DMA Devices
+#
+# CONFIG_INTEL_IOATDMA is not set
+
+#
+# Virtualization
+#
+# CONFIG_KVM is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+CONFIG_NFSD_TCP=y
+# CONFIG_ROOT_NFS is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="n"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+# CONFIG_KPROBES is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_PRINTK_TIME=y
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_DOUBLEFAULT=y
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_X86_BIOS_REBOOT=y
+CONFIG_KTIME_SCALAR=y
Index: buildrom/packages/kernel/conf/defconfig-olpc
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/conf/defconfig-olpc	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,1006 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19-rc2
+# Thu Oct 26 15:18:22 2006
+#
+CONFIG_X86_32=y
+CONFIG_GENERIC_TIME=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_SEMAPHORE_SLEEPERS=y
+CONFIG_X86=y
+CONFIG_MMU=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_DMI=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION="rev_a_20060926-1"
+# CONFIG_LOCALVERSION_AUTO is not set
+# CONFIG_SWAP is not set
+# CONFIG_SYSVIPC is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+# CONFIG_SYSCTL_SYSCALL is not set
+# CONFIG_KALLSYMS is not set
+# CONFIG_HOTPLUG is not set
+CONFIG_PRINTK=y
+# CONFIG_BUG is not set
+# CONFIG_ELF_CORE is not set
+# CONFIG_BASE_FULL is not set
+# CONFIG_FUTEX is not set
+# CONFIG_EPOLL is not set
+# CONFIG_SHMEM is not set
+# CONFIG_SLAB is not set
+CONFIG_VM_EVENT_COUNTERS=y
+# CONFIG_AIO is not set
+# CONFIG_CONSOLE_TRANSLATIONS is not set
+# CONFIG_XATTR is not set
+# CONFIG_FILE_LOCKING is not set
+# CONFIG_PCI_QUIRKS is not set
+# CONFIG_CRC32_TABLES is not set
+CONFIG_PROCESSOR_SELECT=y
+# CONFIG_CPU_SUP_INTEL is not set
+CONFIG_CPU_SUP_CYRIX=y
+CONFIG_CPU_SUP_NSC=y
+# CONFIG_CPU_SUP_AMD is not set
+# CONFIG_CPU_SUP_CENTAUR is not set
+# CONFIG_CPU_SUP_TRANSMETA is not set
+# CONFIG_CPU_SUP_RISE is not set
+# CONFIG_CPU_SUP_NEXGEN is not set
+# CONFIG_CPU_SUP_UMC is not set
+CONFIG_CRC32_CALC=y
+CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=1
+CONFIG_SLOB=y
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# Processor type and features
+#
+# CONFIG_SMP is not set
+CONFIG_X86_PC=y
+# CONFIG_X86_ELAN is not set
+# CONFIG_X86_VOYAGER is not set
+# CONFIG_X86_NUMAQ is not set
+# CONFIG_X86_SUMMIT is not set
+# CONFIG_X86_BIGSMP is not set
+# CONFIG_X86_VISWS is not set
+# CONFIG_X86_GENERICARCH is not set
+# CONFIG_X86_ES7000 is not set
+# CONFIG_M386 is not set
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586TSC is not set
+# CONFIG_M586MMX is not set
+# CONFIG_M686 is not set
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP2 is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MGEODEGX1 is not set
+CONFIG_MGEODE_LX=y
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_X86_GENERIC is not set
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_XADD=y
+CONFIG_X86_L1_CACHE_SHIFT=5
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_INVLPG=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_POPAD_OK=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+CONFIG_X86_USE_3DNOW=y
+CONFIG_X86_TSC=y
+# CONFIG_HPET_TIMER is not set
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_X86_UP_APIC is not set
+# CONFIG_X86_MCE is not set
+# CONFIG_VM86 is not set
+# CONFIG_TOSHIBA is not set
+# CONFIG_I8K is not set
+# CONFIG_X86_REBOOTFIXUPS is not set
+# CONFIG_MICROCODE is not set
+# CONFIG_X86_MSR is not set
+# CONFIG_X86_CPUID is not set
+
+#
+# Firmware Drivers
+#
+# CONFIG_EDD is not set
+# CONFIG_DELL_RBU is not set
+# CONFIG_DCDBAS is not set
+CONFIG_NOHIGHMEM=y
+# CONFIG_HIGHMEM4G is not set
+# CONFIG_HIGHMEM64G is not set
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_3G_OPT is not set
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+# CONFIG_MATH_EMULATION is not set
+# CONFIG_MTRR is not set
+# CONFIG_REGPARM is not set
+# CONFIG_SECCOMP is not set
+CONFIG_VGA_NOPROBE=y
+CONFIG_HZ_100=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
+CONFIG_KEXEC=y
+CONFIG_PHYSICAL_START=0x100000
+# CONFIG_COMPAT_VDSO is not set
+
+#
+# Power management options (ACPI, APM)
+#
+# CONFIG_PM is not set
+
+#
+# ACPI (Advanced Configuration and Power Interface) Support
+#
+# CONFIG_ACPI is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+CONFIG_PCI_GODIRECT=y
+# CONFIG_PCI_GOANY is not set
+CONFIG_PCI_DIRECT=y
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCI_MULTITHREAD_PROBE is not set
+CONFIG_ISA_DMA_API=y
+# CONFIG_ISA is not set
+# CONFIG_MCA is not set
+# CONFIG_SCx200 is not set
+CONFIG_OLPC=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+
+#
+# PCI Hotplug Support
+#
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Networking
+#
+# CONFIG_NET is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+# CONFIG_STANDALONE is not set
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_TS5500 is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+CONFIG_MTD_NAND=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+CONFIG_MTD_NAND_CAFE=y
+CONFIG_MTD_NAND_CS553X=y
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+# CONFIG_BLK_DEV_RAM is not set
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+
+#
+# Misc devices
+#
+# CONFIG_IBM_ASM is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_SCSI_PROC_FS is not set
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# ISDN subsystem
+#
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_PCI is not set
+CONFIG_SERIAL_8250_NR_UARTS=1
+CONFIG_SERIAL_8250_RUNTIME_UARTS=1
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+# CONFIG_UNIX98_PTYS is not set
+# CONFIG_LEGACY_PTYS is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_RTC is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_SONYPI is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_MWAVE is not set
+# CONFIG_PC8736x_GPIO is not set
+# CONFIG_NSC_GPIO is not set
+# CONFIG_CS5535_GPIO is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FIRMWARE_EDID is not set
+CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ARC is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_HGA is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_I810 is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_CYBLA is not set
+# CONFIG_FB_TRIDENT is not set
+CONFIG_FB_GEODE=y
+CONFIG_FB_GEODE_GX=y
+# CONFIG_FB_GEODE_GX_DCON is not set
+# CONFIG_FB_GEODE_GX1 is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=y
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
+# CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=y
+CONFIG_USB_HIDINPUT=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# Networking support is needed for USB Network Adapter support
+#
+# CONFIG_USB_MON is not set
+
+#
+# USB port drivers
+#
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+# CONFIG_EDAC is not set
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+# CONFIG_DNOTIFY is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_PROC_KCORE is not set
+# CONFIG_PROC_SYSCTL is not set
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+CONFIG_JFFS2_SUMMARY=y
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_FS is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_EARLY_PRINTK=y
+# CONFIG_DOUBLEFAULT is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_X86_BIOS_REBOOT=y
+CONFIG_KTIME_SCALAR=y
Index: buildrom/packages/kernel/dcon-detect.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/dcon-detect.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,197 @@
+[PATCH] Detect if the OLPC DCON was detected by the BIOS
+
+From: Jordan Crouse <jordan.crouse at amd.com>
+
+If the OLPC DCON is present, then we'll adjust the mode database
+accordingly (since there is really only 1 mode available anyway).
+
+Signed-off-by: Jordan Crouse <jordan.crouse at amd.com>
+---
+
+ arch/i386/Kconfig               |    7 +++++++
+ arch/i386/kernel/Makefile       |    1 +
+ arch/i386/kernel/olpc.c         |   38 ++++++++++++++++++++++++++++++++++++++
+ drivers/video/geode/gxfb_core.c |   39 +++++++++++++++++++++++++++++++++++----
+ 4 files changed, 81 insertions(+), 4 deletions(-)
+
+Index: linux-2.6.18-rc4-olpc1/arch/i386/Kconfig
+===================================================================
+--- linux-2.6.18-rc4-olpc1.orig/arch/i386/Kconfig	2006-08-08 11:13:24.000000000 -0600
++++ linux-2.6.18-rc4-olpc1/arch/i386/Kconfig	2006-10-03 10:44:14.000000000 -0600
+@@ -1113,6 +1113,13 @@
+ 	def_bool y
+ 	depends on AGP_AMD64
+ 
++config OLPC
++	bool "OLPC Support"
++	default n
++	help
++	  Add support for detecting the unique features of the OLPC 
++	  Childrens Machine
++	  
+ source "drivers/pcmcia/Kconfig"
+ 
+ source "drivers/pci/hotplug/Kconfig"
+Index: linux-2.6.18-rc4-olpc1/arch/i386/kernel/Makefile
+===================================================================
+--- linux-2.6.18-rc4-olpc1.orig/arch/i386/kernel/Makefile	2006-08-08 11:13:24.000000000 -0600
++++ linux-2.6.18-rc4-olpc1/arch/i386/kernel/Makefile	2006-10-03 10:44:14.000000000 -0600
+@@ -44,6 +44,7 @@
+ EXTRA_AFLAGS   := -traditional
+ 
+ obj-$(CONFIG_SCx200)		+= scx200.o
++obj-$(CONFIG_OLPC)		+= olpc.o
+ 
+ # vsyscall.o contains the vsyscall DSO images as __initdata.
+ # We must build both images before we can assemble it.
+Index: linux-2.6.18-rc4-olpc1/arch/i386/kernel/olpc.c
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.18-rc4-olpc1/arch/i386/kernel/olpc.c	2006-10-03 10:44:14.000000000 -0600
+@@ -0,0 +1,38 @@
++/* Support for the OLPC Childrens Machine
++ * Copyright (C) 2006, Advanced Micro Devices, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ */
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/mc146818rtc.h>
++
++int olpc_dcon_present;
++
++/* REV_A CMOS map:
++ * bit 440;  DCON present bit
++ */
++
++#define OLPC_CMOS_DCON_OFFSET (440 / 8)
++#define OLPC_CMOS_DCON_MASK   0x01
++
++static int __init olpc_init(void) {
++
++  unsigned char val;
++
++  /* Read the DCON present bit and set the flag accordingly */
++
++  val = CMOS_READ(OLPC_CMOS_DCON_OFFSET);
++  olpc_dcon_present = (val & OLPC_CMOS_DCON_MASK);
++
++  return 0;
++}
++
++subsys_initcall(olpc_init);
++EXPORT_SYMBOL(olpc_dcon_present);
++
+Index: linux-2.6.18-rc4-olpc1/drivers/video/geode/gxfb_core.c
+===================================================================
+--- linux-2.6.18-rc4-olpc1.orig/drivers/video/geode/gxfb_core.c	2006-08-08 11:13:24.000000000 -0600
++++ linux-2.6.18-rc4-olpc1/drivers/video/geode/gxfb_core.c	2006-10-03 10:46:58.000000000 -0600
+@@ -38,6 +38,7 @@
+ static char *mode_option;
+ 
+ /* Modes relevant to the GX (taken from modedb.c) */
++
+ static const struct fb_videomode gx_modedb[] __initdata = {
+ 	/* 640x480-60 VESA */
+ 	{ NULL, 60, 640, 480, 39682,  48, 16, 33, 10, 96, 2,
+@@ -103,11 +104,33 @@
+ 	{ NULL, 85, 1600, 1200, 4357, 304, 64, 46, 1, 192, 3,
+ 	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+ 	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
+-	{ "OLPC-1", 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3,
++	/* 1200x900-75 - CRT timings for the OLPC mode */
++	{ NULL, 75, 1200, 900, 8049, 104, 240, 29, 54, 136, 3,
++	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
++	  FB_VMODE_NONINTERLACED, 0 }
++};
++
++#ifdef CONFIG_OLPC
++
++/* If the DCON is not detected - then we need to choose a default mode
++ * in OLPC mode
++ */
++
++static const struct fb_videomode gx_nodcon_default = {
++	NULL, 60, 1024, 768, 15384, 160, 24, 29, 3, 136, 6,
++	0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA
++};
++
++static const struct fb_videomode gx_dcon_modedb[] __initdata = {
++	/* The only mode the DCON has is 1200x900 */
++	{ NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3,
+ 	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+ 	  FB_VMODE_NONINTERLACED, 0 }
+ };
+ 
++extern int olpc_dcon_present;
++#endif
++
+ static int gxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+ {
+ 	if (var->xres > 1600 || var->yres > 1200)
+@@ -313,6 +336,10 @@
+ 	int ret;
+ 	unsigned long val;
+ 
++	struct fb_videomode *modedb_default = NULL;
++	struct fb_videomode *modedb_ptr;
++	int modedb_size;
++
+ 	info = gxfb_init_fbinfo(&pdev->dev);
+ 	if (!info)
+ 		return -ENOMEM;
+@@ -336,15 +363,34 @@
+ 	else
+ 		par->enable_crt = 1;
+ 
++	/* If the OLPC DCON is present, then we use a special
++	 * mode database (don't say we support modes that we don't).
++	 */
++
++	modedb_ptr = (struct fb_videomode *) gx_modedb;
++	modedb_size = ARRAY_SIZE(gx_modedb);
++
++#ifdef CONFIG_OLPC
++	if (olpc_dcon_present) {
++		printk(KERN_INFO "gxfb:  DCON detected.\n");
++		modedb_ptr = (struct fb_videomode *) gx_dcon_modedb;
++		modedb_size = ARRAY_SIZE(gx_dcon_modedb);
++	}
++	else {
++		/* Specify the 1024x768 at 60 default for non DCON users */
++		modedb_default = &gx_nodcon_default;
++	}
++#endif
++
+ 	ret = fb_find_mode(&info->var, info, mode_option,
+-			   gx_modedb, ARRAY_SIZE(gx_modedb), NULL, 16);
++			   modedb_ptr, modedb_size, modedb_default, 16);
++
+ 	if (ret == 0 || ret == 4) {
+ 		dev_err(&pdev->dev, "could not find valid video mode\n");
+ 		ret = -EINVAL;
+ 		goto err;
+ 	}
+ 
+-       
+ 	/* Clear the frame buffer of garbage. */
+         memset_io(info->screen_base, 0, info->fix.smem_len);
+ 
+Index: linux-2.6.18-rc4-olpc1/drivers/video/modedb.c
+===================================================================
+--- linux-2.6.18-rc4-olpc1.orig/drivers/video/modedb.c	2006-08-08 11:13:24.000000000 -0600
++++ linux-2.6.18-rc4-olpc1/drivers/video/modedb.c	2006-10-03 10:44:14.000000000 -0600
+@@ -506,7 +506,7 @@
+ 	dbsize = ARRAY_SIZE(modedb);
+     }
+     if (!default_mode)
+-	default_mode = &modedb[DEFAULT_MODEDB_INDEX];
++	default_mode = &db[DEFAULT_MODEDB_INDEX];
+     if (!default_bpp)
+ 	default_bpp = 8;
+ 
Index: buildrom/packages/kernel/ext3.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/ext3.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,24 @@
+Index: git/fs/ext2/super.c
+===================================================================
+--- git.orig/fs/ext2/super.c	2006-10-24 13:39:06.000000000 -0600
++++ git/fs/ext2/super.c	2006-10-24 13:39:08.000000000 -0600
+@@ -748,10 +748,15 @@
+ 	 */
+ 	features = EXT2_HAS_INCOMPAT_FEATURE(sb, ~EXT2_FEATURE_INCOMPAT_SUPP);
+ 	if (features) {
+-		printk("EXT2-fs: %s: couldn't mount because of "
+-		       "unsupported optional features (%x).\n",
+-		       sb->s_id, le32_to_cpu(features));
+-		goto failed_mount;
++		if (!(sb->s_flags & MS_RDONLY) ||
++		   (features != cpu_to_le32(EXT3_FEATURE_INCOMPAT_RECOVER))) {
++			printk("EXT2-fs: %s: couldn't mount because of "
++		       		"unsupported optional features (%x).\n",
++		       		sb->s_id, le32_to_cpu(features));
++				goto failed_mount;
++		} else
++			printk("EXT2-fs: %s: ignoring journal recovery while "
++				"mounting as read-only!\n", sb->s_id);
+ 	}
+ 	if (!(sb->s_flags & MS_RDONLY) &&
+ 	    (features = EXT2_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))){
Index: buildrom/packages/kernel/kernel.inc
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/kernel.inc	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,66 @@
+# Common kernel file included by the targets
+
+KERNEL_BASE_DIR ?= linux-$(KERNEL_VERSION)
+
+KERNEL_DIR=$(BUILD_DIR)/kernel
+KERNEL_SRC_DIR=$(KERNEL_DIR)/$(KERNEL_BASE_DIR)
+KERNEL_STAMP_DIR=$(KERNEL_DIR)/stamps
+KERNEL_LOG_DIR=$(KERNEL_DIR)/logs
+
+ifeq ($(CONFIG_VERBOSE),y)
+KERNEL_FETCH_LOG=/dev/stdout
+KERNEL_BUILD_LOG=/dev/stdout
+KERNEL_INSTALL_LOG=/dev/stdout
+else
+KERNEL_FETCH_LOG=$(KERNEL_LOG_DIR)/fetch.log
+KERNEL_BUILD_LOG=$(KERNEL_LOG_DIR)/build.log
+KERNEL_INSTALL_LOG=$(KERNEL_LOG_DIR)/install.log
+endif
+
+$(KERNEL_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(KERNEL_SOURCE)
+	@ mkdir -p $(KERNEL_DIR)
+	@ echo "Unpacking kernel..."
+	@ tar -C $(KERNEL_DIR) -jxf $(SOURCE_DIR)/$(KERNEL_SOURCE)
+	@ touch $@	
+
+$(KERNEL_STAMP_DIR)/.patched: $(KERNEL_STAMP_DIR)/.unpacked
+	@ echo "Patching kernel..."
+	@ $(BIN_DIR)/doquilt.sh $(KERNEL_SRC_DIR) $(KERNEL_PATCHES)
+	@ touch $@
+
+$(KERNEL_SRC_DIR)/.config: $(KERNEL_STAMP_DIR)/.patched
+	@ cat $(KERNEL_CONFIG) | sed -e s:^CONFIG_LOCALVERSION=.*:CONFIG_LOCALVERSION=\"$(ROM_VERSION)\": > $(KERNEL_SRC_DIR)/.config
+
+$(KERNEL_SRC_DIR)/arch/i386/boot/bzImage: $(KERNEL_SRC_DIR)/.config
+	@ echo "Building kernel..."
+	@ $(MAKE) -C $(KERNEL_SRC_DIR) ARCH=i386 \
+	KERNEL_CC=$(CC) KERNEL_LD=$(LD) > $(KERNEL_BUILD_LOG) 2>&1
+
+$(OUTPUT_DIR)/bzImage: $(KERNEL_SRC_DIR)/arch/i386/boot/bzImage
+	@ install -d $(OUTPUT_DIR)
+	@ install -m 0644 $< $@ 
+
+$(OUTPUT_DIR)/vmlinux: $(KERNEL_SRC_DIR)/arch/i386/boot/bzImage
+	@ install -d $(OUTPUT_DIR)
+	@ install -m 0644 $(KERNEL_SRC_DIR)/vmlinux $@
+	
+$(KERNEL_STAMP_DIR)/.headers: $(KERNEL_SRC_DIR)/.config $(STAGING_DIR)/host/bin/unifdef
+	@ echo "Installing kernel headers..."
+	@( export PATH=$(PATH):$(STAGING_DIR)/host/bin; \
+	$(MAKE) -C $(KERNEL_SRC_DIR) ARCH=i386 \
+	INSTALL_HDR_PATH=$(STAGING_DIR)/ headers_install > $(KERNEL_INSTALL_LOG) 2>&1)
+	@ touch $@
+
+$(KERNEL_STAMP_DIR) $(KERNEL_LOG_DIR):
+	@ mkdir -p $@
+
+generic-kernel: $(KERNEL_STAMP_DIR) $(KERNEL_LOG_DIR) $(OUTPUT_DIR)/bzImage $(OUTPUT_DIR)/vmlinux $(KERNEL_STAMP_DIR)/.headers
+
+generic-kernel-clean:
+	@ echo "Cleaning kernel..."
+	@ if [ -d $(KERNEL_SRC_DIR) ]; then \
+	$(MAKE) -C $(KERNEL_SRC_DIR) clean > /dev/null 2>&1; \
+	fi
+
+generic-kernel-distclean:
+	@ rm -rf $(KERNEL_DIR)
Index: buildrom/packages/kernel/kernel.mk
===================================================================
--- buildrom.orig/packages/kernel/kernel.mk	2007-05-01 14:29:43.000000000 -0600
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,50 +0,0 @@
-KERNEL_VERSION=2.6.18-rc2-olpc1
-KERNEL_URL=http://crank.laptop.org/~jcrouse/
-KERNEL_SOURCE=linux-$(KERNEL_VERSION).tar.gz
-KERNEL_DIR=$(BUILD_DIR)/kernel
-KERNEL_SRC_DIR=$(KERNEL_DIR)/linux-$(KERNEL_VERSION)
-KERNEL_STAMP_DIR=$(KERNEL_DIR)/stamps
-KERNEL_LOG_DIR=$(KERNEL_DIR)/logs
-
-ifeq ($(VERBOSE),y)
-KERNEL_BUILD_LOG=/dev/stdout
-else
-KERNEL_BUILD_LOG=$(KERNEL_LOG_DIR)/build.log
-endif
-
-$(SOURCE_DIR)/$(KERNEL_SOURCE):
-	@ mkdir -p $(SOURCE_DIR)
-	@ wget -P $(SOURCE_DIR) $(KERNEL_URL)/$(KERNEL_SOURCE)
-
-$(KERNEL_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(KERNEL_SOURCE)
-	@ echo "Unpacking kernel..."
-	@ tar -C $(KERNEL_DIR) -zxf $(SOURCE_DIR)/$(KERNEL_SOURCE)
-	@ touch $@	
-
-$(KERNEL_SRC_DIR)/.config: $(KERNEL_STAMP_DIR)/.unpacked
-	@ cp $(PACKAGE_DIR)/kernel/conf/defconfig $(KERNEL_SRC_DIR)/.config
-
-$(KERNEL_SRC_DIR)/arch/i386/boot/bzImage: $(KERNEL_SRC_DIR)/.config
-	@ echo "Building kernel..."
-	@ $(MAKE) -C $(KERNEL_SRC_DIR) ARCH=i386 \
-	KERNEL_CC=$(CC) KERNEL_LD=$(LD) > $(KERNEL_BUILD_LOG) 2>&1
-
-$(OUTPUT_DIR)/bzImage: $(KERNEL_SRC_DIR)/arch/i386/boot/bzImage
-	@ install -d $(OUTPUT_DIR)
-	@ install -m 0644 $< $@ 
-
-$(OUTPUT_DIR)/vmlinux: $(KERNEL_SRC_DIR)/arch/i386/boot/bzImage
-	@ install -d $(OUTPUT_DIR)
-	@ install -m 0644 $(KERNEL_SRC_DIR)/vmlinux $@
-
-$(KERNEL_STAMP_DIR) $(KERNEL_LOG_DIR):
-	@ mkdir -p $@
-
-kernel: $(KERNEL_STAMP_DIR) $(KERNEL_LOG_DIR) $(OUTPUT_DIR)/bzImage $(OUTPUT_DIR)/vmlinux
-
-kernel-clean:
-	@ echo "Cleaning kernel..."
-	@ $(MAKE) -C $(KERNEL_SRC_DIR) clean > /dev/null 2>&1
-
-kernel-distclean:
-	@ rm -rf $(KERNEL_DIR)/*
Index: buildrom/packages/kernel/norwich-kernel.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/norwich-kernel.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,19 @@
+# Build file for the AMD Geode Norwich LAB kernel
+
+KERNEL_URL=http://kernel.org/pub/linux/kernel/v2.6/
+KERNEL_SOURCE=linux-$(KERNEL_VERSION).tar.bz2
+KERNEL_CONFIG=$(PACKAGE_DIR)/kernel/conf/defconfig-norwich
+
+#TINY_DIR=$(PACKAGE_DIR)/kernel/patches/tiny
+#KERNEL_PATCHES += $(shell ls $(TINY_DIR)/*.patch)
+
+
+$(SOURCE_DIR)/$(KERNEL_SOURCE):
+	@ mkdir -p $(SOURCE_DIR)
+	@ wget -P $(SOURCE_DIR) $(KERNEL_URL)/$(KERNEL_SOURCE)
+
+include $(PACKAGE_DIR)/kernel/kernel.inc
+
+kernel: generic-kernel
+kernel-clean: generic-kernel-clean
+kernel-distclean: generic-kernel-distclean
Index: buildrom/packages/kernel/olpc-kernel.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/olpc-kernel.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,23 @@
+# Build file for the OLPC LAB kernel
+
+KERNEL_URL=git://dev.laptop.org/olpc-2.6
+KERNEL_SOURCE=linux-olpc-2.6-$(KERNEL_TAG).tar.gz
+KERNEL_BASE_DIR=git
+KERNEL_CONFIG=$(PACKAGE_DIR)/kernel/conf/defconfig-olpc
+
+KERNEL_PATCHES += $(PACKAGE_DIR)/kernel/patches/ext3.patch
+TINY_DIR=$(PACKAGE_DIR)/kernel/patches/tiny
+KERNEL_PATCHES += $(shell ls $(TINY_DIR)/*.patch)
+
+include $(PACKAGE_DIR)/kernel/kernel.inc
+
+$(SOURCE_DIR)/$(KERNEL_SOURCE):
+	@ echo "Fetching the kernel source..."
+	@ mkdir -p $(SOURCE_DIR)/kernel
+	@ $(BIN_DIR)/fetchgit.sh $(KERNEL_URL) $(SOURCE_DIR)/kernel \
+	$(KERNEL_TAG) $(SOURCE_DIR)/$(KERNEL_SOURCE) \
+	> $(KERNEL_FETCH_LOG) 2>&1
+
+kernel: generic-kernel
+kernel-clean: generic-kernel-clean
+kernel-distclean: generic-kernel-distclean
Index: buildrom/packages/kernel/patches/ext3.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/ext3.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,24 @@
+Index: git/fs/ext2/super.c
+===================================================================
+--- git.orig/fs/ext2/super.c	2006-10-24 13:39:06.000000000 -0600
++++ git/fs/ext2/super.c	2006-10-24 13:39:08.000000000 -0600
+@@ -748,10 +748,15 @@
+ 	 */
+ 	features = EXT2_HAS_INCOMPAT_FEATURE(sb, ~EXT2_FEATURE_INCOMPAT_SUPP);
+ 	if (features) {
+-		printk("EXT2-fs: %s: couldn't mount because of "
+-		       "unsupported optional features (%x).\n",
+-		       sb->s_id, le32_to_cpu(features));
+-		goto failed_mount;
++		if (!(sb->s_flags & MS_RDONLY) ||
++		   (features != cpu_to_le32(EXT3_FEATURE_INCOMPAT_RECOVER))) {
++			printk("EXT2-fs: %s: couldn't mount because of "
++		       		"unsupported optional features (%x).\n",
++		       		sb->s_id, le32_to_cpu(features));
++				goto failed_mount;
++		} else
++			printk("EXT2-fs: %s: ignoring journal recovery while "
++				"mounting as read-only!\n", sb->s_id);
+ 	}
+ 	if (!(sb->s_flags & MS_RDONLY) &&
+ 	    (features = EXT2_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))){
Index: buildrom/packages/kernel/patches/tiny/01-tiny-no-aio.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/01-tiny-no-aio.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,136 @@
+From be9c554435101d6575298547db10e796360ae555 Mon Sep 17 00:00:00 2001
+From: Richard A. Smith <smithbone at gmail.com>
+Date: Mon, 17 Jul 2006 23:49:18 -0500
+Subject: [PATCH] refresh the no-aio patch from linux-tiny
+
+Signed-off-by: Richard A. Smith <smithbone at gmail.com>
+---
+ fs/aio.c        |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ init/Kconfig    |    8 ++++++++
+ kernel/sys_ni.c |    5 +++++
+ kernel/sysctl.c |    2 ++
+ 4 files changed, 68 insertions(+), 0 deletions(-)
+
+Index: git/fs/aio.c
+===================================================================
+--- git.orig/fs/aio.c	2006-10-24 13:39:06.000000000 -0600
++++ git/fs/aio.c	2006-10-24 13:39:13.000000000 -0600
+@@ -35,6 +35,8 @@
+ #include <asm/uaccess.h>
+ #include <asm/mmu_context.h>
+ 
++#ifdef CONFIG_AIO
++
+ #if DEBUG > 1
+ #define dprintk		printk
+ #else
+@@ -1789,3 +1791,54 @@
+ EXPORT_SYMBOL(aio_complete);
+ EXPORT_SYMBOL(aio_put_req);
+ EXPORT_SYMBOL(wait_on_sync_kiocb);
++
++#else
++
++ssize_t fastcall wait_on_sync_kiocb(struct kiocb *iocb)
++{
++	return 0;
++}
++
++void fastcall exit_aio(struct mm_struct *mm)
++{
++}
++
++void fastcall __put_ioctx(struct kioctx *ctx)
++{
++}
++
++int fastcall aio_put_req(struct kiocb *req)
++{
++	return 0;
++}
++
++struct kioctx *lookup_ioctx(unsigned long ctx_id)
++{
++	return 0;
++}
++
++void fastcall kick_iocb(struct kiocb *iocb)
++{
++}
++
++int fastcall aio_complete(struct kiocb *iocb, long res, long res2)
++{
++	return 0;
++}
++
++int fastcall io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
++			 struct iocb *iocb)
++{
++	return -EINVAL;
++}
++
++struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb *iocb, u32 key)
++{
++	return 0;
++}
++
++EXPORT_SYMBOL(aio_complete);
++EXPORT_SYMBOL(aio_put_req);
++EXPORT_SYMBOL(wait_on_sync_kiocb);
++
++#endif
+Index: git/init/Kconfig
+===================================================================
+--- git.orig/init/Kconfig	2006-10-24 13:39:06.000000000 -0600
++++ git/init/Kconfig	2006-10-24 13:39:13.000000000 -0600
+@@ -438,6 +438,14 @@
+ 	  option allows the disabling of the VM event counters.
+ 	  /proc/vmstat will only show page counts.
+ 
++config AIO
++ 	default y
++ 	bool "Enable AIO support" if EMBEDDED
++ 	help
++ 	  This option enables POSIX async IO which may be used by some high
++ 	  performance threaded applications. Disabling this option saves about
++ 	  5k.
++
+ endmenu		# General setup
+ 
+ config RT_MUTEXES
+Index: git/kernel/sys_ni.c
+===================================================================
+--- git.orig/kernel/sys_ni.c	2006-10-24 13:39:06.000000000 -0600
++++ git/kernel/sys_ni.c	2006-10-24 13:39:13.000000000 -0600
+@@ -112,6 +112,11 @@
+ cond_syscall(sys_vm86);
+ cond_syscall(compat_sys_ipc);
+ cond_syscall(compat_sys_sysctl);
++cond_syscall(sys_io_setup);
++cond_syscall(sys_io_destroy);
++cond_syscall(sys_io_submit);
++cond_syscall(sys_io_cancel);
++cond_syscall(sys_io_getevents);
+ 
+ /* arch-specific weak syscall entries */
+ cond_syscall(sys_pciconfig_read);
+Index: git/kernel/sysctl.c
+===================================================================
+--- git.orig/kernel/sysctl.c	2006-10-24 13:39:06.000000000 -0600
++++ git/kernel/sysctl.c	2006-10-24 13:39:13.000000000 -0600
+@@ -1127,6 +1127,7 @@
+ 		.mode		= 0644,
+ 		.proc_handler	= &proc_dointvec,
+ 	},
++#ifdef CONFIG_AIO
+ 	{
+ 		.ctl_name	= FS_AIO_NR,
+ 		.procname	= "aio-nr",
+@@ -1143,6 +1144,7 @@
+ 		.mode		= 0644,
+ 		.proc_handler	= &proc_doulongvec_minmax,
+ 	},
++#endif
+ #ifdef CONFIG_INOTIFY_USER
+ 	{
+ 		.ctl_name	= FS_INOTIFY,
Index: buildrom/packages/kernel/patches/tiny/02-tiny-no-translations.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/02-tiny-no-translations.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,132 @@
+From 324c218a9c6a24d897c1b585665b247d0d3b525e Mon Sep 17 00:00:00 2001
+From: Richard A. Smith <smithbone at gmail.com>
+Date: Tue, 18 Jul 2006 00:04:36 -0500
+Subject: [PATCH] Refresh the no-translations patch from linux-tiny
+
+Signed-off-by: Richard A. Smith <smithbone at gmail.com>
+---
+ drivers/char/consolemap.c |   71 +++++++++++++++++++++++++++++++++++++++++++++
+ drivers/char/vt.c         |    4 +++
+ init/Kconfig              |    7 ++++
+ 3 files changed, 82 insertions(+), 0 deletions(-)
+
+Index: git/drivers/char/consolemap.c
+===================================================================
+--- git.orig/drivers/char/consolemap.c	2006-10-23 07:35:33.000000000 -0600
++++ git/drivers/char/consolemap.c	2006-10-24 13:35:03.000000000 -0600
+@@ -22,6 +22,8 @@
+ #include <linux/consolemap.h>
+ #include <linux/vt_kern.h>
+ 
++#ifdef CONFIG_CONSOLE_TRANSLATIONS
++
+ static unsigned short translations[][256] = {
+   /* 8-bit Latin-1 mapped to Unicode -- trivial mapping */
+   {
+@@ -667,3 +669,72 @@
+ }
+ 
+ EXPORT_SYMBOL(con_copy_unimap);
++
++#else
++
++unsigned char inverse_translate(struct vc_data *conp, int glyph)
++{
++	return glyph;
++}
++
++unsigned short *set_translate(int m, struct vc_data *vc)
++{
++	return NULL;
++}
++
++int con_set_trans_old(unsigned char * arg)
++{
++	return 0;
++}
++
++int con_get_trans_old(unsigned char * arg)
++{
++	return -EINVAL;
++}
++
++int con_set_trans_new(ushort * arg)
++{
++	return 0;
++}
++
++int con_get_trans_new(ushort * arg)
++{
++	return -EINVAL;
++}
++
++int con_clear_unimap(struct vc_data *vc, struct unimapinit *ui)
++{
++	return 0;
++}
++
++int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair *list)
++{
++	return 0;
++}
++
++int con_set_default_unimap(struct vc_data *vc)
++{
++	return 0;
++}
++
++int con_copy_unimap(struct vc_data *d, struct vc_data *s)
++{
++	return 0;
++}
++
++int con_get_unimap(struct vc_data *vc, ushort ct, ushort *uct,
++		   struct unipair *list)
++{
++	return -EINVAL;
++}
++
++void con_free_unimap(struct vc_data *vc) { }
++
++int conv_uni_to_pc(struct vc_data *conp, long ucs)
++{
++	return ucs > 0xff ? -1: ucs;
++}
++
++void __init console_map_init(void) { }
++
++#endif
+Index: git/drivers/char/vt.c
+===================================================================
+--- git.orig/drivers/char/vt.c	2006-10-23 07:35:33.000000000 -0600
++++ git/drivers/char/vt.c	2006-10-24 13:35:42.000000000 -0600
+@@ -2058,7 +2058,11 @@
+ 		      tc = c;
+ 		    }
+ 		} else {	/* no utf or alternate charset mode */
++#ifdef CONFIG_CONSOLE_TRANSLATIONS
+ 		  tc = vc->vc_translate[vc->vc_toggle_meta ? (c | 0x80) : c];
++#else
++		  tc = c;
++#endif
+ 		}
+ 
+                 /* If the original code was a control character we
+Index: git/init/Kconfig
+===================================================================
+--- git.orig/init/Kconfig	2006-10-24 13:33:23.000000000 -0600
++++ git/init/Kconfig	2006-10-24 13:35:03.000000000 -0600
+@@ -446,6 +446,13 @@
+  	  performance threaded applications. Disabling this option saves about
+  	  5k.
+ 
++config CONSOLE_TRANSLATIONS
++ 	default y
++ 	bool "Enable character translations in console" if EMBEDDED
++ 	help
++ 	  This enables support for font mapping and Unicode translation
++          on virtual consoles.
++
+ endmenu		# General setup
+ 
+ config RT_MUTEXES
Index: buildrom/packages/kernel/patches/tiny/03-tiny-no-xattr.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/03-tiny-no-xattr.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,86 @@
+From 64005ef5d31ac84f476ed7b88e435c2155408ed1 Mon Sep 17 00:00:00 2001
+From: Richard A. Smith <smithbone at gmail.com>
+Date: Tue, 18 Jul 2006 00:11:18 -0500
+Subject: [PATCH] refresh the no-xattr patch from linux-tiny
+
+Signed-off-by: Richard A. Smith <smithbone at gmail.com>
+---
+ fs/Kconfig      |    1 +
+ fs/Makefile     |    3 ++-
+ init/Kconfig    |    6 ++++++
+ kernel/sys_ni.c |   12 ++++++++++++
+ 4 files changed, 21 insertions(+), 1 deletions(-)
+
+Index: git/fs/Kconfig
+===================================================================
+--- git.orig/fs/Kconfig	2006-10-23 07:35:33.000000000 -0600
++++ git/fs/Kconfig	2006-10-24 13:36:04.000000000 -0600
+@@ -21,6 +21,7 @@
+ config EXT2_FS_XATTR
+ 	bool "Ext2 extended attributes"
+ 	depends on EXT2_FS
++	depends on XATTR
+ 	help
+ 	  Extended attributes are name:value pairs associated with inodes by
+ 	  the kernel or by users (see the attr(5) manual page, or visit
+Index: git/fs/Makefile
+===================================================================
+--- git.orig/fs/Makefile	2006-10-23 07:35:33.000000000 -0600
++++ git/fs/Makefile	2006-10-24 13:36:33.000000000 -0600
+@@ -9,7 +9,7 @@
+ 		char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \
+ 		ioctl.o readdir.o select.o fifo.o locks.o dcache.o inode.o \
+ 		attr.o bad_inode.o file.o filesystems.o namespace.o aio.o \
+-		seq_file.o xattr.o libfs.o fs-writeback.o \
++		seq_file.o libfs.o fs-writeback.o \
+ 		pnode.o drop_caches.o splice.o sync.o utimes.o
+ 
+ ifeq ($(CONFIG_BLOCK),y)
+@@ -20,6 +20,7 @@
+ 
+ obj-$(CONFIG_INOTIFY)		+= inotify.o
+ obj-$(CONFIG_INOTIFY_USER)	+= inotify_user.o
++obj-$(CONFIG_XATTR)		+= xattr.o
+ obj-$(CONFIG_EPOLL)		+= eventpoll.o
+ obj-$(CONFIG_COMPAT)		+= compat.o compat_ioctl.o
+ 
+Index: git/init/Kconfig
+===================================================================
+--- git.orig/init/Kconfig	2006-10-24 13:35:03.000000000 -0600
++++ git/init/Kconfig	2006-10-24 13:36:04.000000000 -0600
+@@ -453,6 +453,12 @@
+  	  This enables support for font mapping and Unicode translation
+           on virtual consoles.
+ 
++config XATTR
++ 	default y
++ 	bool "Enable filesystem extended attribute support" if EMBEDDED
++ 	help
++ 	  This enables the filesystem extended attribute syscalls.
++
+ endmenu		# General setup
+ 
+ config RT_MUTEXES
+Index: git/kernel/sys_ni.c
+===================================================================
+--- git.orig/kernel/sys_ni.c	2006-10-24 13:33:23.000000000 -0600
++++ git/kernel/sys_ni.c	2006-10-24 13:36:04.000000000 -0600
+@@ -117,6 +117,18 @@
+ cond_syscall(sys_io_submit);
+ cond_syscall(sys_io_cancel);
+ cond_syscall(sys_io_getevents);
++cond_syscall(sys_setxattr);
++cond_syscall(sys_lsetxattr);
++cond_syscall(sys_fsetxattr);
++cond_syscall(sys_getxattr);
++cond_syscall(sys_lgetxattr);
++cond_syscall(sys_fgetxattr);
++cond_syscall(sys_listxattr);
++cond_syscall(sys_llistxattr);
++cond_syscall(sys_flistxattr);
++cond_syscall(sys_removexattr);
++cond_syscall(sys_lremovexattr);
++cond_syscall(sys_fremovexattr);
+ 
+ /* arch-specific weak syscall entries */
+ cond_syscall(sys_pciconfig_read);
Index: buildrom/packages/kernel/patches/tiny/04-tiny-pci-quirks.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/04-tiny-pci-quirks.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,86 @@
+From 01c3ed6f33af0bc22621fa7af678b2ad115d63d4 Mon Sep 17 00:00:00 2001
+From: Richard A. Smith <smithbone at gmail.com>
+Date: Tue, 18 Jul 2006 00:15:55 -0500
+Subject: [PATCH] refresh pci-quirks patch from linux-tiny
+
+Signed-off-by: Richard A. Smith <smithbone at gmail.com>
+---
+ drivers/pci/quirks.c |   27 +++++++++++++++++----------
+ init/Kconfig         |    8 ++++++++
+ 2 files changed, 25 insertions(+), 10 deletions(-)
+
+Index: git/drivers/pci/quirks.c
+===================================================================
+--- git.orig/drivers/pci/quirks.c	2006-10-23 07:35:33.000000000 -0600
++++ git/drivers/pci/quirks.c	2006-10-24 13:36:48.000000000 -0600
+@@ -34,6 +34,10 @@
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR,quirk_mellanox_tavor);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE,quirk_mellanox_tavor);
+ 
++int isa_dma_bridge_buggy;		/* Exported */
++int pci_pci_problems;
++
++#ifdef CONFIG_PCI_QUIRKS
+ /* Deal with broken BIOS'es that neglect to enable passive release,
+    which can cause problems in combination with the 82441FX/PPro MTRRs */
+ static void __devinit quirk_passive_release(struct pci_dev *dev)
+@@ -54,14 +58,13 @@
+ }
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82441,	quirk_passive_release );
+ 
+-/*  The VIA VP2/VP3/MVP3 seem to have some 'features'. There may be a workaround
+-    but VIA don't answer queries. If you happen to have good contacts at VIA
+-    ask them for me please -- Alan 
+-    
+-    This appears to be BIOS not version dependent. So presumably there is a 
+-    chipset level fix */
+-int isa_dma_bridge_buggy;		/* Exported */
+-    
++/*  The VIA VP2/VP3/MVP3 seem to have some 'features'. There may be a
++    workaround but VIA don't answer queries. If you happen to have
++    good contacts at VIA ask them for me please -- Alan
++
++    This appears to be BIOS not version dependent. So presumably there
++    is a chipset level fix */
++
+ static void __devinit quirk_isa_dma_hangs(struct pci_dev *dev)
+ {
+ 	if (!isa_dma_bridge_buggy) {
+@@ -81,8 +84,6 @@
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC,	PCI_DEVICE_ID_NEC_CBUS_2,	quirk_isa_dma_hangs );
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC,	PCI_DEVICE_ID_NEC_CBUS_3,	quirk_isa_dma_hangs );
+ 
+-int pci_pci_problems;
+-
+ /*
+  *	Chipsets where PCI->PCI transfers vanish or hang
+  */
+@@ -1858,3 +1859,9 @@
+ #ifdef CONFIG_HOTPLUG
+ EXPORT_SYMBOL(pci_fixup_device);
+ #endif
++
++#else
++void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev)
++{
++}
++#endif /* CONFIG_PCI_QUIRKS */
+Index: git/init/Kconfig
+===================================================================
+--- git.orig/init/Kconfig	2006-10-24 13:36:04.000000000 -0600
++++ git/init/Kconfig	2006-10-24 13:36:48.000000000 -0600
+@@ -459,6 +459,14 @@
+  	help
+  	  This enables the filesystem extended attribute syscalls.
+ 
++config PCI_QUIRKS
++ 	default y
++ 	bool "Enable PCI quirk workarounds" if EMBEDDED
++ 	help
++ 	  This enables workarounds for various PCI chipset bugs/quirks.
++ 	  Disable this only if you know your target machine is unaffected
++ 	  by PCI quirks.
++
+ endmenu		# General setup
+ 
+ config RT_MUTEXES
Index: buildrom/packages/kernel/patches/tiny/06-tiny-buffer-inlines.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/06-tiny-buffer-inlines.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,20 @@
+
+uninline a buffer.c function
+
+
+ tiny-mpm/fs/buffer.c |    2 +-
+ 1 files changed, 1 insertion(+), 1 deletion(-)
+
+Index: git/fs/buffer.c
+===================================================================
+--- git.orig/fs/buffer.c	2006-10-23 07:35:33.000000000 -0600
++++ git/fs/buffer.c	2006-10-24 13:36:53.000000000 -0600
+@@ -569,7 +569,7 @@
+ /*
+  * The buffer's backing address_space's private_lock must be held
+  */
+-static inline void __remove_assoc_queue(struct buffer_head *bh)
++static void __remove_assoc_queue(struct buffer_head *bh)
+ {
+ 	list_del_init(&bh->b_assoc_buffers);
+ 	WARN_ON(!bh->b_assoc_map);
Index: buildrom/packages/kernel/patches/tiny/08-tiny-ext2namei-inlines.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/08-tiny-ext2namei-inlines.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,20 @@
+
+uninline ext2_add_nondir
+
+
+ tiny-mpm/fs/ext2/namei.c |    2 +-
+ 1 files changed, 1 insertion(+), 1 deletion(-)
+
+Index: linux-2.6.18-rc4-olpc1/fs/ext2/namei.c
+===================================================================
+--- linux-2.6.18-rc4-olpc1.orig/fs/ext2/namei.c	2006-08-08 11:13:24.000000000 -0600
++++ linux-2.6.18-rc4-olpc1/fs/ext2/namei.c	2006-09-14 09:23:18.000000000 -0600
+@@ -36,7 +36,7 @@
+ #include "acl.h"
+ #include "xip.h"
+ 
+-static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode)
++static int ext2_add_nondir(struct dentry *dentry, struct inode *inode)
+ {
+ 	int err = ext2_add_link(dentry, inode);
+ 	if (!err) {
Index: buildrom/packages/kernel/patches/tiny/12-tiny-tiny-crc.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/12-tiny-tiny-crc.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,89 @@
+
+Unroll crc32 calculation on small systems
+
+
+ tiny-mpm/init/Kconfig    |   12 ++++++++++++
+ tiny-mpm/lib/Makefile    |    2 ++
+ tiny-mpm/lib/crc32.c     |    2 ++
+ tiny-mpm/lib/crc32defs.h |    9 ++++++++-
+ 4 files changed, 24 insertions(+), 1 deletion(-)
+
+Index: git/init/Kconfig
+===================================================================
+--- git.orig/init/Kconfig	2006-10-24 13:41:52.000000000 -0600
++++ git/init/Kconfig	2006-10-24 13:44:02.000000000 -0600
+@@ -467,12 +467,25 @@
+  	  Disable this only if you know your target machine is unaffected
+  	  by PCI quirks.
+ 
++config CRC32_TABLES
++	depends CRC32
++	default y
++	bool "Calculate CRC32 with tables" if EMBEDDED
++	help
++	  This option enables use of tables for CRC calculation. Disabling
++          reduces kernel size by about 2K. This may actually result in
++          faster code on machines with limited memory bandwidth.
++
+ endmenu		# General setup
+ 
+ config RT_MUTEXES
+ 	boolean
+ 	select PLIST
+ 
++config CRC32_CALC
++	default !CRC32_TABLES
++	bool
++
+ config TINY_SHMEM
+ 	default !SHMEM
+ 	bool
+Index: git/lib/Makefile
+===================================================================
+--- git.orig/lib/Makefile	2006-10-23 07:35:33.000000000 -0600
++++ git/lib/Makefile	2006-10-24 13:43:43.000000000 -0600
+@@ -58,7 +58,9 @@
+ hostprogs-y	:= gen_crc32table
+ clean-files	:= crc32table.h
+ 
++ifeq ($(CONFIG_CRC32_TABLES),y)
+ $(obj)/crc32.o: $(obj)/crc32table.h
++endif
+ 
+ quiet_cmd_crc32 = GEN     $@
+       cmd_crc32 = $< > $@
+Index: git/lib/crc32.c
+===================================================================
+--- git.orig/lib/crc32.c	2006-10-23 07:35:33.000000000 -0600
++++ git/lib/crc32.c	2006-10-24 13:43:43.000000000 -0600
+@@ -36,7 +36,9 @@
+ #define tole(x) (x)
+ #define tobe(x) (x)
+ #endif
++#ifdef CONFIG_CRC32_TABLES
+ #include "crc32table.h"
++#endif
+ 
+ MODULE_AUTHOR("Matt Domsch <Matt_Domsch at dell.com>");
+ MODULE_DESCRIPTION("Ethernet CRC32 calculations");
+Index: git/lib/crc32defs.h
+===================================================================
+--- git.orig/lib/crc32defs.h	2006-10-23 07:35:33.000000000 -0600
++++ git/lib/crc32defs.h	2006-10-24 13:43:43.000000000 -0600
+@@ -7,8 +7,15 @@
+ #define CRCPOLY_BE 0x04c11db7
+ 
+ /* How many bits at a time to use.  Requires a table of 4<<CRC_xx_BITS bytes. */
++
++#ifdef CONFIG_CRC32_CALC /* config symbols not visible to gen_crc32table */
++#define CRC_LE_BITS 1
++#define CRC_BE_BITS 1
++#endif
++
+ /* For less performance-sensitive, use 4 */
+-#ifndef CRC_LE_BITS 
++
++#ifndef CRC_LE_BITS
+ # define CRC_LE_BITS 8
+ #endif
+ #ifndef CRC_BE_BITS
Index: buildrom/packages/kernel/patches/tiny/14-tiny-remove-vm86.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/14-tiny-remove-vm86.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,162 @@
+
+Make vm86 support optional
+
+
+ tiny-mpm/arch/i386/kernel/Makefile   |    3 ++-
+ tiny-mpm/arch/i386/kernel/entry.S    |    6 +++++-
+ tiny-mpm/arch/i386/kernel/process.c  |    3 ++-
+ tiny-mpm/arch/i386/kernel/sys_i386.c |    1 +
+ tiny-mpm/arch/i386/kernel/traps.c    |   17 ++++++++++++++++-
+ tiny-mpm/arch/i386/kernel/vm86.c     |    1 -
+ tiny-mpm/init/Kconfig                |   10 ++++++++++
+ tiny-mpm/kernel/sys.c                |    2 ++
+ 8 files changed, 38 insertions(+), 5 deletions(-)
+
+Index: git/arch/i386/kernel/entry.S
+===================================================================
+--- git.orig/arch/i386/kernel/entry.S	2006-10-23 07:35:33.000000000 -0600
++++ git/arch/i386/kernel/entry.S	2006-10-24 13:44:08.000000000 -0600
+@@ -458,15 +458,21 @@
+ 
+ work_notifysig:				# deal with pending signals and
+ 					# notify-resume requests
+-	testl $VM_MASK, EFLAGS(%esp)
+ 	movl %esp, %eax
++
++#ifdef CONFIG_VM86
++	testl $VM_MASK, EFLAGS(%esp)
+ 	jne work_notifysig_v86		# returning to kernel-space or
+ 					# vm86-space
++#endif
++
+ 	xorl %edx, %edx
+ 	call do_notify_resume
+ 	jmp resume_userspace_sig
+ 
+ 	ALIGN
++
++#ifdef CONFIG_VM86
+ work_notifysig_v86:
+ #ifdef CONFIG_VM86
+ 	pushl %ecx			# save ti_flags for do_notify_resume
+@@ -482,6 +488,8 @@
+ 
+ 	# perform syscall exit tracing
+ 	ALIGN
++#endif
++
+ syscall_trace_entry:
+ 	movl $-ENOSYS,EAX(%esp)
+ 	movl %esp, %eax
+Index: git/arch/i386/kernel/process.c
+===================================================================
+--- git.orig/arch/i386/kernel/process.c	2006-10-23 07:35:33.000000000 -0600
++++ git/arch/i386/kernel/process.c	2006-10-24 13:44:08.000000000 -0600
+@@ -402,7 +402,9 @@
+ void release_thread(struct task_struct *dead_task)
+ {
+ 	BUG_ON(dead_task->mm);
++#ifdef CONFIG_VM86
+ 	release_vm86_irqs(dead_task);
++#endif
+ }
+ 
+ /*
+Index: git/arch/i386/kernel/traps.c
+===================================================================
+--- git.orig/arch/i386/kernel/traps.c	2006-10-23 07:35:33.000000000 -0600
++++ git/arch/i386/kernel/traps.c	2006-10-24 13:44:08.000000000 -0600
+@@ -547,8 +547,10 @@
+ 	tsk->thread.trap_no = trapnr;
+ 
+ 	if (regs->eflags & VM_MASK) {
++#ifdef CONFIG_VM86
+ 		if (vm86)
+ 			goto vm86_trap;
++#endif
+ 		goto trap_signal;
+ 	}
+ 
+@@ -569,11 +571,13 @@
+ 		return;
+ 	}
+ 
++#ifdef CONFIG_VM86
+ 	vm86_trap: {
+ 		int ret = handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, trapnr);
+ 		if (ret) goto trap_signal;
+ 		return;
+ 	}
++#endif
+ }
+ 
+ #define DO_ERROR(trapnr, signr, str, name) \
+@@ -628,6 +632,7 @@
+ #endif
+ DO_VM86_ERROR( 4, SIGSEGV, "overflow", overflow)
+ DO_VM86_ERROR( 5, SIGSEGV, "bounds", bounds)
++
+ DO_ERROR_INFO( 6, SIGILL,  "invalid opcode", invalid_op, ILL_ILLOPN, regs->eip)
+ DO_ERROR( 9, SIGFPE,  "coprocessor segment overrun", coprocessor_segment_overrun)
+ DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
+@@ -673,8 +678,10 @@
+ 	current->thread.error_code = error_code;
+ 	current->thread.trap_no = 13;
+ 
++#ifdef CONFIG_VM86
+ 	if (regs->eflags & VM_MASK)
+ 		goto gp_in_vm86;
++#endif
+ 
+ 	if (!user_mode(regs))
+ 		goto gp_in_kernel;
+@@ -684,10 +691,12 @@
+ 	force_sig(SIGSEGV, current);
+ 	return;
+ 
++#ifdef CONFIG_VM86
+ gp_in_vm86:
+ 	local_irq_enable();
+ 	handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
+ 	return;
++#endif
+ 
+ gp_in_kernel:
+ 	if (!fixup_exception(regs)) {
+@@ -893,8 +902,10 @@
+ 			goto clear_dr7;
+ 	}
+ 
++#ifdef CONFIG_VM86
+ 	if (regs->eflags & VM_MASK)
+ 		goto debug_vm86;
++#endif
+ 
+ 	/* Save debug status register where ptrace can see it */
+ 	tsk->thread.debugreg[6] = condition;
+@@ -923,9 +934,11 @@
+ 	set_debugreg(0, 7);
+ 	return;
+ 
++#ifdef CONFIG_VM86
+ debug_vm86:
+ 	handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
+ 	return;
++#endif
+ 
+ clear_TF_reenable:
+ 	set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
+@@ -1063,11 +1076,13 @@
+ 		 * Handle strange cache flush from user space exception
+ 		 * in all other cases.  This is undocumented behaviour.
+ 		 */
++#ifdef CONFIG_VM86
+ 		if (regs->eflags & VM_MASK) {
+ 			handle_vm86_fault((struct kernel_vm86_regs *)regs,
+ 					  error_code);
+ 			return;
+ 		}
++#endif
+ 		current->thread.trap_no = 19;
+ 		current->thread.error_code = error_code;
+ 		die_if_kernel("cache flush denied", regs, error_code);
Index: buildrom/packages/kernel/patches/tiny/15-tiny-fslock.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/15-tiny-fslock.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,224 @@
+
+configurable POSIX file locking API
+
+
+ tiny-mpm/fs/Makefile         |    3 ++-
+ tiny-mpm/fs/locks.c          |    1 +
+ tiny-mpm/fs/proc/proc_misc.c |    4 ++++
+ tiny-mpm/include/linux/fs.h  |   42 +++++++++++++++++++++++++++++++++++++++++-
+ tiny-mpm/init/Kconfig        |    6 ++++++
+ tiny-mpm/kernel/sys.c        |    1 +
+ 6 files changed, 55 insertions(+), 2 deletions(-)
+
+Index: git/init/Kconfig
+===================================================================
+--- git.orig/init/Kconfig	2006-10-24 13:44:02.000000000 -0600
++++ git/init/Kconfig	2006-10-24 13:44:14.000000000 -0600
+@@ -459,6 +459,12 @@
+  	help
+  	  This enables the filesystem extended attribute syscalls.
+ 
++config FILE_LOCKING
++	default y
++	bool "Enable POSIX file locking API" if EMBEDDED
++	help
++	  This enables standard file locking support.
++
+ config PCI_QUIRKS
+  	default y
+  	bool "Enable PCI quirk workarounds" if EMBEDDED
+Index: git/fs/proc/proc_misc.c
+===================================================================
+--- git.orig/fs/proc/proc_misc.c	2006-10-23 07:35:33.000000000 -0600
++++ git/fs/proc/proc_misc.c	2006-10-24 13:44:14.000000000 -0600
+@@ -618,6 +618,7 @@
+ 	return proc_calc_metrics(page, start, off, count, eof, len);
+ }
+ 
++#ifdef CONFIG_FILE_LOCKING
+ static int locks_read_proc(char *page, char **start, off_t off,
+ 				 int count, int *eof, void *data)
+ {
+@@ -627,6 +628,7 @@
+ 		*eof = 1;
+ 	return len;
+ }
++#endif
+ 
+ static int execdomains_read_proc(char *page, char **start, off_t off,
+ 				 int count, int *eof, void *data)
+@@ -686,7 +688,9 @@
+ #endif
+ 		{"filesystems",	filesystems_read_proc},
+ 		{"cmdline",	cmdline_read_proc},
++#ifdef CONFIG_FILE_LOCKING
+ 		{"locks",	locks_read_proc},
++#endif
+ 		{"execdomains",	execdomains_read_proc},
+ 		{NULL,}
+ 	};
+Index: git/include/linux/fs.h
+===================================================================
+--- git.orig/include/linux/fs.h	2006-10-23 07:35:33.000000000 -0600
++++ git/include/linux/fs.h	2006-10-24 13:44:14.000000000 -0600
+@@ -835,6 +835,9 @@
+ 
+ #include <linux/fcntl.h>
+ 
++extern void send_sigio(struct fown_struct *fown, int fd, int band);
++
++#ifdef CONFIG_FILE_LOCKING
+ extern int fcntl_getlk(struct file *, struct flock __user *);
+ extern int fcntl_setlk(unsigned int, struct file *, unsigned int,
+ 			struct flock __user *);
+@@ -845,7 +848,6 @@
+ 			struct flock64 __user *);
+ #endif
+ 
+-extern void send_sigio(struct fown_struct *fown, int fd, int band);
+ extern int fcntl_setlease(unsigned int fd, struct file *filp, long arg);
+ extern int fcntl_getlease(struct file *filp);
+ 
+@@ -871,6 +873,32 @@
+ extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
+ extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
+ 
++#else /* !CONFIG_FILE_LOCKING */
++#define fcntl_getlk(a, b) (-EINVAL)
++#define fcntl_setlk(a, b, c, d) (-EACCES)
++#if BITS_PER_LONG == 32
++#define fcntl_getlk64(a, b) (-EINVAL)
++#define fcntl_setlk64(a, b, c, d) (-EACCES)
++#endif
++#define fcntl_setlease(a, b, c) (0)
++#define fcntl_getlease(a) (0)
++#define locks_init_lock(a)
++#define locks_copy_lock(a, b)
++#define locks_remove_posix(a, b)
++#define locks_remove_flock(a)
++#define posix_test_lock(a, b) (0)
++#define posix_lock_file(a, b) (-ENOLCK)
++#define posix_lock_file_wait(a, b) (-ENOLCK)
++#define posix_block_lock(a, b)
++#define posix_unblock_lock(a, b)
++#define posix_locks_deadlock(a, b) (0)
++#define __break_lease(a, b) (0)
++#define lease_get_mtime(a, b)
++#define lock_may_read(a, b, c) (1)
++#define lock_may_write(a, b, c) (1)
++#define steal_locks(a)
++#endif /* !CONFIG_FILE_LOCKING */
++
+ struct fasync_struct {
+ 	int	magic;
+ 	int	fa_fd;
+@@ -1446,6 +1474,7 @@
+ #define FLOCK_VERIFY_READ  1
+ #define FLOCK_VERIFY_WRITE 2
+ 
++#ifdef CONFIG_FILE_LOCKING
+ extern int locks_mandatory_locked(struct inode *);
+ extern int locks_mandatory_area(int, struct inode *, struct file *, loff_t, size_t);
+ 
+@@ -1486,6 +1515,18 @@
+ 	return 0;
+ }
+ 
++#else /* !CONFIG_FILE_LOCKING */
++
++#define locks_mandatory_locked(a) (0)
++#define locks_mandatory_area(a, b, c, d, e) (0)
++#define MANDATORY_LOCK(inode) (0)
++#define locks_verify_locked(a) (0)
++#define locks_verify_area(a, b, c, d, e) (0 && (b))
++#define locks_verify_truncate(a, b, c) (0)
++#define break_lease(a, b) (0)
++
++#endif /* !CONFIG_FILE_LOCKING */
++
+ /* fs/open.c */
+ 
+ extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs,
+Index: git/kernel/sys_ni.c
+===================================================================
+--- git.orig/kernel/sys_ni.c	2006-10-24 13:41:52.000000000 -0600
++++ git/kernel/sys_ni.c	2006-10-24 13:44:14.000000000 -0600
+@@ -129,6 +129,7 @@
+ cond_syscall(sys_removexattr);
+ cond_syscall(sys_lremovexattr);
+ cond_syscall(sys_fremovexattr);
++cond_syscall(sys_flock);
+ 
+ /* arch-specific weak syscall entries */
+ cond_syscall(sys_pciconfig_read);
+Index: git/fs/Makefile
+===================================================================
+--- git.orig/fs/Makefile	2006-10-24 13:41:52.000000000 -0600
++++ git/fs/Makefile	2006-10-24 13:44:32.000000000 -0600
+@@ -7,7 +7,7 @@
+ 
+ obj-y :=	open.o read_write.o file_table.o super.o \
+ 		char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \
+-		ioctl.o readdir.o select.o fifo.o locks.o dcache.o inode.o \
++		ioctl.o readdir.o select.o fifo.o dcache.o inode.o \
+ 		attr.o bad_inode.o file.o filesystems.o namespace.o aio.o \
+ 		seq_file.o libfs.o fs-writeback.o \
+ 		pnode.o drop_caches.o splice.o sync.o utimes.o
+@@ -20,6 +20,7 @@
+ 
+ obj-$(CONFIG_INOTIFY)		+= inotify.o
+ obj-$(CONFIG_INOTIFY_USER)	+= inotify_user.o
++obj-$(CONFIG_FILE_LOCKING)	+= locks.o
+ obj-$(CONFIG_XATTR)		+= xattr.o
+ obj-$(CONFIG_EPOLL)		+= eventpoll.o
+ obj-$(CONFIG_COMPAT)		+= compat.o compat_ioctl.o
+Index: git/kernel/sysctl.c
+===================================================================
+--- git.orig/kernel/sysctl.c	2006-10-24 13:41:52.000000000 -0600
++++ git/kernel/sysctl.c	2006-10-24 13:44:14.000000000 -0600
+@@ -1100,6 +1100,7 @@
+ 		.extra1		= &minolduid,
+ 		.extra2		= &maxolduid,
+ 	},
++#ifdef CONFIG_FILE_LOCKING
+ 	{
+ 		.ctl_name	= FS_LEASES,
+ 		.procname	= "leases-enable",
+@@ -1108,6 +1109,7 @@
+ 		.mode		= 0644,
+ 		.proc_handler	= &proc_dointvec,
+ 	},
++#endif
+ #ifdef CONFIG_DNOTIFY
+ 	{
+ 		.ctl_name	= FS_DIR_NOTIFY,
+@@ -1119,6 +1121,8 @@
+ 	},
+ #endif
+ #ifdef CONFIG_MMU
++#ifdef CONFIG_FILE_LOCKING
++
+ 	{
+ 		.ctl_name	= FS_LEASE_TIME,
+ 		.procname	= "lease-break-time",
+@@ -1127,6 +1131,7 @@
+ 		.mode		= 0644,
+ 		.proc_handler	= &proc_dointvec,
+ 	},
++#endif
+ #ifdef CONFIG_AIO
+ 	{
+ 		.ctl_name	= FS_AIO_NR,
+Index: git/fs/Kconfig
+===================================================================
+--- git.orig/fs/Kconfig	2006-10-24 13:41:52.000000000 -0600
++++ git/fs/Kconfig	2006-10-24 13:44:14.000000000 -0600
+@@ -1565,7 +1565,7 @@
+ 
+ config NFS_FS
+ 	tristate "NFS file system support"
+-	depends on INET
++	depends on INET && FILE_LOCKING
+ 	select LOCKD
+ 	select SUNRPC
+ 	select NFS_ACL_SUPPORT if NFS_V3_ACL
Index: buildrom/packages/kernel/patches/tiny/20-tiny-cpu-support.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/20-tiny-cpu-support.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,211 @@
+
+configurable support for vendor-specific x86 CPU features
+
+
+ tiny-mpm/arch/i386/kernel/cpu/Makefile |   16 ++++----
+ tiny-mpm/arch/i386/kernel/cpu/common.c |   18 +++++++++
+ tiny-mpm/arch/i386/mm/init.c           |   12 +++++-
+ tiny-mpm/init/Kconfig                  |   62 +++++++++++++++++++++++++++++++++
+ 4 files changed, 99 insertions(+), 9 deletions(-)
+
+Index: git/arch/i386/kernel/cpu/Makefile
+===================================================================
+--- git.orig/arch/i386/kernel/cpu/Makefile	2006-10-23 07:35:33.000000000 -0600
++++ git/arch/i386/kernel/cpu/Makefile	2006-10-24 13:44:37.000000000 -0600
+@@ -4,14 +4,14 @@
+ 
+ obj-y	:=	common.o proc.o
+ 
+-obj-y	+=	amd.o
+-obj-y	+=	cyrix.o
+-obj-y	+=	centaur.o
+-obj-y	+=	transmeta.o
+-obj-y	+=	intel.o intel_cacheinfo.o
+-obj-y	+=	rise.o
+-obj-y	+=	nexgen.o
+-obj-y	+=	umc.o
++obj-$(CONFIG_CPU_SUP_AMD)	+=	amd.o
++obj-$(CONFIG_CPU_SUP_CYRIX)	+=	cyrix.o
++obj-$(CONFIG_CPU_SUP_CENTAUR)	+=	centaur.o
++obj-$(CONFIG_CPU_SUP_TRANSMETA)	+=	transmeta.o
++obj-$(CONFIG_CPU_SUP_INTEL)	+=	intel.o intel_cacheinfo.o
++obj-$(CONFIG_CPU_SUP_RISE)	+=	rise.o
++obj-$(CONFIG_CPU_SUP_NEXGEN)	+=	nexgen.o
++obj-$(CONFIG_CPU_SUP_UMC)	+=	umc.o
+ 
+ obj-$(CONFIG_X86_MCE)	+=	mcheck/
+ 
+Index: git/arch/i386/kernel/cpu/common.c
+===================================================================
+--- git.orig/arch/i386/kernel/cpu/common.c	2006-10-23 07:35:33.000000000 -0600
++++ git/arch/i386/kernel/cpu/common.c	2006-10-24 13:44:37.000000000 -0600
+@@ -13,6 +13,7 @@
+ #include <asm/mmu_context.h>
+ #include <asm/mtrr.h>
+ #include <asm/mce.h>
++#include <asm/uaccess.h>
+ #ifdef CONFIG_X86_LOCAL_APIC
+ #include <asm/mpspec.h>
+ #include <asm/apic.h>
+@@ -325,7 +326,9 @@
+ 		}
+ 	}
+ 
++#ifdef CONFIG_CPU_SUP_INTEL
+ 	early_intel_workaround(c);
++#endif
+ 
+ #ifdef CONFIG_X86_HT
+ 	c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
+@@ -572,15 +575,33 @@
+ 
+ void __init early_cpu_init(void)
+ {
++#ifdef CONFIG_CPU_SUP_INTEL
+ 	intel_cpu_init();
++#endif
++#ifdef CONFIG_CPU_SUP_CYRIX
+ 	cyrix_init_cpu();
++#endif
++#ifdef CONFIG_CPU_SUP_NSC
+ 	nsc_init_cpu();
++#endif
++#ifdef CONFIG_CPU_SUP_AMD
+ 	amd_init_cpu();
++#endif
++#ifdef CONFIG_CPU_SUP_CENTAUR
+ 	centaur_init_cpu();
++#endif
++#ifdef CONFIG_CPU_SUP_TRANSMETA
+ 	transmeta_init_cpu();
++#endif
++#ifdef CONFIG_CPU_SUP_RISE
+ 	rise_init_cpu();
++#endif
++#ifdef CONFIG_CPU_SUP_NEXGEN
+ 	nexgen_init_cpu();
++#endif
++#ifdef CONFIG_CPU_SUP_UMC
+ 	umc_init_cpu();
++#endif
+ 	early_cpu_detect();
+ 
+ #ifdef CONFIG_DEBUG_PAGEALLOC
+Index: git/arch/i386/mm/init.c
+===================================================================
+--- git.orig/arch/i386/mm/init.c	2006-10-23 07:35:33.000000000 -0600
++++ git/arch/i386/mm/init.c	2006-10-24 13:44:37.000000000 -0600
+@@ -185,12 +185,14 @@
+ 	}
+ }
+ 
++#ifdef CONFIG_CPU_SUP_INTEL
+ static inline int page_kills_ppro(unsigned long pagenr)
+ {
+ 	if (pagenr >= 0x70000 && pagenr <= 0x7003F)
+ 		return 1;
+ 	return 0;
+ }
++#endif
+ 
+ extern int is_available_memory(efi_memory_desc_t *);
+ 
+@@ -278,7 +280,11 @@
+ 
+ void __init add_one_highpage_init(struct page *page, int pfn, int bad_ppro)
+ {
+-	if (page_is_ram(pfn) && !(bad_ppro && page_kills_ppro(pfn))) {
++	if (page_is_ram(pfn)
++#ifdef CONFIG_CPU_SUP_INTEL
++	    && !(bad_ppro && page_kills_ppro(pfn))
++#endif
++		) {
+ 		ClearPageReserved(page);
+ 		free_new_highpage(page);
+ 	} else
+@@ -572,7 +578,11 @@
+ 	BUG_ON(!mem_map);
+ #endif
+ 	
++#ifdef CONFIG_CPU_SUP_INTEL
+ 	bad_ppro = ppro_with_ram_bug();
++#else
++	bad_ppro = 0;
++#endif
+ 
+ #ifdef CONFIG_HIGHMEM
+ 	/* check that fixmap and pkmap do not overlap */
+Index: git/init/Kconfig
+===================================================================
+--- git.orig/init/Kconfig	2006-10-24 13:44:14.000000000 -0600
++++ git/init/Kconfig	2006-10-24 13:44:37.000000000 -0600
+@@ -482,6 +482,69 @@
+           reduces kernel size by about 2K. This may actually result in
+           faster code on machines with limited memory bandwidth.
+ 
++menuconfig PROCESSOR_SELECT
++	depends X86
++	default y
++	bool "Supported processor vendors" if EMBEDDED
++	help
++	  This lets you choose what x86 vendor support code your kernel
++	  will include.
++
++config CPU_SUP_INTEL
++       default y
++       bool "Support Intel processors" if PROCESSOR_SELECT
++       help
++         This enables extended support for Intel processors
++
++config CPU_SUP_CYRIX
++       default y
++       bool "Support Cyrix processors" if PROCESSOR_SELECT
++       help
++         This enables extended support for Cyrix processors
++
++config CPU_SUP_NSC
++       default y
++       bool "Support NSC processors" if PROCESSOR_SELECT
++       select CPU_SUP_CYRIX
++       help
++         This enables extended support for NSC processors
++
++config CPU_SUP_AMD
++       default y
++       bool "Support AMD processors" if PROCESSOR_SELECT
++       help
++         This enables extended support for AMD processors
++
++config CPU_SUP_CENTAUR
++       default y
++       bool "Support Centaur processors" if PROCESSOR_SELECT
++       help
++         This enables extended support for Centaur processors
++
++config CPU_SUP_TRANSMETA
++       default y
++       bool "Support Transmeta processors" if PROCESSOR_SELECT
++       help
++         This enables extended support for Transmeta processors
++
++config CPU_SUP_RISE
++       default y
++       bool "Support Rise processors" if PROCESSOR_SELECT
++       help
++         This enables extended support for Rise processors
++
++config CPU_SUP_NEXGEN
++       default y
++       bool "Support NexGen processors" if PROCESSOR_SELECT
++       help
++         This enables extended support for NexGen processors
++
++config CPU_SUP_UMC
++       default y
++       bool "Support UMC processors" if PROCESSOR_SELECT
++       help
++         This enables extended support for UMC processors
++
+ endmenu		# General setup
+ 
+ config RT_MUTEXES
Index: buildrom/packages/kernel/patches/tiny/README
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kernel/patches/tiny/README	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,3 @@
+Patches from the linux-tiny patchset 
+http://www.selenic.com/linux-tiny/
+
Index: buildrom/packages/kexec-boot-loader/kexec-boot-loader.mk
===================================================================
--- buildrom.orig/packages/kexec-boot-loader/kexec-boot-loader.mk	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/packages/kexec-boot-loader/kexec-boot-loader.mk	2007-05-01 17:21:24.000000000 -0600
@@ -1,11 +1,11 @@
-KBL_URL=http://hera.kernel.org/~marcelo/olpc
+KBL_URL=http://dev.laptop.org/~marcelo/
 KBL_SOURCE=kexec-boot-loader.tar.gz
 KBL_DIR=$(BUILD_DIR)/kexec-boot-loader
 KBL_SRC_DIR=$(KBL_DIR)/kexec-boot-loader
 KBL_STAMP_DIR=$(KBL_DIR)/stamps
 KBL_LOG_DIR=$(KBL_DIR)/logs
 
-ifeq ($(KBL_KEXEC_ONLY),y)
+ifeq ($(CONFIG_KBL_KEXEC_ONLY),y)
 KBL_PATCHES += $(PACKAGE_DIR)/kexec-boot-loader/kexec-only.patch
 KBL_LDFLAGS=
 KBL_TARGET=$(INITRD_DIR)/sbin/kbl-kexec
@@ -16,7 +16,7 @@
 KBL_TARGET=$(INITRD_DIR)/kbl
 endif
 
-ifeq ($(VERBOSE),y)
+ifeq ($(CONFIG_VERBOSE),y)
 KBL_BUILD_LOG=/dev/stdout
 KBL_INSTALL_LOG=/dev/stdout
 else
@@ -35,18 +35,12 @@
 
 $(KBL_STAMP_DIR)/.patched: $(KBL_STAMP_DIR)/.unpacked
 	@ echo "Patching kexec-boot-loader..."
-	@ mkdir -p $(KBL_SRC_DIR)/patches
-	@ echo "# kexec-boot-loader series" > $(KBL_SRC_DIR)/patches/series
-	@ for file in $(KBL_PATCHES); do \
-		echo `basename $$file` >> $(KBL_SRC_DIR)/patches/series; \
-		cp $$file $(KBL_SRC_DIR)/patches; \
-	 done
-	@ (cd $(KBL_SRC_DIR); quilt push -a)
+	@ $(BIN_DIR)/doquilt.sh $(KBL_SRC_DIR) $(KBL_PATCHES)
 	@ touch $@
 
 $(KBL_SRC_DIR)/olpc-boot-loader: $(KBL_STAMP_DIR)/.patched
 	@ echo "Building kexec-boot-loader..."
-	@ $(MAKE) -C $(KBL_SRC_DIR) LDFLAGS="$(KBL_LDFLAGS) $(LDFLAGS) -gc-sections" UCLIBCLIBS="$(LIBS)" all > $(KBL_BUILD_LOG) 2>&1
+	@ $(MAKE) -C $(KBL_SRC_DIR) CFLAGS="$(CFLAGS) -ffunction-sections -fdata-sections" LDFLAGS="$(KBL_LDFLAGS) $(LDFLAGS) -gc-sections" UCLIBCLIBS="$(LIBS)" all > $(KBL_BUILD_LOG) 2>&1
 
 $(KBL_TARGET): $(KBL_SRC_DIR)/olpc-boot-loader
 	@ install -d $(INITRD_DIR)/sbin
@@ -65,4 +59,12 @@
 kexec-boot-loader-distclean:
 	@ rm -rf $(KBL_DIR)/*
 
-.PHONY: kexec-boot-loader-message
+kexec-boot-loader-bom:
+	@ echo "Package: kexec-boot-loader"
+	@ echo "Source: $(KBL_URL)/$(KBL_SOURCE)"
+	@ echo -n "Patches: (local) "
+	@ for file in $(KBL_PATCHES); do \
+		echo -n `basename $$file`; \
+	done
+	@ echo ""
+	@ echo ""
Index: buildrom/packages/kexec-boot-loader/symlink.patch.bak
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/kexec-boot-loader/symlink.patch.bak	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,74 @@
+Index: kexec-boot-loader/main.c
+===================================================================
+--- kexec-boot-loader.orig/main.c	2006-07-25 10:37:59.000000000 -0600
++++ kexec-boot-loader/main.c	2006-07-25 11:10:34.000000000 -0600
+@@ -11,6 +11,36 @@
+ 	print("no %s, %s\n", err, what);
+ 	exit(1);
+ }
++			       					
++static int xreadlink(const char *base, const char *file, char *result,
++                     int len) 
++{	
++        struct stat s;
++        char *buf;
++        char *f = alloca(strlen(base) + strlen(file) + 5);
++	
++        if (file[0] == '/')
++		sprintf(f, "%s/.%s", base, file);
++        else
++		sprintf(f, "%s/%s", base, file);
++	
++        if (lstat(f, &s))
++                return -1;
++
++        if (S_ISLNK(s.st_mode)) {
++                buf = alloca(len + 1);
++                memset(buf, 0, len);
++
++                if (readlink(f, buf, len) == -1)
++                        return -1;
++
++                return xreadlink(base, buf, result, len);
++	}
++	
++        strncpy(result, f, len);
++        return 0;
++}
++
+ 
+ int stat_file(char *file)
+ {
+@@ -30,15 +60,27 @@
+ int main (int argc, char *argv[])
+ {
+ 	int ret;
++	char *kernel, *cmd = NULL, *init = NULL;
++	char rkernel[128];
+ 
+-	char *kernel = argv[1], *cmd = argv[2], *init = argv[3];
++	if (argc < 2) 
++		no("few", "arguments");
++       
++	kernel = argv[1];
++
++	if (argc >= 3)
++		cmd = argv[2];
++	
++	if (argc >= 4)
++		init = argv[3];
+ 
+-	printf("argc is %d, argv[1] %s, argv[2] %s, argv[3] %s\n", argc, argv[1], argv[2], argv[3]);
++	if (xreadlink(dirname(kernel), kernel, rkernel, sizeof(rkernel)))
++	  no("readlink", kernel);
+ 
+-	if (stat_file(kernel))
+-		no("kernel", kernel);
++	if (stat_file(rkernel))
++		no("kernel", rkernel);
+ 
+- 	ret = my_load(cmd, kernel, init);
++ 	ret = my_load(cmd, rkernel, init);
+ 	if (ret)
+ 		no("load", "failed");
+ 
Index: buildrom/packages/linuxbios/cache.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/cache.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,14 @@
+Index: LinuxBIOSv2/src/arch/i386/init/crt0.S.lb
+===================================================================
+--- LinuxBIOSv2.orig/src/arch/i386/init/crt0.S.lb	2006-08-28 11:24:58.000000000 -0600
++++ LinuxBIOSv2/src/arch/i386/init/crt0.S.lb	2006-08-28 15:18:04.000000000 -0600
+@@ -65,6 +65,9 @@
+ 
+ 	cld				/* clear direction flag */
+ 	
++	/* Invalidate the cache (if they are enabled) */
++	wbinvd
++	
+ 	/* copy linuxBIOS from it's initial load location to 
+ 	 * the location it is compiled to run at.
+ 	 * Normally this is copying from FLASH ROM to RAM.
Index: buildrom/packages/linuxbios/CL2.5.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/CL2.5.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,17 @@
+Index: src/mainboard/olpc/rev_a/auto.c
+===================================================================
+--- a/src/mainboard/olpc/rev_a/auto.c	(revision 2392)
++++ b/src/mainboard/olpc/rev_a/auto.c	(working copy)
+@@ -122,10 +122,11 @@
+ 	/* the msr value reported by quanta is very, very different. 
+ 	 * we will go with that value for now. 
+ 	 */
+-	msr.lo = 0x286332a3;
++	msr.lo = 0x686332a3;
+ 
+ 	wrmsr(0x20000019, msr);
+ 
++	print_err("CL2.5 Set\n");
+ }
+ 
+ #include "northbridge/amd/gx2/raminit.c"
Index: buildrom/packages/linuxbios/dcon-detect.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/dcon-detect.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,80 @@
+diff --git a/src/mainboard/olpc/rev_a/mainboard.c b/src/mainboard/olpc/rev_a/mainboard.c
+index d23255b..05abbfa 100755
+--- a/src/mainboard/olpc/rev_a/mainboard.c
++++ b/src/mainboard/olpc/rev_a/mainboard.c
+@@ -6,6 +6,67 @@ #include <device/pci_ops.h>
+ #include <arch/io.h>
+ #include <pc80/mc146818rtc.h>
+ #include "chip.h"
++#include "../southbridge/amd/cs5536/cs5536_smbus2.h"
++
++/* Borrowed from mc146818rtc.c */
++
++#define CMOS_READ(addr) ({ \
++		outb((addr),RTC_PORT(0)); \
++		inb(RTC_PORT(1)); \
++		})
++
++#define CMOS_WRITE(val, addr) ({ \
++		outb((addr),RTC_PORT(0)); \
++		outb((val),RTC_PORT(1)); \
++		})
++
++static void write_bit(unsigned char val) {
++
++	unsigned char byte = CMOS_READ(440 / 8);
++
++	/* Don't change it if its already set */
++
++	if ((byte & 1) == (val & 1))
++		return;
++
++	byte &= ~1;
++	byte |= val & 1;
++	CMOS_WRITE(val, 440/8);
++}
++
++static unsigned short _getsmbusbase(void) {
++	unsigned devfn = PCI_DEVFN(0xf, 0);
++	device_t dev = dev_find_slot(0x0, devfn);
++	unsigned long addr = pci_read_config32(dev, PCI_BASE_ADDRESS_0);
++
++	return (unsigned short) (addr & ~1);
++}
++
++static void init_dcon(void) {
++
++  int ret = 1;
++  unsigned short rev = 0;
++  unsigned short iobase = _getsmbusbase();
++
++  printk_debug("CHECKING FOR DCON (%x)\n", iobase);
++
++  /* Get the IO base for the SMBUS */
++
++  rev = do_smbus_read_word(iobase, 0x0D << 1, 0x00);
++
++  if (rev & 0xDC00) {
++	printk_debug("DCON FOUND - REV %x\n", rev);
++
++	/* Enable the DCON */
++	ret = do_smbus_write_word(iobase, 0x0D << 1, 0x01, 0x0069);
++	if (ret != 0)
++		printk_debug("DCON ENABLE FAILED\n", ret);
++  }
++  else
++	  printk_debug("DCON NOT FOUND (%x)\n", rev);
++
++  write_bit(rev > 0 ? 1 : 0);
++}
+ 
+ // indexed access to EC registers
+ #define EC_INDEX(n)  (0x380 + (n))
+@@ -98,6 +159,7 @@ #define EC_3700_SIGNATURE  0xa0
+         }
+ #endif
+ 
++	init_dcon();
+ 	printk_debug("OLPC REVA EXIT %s\n", __FUNCTION__);
+ }
+ 
Index: buildrom/packages/linuxbios/fix.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/fix.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,56 @@
+diff --git a/src/southbridge/amd/cs5536/cs5536.c b/src/southbridge/amd/cs5536/cs5536.c
+index 3e6f96b..6c0c8c0 100755
+--- a/src/southbridge/amd/cs5536/cs5536.c
++++ b/src/southbridge/amd/cs5536/cs5536.c
+@@ -90,6 +90,29 @@ static unsigned char ec_inb(unsigned sho
+     return inb(EC_INDEX(3));
+ }
+ 
++#define EC_3920_SIGNATURE  0x09
++
++static unsigned char eccmd(unsigned char command) {
++
++	unsigned char ret;
++
++	if ((ret = inb(0x6c)) & 1)
++		ret = inb(0x68);
++
++	/* Write the command */
++	outb(command, 0x6C);
++
++	/* Wait for the EC response */
++	while((inb(0x6C) & 3) != 1);
++
++	/* get the response */
++	ret = inb(0x68);
++
++	/* Clear the "ownership flag" */
++	outb(0xFF, 0x6C);
++	return ret;
++}
++
+ static void southbridge_init(struct device *dev)
+ {
+ 	struct southbridge_amd_cs5536_config  *sb = (struct southbridge_amd_cs5536_config *)dev->chip_info;
+@@ -107,13 +130,15 @@ static void southbridge_init(struct devi
+ 	setup_i8259(); 
+ 
+ 	if (sb->lpc_serirq_enable) {
++		int ret;
+ 		msr.lo = sb->lpc_serirq_enable;
+-#if 0  // Not Yet
+-#define EC_3700_SIGNATURE  0xa0
+-                if (ec_inb(0xff00) == EC_3700_SIGNATURE) {
+-                    msr.lo |= 0x40;  // Set quiet mode bit
+-                }
+-#endif
++
++		/* Get the HW version */
++		ret = eccmd(0x09);
++
++		if (ret != EC_3920_SIGNATURE)
++			msr.lo |= 0x40;
++
+ 		msr.hi  = 0;
+ 		wrmsr(MDD_LPC_SIRQ, msr);
+ 	}
Index: buildrom/packages/linuxbios/generic-linuxbios.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/generic-linuxbios.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,27 @@
+# This is the Generic LinuxBIOS target
+
+ifeq ($(CONFIG_PLATFORM),y)
+ifeq ($(LINUXBIOS_TAG),)
+$(error You need to specify a version to pull in your platform config)
+endif
+endif
+
+LINUXBIOS_BASE_DIR=svn
+LINUXBIOS_URL=svn://openbios.org/repos/trunk/LinuxBIOSv2
+LINUXBIOS_TARBALL=linuxbios-svn-$(LINUXBIOS_TAG).tar.gz
+LINUXBIOS_PAYLOAD_TARGET=/tmp/payload.elf
+TARGET_ROM = $(LINUXBIOS_VENDOR)-$(LINUXBIOS_BOARD).rom
+
+include $(PACKAGE_DIR)/linuxbios/linuxbios.inc
+
+$(SOURCE_DIR)/$(LINUXBIOS_TARBALL): 
+	@ echo "Fetching the LinuxBIOS code..."
+	@ mkdir -p $(SOURCE_DIR)/linuxbios
+	@ $(BIN_DIR)/fetchsvn.sh $(LINUXBIOS_URL) $(SOURCE_DIR)/linuxbios \
+	$(LINUXBIOS_TAG) $(SOURCE_DIR)/$(LINUXBIOS_TARBALL) \
+	> $(LINUXBIOS_FETCH_LOG) 2>&1
+
+$(OUTPUT_DIR)/$(TARGET_ROM): $(LINUXBIOS_OUTPUT)
+	@ cp $< %@
+
+linuxbios: $(OUTPUT_DIR)/$(TARGET_ROM)
Index: buildrom/packages/linuxbios/linuxbios.inc
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/linuxbios.inc	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,98 @@
+# This is the common code included by all the targets
+
+ifeq ($(CONFIG_PLATFORM),y)
+ifeq ($(LINUXBIOS_VENDOR),)
+$(error No LinuxBIOS vendor specified)
+endif
+ifeq ($(LINUXBIOS_BOARD),)
+$(error No LinuxBIOS board specified)
+endif
+ifeq ($(LINUXBIOS_CONFIG),)
+$(error No LinuxBIOS config specified)
+endif
+ifeq ($(LINUXBIOS_TDIR),)
+$(error No LinuxBIOS TDIR specified)
+endif
+endif
+
+LINUXBIOS_OUTPUT=$(LINUXBIOS_BUILD_DIR)/$(LINUXBIOS_ROM_NAME)
+LINUXBIOS_DIR=$(BUILD_DIR)/linuxbios
+
+# If the user wanted to override the build directory - obey that now
+
+ifeq ($(CONFIG_LB_USE_BUILD),y)
+LINUXBIOS_SRC_DIR=$(subst ",,$(CONFIG_LB_BUILDDIR))
+else
+LINUXBIOS_SRC_DIR=$(LINUXBIOS_DIR)/$(LINUXBIOS_BASE_DIR)
+endif
+
+LINUXBIOS_TARGET_DIR=$(LINUXBIOS_SRC_DIR)/targets/
+LINUXBIOS_TARGET_NAME=$(LINUXBIOS_VENDOR)/$(LINUXBIOS_BOARD)
+LINUXBIOS_CONFIG_NAME=$(LINUXBIOS_TARGET_NAME)/$(LINUXBIOS_CONFIG)
+LINUXBIOS_BUILD_DIR=$(LINUXBIOS_TARGET_DIR)/$(LINUXBIOS_TARGET_NAME)/$(LINUXBIOS_TDIR)
+
+LINUXBIOS_STAMP_DIR=$(LINUXBIOS_DIR)/stamps
+LINUXBIOS_LOG_DIR=$(LINUXBIOS_DIR)/logs
+
+ifeq ($(CONFIG_VERBOSE),y)
+LINUXBIOS_FETCH_LOG=/dev/stdout
+LINUXBIOS_CONFIG_LOG=/dev/stdout
+LINUXBIOS_BUILD_LOG=/dev/stdout
+LINUXBIOS_INSTALL_LOG=/dev/stdout
+else
+LINUXBIOS_FETCH_LOG=$(LINUXBIOS_LOG_DIR)/fetch.log
+LINUXBIOS_BUILD_LOG=$(LINUXBIOS_LOG_DIR)/build.log
+LINUXBIOS_CONFIG_LOG=$(LINUXBIOS_LOG_DIR)/config.log
+LINUXBIOS_INSTALL_LOG=$(LINUXBIOS_LOG_DIR)/install.log
+endif
+
+# This allows us to skip the unpack/patch/configure stage
+
+ifeq ($(CONFIG_LB_USE_BUILD),y)
+LINUXBIOS_DIR_TARGET=
+else
+LINUXBIOS_DIR_TARGET=$(LINUXBIOS_STAMP_DIR)/.configured
+endif
+
+$(LINUXBIOS_PAYLOAD_TARGET): $(PAYLOAD_TARGET)
+	@ cp $< $@
+
+$(LINUXBIOS_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(LINUXBIOS_TARBALL)
+	@ echo "Unpacking LinuxBIOS..."
+	@ tar -C $(LINUXBIOS_DIR) -zxf $(SOURCE_DIR)/$(LINUXBIOS_TARBALL)
+	@ touch $@	
+
+$(LINUXBIOS_STAMP_DIR)/.patched: $(LINUXBIOS_STAMP_DIR)/.unpacked 
+	@ echo "Patching LinuxBIOS..."
+	@ $(BIN_DIR)/doquilt.sh $(LINUXBIOS_SRC_DIR) $(LINUXBIOS_PATCHES)
+	@ touch $@
+
+$(LINUXBIOS_STAMP_DIR)/.configured: $(LINUXBIOS_STAMP_DIR)/.patched
+	@ echo "Building target config file..."
+	@( cd $(LINUXBIOS_TARGET_DIR); \
+	./buildtarget $(LINUXBIOS_CONFIG_NAME) > $(LINUXBIOS_CONFIG_LOG) 2>&1)
+	@ touch $@
+
+$(LINUXBIOS_STAMP_DIR) $(LINUXBIOS_LOG_DIR):
+	@ mkdir -p $@
+
+$(LINUXBIOS_OUTPUT): $(LINUXBIOS_STAMP_DIR) $(LINUXBIOS_LOG_DIR) $(LINUXBIOS_DIR_TARGET) $(LINUXBIOS_PAYLOAD_TARGET)
+	@ echo "Building linuxbios..."
+	@ (export CPU_OPT="$(STACKPROTECT)"; \
+	make -C $(LINUXBIOS_BUILD_DIR) > $(LINUXBIOS_BUILD_LOG) 2>&1)
+
+generic-linuxbios-clean:
+	@ echo "Cleaning linuxbios..."
+	@ if [ -d $(LINUXBIOS_BUILD_DIR) ];then \
+	$(MAKE) -C $(LINUXBIOS_BUILD_DIR) clean > /dev/null 2>&1; \
+	fi	
+	@ rm -f $(LINUXBIOS_OUTPUT)
+
+generic-linuxbios-distclean:
+	@ if [ "$(CONFIG_LB_USE_BUILD)" = "y" ]; then \
+	echo "Cleaning linuxbios build..."; \
+	$(MAKE) -C $(LINUXBIOS_BUILD_DIR) clean > /dev/null 2>&1; \
+	rm -f $(LINUXBIOS_OUTPUT); \
+	fi	
+
+	@ rm -rf $(LINUXBIOS_DIR)/*
Index: buildrom/packages/linuxbios/linuxbios.mk
===================================================================
--- buildrom.orig/packages/linuxbios/linuxbios.mk	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/packages/linuxbios/linuxbios.mk	2007-05-01 17:21:24.000000000 -0600
@@ -7,81 +7,165 @@
 LINUXBIOS_BOARD=rev_a
 endif
 ifeq ($(LINUXBIOS_CONFIG),)
-LINUXBIOS_CONFIG=Config.1M.lb
+LINUXBIOS_CONFIG=Config.SPI.lb
 endif
 ifeq ($(LINUXBIOS_TDIR),)
 LINUXBIOS_TDIR=rev_a_1M
 endif
+ifeq ($(LINUXBIOS_FETCH),)
+LINUXBIOS_FETCH=git
+endif
+
+LINUXBIOS_PATCHES =
+
+ifeq ($(PAYLOAD_LAB),y)
+LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/dcon-detect.patch
+endif
+
+ifeq ($(LINUXBIOS_ENABLE_LZMA),y)
+LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/lzma-config.patch
+endif
+
+ifeq ($(LINUXBIOS_CAS25),y)
+LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/CL2.5.patch
+LINUXBIOS_CL2_MARKER=_CL2.5
+endif
+
+EC_FIRMWARE_URL=http://dev.laptop.org/pub/ec
+
+ifeq ($(EC_FIRMWARE_OVERRIDE),)
+EC_FIRMWARE_REV=ec_v$(EC_VER).img
+else
+EC_FIRMWARE_REV=$(EC_FIRMWARE_OVERRIDE)
+endif
+
+LINUXBIOS_ROM_FILENAME=olpc-$(FIRMWARE_REVISION)$(LINUXBIOS_CL2_MARKER).rom
 
-LINUXBIOS_SOURCE_DIR=LinuxBIOSv2
-LINUXBIOS_SVN=svn://openbios.org/repos/trunk/LinuxBIOSv2
 LINUXBIOS_DIR=$(BUILD_DIR)/linuxbios
-LINUXBIOS_SRC_DIR=$(LINUXBIOS_DIR)/$(LINUXBIOS_SOURCE_DIR)
+
 LINUXBIOS_TARGET_DIR=$(LINUXBIOS_SRC_DIR)/targets/
 LINUXBIOS_TARGET_NAME=$(LINUXBIOS_VENDOR)/$(LINUXBIOS_BOARD)
 LINUXBIOS_CONFIG_NAME=$(LINUXBIOS_TARGET_NAME)/$(LINUXBIOS_CONFIG)
 LINUXBIOS_BUILD_DIR=$(LINUXBIOS_TARGET_DIR)/$(LINUXBIOS_TARGET_NAME)/$(LINUXBIOS_TDIR)
+
+# Choose the right variables to use based on our fetch method
+
+ifeq ($(LINUXBIOS_FETCH),git)
+LINUXBIOS_FETCHSH=$(BIN_DIR)/fetchgit.sh
+LINUXBIOS_SRC_DIR=$(LINUXBIOS_DIR)/git
+LINUXBIOS_TAG=$(LINUXBIOS_GIT_TAG)
+LINUXBIOS_URL=$(LINUXBIOS_GIT_URL)
+else
+LINUXBIOS_FETCHSH=$(BIN_DIR)/fetchsvn.sh
+LINUXBIOS_SRC_DIR=$(LINUXBIOS_DIR)/svn
+LINUXBIOS_TAG=$(LINUXBIOS_SVN_TAG)
+LINUXBIOS_URL=$(LINUXBIOS_SVN_URL)
+endif
+
+ifeq ($(LINUXBIOS_TAG),)
+$(error LINUXBIOS_TAG was not defined.  Check your Config.mk)
+endif
+
+ifeq ($(LINUXBIOS_URL),)
+$(error LINUXBIOS_URL was not defined.  Check your Config.mk)
+endif
+
+LINUXBIOS_TARBALL=linuxbios-$(LINUXBIOS_FETCH)-$(LINUXBIOS_TAG).tar.gz
+
 LINUXBIOS_STAMP_DIR=$(LINUXBIOS_DIR)/stamps
 LINUXBIOS_LOG_DIR=$(LINUXBIOS_DIR)/logs
-LINUXBIOS_VER=2348
 
 ifeq ($(VERBOSE),y)
 LINUXBIOS_FETCH_LOG=/dev/stdout
 LINUXBIOS_CONFIG_LOG=/dev/stdout
 LINUXBIOS_BUILD_LOG=/dev/stdout
 LINUXBIOS_INSTALL_LOG=/dev/stdout
-NRV2B_BUILD_LOG=/dev/stdout
 else
 LINUXBIOS_FETCH_LOG=$(LINUXBIOS_LOG_DIR)/fetch.log
 LINUXBIOS_BUILD_LOG=$(LINUXBIOS_LOG_DIR)/build.log
 LINUXBIOS_CONFIG_LOG=$(LINUXBIOS_LOG_DIR)/config.log
 LINUXBIOS_INSTALL_LOG=$(LINUXBIOS_LOG_DIR)/install.log
-NRV2B_BUILD_LOG=$(LINUXBIOS_LOG_DIR)/nrv2b.build.log
 endif
 
-$(LINUXBIOS_STAMP_DIR)/.unpacked_$(LINUXBIOS_VER): 
-	@ echo "Checking Linuxbios repository..."
-	@ $(BIN_DIR)/fetchsvn.sh $(LINUXBIOS_SVN) $(LINUXBIOS_SRC_DIR) \
-	$(LINUXBIOS_VER) > $(LINUXBIOS_FETCH_LOG) 2>&1
-	@ touch $@
+# Build the manufacturer string from the firmware model and revision
+
+FIRMWARE_REV2 = $(shell echo $(FIRMWARE_REVISION) | awk '{print substr($$1,0,3)}')
+MANUFACTURER_STRING = `printf "%-6s%-7s%-3s" $(FIRMWARE_MODEL) $(FIRMWARE_REVISION) $(FIRMWARE_REV2)`
 
 # fix me sooner or later!
 /tmp/olpcpayload.elf: $(PAYLOAD_TARGET)
 	@ cp $< $@
 
-$(LINUXBIOS_STAMP_DIR)/.configured: $(LINUXBIOS_STAMP_DIR)/.unpacked_$(LINUXBIOS_VER)
+$(SOURCE_DIR)/$(LINUXBIOS_TARBALL): 
+	@ echo "Fetching the LinuxBIOS code..."
+	@ mkdir -p $(SOURCE_DIR)/linuxbios
+	@ $(LINUXBIOS_FETCHSH) $(LINUXBIOS_URL) $(SOURCE_DIR)/linuxbios \
+	$(LINUXBIOS_TAG) $(SOURCE_DIR)/$(LINUXBIOS_TARBALL) \
+	> $(LINUXBIOS_FETCH_LOG) 2>&1
+
+$(LINUXBIOS_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(LINUXBIOS_TARBALL)
+	@ echo "Unpacking LinuxBIOS..."
+	@ tar -C $(LINUXBIOS_DIR) -zxf $(SOURCE_DIR)/$(LINUXBIOS_TARBALL)
+	@ touch $@	
+
+$(LINUXBIOS_STAMP_DIR)/.patched: $(LINUXBIOS_STAMP_DIR)/.unpacked
+	@ echo "Patching LinuxBIOS..."
+	@ $(BIN_DIR)/doquilt.sh $(LINUXBIOS_SRC_DIR) $(LINUXBIOS_PATCHES)
+	@ touch $@
+
+$(LINUXBIOS_STAMP_DIR)/.configured: $(LINUXBIOS_STAMP_DIR)/.patched
+	@ echo "Building target config file..."
 	@( cd $(LINUXBIOS_TARGET_DIR); \
 	./buildtarget $(LINUXBIOS_CONFIG_NAME) > $(LINUXBIOS_CONFIG_LOG) 2>&1)
 	@ touch $@
 
-$(LINUXBIOS_BUILD_DIR)/linuxbios.rom:  $(LINUXBIOS_STAMP_DIR)/.configured /tmp/olpcpayload.elf
+ifeq ($(EC_FIRMWARE_OVERRIDE),)
+$(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV):
+	@ echo "Fetching the EC bits..."
+	@ wget -N -P $(LINUXBIOS_BUILD_DIR) $(EC_FIRMWARE_URL)/$(EC_FIRMWARE_REV) 
+	@ wget -N -P $(LINUXBIOS_BUILD_DIR) $(EC_FIRMWARE_URL)/MD5SUMS 
+	@ if [ "`md5sum $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) |cut -d' ' -f1`" != "`grep $(EC_FIRMWARE_REV) $(LINUXBIOS_BUILD_DIR)/MD5SUMS | cut -d' ' -f1`" ]; then echo "ERROR! EC firmware hash does not match"; exit 1; fi
+	@ echo "EC Bits fetched and verified"
+	@ touch $@
+else
+$(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV):
+	@ echo "EC_FIRMWARE_OVERRIDE active so using custom EC bits from $(EC_FIRMWARE_OVERRIDE)"
+	@ cp -f $(PACKAGE_DIR)/bin/$(EC_FIRMWARE_OVERRIDE) $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV)	
+	@ touch $@
+endif
+
+$(LINUXBIOS_BUILD_DIR)/$(LINUXBIOS_ROM_FILENAME):  $(LINUXBIOS_STAMP_DIR)/.configured /tmp/olpcpayload.elf
 	@ echo "Building linuxbios..."
 	@ make -C $(LINUXBIOS_BUILD_DIR) > $(LINUXBIOS_BUILD_LOG) 2>&1
 
-$(OUTPUT_DIR)/linuxbios.rom:  $(LINUXBIOS_BUILD_DIR)/linuxbios.rom
-	@ echo "Making the ROM..."
-	@ cat $(PACKAGE_DIR)/vsa/olpc_vsa.64k.bin \
-	$(LINUXBIOS_BUILD_DIR)/linuxbios.rom > $@
-
-$(LINUXBIOS_SRC_DIR)/util/nrv2b/nrv2b: $(LINUXBIOS_STAMP_DIR)/.unpacked_$(LINUXBIOS_VER)
-	@ echo "Building nrv2b..."
-	@ make -C $(LINUXBIOS_SRC_DIR)/util/nrv2b CFLAGS="$(HOST_CFLAGS)" \
-	LDFLAGS=$(HOST_LDFLAGS) > $(NRV2B_BUILD_LOG) 2>&1
-
-$(STAGING_DIR)/bin/nrv2b: $(LINUXBIOS_SRC_DIR)/util/nrv2b/nrv2b
-	@ install -d $(STAGING_DIR)/bin
-	@ install -m 0755 $< $@
-
+$(LINUXBIOS_BUILD_DIR)/$(LINUXBIOS_ROM_FILENAME).nosig: $(LINUXBIOS_BUILD_DIR)/$(LINUXBIOS_ROM_FILENAME) $(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV)
+	@ echo "Creating FIRMWARE_REVISON = $(FIRMWARE_REVISION) ROM and md5 files" 
+	@ cat $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) $(PACKAGE_DIR)/bin/olpc_vsa.64k.bin $(LINUXBIOS_BUILD_DIR)/linuxbios.rom > $@
+
+$(OUTPUT_DIR)/$(LINUXBIOS_ROM_FILENAME): $(LINUXBIOS_BUILD_DIR)/$(LINUXBIOS_ROM_FILENAME).nosig
+	@ $(BIN_DIR)/setsig.sh $< "$(MANUFACTURER_STRING)" $@ 
+	@ $(STAGING_DIR)/bin/crc32sum -a $@ > $(LINUXBIOS_BUILD_LOG)
+	@ md5sum $@ | cut -d ' ' -f 1 > $(OUTPUT_DIR)/$(LINUXBIOS_ROM_FILENAME).md5
+	
 $(LINUXBIOS_STAMP_DIR) $(LINUXBIOS_LOG_DIR):
 	@ mkdir -p $@
 
-linuxbios: $(LINUXBIOS_STAMP_DIR) $(LINUXBIOS_LOG_DIR) $(OUTPUT_DIR)/linuxbios.rom
-
-nrv2b: $(LINUXBIOS_STAMP_DIR) $(LINUXBIOS_LOG_DIR) $(STAGING_DIR)/bin/nrv2b
+linuxbios: $(LINUXBIOS_STAMP_DIR) $(LINUXBIOS_LOG_DIR) $(OUTPUT_DIR)/$(LINUXBIOS_ROM_FILENAME)
 
 linuxbios-clean:
 	@ echo "Cleaning linuxbios..."
 	@ $(MAKE) -C $(LINUXBIOS_BUILD_DIR) clean > /dev/null 2>&1
+	@ rm -f $(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV)
+	@ rm -f $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) \
+	$(LINUXBIOS_BUILD_DIR)/MD5SUMS
 
 linuxbios-distclean:
 	@ rm -rf $(LINUXBIOS_DIR)/*
+
+linuxbios-bom:
+	@ echo "Package: linuxbios"
+	@ echo "Source:  $(LINUXBIOS_URL)"
+	@ echo "Revison: $(LINUXBIOS_TAG)"
+	@ echo "Tarball: `basename $(LINUXBIOS_TARBALL)"
+	@ echo ""
+
Index: buildrom/packages/linuxbios/linuxbios-olpc.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/linuxbios-olpc.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,64 @@
+# This is the OLPC LinuxBIOS target
+
+ifeq ($(CONFIG_PLATFORM),y)
+ifeq ($(LINUXBIOS_TAG),)
+$(error You need to specify a version to pull in your platform config)
+endif
+endif
+
+LINUXBIOS_ROM_FILENAME=olpc-$(FIRMWARE_REVISION)$(LINUXBIOS_CL2_MARKER).rom
+LINUXBIOS_FETCHSH=$(BIN_DIR)/fetchgit.sh
+LINUXBIOS_BASE_DIR=git
+LINUXBIOS_URL=git://dev.laptop.org/projects/linuxbios
+LINUXBIOS_TARBALL=linuxbios-git-$(LINUXBIOS_TAG).tar.gz
+LINUXBIOS_PAYLOAD_TARGET = /tmp/olpcpayload.elf
+LINUXBIOS_VSA=$(PACKAGE_DIR)/bin/olpc_vsa.64k.bin
+
+MANUFACTURER_STRING = `printf "%-6s%-7s%-3s" $(FIRMWARE_MODEL) $(FIRMWARE_REVISION) $(FIRMWARE_REV2)`
+
+ifeq ($(_LINUXBIOS_INC_),)
+include $(PACKAGE_DIR)/linuxbios/linuxbios.inc
+endif
+
+$(SOURCE_DIR)/$(LINUXBIOS_TARBALL): 
+	@ echo "Fetching the LinuxBIOS code..."
+	@ mkdir -p $(SOURCE_DIR)/linuxbios
+	@ $(BIN_DIR)/fetchgit.sh $(LINUXBIOS_URL) $(SOURCE_DIR)/linuxbios \
+	$(LINUXBIOS_TAG) $(SOURCE_DIR)/$(LINUXBIOS_TARBALL) \
+	> $(LINUXBIOS_FETCH_LOG) 2>&1
+
+ifeq ($(EC_FIRMWARE_OVERRIDE),)
+$(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV):
+	@ echo "Fetching the EC bits..."
+	@ wget -N -P $(LINUXBIOS_BUILD_DIR) $(EC_FIRMWARE_URL)/$(EC_FIRMWARE_REV)
+	@ wget -N -P $(LINUXBIOS_BUILD_DIR) $(EC_FIRMWARE_URL)/MD5SUMS
+	@ if [ "`md5sum $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) |cut -d' ' -f1`" != "`grep $(EC_FIRMWARE_REV) $(LINUXBIOS_BUILD_DIR)/MD5SUMS | cut -d' ' -f1`" ]; then echo "ERROR! EC firmware hash does not match"; exit 1; fi
+	@ echo "EC Bits fetched and verified"
+	@ touch $@
+else
+$(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV):
+	@ echo "EC_FIRMWARE_OVERRIDE active so using custom EC bits from $(EC_FIRMWARE_OVERRIDE)"
+	@ cp -f $(PACKAGE_DIR)/bin/$(EC_FIRMWARE_OVERRIDE) $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV)
+	@ touch $@
+endif
+
+
+$(OUTPUT_DIR)/$(OLPC_ROM_FILENAME).nosig: $(LINUXBIOS_OUTPUT) $(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV)
+	@ echo "Creating FIRMWARE_REVISON = $(FIRMWARE_REVISION) ROM and md5 files"
+	@ cat $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) $(LINUXBIOS_VSA) \
+	$(LINUXBIOS_BUILD_DIR)/$(LINUXBIOS_OUTPUT) > $@
+
+$(OUTPUT_DIR)/$(LINUXBIOS_ROM_FILENAME): $(OUTPUT_DIR)/$(OLPC_ROM_FILENAME).nosig
+	@ $(BIN_DIR)/setsig.sh $< "$(MANUFACTURER_STRING)" $@ 
+	@ $(STAGING_DIR)/bin/crc32sum -a $@ > $(LINUXBIOS_BUILD_LOG)
+	@ md5sum $@ | cut -d ' ' -f 1 > $(OUTPUT_DIR)/$(LINUXBIOS_ROM_FILENAME).md5
+
+
+olpc-linuxbios: $(OUTPUT_DIR)/$(LINUXBIOS_ROM_FILENAME)
+olpc-linuxbios-clean: generic-linuxbios-clean
+	@ rm -f $(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV)
+	@ rm -f $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) \
+        $(LINUXBIOS_BUILD_DIR)/MD5SUMS
+
+olpc-linuxbios-distclean: generic-linuxbios-distclean
+
Index: buildrom/packages/linuxbios/lzma-config.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/lzma-config.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,15 @@
+Index: LinuxBIOSv2/targets/olpc/rev_a/Config.SPI.lb
+===================================================================
+--- LinuxBIOSv2.orig/targets/olpc/rev_a/Config.SPI.lb	2006-09-15 11:54:44.000000000 -0600
++++ LinuxBIOSv2/targets/olpc/rev_a/Config.SPI.lb	2006-09-15 11:55:04.000000000 -0600
+@@ -5,8 +5,8 @@
+ 
+ # Don't let LinuxBIOS compress the payload
+ #option CONFIG_COMPRESSED_ROM_STREAM_NRV2B=0
+-#option CONFIG_COMPRESSED_ROM_STREAM_LZMA=1
+-#option CONFIG_PRECOMPRESSED_ROM_STREAM=0
++option CONFIG_COMPRESSED_ROM_STREAM_LZMA=1
++option CONFIG_PRECOMPRESSED_ROM_STREAM=1
+ 
+ # leave 64k for vsa and 64k for EC code
+ option ROM_SIZE=(1024*1024)-(64*1024)-(64*1024)
Index: buildrom/packages/linuxbios/norwich-linuxbios.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/norwich-linuxbios.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,38 @@
+# This is the Generic LinuxBIOS target
+
+ifeq ($(CONFIG_PLATFORM),y)
+ifeq ($(LINUXBIOS_TAG),)
+$(error You need to specify a version to pull in your platform config)
+endif
+endif
+
+LINUXBIOS_BASE_DIR=svn
+LINUXBIOS_URL=svn://openbios.org/repos/trunk/LinuxBIOSv2
+LINUXBIOS_TARBALL=linuxbios-svn-$(LINUXBIOS_TAG).tar.gz
+LINUXBIOS_PAYLOAD_TARGET=$(LINUXBIOS_BUILD_DIR)/payload.elf
+VSA_URL=http://www.amd.com/files/connectivitysolutions/geode/geode_lx/
+LINUXBIOS_VSA=lx_vsa.36k.bin
+TARGET_ROM = $(LINUXBIOS_VENDOR)-$(LINUXBIOS_BOARD).rom
+
+include $(PACKAGE_DIR)/linuxbios/linuxbios.inc
+
+$(SOURCE_DIR)/$(LINUXBIOS_VSA):
+	@ echo "Fetching the VSA code..."
+	wget -P $(SOURCE_DIR) $(VSA_URL)/$(LINUXBIOS_VSA).gz  -O $@
+
+$(SOURCE_DIR)/$(LINUXBIOS_TARBALL): 
+	@ echo "Fetching the LinuxBIOS code..."
+	@ mkdir -p $(SOURCE_DIR)/linuxbios
+	@ $(BIN_DIR)/fetchsvn.sh $(LINUXBIOS_URL) $(SOURCE_DIR)/linuxbios \
+	$(LINUXBIOS_TAG) $(SOURCE_DIR)/$(LINUXBIOS_TARBALL) \
+	> $(LINUXBIOS_FETCH_LOG) 2>&1
+
+# Special rule - append the VSA
+
+$(OUTPUT_DIR)/$(TARGET_ROM): $(LINUXBIOS_OUTPUT) $(SOURCE_DIR)/$(LINUXBIOS_VSA)
+	@ mkdir -p $(OUTPUT_DIR)
+	@ cat $(SOURCE_DIR)/$(LINUXBIOS_VSA) $(LINUXBIOS_OUTPUT) > $@
+	
+linuxbios: $(OUTPUT_DIR)/$(TARGET_ROM)
+linuxbios-clean: generic-linuxbios-clean
+linuxbios-distclean: generic-linuxbios-distclean
Index: buildrom/packages/linuxbios/olpc-linuxbios.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/olpc-linuxbios.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,65 @@
+# This is the OLPC LinuxBIOS target
+
+ifeq ($(CONFIG_PLATFORM),y)
+ifeq ($(LINUXBIOS_TAG),)
+$(error You need to specify a version to pull in your platform config)
+endif
+endif
+
+TARGET_ROM=olpc-$(FIRMWARE_REVISION)$(LINUXBIOS_CL2_MARKER).rom
+LINUXBIOS_FETCHSH=$(BIN_DIR)/fetchgit.sh
+LINUXBIOS_BASE_DIR=git
+LINUXBIOS_URL=git://dev.laptop.org/projects/linuxbios
+LINUXBIOS_TARBALL=linuxbios-git-$(LINUXBIOS_TAG).tar.gz
+LINUXBIOS_PAYLOAD_TARGET = /tmp/olpcpayload.elf
+LINUXBIOS_VSA=$(PACKAGE_DIR)/bin/olpc_vsa.64k.bin
+
+MANUFACTURER_STRING = `printf "%-6s%-7s%-3s" $(FIRMWARE_MODEL) $(FIRMWARE_REVISION) $(FIRMWARE_REV2)`
+
+ifeq ($(CONFIG_USE_LZMA),y)
+LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/patches/lzma-config.patch
+endif
+
+include $(PACKAGE_DIR)/linuxbios/linuxbios.inc
+
+$(SOURCE_DIR)/$(LINUXBIOS_TARBALL): 
+	@ echo "Fetching the LinuxBIOS code..."
+	@ mkdir -p $(SOURCE_DIR)/linuxbios
+	@ $(BIN_DIR)/fetchgit.sh $(LINUXBIOS_URL) $(SOURCE_DIR)/linuxbios \
+	$(LINUXBIOS_TAG) $(SOURCE_DIR)/$(LINUXBIOS_TARBALL) \
+	> $(LINUXBIOS_FETCH_LOG) 2>&1
+
+ifeq ($(EC_FIRMWARE_OVERRIDE),)
+$(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV):
+	@ echo "Fetching the EC bits..."
+	@ wget -N -P $(LINUXBIOS_BUILD_DIR) $(EC_FIRMWARE_URL)/$(EC_FIRMWARE_REV)
+	@ wget -N -P $(LINUXBIOS_BUILD_DIR) $(EC_FIRMWARE_URL)/MD5SUMS
+	@ if [ "`md5sum $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) |cut -d' ' -f1`" != "`grep $(EC_FIRMWARE_REV) $(LINUXBIOS_BUILD_DIR)/MD5SUMS | cut -d' ' -f1`" ]; then echo "ERROR! EC firmware hash does not match"; exit 1; fi
+	@ echo "EC Bits fetched and verified"
+	@ touch $@
+else
+$(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV):
+	@ echo "EC_FIRMWARE_OVERRIDE active so using custom EC bits from $(EC_FIRMWARE_OVERRIDE)"
+	@ cp -f $(PACKAGE_DIR)/bin/$(EC_FIRMWARE_OVERRIDE) $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV)
+	@ touch $@
+endif
+
+
+$(OUTPUT_DIR)/$(OLPC_ROM_FILENAME).nosig: $(LINUXBIOS_OUTPUT) $(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV)
+	@ echo "Creating FIRMWARE_REVISON = $(FIRMWARE_REVISION) ROM and md5 files"
+	@ cat $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) $(LINUXBIOS_VSA) \
+	$(LINUXBIOS_BUILD_DIR)/$(LINUXBIOS_OUTPUT) > $@
+
+$(TARGET_ROM): $(OUTPUT_DIR)/$(OLPC_ROM_FILENAME).nosig
+	@ $(BIN_DIR)/setsig.sh $< "$(MANUFACTURER_STRING)" $@ 
+	@ $(STAGING_DIR)/bin/crc32sum -a $@ > $(LINUXBIOS_BUILD_LOG)
+	@ md5sum $@ | cut -d ' ' -f 1 > $(OUTPUT_DIR)/$(LINUXBIOS_ROM_FILENAME).md5
+
+linuxbios: $(OUTPUT_DIR)/$(TARGET_ROM)
+linuxbios-clean: generic-linuxbios-clean
+	@ rm -f $(LINUXBIOS_STAMP_DIR)/.pull_ecf_$(EC_FIRMWARE_REV)
+	@ rm -f $(LINUXBIOS_BUILD_DIR)/$(EC_FIRMWARE_REV) \
+        $(LINUXBIOS_BUILD_DIR)/MD5SUMS
+
+linuxbios-distclean: generic-linuxbios-distclean
+
Index: buildrom/packages/linuxbios/patches/cache.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/patches/cache.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,14 @@
+Index: LinuxBIOSv2/src/arch/i386/init/crt0.S.lb
+===================================================================
+--- LinuxBIOSv2.orig/src/arch/i386/init/crt0.S.lb	2006-08-28 11:24:58.000000000 -0600
++++ LinuxBIOSv2/src/arch/i386/init/crt0.S.lb	2006-08-28 15:18:04.000000000 -0600
+@@ -65,6 +65,9 @@
+ 
+ 	cld				/* clear direction flag */
+ 	
++	/* Invalidate the cache (if they are enabled) */
++	wbinvd
++	
+ 	/* copy linuxBIOS from it's initial load location to 
+ 	 * the location it is compiled to run at.
+ 	 * Normally this is copying from FLASH ROM to RAM.
Index: buildrom/packages/linuxbios/patches/CL2.5.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/patches/CL2.5.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,17 @@
+Index: src/mainboard/olpc/rev_a/auto.c
+===================================================================
+--- a/src/mainboard/olpc/rev_a/auto.c	(revision 2392)
++++ b/src/mainboard/olpc/rev_a/auto.c	(working copy)
+@@ -122,10 +122,11 @@
+ 	/* the msr value reported by quanta is very, very different. 
+ 	 * we will go with that value for now. 
+ 	 */
+-	msr.lo = 0x286332a3;
++	msr.lo = 0x686332a3;
+ 
+ 	wrmsr(0x20000019, msr);
+ 
++	print_err("CL2.5 Set\n");
+ }
+ 
+ #include "northbridge/amd/gx2/raminit.c"
Index: buildrom/packages/linuxbios/patches/dcon-detect.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/patches/dcon-detect.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,80 @@
+diff --git a/src/mainboard/olpc/rev_a/mainboard.c b/src/mainboard/olpc/rev_a/mainboard.c
+index d23255b..05abbfa 100755
+--- a/src/mainboard/olpc/rev_a/mainboard.c
++++ b/src/mainboard/olpc/rev_a/mainboard.c
+@@ -6,6 +6,67 @@ #include <device/pci_ops.h>
+ #include <arch/io.h>
+ #include <pc80/mc146818rtc.h>
+ #include "chip.h"
++#include "../southbridge/amd/cs5536/cs5536_smbus2.h"
++
++/* Borrowed from mc146818rtc.c */
++
++#define CMOS_READ(addr) ({ \
++		outb((addr),RTC_PORT(0)); \
++		inb(RTC_PORT(1)); \
++		})
++
++#define CMOS_WRITE(val, addr) ({ \
++		outb((addr),RTC_PORT(0)); \
++		outb((val),RTC_PORT(1)); \
++		})
++
++static void write_bit(unsigned char val) {
++
++	unsigned char byte = CMOS_READ(440 / 8);
++
++	/* Don't change it if its already set */
++
++	if ((byte & 1) == (val & 1))
++		return;
++
++	byte &= ~1;
++	byte |= val & 1;
++	CMOS_WRITE(val, 440/8);
++}
++
++static unsigned short _getsmbusbase(void) {
++	unsigned devfn = PCI_DEVFN(0xf, 0);
++	device_t dev = dev_find_slot(0x0, devfn);
++	unsigned long addr = pci_read_config32(dev, PCI_BASE_ADDRESS_0);
++
++	return (unsigned short) (addr & ~1);
++}
++
++static void init_dcon(void) {
++
++  int ret = 1;
++  unsigned short rev = 0;
++  unsigned short iobase = _getsmbusbase();
++
++  printk_debug("CHECKING FOR DCON (%x)\n", iobase);
++
++  /* Get the IO base for the SMBUS */
++
++  rev = do_smbus_read_word(iobase, 0x0D << 1, 0x00);
++
++  if (rev & 0xDC00) {
++	printk_debug("DCON FOUND - REV %x\n", rev);
++
++	/* Enable the DCON */
++	ret = do_smbus_write_word(iobase, 0x0D << 1, 0x01, 0x0069);
++	if (ret != 0)
++		printk_debug("DCON ENABLE FAILED\n", ret);
++  }
++  else
++	  printk_debug("DCON NOT FOUND (%x)\n", rev);
++
++  write_bit(rev > 0 ? 1 : 0);
++}
+ 
+ // indexed access to EC registers
+ #define EC_INDEX(n)  (0x380 + (n))
+@@ -98,6 +159,7 @@ #define EC_3700_SIGNATURE  0xa0
+         }
+ #endif
+ 
++	init_dcon();
+ 	printk_debug("OLPC REVA EXIT %s\n", __FUNCTION__);
+ }
+ 
Index: buildrom/packages/linuxbios/patches/disable_swapsifs.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/patches/disable_swapsifs.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,23 @@
+Index: LinuxBIOSv2/src/cpu/amd/model_gx2/cpubug.c
+===================================================================
+--- LinuxBIOSv2.orig/src/cpu/amd/model_gx2/cpubug.c	2006-08-29 08:44:01.000000000 -0600
++++ LinuxBIOSv2/src/cpu/amd/model_gx2/cpubug.c	2006-08-29 08:45:21.000000000 -0600
+@@ -176,7 +176,7 @@
+ 	wrmsr(0x3003, msr);
+ 
+ 	/* change this value to zero if you need to disable this BTB SWAPSiF. */
+-	if (1) { 
++	if (0) {
+ 
+ 		/* Disable enable_actions in DIAGCTL while setting up GLCP */
+ 		msr.hi = 0;
+@@ -373,7 +373,8 @@
+ 			pcideadlock();
+ 			eng1398();
+ 			eng2900();
+-			bug118339();
++			/* Disabled because it freaks out FS2 */
++			//bug118339();
+ 			break;
+ 		case 0x22:
+ 		case 0x30: 
Index: buildrom/packages/linuxbios/patches/fix.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/patches/fix.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,56 @@
+diff --git a/src/southbridge/amd/cs5536/cs5536.c b/src/southbridge/amd/cs5536/cs5536.c
+index 3e6f96b..6c0c8c0 100755
+--- a/src/southbridge/amd/cs5536/cs5536.c
++++ b/src/southbridge/amd/cs5536/cs5536.c
+@@ -90,6 +90,29 @@ static unsigned char ec_inb(unsigned sho
+     return inb(EC_INDEX(3));
+ }
+ 
++#define EC_3920_SIGNATURE  0x09
++
++static unsigned char eccmd(unsigned char command) {
++
++	unsigned char ret;
++
++	if ((ret = inb(0x6c)) & 1)
++		ret = inb(0x68);
++
++	/* Write the command */
++	outb(command, 0x6C);
++
++	/* Wait for the EC response */
++	while((inb(0x6C) & 3) != 1);
++
++	/* get the response */
++	ret = inb(0x68);
++
++	/* Clear the "ownership flag" */
++	outb(0xFF, 0x6C);
++	return ret;
++}
++
+ static void southbridge_init(struct device *dev)
+ {
+ 	struct southbridge_amd_cs5536_config  *sb = (struct southbridge_amd_cs5536_config *)dev->chip_info;
+@@ -107,13 +130,15 @@ static void southbridge_init(struct devi
+ 	setup_i8259(); 
+ 
+ 	if (sb->lpc_serirq_enable) {
++		int ret;
+ 		msr.lo = sb->lpc_serirq_enable;
+-#if 0  // Not Yet
+-#define EC_3700_SIGNATURE  0xa0
+-                if (ec_inb(0xff00) == EC_3700_SIGNATURE) {
+-                    msr.lo |= 0x40;  // Set quiet mode bit
+-                }
+-#endif
++
++		/* Get the HW version */
++		ret = eccmd(0x09);
++
++		if (ret != EC_3920_SIGNATURE)
++			msr.lo |= 0x40;
++
+ 		msr.hi  = 0;
+ 		wrmsr(MDD_LPC_SIRQ, msr);
+ 	}
Index: buildrom/packages/linuxbios/patches/lzma-config.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/linuxbios/patches/lzma-config.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,15 @@
+Index: LinuxBIOSv2/targets/olpc/rev_a/Config.SPI.lb
+===================================================================
+--- LinuxBIOSv2.orig/targets/olpc/rev_a/Config.SPI.lb	2006-09-15 11:54:44.000000000 -0600
++++ LinuxBIOSv2/targets/olpc/rev_a/Config.SPI.lb	2006-09-15 11:55:04.000000000 -0600
+@@ -5,8 +5,8 @@
+ 
+ # Don't let LinuxBIOS compress the payload
+ #option CONFIG_COMPRESSED_ROM_STREAM_NRV2B=0
+-#option CONFIG_COMPRESSED_ROM_STREAM_LZMA=1
+-#option CONFIG_PRECOMPRESSED_ROM_STREAM=0
++option CONFIG_COMPRESSED_ROM_STREAM_LZMA=1
++option CONFIG_PRECOMPRESSED_ROM_STREAM=1
+ 
+ # leave 64k for vsa and 64k for EC code
+ option ROM_SIZE=(1024*1024)-(64*1024)-(64*1024)
Index: buildrom/packages/lzma/lzma.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/lzma/lzma.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,46 @@
+LZMA_URL=http://switch.dl.sourceforge.net/sourceforge/sevenzip
+LZMA_SOURCE=lzma443.tar.bz2
+LZMA_DIR=$(BUILD_DIR)/lzma
+LZMA_SRC_DIR=$(LZMA_DIR)/lzma-443
+LZMA_STAMP_DIR=$(LZMA_DIR)/stamps
+LZMA_LOG_DIR=$(LZMA_DIR)/logs
+
+ifeq ($(CONFIG_VERBOSE),y)
+LZMA_BUILD_LOG=/dev/stdout
+LZMA_CONFIG_LOG=/dev/stdout
+else
+LZMA_BUILD_LOG=$(LZMA_LOG_DIR)/build.log
+LZMA_CONFIG_LOG=$(LZMA_LOG_DIR)/config.log
+endif
+
+$(SOURCE_DIR)/$(LZMA_SOURCE):
+	@ mkdir -p $(SOURCE_DIR)
+	@ wget -P $(SOURCE_DIR) $(LZMA_URL)/$(LZMA_SOURCE)
+
+$(LZMA_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(LZMA_SOURCE)
+	@ mkdir -p $(LZMA_SRC_DIR)
+	@ tar -C $(LZMA_SRC_DIR) -jxf $(SOURCE_DIR)/$(LZMA_SOURCE)
+	@ touch $@
+
+$(LZMA_SRC_DIR)/C/7zip/Compress/LZMA_Alone/lzma: $(LZMA_STAMP_DIR)/.unpacked
+	@ echo "Building lzma..."
+	@ ( export CC=$(HOST_CC); export CFLAGS=$(HOST_CFLAGS); \
+	export LDFLAGS=$(HOST_LDFLAGS); unset LIBS; \
+	cd $(LZMA_SRC_DIR)/C/7zip/Compress/LZMA_Alone; \
+	$(MAKE) -C $(LZMA_SRC_DIR)/C/7zip/Compress/LZMA_Alone -f makefile.gcc > $(LZMA_BUILD_LOG) 2>&1 )
+
+$(STAGING_DIR)/bin/lzma: $(LZMA_SRC_DIR)/C/7zip/Compress/LZMA_Alone/lzma
+	@ install -d $(STAGING_DIR)/bin
+	@ install -m 0755 $< $@
+
+$(LZMA_STAMP_DIR) $(LZMA_LOG_DIR):
+	@ mkdir -p $@
+
+lzma: $(LZMA_STAMP_DIR) $(LZMA_LOG_DIR) $(STAGING_DIR)/bin/lzma
+
+lzma-clean:
+	@ echo "Cleaning lzma..."
+	@ $(MAKE) -C $(LZMA_SRC_DIR)/C/7zip/Compress/LZMA_Alone -f makefile.gcc clean > /dev/null 2>&1
+
+lzma-distclean:
+	@ rm -rf $(LZMA_DIR)/*
Index: buildrom/packages/memtest/config.h.serial
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/memtest/config.h.serial	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,36 @@
+/* config.h - MemTest-86  Version 3.0
+ *
+ * Compile time configuration options
+ *
+ * Released under version 2 of the Gnu Public License.
+ * By Chris Brady, cbrady at sgi.com
+ */
+
+/* PARITY_MEM - Enables support for reporting memory parity errors */
+/*	Experimental, normally enabled */
+#define PARITY_MEM
+
+/* SERIAL_CONSOLE_DEFAULT -  The default state of the serial console. */
+/*	This is normally off since it slows down testing.  Change to a 1 */
+/*	to enable. */
+#define SERIAL_CONSOLE_DEFAULT 1
+
+/* SERIAL_BAUD_RATE - Baud rate for the serial console */
+#define SERIAL_BAUD_RATE 115200
+
+/* BEEP_MODE - Beep on error. Default off, Change to 1 to enable */
+#define BEEP_MODE 0
+
+/* SCRN_DEBUG - extra check for SCREEN_BUFFER
+ */ 
+/* #define SCRN_DEBUG */
+
+/* APM - Turns off APM at boot time to avoid blanking the screen */
+/*	Normally enabled */
+#define APM_OFF
+
+/* USB_WAR - Enables a workaround for errors caused by BIOS USB keyboard */
+/*	and mouse support*/
+/*	Normally enabled */
+#define USB_WAR
+
Index: buildrom/packages/memtest/memtest.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/memtest/memtest.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,53 @@
+MEMTEST_URL=http://mirror.trouble-free.net/sources
+MEMTEST_SOURCE=memtest86-3.1a.tar.gz
+MEMTEST_DIR=$(BUILD_DIR)/memtest
+MEMTEST_SRC_DIR=$(MEMTEST_DIR)/memtest86-3.1a
+MEMTEST_STAMP_DIR=$(MEMTEST_DIR)/stamps
+MEMTEST_LOG_DIR=$(MEMTEST_DIR)/logs
+
+ifeq ($(CONFIG_MEMTEST_SERIAL),y)
+MEMTEST_CONFIG_TARGET=$(MEMTEST_STAMP_DIR)/.configured
+MEMTEST_CONFIG=$(PACKAGE_DIR)/memtest/config.h.serial
+else
+MEMTEST_CONFIG_TARGET=$(MEMTEST_STAMP_DIR)/.unpacked
+endif
+
+ifeq ($(CONFIG_VERBOSE),y)
+MEMTEST_BUILD_LOG=/dev/stdout
+MEMTEST_INSTALL_LOG=/dev/stdout
+else
+MEMTEST_BUILD_LOG=$(MEMTEST_LOG_DIR)/build.log
+MEMTEST_INSTALL_LOG=$(MEMTEST_LOG_DIR)/install.log
+endif
+
+$(SOURCE_DIR)/$(MEMTEST_SOURCE):
+	@ mkdir -p $(SOURCE_DIR)
+	@ wget -P $(SOURCE_DIR) $(MEMTEST_URL)/$(MEMTEST_SOURCE)
+
+$(MEMTEST_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(MEMTEST_SOURCE)
+	@ echo "Unpacking memtest..."
+	@ tar -C $(MEMTEST_DIR) -zxf $(SOURCE_DIR)/$(MEMTEST_SOURCE)
+	@ touch $@	
+
+$(MEMTEST_STAMP_DIR)/.configured: $(MEMTEST_STAMP_DIR)/.unpacked
+	@ cp $(MEMTEST_SRC_DIR)/config.h $(MEMTEST_SRC_DIR)/config.h.bak
+	@ cp $(MEMTEST_CONFIG) $(MEMTEST_SRC_DIR)/config.h
+	@ touch $@
+	
+$(MEMTEST_SRC_DIR)/memtest: $(MEMTEST_CONFIG_TARGET)
+	@ echo "Building memtest..."
+	@ $(MAKE) -C $(MEMTEST_SRC_DIR) CCFLAGS="$(CFLAGS)" memtest > $(MEMTEST_BUILD_LOG) 2>&1
+
+$(MEMTEST_STAMP_DIR) $(MEMTEST_LOG_DIR):
+	@ mkdir -p $@
+
+memtest: $(MEMTEST_STAMP_DIR) $(MEMTEST_LOG_DIR) $(MEMTEST_SRC_DIR)/memtest
+	@ install -d $(OUTPUT_DIR)
+	@ install -m 0644 $(MEMTEST_SRC_DIR)/memtest $(PAYLOAD_ELF)
+
+memtest-clean:
+	@ echo "Cleaning memtest..."
+	@ $(MAKE) -C $(MEMTEST_SRC_DIR) clean > /dev/null 2>&1
+
+memtest-distclean:
+	@ rm -rf $(MEMTEST_DIR)/*
Index: buildrom/packages/mkelfimage/mkelfimage.mk
===================================================================
--- buildrom.orig/packages/mkelfimage/mkelfimage.mk	2007-05-01 14:29:43.000000000 -0600
+++ buildrom/packages/mkelfimage/mkelfimage.mk	2007-05-01 17:21:24.000000000 -0600
@@ -5,7 +5,7 @@
 MKELFIMAGE_STAMP_DIR=$(MKELFIMAGE_DIR)/stamps
 MKELFIMAGE_LOG_DIR=$(MKELFIMAGE_DIR)/logs
 
-ifeq ($(VERBOSE),y)
+ifeq ($(CONFIG_VERBOSE),y)
 MKELFIMAGE_BUILD_LOG=/dev/stdout
 MKELFIMAGE_CONFIG_LOG=/dev/stdout
 else
@@ -18,6 +18,7 @@
 	@ wget -P $(SOURCE_DIR) $(MKELFIMAGE_URL)/$(MKELFIMAGE_SOURCE)
 
 $(MKELFIMAGE_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(MKELFIMAGE_SOURCE)
+	@ echo "Unpacking mkelfimage..."
 	@ tar -C $(MKELFIMAGE_DIR) -zxf $(SOURCE_DIR)/$(MKELFIMAGE_SOURCE)
 	@ touch $@	
 
@@ -42,8 +43,12 @@
 mkelfimage: $(MKELFIMAGE_STAMP_DIR) $(MKELFIMAGE_LOG_DIR) $(STAGING_DIR)/sbin/mkelfImage
 
 mkelfimage-clean:
-	@ $(MAKE) -C $(MKELFIMAGE_SRC_DIR) clean > /dev/null 2>&1
+	$(MAKE) -C $(MKELFIMAGE_SRC_DIR) clean 
 
 mkelfimage-distclean:
 	@ rm -rf $(MKELFIMAGE_DIR)/*
 
+mkelfimage-bom:
+	echo "Package: mkelfimage"
+	echo "Source: $(MKELFIMAGE_URL)/$(MKELFIMAGE_SOURCE)"
+	echo ""
Index: buildrom/packages/nanox/conf/defconfig
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/nanox/conf/defconfig	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,386 @@
+####################################################################
+# Microwindows and Nano-X configuration file
+#
+# This package can be configured to run on Linux (MIPS, ARM, POWERPC or x86)
+# UNIX, ELKS, DJGPP, or RTEMS.
+# On Linux, we've got drivers for Linux 2.x framebuffers, X11, or,
+# svgalib for VGA hardware.
+# In addition, a gpm or direct serial mouse driver can be configured.
+# On ELKS, the bios screen driver and serial mouse driver are always used.
+#
+# Either Microwindows and/or Nano-X can be built.
+# Microwindows and Nano-X have several demos.
+#
+# For MSDOS makes, see mcmwin.mak and mcnanox.mak
+####################################################################
+
+####################################################################
+#
+# build target platform
+#
+# Valid ARCH values are:
+#
+# LINUX-NATIVE
+# LINUX-TCC
+# LINUX-ARM
+# LINUX-MIPS
+# LINUX-POWERPC (BIGENDIAN=Y)
+# LINUX-SPARC (BIGENDIAN=Y)
+# LINUX-SH
+# FREEBSD-X86
+# SOLARIS (BIGENDIAN=Y)
+# TRIMEDIA
+# RTEMS
+# DJGPP
+# ELKS
+#
+# note: ELKS can't build client/server nano-X, nor widget lib
+#
+####################################################################
+ARCH                     = LINUX-NATIVE
+BIGENDIAN                = N
+NATIVETOOLSPREFIX        = 
+ARMTOOLSPREFIX           = arm-linux-
+MIPSTOOLSPREFIX          = mipsel-linux-
+POWERPCTOOLSPREFIX       = powerpc-linux-
+SHTOOLSPREFIX            = sh-linux-gnu
+RTEMSTOOLSPREFIX         = i386-rtemself-
+
+####################################################################
+#
+# Compiling options
+#
+####################################################################
+OPTIMIZE                 = Y
+DEBUG                    = N
+VERBOSE                  = Y
+THREADSAFE               = N
+
+####################################################################
+#
+# Libraries to build: microwin, nano-X, nanowidget, object frameworks
+#
+####################################################################
+MICROWIN                 = N
+NANOX                    = Y
+SHAREDLIBS               = N
+OBJFRAMEWORK             = N
+
+
+####################################################################
+#
+# Demos to build
+#
+####################################################################
+MICROWINDEMO             = N
+NANOXDEMO                = N
+
+####################################################################
+#
+# Applications to build
+#
+####################################################################
+NANOWM                   = N
+
+####################################################################
+#
+# The pixeltype of the native hardware or underlying graphics library.
+# This definition defines the PIXELVAL to be 32, 16 or 8 bits wide.
+# If using Linux framebuffer, set to MWPF_TRUECOLOR0888, and use fbset.
+# It also enables GdArea/GrArea for this particular pixel packing format.
+#
+# define MWPF_PALETTE       /* pixel is packed 8 bits 1, 4 or 8 pal index*/
+# define MWPF_TRUECOLOR8888 /* pixel is packed 32 bits 8/8/8/8 truecolor w/alpha*/
+# define MWPF_TRUECOLOR0888 /* pixel is packed 32 bits 8/8/8 truecolor*/
+# define MWPF_TRUECOLOR888  /* pixel is packed 24 bits 8/8/8 truecolor*/
+# define MWPF_TRUECOLOR565  /* pixel is packed 16 bits 5/6/5 truecolor*/
+# define MWPF_TRUECOLOR555  /* pixel is packed 16 bits 5/5/5 truecolor*/
+# define MWPF_TRUECOLOR332  /* pixel is packed 8 bits 3/3/2 truecolor*/
+#
+####################################################################
+#SCREEN_PIXTYPE           = MWPF_TRUECOLOR0888
+SCREEN_PIXTYPE		  = MWPF_TRUECOLOR565
+
+####################################################################
+#
+# NanoX: Put Y to the following line to link the nano-X application
+# with the server.  This is required for ELKS, if no network is present,
+# or for speed or debugging.  This affects the nano-X server only.
+#
+####################################################################
+LINK_APP_INTO_SERVER     = Y
+
+####################################################################
+# Shared memory support for Nano-X client/server protocol speedup
+####################################################################
+HAVE_SHAREDMEM_SUPPORT   = N
+
+####################################################################
+#
+# File I/O support
+# Supporting either below drags in libc stdio, which may not be wanted
+#
+####################################################################
+HAVE_FILEIO              = Y
+
+####################################################################
+# BMP, GIF reading support
+####################################################################
+HAVE_BMP_SUPPORT         = N
+HAVE_GIF_SUPPORT         = N
+HAVE_PNM_SUPPORT         = Y
+HAVE_XPM_SUPPORT         = N
+
+####################################################################
+# JPEG support through libjpeg, see README.txt in contrib/jpeg
+####################################################################
+HAVE_JPEG_SUPPORT        = N
+INCJPEG                  = .
+LIBJPEG                  = /usr/lib/libjpeg.a
+
+####################################################################
+# PNG support via libpng and libz
+####################################################################
+HAVE_PNG_SUPPORT         = N
+INCPNG                   = .
+LIBPNG                   = /usr/lib/libpng.a
+LIBZ                     = /usr/lib/libz.a
+
+####################################################################
+# TIFF support through libtiff
+####################################################################
+HAVE_TIFF_SUPPORT        = N
+INCTIFF                  = .
+LIBTIFF                  = /usr/lib/libtiff.a
+
+####################################################################
+# native .fnt loadable font support
+####################################################################
+HAVE_FNT_SUPPORT         = N
+HAVE_FNTGZ_SUPPORT       = N
+FNT_FONT_DIR             = "fonts/bdf"
+
+####################################################################
+# T1 adobe type1 font support thru t1lib
+####################################################################
+HAVE_T1LIB_SUPPORT       = N
+INCT1LIB                 = .
+LIBT1LIB                 = /usr/local/lib/libt1.a
+
+####################################################################
+# TrueType font support thru FreeType 1.x
+####################################################################
+HAVE_FREETYPE_SUPPORT    = N
+INCFTLIB                 = /usr/include/freetype1
+LIBFTLIB                 = /usr/lib/libttf.so
+FREETYPE_FONT_DIR        = "fonts/truetype"
+
+####################################################################
+# Support for many kinds of font thru FreeType 2.x
+# Must also set FREETYPE_FONT_DIR in the Freetype 1.x section
+####################################################################
+HAVE_FREETYPE_2_SUPPORT  = N
+INCFT2LIB                = .
+LIBFT2LIB                = /usr/lib/libfreetype.a
+
+####################################################################
+# PCF font support 
+# Selecting HAVE_PCFGZ_SUPPORT will allow you to directly read
+# .pcf.gz files, but it will add libz to the size of the server
+####################################################################
+HAVE_PCF_SUPPORT         = N
+HAVE_PCFGZ_SUPPORT       = N
+PCF_FONT_DIR             = "fonts/pcf"
+
+####################################################################
+# Chinese Han Zi Ku loadable font support
+####################################################################
+HAVE_HZK_SUPPORT         = N
+HZK_FONT_DIR             = "fonts/chinese"
+
+####################################################################
+# Chinese BIG5 compiled in font support (big5font.c)
+####################################################################
+HAVE_BIG5_SUPPORT        = N
+
+####################################################################
+# Chinese GB2312 compiled in font support (gb2312font.c)
+####################################################################
+HAVE_GB2312_SUPPORT      = N
+
+####################################################################
+# Japanese JISX0213 compiled in font support (jisx0213-12x12.c)
+####################################################################
+HAVE_JISX0213_SUPPORT    = N
+
+####################################################################
+# Korean HANGUL font support (jo16x16.c)
+####################################################################
+HAVE_KSC5601_SUPPORT     = N
+
+####################################################################
+# Japanese EUC-JP support using loadable MGL font
+####################################################################
+HAVE_EUCJP_SUPPORT       = N
+EUCJP_FONT_DIR           = "fonts/japanese"
+
+####################################################################
+# Generate screen driver interface only with no fonts or clipping
+####################################################################
+NOFONTSORCLIPPING        = N
+
+####################################################################
+#
+# Window move algorithms for Microwindows
+# Change for tradeoff between cpu speed and looks
+# ERASEMOVE repaints only backgrounds while window dragging, quicker.
+# Otherwise an XOR redraw is used for window moves only after button up,
+# quickest (should set for ELKS)
+# UPDATEREGIONS paints in update clipping region only for better look and feel
+#
+####################################################################
+ERASEMOVE                = Y
+UPDATEREGIONS            = Y
+
+####################################################################
+#
+# Link with Gray Palette (valid only for 4bpp modes)
+#
+####################################################################
+GRAYPALETTE              = N
+
+####################################################################
+#
+# If the platform is running UNIX, Linux or RTEMS...
+#
+####################################################################
+ifneq ($(ARCH), ELKS)
+
+# X Window screen, mouse and kbd drivers
+X11                      = N
+
+ifeq ($(X11), Y)
+# startup screen width, height, (depth for palette mode only)
+SCREEN_WIDTH             = 800
+SCREEN_HEIGHT            = 600
+SCREEN_DEPTH             = 4 
+
+# You may want to turn this on for XFree86 4.x or if your backing store
+# isn't functioning properly
+USE_EXPOSURE		 = Y
+
+else
+
+# framebuffer screen driver (linear and/or vga 4 planes)
+# set VTSWITCH to include virtual terminal switch code
+# set FBREVERSE to reverse bit orders in 1,2,4 bpp
+# set FBVGA=N for all systems without VGA hardware (for MIPS must=N)
+FRAMEBUFFER              = Y
+FBVGA                    = N
+VTSWITCH                 = N
+FBREVERSE                = N
+
+# set HAVETEXTMODE=Y for systems that can switch between text & graphics.
+# On a graphics-only embedded system, such as Osprey and Embedded
+# Planet boards, set HAVETEXTMODE=N
+HAVETEXTMODE             = Y
+
+# svgalib screen driver
+VGALIB                   = N
+
+# direct VGA hardware access screen driver
+HWVGA                    = N
+
+####################################################################
+# Mouse drivers
+# GPMMOUSE	gpm mouse
+# SERMOUSE	serial Microsoft, PC, Logitech, PS/2 mice (/dev/psaux)
+# SUNMOUSE	Sun Workstation mouse (/dev/sunmouse)
+# NOMOUSE	no mouse driver
+#
+# Touchscreen drivers
+# IPAQMOUSE	Compaq iPAQ, Intel Assabet (/dev/h3600_tsraw)
+# ZAURUSMOUSE	Sharp Zaurus (/dev/sharp_ts)
+# TUXMOUSE	TuxScreen (/dev/ucb1x00-ts)
+# ADSMOUSE	Applied Data Systems GC+ (/dev/ts)
+# ADS7846MOUSE	        ADS7846 chip, PSI OMAP Innovator (/dev/innnovator_ts)
+# EPMOUSE	Embedded Planet (/dev/tpanel)
+# VHMOUSE	Vtech Helio (/dev/tpanel)
+# MTMOUSE	MicroTouch serial (/dev/ttyS1)
+# PSIONMOUSE	Psion 5 (/dev/touch_psion)
+# YOPYMOUSE	Yopy (/dev/yopy-ts)
+# HARRIERMOUSE	NEC Harrier (/dev/tpanel)
+####################################################################
+GPMMOUSE                 = N
+SERMOUSE                 = N
+SUNMOUSE                 = N
+NOMOUSE                  = Y
+IPAQMOUSE                = N
+ZAURUSMOUSE              = N
+TUXMOUSE                 = N
+ADSMOUSE                 = N
+ADS7846MOUSE             = N
+EPMOUSE                  = N
+VHMOUSE                  = N
+MTMOUSE                  = N
+PSIONMOUSE               = N
+YOPYMOUSE                = N
+HARRIERMOUSE             = N
+LIRCMOUSE                = N
+
+# keyboard or null kbd driver
+TTYKBD                   = Y
+SCANKBD                  = N
+PIPEKBD                  = N
+IPAQKBD                  = N
+LIRCKBD                  = N
+NOKBD                    = N
+
+endif
+
+# Secondary keyboard drivers.
+# You may have a normal keyboard driver in addition to these
+# drivers, e.g. for both normal keyboard and IR input.
+LIRCKBD2                 = N
+
+####################################################################
+# Screen driver specific configuration
+# SA1100_LCD_LTLEND 4bpp driver with arm SA1100 LCD controller
+# INVERT4BPP 4bpp inverted pixel driver for VTech Helio
+####################################################################
+SA1100_LCD_LTLEND        = N
+INVERT4BPP               = N
+
+####################################################################
+#
+# If the platform is a RTEMS box ....
+#
+####################################################################
+ifeq ($(ARCH), RTEMS)
+
+# Location & BSP information of the RTEMS build
+RTEMS_BUILD              = /tools/build-i386-elf-rtems
+RTEMS_BSP                = pc386
+LINK_APP_INTO_SERVER     = Y
+
+endif
+
+endif
+
+####################################################################
+#
+# If the platform is an ELKS box ...
+#
+####################################################################
+ifeq ($(ARCH), ELKS)
+
+# Higher speed asm driver, c driver of hercules screen driver
+ASMVGADRIVER             = Y
+CVGADRIVER               = N
+HERCDRIVER               = N
+DBGDRIVER                = N
+
+# Mouse support
+SERMOUSE                 = Y
+
+endif
Index: buildrom/packages/ofw/64bit-fix.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/ofw/64bit-fix.patch	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,21 @@
+Index: svn/cpu/x86/Linux/Makefile
+===================================================================
+--- svn.orig/cpu/x86/Linux/Makefile	2007-02-15 14:26:55.000000000 -0700
++++ svn/cpu/x86/Linux/Makefile	2007-02-15 14:52:41.000000000 -0700
+@@ -23,14 +23,14 @@
+ # Use x86forth when you need to compile new dictionaries that will
+ # run on x86 systems.
+ forth: ${OBJS}
+-	${CC} -o -m32 $@ ${OBJS}
++	${CC} -m32 -o $@ ${OBJS}
+ 	@ln -sf forth x86forth
+ 
+ # Compile with -O0 because with GCC4, higher optimization levels cause the
+ # functions to be reordered so the "inflate" entry point is no longer at
+ # the beginning.
+ inflate.o: ${ZIPDIR}/inflate.c
+-	${CC} -c -m32 -O0 -fpic $< -o $@
++	${CC} -m32 -c -O0 -fpic $< -o $@
+ 
+ ../build/inflate.bin: inflate.o
+ 	objcopy -O binary $< $@
Index: buildrom/packages/ofw/ofw.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/ofw/ofw.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,65 @@
+# Build the openfirmware payload
+
+OFW_DIR=$(BUILD_DIR)/ofw
+OFW_SRC_DIR=$(OFW_DIR)/svn
+OFW_BUILD_DIR=$(OFW_SRC_DIR)/cpu/x86/pc/olpc/build
+OFW_STAMP_DIR=$(OFW_DIR)/stamps
+OFW_LOG_DIR=$(OFW_DIR)/logs
+
+OFW_TARBALL=openfirmware-svn-$(OFW_SVN_TAG).tar.gz
+OFW_PATCHES=$(PACKAGE_DIR)/ofw/64bit-fix.patch
+
+ifeq ($(CONFIG_VERBOSE),y)
+OFW_FETCH_LOG=/dev/stdout
+OFW_BUILD_LOG=/dev/stdout
+OFW_INSTALL_LOG=/dev/stdout
+else
+OFW_FETCH_LOG=$(OFW_LOG_DIR)/fetch.log
+OFW_BUILD_LOG=$(OFW_LOG_DIR)/build.log
+OFW_INSTALL_LOG=$(OFW_LOG_DIR)/install.log
+endif
+
+# NOTE - this should be replaced by the GIT fetch or tarball fetch
+# as appropriate
+
+$(SOURCE_DIR)/$(OFW_TARBALL):
+	@ echo "Fetching OpenFirmware..."
+	@ echo "SVN Checkout rev $(OFW_SVN_TAG)"
+	@ $(BIN_DIR)/fetchsvn.sh $(OFW_SVN_URL) $(SOURCE_DIR)/ofw \
+	$(OFW_SVN_TAG) $@ > $(OFW_FETCH_LOG) 2>&1
+
+$(OFW_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(OFW_TARBALL)
+	@ echo "Unpacking OpenFirmware..."
+	@ tar -C $(OFW_DIR) -zxf $(SOURCE_DIR)/$(OFW_TARBALL)
+	@ touch $@	
+
+$(OFW_STAMP_DIR)/.patched: $(OFW_STAMP_DIR)/.unpacked
+	@ echo "Patching OFW..."
+	@ $(BIN_DIR)/doquilt.sh $(OFW_SRC_DIR) $(OFW_PATCHES)
+	@ touch $@
+
+$(OFW_BUILD_DIR)/ofw.elf: $(OFW_STAMP_DIR)/.patched
+	@ echo "Building OpenFirmware..."
+	@ (echo -n "svn: " ; cd $(OFW_SRC_DIR); svn info | grep Revision )
+	@ $(MAKE) -C $(OFW_BUILD_DIR) > $(OFW_BUILD_LOG) 2>&1
+
+$(OFW_STAMP_DIR) $(OFW_LOG_DIR):
+	@ mkdir -p $@
+
+ofw: $(OFW_STAMP_DIR) $(OFW_LOG_DIR) $(OFW_BUILD_DIR)/ofw.elf 
+	@ mkdir -p $(OUTPUT_DIR)
+	@ install -m 0644 $(OFW_BUILD_DIR)/ofw.elf $(OUTPUT_DIR)/ofw-payload.elf
+
+ofw-clean:
+	@ echo "Cleaning openfirmware..."
+	@ $(MAKE) -C $(OFW_BUILD_DIR) clean > /dev/null 2>&1
+
+ofw-distclean:
+	@ rm -rf $(OFW_DIR)/*
+
+ofw-bom:
+	@ echo "Package: linuxbios"
+	@ echo "Source:  $(OFW_SVN_URL)"
+	@ echo "Revison: $(OFW_SVN_TAG)"
+	@ echo "Tarball: `basename $(OFW_TARBALL)"
+	@ echo ""
Index: buildrom/packages/olpcflash/Makefile
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/olpcflash/Makefile	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,9 @@
+CC=gcc
+CFLAGS_extra= -Wall
+LDFLAGS_extra=
+
+olpcflash: olpcflash.c
+	$(CC) $(CFLAGS) $(CFLAGS_extra) $(LDFLAGS) $(LDFLAGS_extra) -o $@ olpcflash.c $(LIBS)
+
+clean:
+	rm -f olpcflash
Index: buildrom/packages/olpcflash/olpcflash.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/olpcflash/olpcflash.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,937 @@
+/*
+ * olpcflash.c: SPI Flash programming utility for OLPC.
+ *
+ * Copyright 2000 Silicon Integrated System Corporation
+ * Copyright 2004 Tyan Corp
+ *		yhlu yhlu at tyan.com add exclude start and end option
+ * Copyright 2005-2006 coresystems GmbH 
+ *      Stefan Reinauer <stepan at coresystems.de> added rom layout
+ *      support, and checking for suitable rom image, various fixes
+ *      support for flashing the Technologic Systems 5300.
+ * Copyright 2006  Ron Minniich <rminnich at lanl.gov>
+ *      Initial support for EnE KB3920 EC and the spansion
+ *      25FL008A 8Mibit SPI part on the OLPC
+ * Copyright 2006 Richard A. Smith <smithbone at gmail.com> 
+ *      Added lots of additional stuff to make writing to spansion part
+ *      work correctly with the OLPC EnE EC.
+ * 
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License
+ *	along with this program; if not, write to the Free Software
+ *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <sys/io.h>
+#include <sys/time.h>
+#include <time.h>
+
+#define printf_debug(x...) { if(verbose) printf(x); }
+#define printf_super_debug(x...) { if(verbose > 1) printf(x); }
+
+#define VER_MAJOR   0
+#define VER_MINOR   3
+#define VER_RELEASE 0
+
+#define LINUXBIOS_START		0x10000
+#define PAGE_SIZE			256
+#define EC_CODE_SIZE 		(64*1024)
+#define ROM_SIZE			(1024*1024)
+#define IOBASE_DEFAULT			(0x381)
+
+enum {
+	GPIO5 = 0xfc2a,
+	SPIA0 = 0xfea8, 
+	SPIA1, 
+	SPIA2, 
+	SPIDAT,
+	SPICMD, 
+	SPICFG,
+	SPIDATR
+};
+
+enum {
+	DUMMY,
+	WRITESTATUS = 1,
+	BYTEPROGRAM, 
+	READ,
+	WRITEDISABLE,
+	READSTATUS,	
+	WRITEENABLE,
+	HIGHSPEEDREAD 	= 0xb,
+	SECTORERASESST 	= 0x20, 
+	ENABLEWRITESTATUSSST = 0x50,
+	BLOCKERASESST 	= 0x52,  /* 32k block */
+	CHIPERASESST 	= 0x60,
+	READJDECID 	= 0x9f,
+	AUTOINCPROGSST  = 0xad,
+	CHIPERASEPCM 	= 0xc7, /* also nexflash */
+	SECTORERASEPCM 	= 0xd7,
+	BLOCKERASEPCM 	= 0xd8, /* also nexflash, and spansion, SST (64k) */
+};
+
+enum {
+	SPIBUSY = 2, 
+	SPIFIRMWAREMODE = 1 << 4,
+	SPICMDWE = 8,
+	SPIFLASHREADCE = 1 << 6
+};
+
+enum {
+	WIP = 1 << 0
+};
+
+enum {
+	SPANSION	= 0x01,
+	SST 		= 0xbf,
+	WINBOND 	= 0xef
+};
+
+struct flashchip {
+	int manufacture_id;
+	int model_type;
+	int model_id;
+
+	int total_size;
+	int page_size;
+
+	int (*write_page) (unsigned char *buf, unsigned long addr, unsigned long size);
+
+};
+
+char *chip_to_probe = NULL;
+
+int exclude_start_page, exclude_end_page;
+int force=0, verbose=0; int noop=0;
+
+/* this is the defaut index and data IO base address for
+ * EC register access.
+ * setup by the EC code.
+ */
+
+unsigned short iobase = IOBASE_DEFAULT;
+
+// count to a billion. Time it. If it's < 1 sec, count to 10B, etc.
+unsigned long micro = 1;
+
+
+void myusec_delay(int time)
+{
+	volatile unsigned long i;
+	for (i = 0; i < time * micro; i++);
+}
+
+void myusec_calibrate_delay()
+{
+	int count = 1000;
+	unsigned long timeusec;
+	struct timeval start, end;
+	int ok = 0;
+
+	printf_debug("Setting up microsecond timing loop\n");
+	while (!ok) {
+		gettimeofday(&start, 0);
+		myusec_delay(count);
+		gettimeofday(&end, 0);
+		timeusec = 1000000 * (end.tv_sec - start.tv_sec) +
+		    (end.tv_usec - start.tv_usec);
+		count *= 2;
+		if (timeusec < 1000000 / 4)
+			continue;
+		ok = 1;
+	}
+
+	// compute one microsecond. That will be count / time
+	micro = count / timeusec;
+
+	printf_debug("%ldM loops per second\n", (unsigned long) micro);
+}
+
+
+void setecindex(unsigned short index)
+{
+	unsigned char hi = index>>8;
+	unsigned char lo = index;
+
+	if (noop) return;
+
+	outb(hi, iobase);
+	outb(lo, iobase+1);
+	printf_super_debug("%s: set 0x%x to 0x%x, 0x%x to 0x%x\n", __FUNCTION__, 
+		iobase, hi, iobase+1, lo);
+}
+
+unsigned char getecdata(void)
+{
+	unsigned char data;
+
+	if (noop) return 0;
+
+	data = inb(iobase+2);
+	printf_super_debug("%s: read 0x%x from 0x%x\n", __FUNCTION__, data, iobase+2);
+	return data;
+}
+
+void putecdata(unsigned char data)
+{
+
+	if (noop) return;
+
+	outb(data, iobase+2);
+	printf_super_debug("%s: wrote 0x%x to 0x%x\n", __FUNCTION__, data, iobase+2);
+}
+
+unsigned char readecdata(unsigned short index)
+{
+	setecindex(index);
+	return getecdata();
+}
+
+void writeecdata(unsigned short index, unsigned char data)
+{
+	setecindex(index);
+	putecdata(data);
+}
+
+void setaddr(unsigned long addr){
+	unsigned char data;
+	data = addr;
+	writeecdata(SPIA0, data);
+	data = addr >> 8;
+	writeecdata(SPIA1, data);
+	data = addr >> 16;
+	writeecdata(SPIA2, data);
+}
+
+unsigned char rdata(void)
+{
+	unsigned char data;
+	data = readecdata(SPIDAT);
+	return data;
+}
+
+void wdata(unsigned char data)
+{
+	writeecdata(SPIDAT, data);
+}
+
+unsigned char cmd(void)
+{
+	return readecdata(SPICMD);
+}
+
+void docmd(unsigned char cmd)
+{
+	printf_super_debug("docmd: cmd 0x%x\n", cmd);
+	writeecdata(SPICMD, cmd);
+	printf_super_debug("docmd: cmd 0x%x\n", cmd);
+}
+
+void wait_cmd_sent(void)
+{
+	int trycount = 0;
+	myusec_delay(10);
+
+	if (noop) return;
+
+	while (readecdata(SPICFG) & SPIBUSY){
+		trycount++;
+		myusec_delay(10);
+		if (trycount > 100000){ /* 1 second! */
+			printf("wait_sent: Err: waited for > 1 second\n");
+			trycount = 0;
+		}
+	}
+}	
+
+/* 
+ * The EnE code has lots of small delays inbetween
+ * many of the actions.  Route all this through 
+ * one function so I can play with how long they
+ * need to be.
+ */
+void short_delay(void)
+{
+	// EnE code did 4 pci reads of the base address
+	// which should be around 800nS
+	// 2 uS should cover it in case I'm wrong
+	myusec_delay(2);
+}
+
+/*
+ * Firmware mode allows you raw control over the SPI bus
+ * the spansion part is not supported by the EC in 
+ * "hardware" mode.
+ * in this mode bytes written to the SPICMD register
+ * are clocked out the bus.
+ * This also asserts SPICS#
+ */
+void start_SPI_firmware_mode_access(void)
+{
+	writeecdata(SPICFG,0x18);
+}
+
+void end_SPI_firmware_mode_access(void)
+{
+	writeecdata(SPICFG,0x08);
+}
+
+/*
+ * You must do this prior to _every_ command that
+ * writes data to the part.  The write enable
+ * latch resets after write commands complete.
+ */
+void send_write_enable(void) {
+	start_SPI_firmware_mode_access();
+	short_delay();
+	docmd(WRITEENABLE);
+	wait_cmd_sent();
+	end_SPI_firmware_mode_access();
+}
+
+void send_addr(unsigned long addr)
+{
+	unsigned char data;
+
+	data = addr >> 16 & 0xff;
+	docmd(data);
+	wait_cmd_sent();
+
+	data = addr >> 8 & 0xff;
+	docmd(data);
+	wait_cmd_sent();
+
+	data = addr & 0xff;
+	docmd(data);
+}
+
+void enable_flash_cmd(void)
+{
+	writeecdata(SPICFG, SPICMDWE|readecdata(SPICFG));
+}
+
+void enable_flash_write_protect(void)
+{
+	unsigned char val;
+	val = readecdata(GPIO5);
+	val &= ~0x80;
+	writeecdata(GPIO5,val);
+}
+
+void disable_flash_write_protect(void)
+{
+	unsigned char val;
+	val = readecdata(GPIO5);
+	val |= 0x80;
+	writeecdata(GPIO5,val);
+}
+
+/*
+ * This appears to be necessary.  If you watch the lines with 
+ *	scope you will see that there is constant activity on the SPI
+ *	bus to the part.  Trying to write to the port while all that
+ * is going on is sure to muck things up.
+ * Putting this into reset stops all that 
+ * activity.
+
+ * Plus Ray Tseng said so.
+ * 
+ */
+void put_kbc_in_reset(void)
+{
+	unsigned char val;
+	unsigned long timeout = 500000;
+
+	if (noop) return;
+
+	outb(0xd8,0x66);
+	while((inb(0x66) & 0x02) && (timeout>0)) {
+		timeout--;
+	}
+	val = readecdata(0xff14);
+	val |= 0x01;
+	writeecdata(0xff14,val);
+}
+
+void restore_kbc_run_mode(void)
+{
+	unsigned char val;
+
+	val = readecdata(0xff14);
+	val &= ~0x01;
+	writeecdata(0xff14,val);
+}
+
+unsigned char read_status_register(void)
+{
+	unsigned char data=0;
+	start_SPI_firmware_mode_access();
+	short_delay();
+	docmd(READSTATUS);
+	wait_cmd_sent();
+	docmd(DUMMY);
+	wait_cmd_sent();
+	data =  rdata();
+	end_SPI_firmware_mode_access();
+	return data;
+}
+
+// Staus reg writes; erases and programs all need to 
+// check this status bit.
+int wait_write_done(void)
+{
+	int trycount = 0;
+
+	if (noop) return 0;
+
+	while (read_status_register() & WIP){
+		trycount++;
+		myusec_delay(10);
+		// For the spansion part datasheet claims that 
+		// the only thing that takes longer than 500mS is 
+		// bulk erase and we don't ever want to use that
+		// command
+		if (trycount > 100000){ /* 1 second! */
+			printf("wait_write_done: Err: waited for > 1 second\n");
+			trycount = 0;
+			return -1;
+		}
+	}
+
+	return 0;
+}	
+
+int erase_sector(unsigned long addr)
+{
+	send_write_enable();
+	short_delay();
+
+	start_SPI_firmware_mode_access();
+	short_delay();
+
+	docmd(BLOCKERASEPCM);
+	wait_cmd_sent();
+
+	send_addr(addr);
+	wait_cmd_sent();
+
+	end_SPI_firmware_mode_access();
+
+	return wait_write_done();
+}
+
+/*
+ Erase from sectors 0x10000 to 0xf0000
+*/
+int erase_linuxbios_area(void) 
+{
+	unsigned long addr;
+
+	for (addr = 0x10000;addr < 0xfffff;addr+=0x10000) {
+		printf("Erasing Sector: 0x%08lx\r\n",addr);
+		erase_sector(addr);
+	}
+	return 0;
+}
+
+int erase_EC_area(void) 
+{
+	unsigned long addr = 0;
+	printf("Erasing Sector: 0x%08lx\r\n",addr);
+	erase_sector(addr);
+	return 0;
+}
+
+int erase_flash(int mode)
+{
+	if (mode == 1) {
+		erase_EC_area();
+	}
+	erase_linuxbios_area();
+	return 0;
+}
+
+
+unsigned char read_flash_byte(unsigned long addr) 
+{
+	unsigned char data;
+
+	setaddr(addr);
+	docmd(READ);
+	wait_cmd_sent();
+	data =  rdata();
+	printf_debug("read 0x%x at 0x%lx\n", data, addr);
+	return data;
+}
+
+int read_flash(unsigned char *buf, unsigned long start, unsigned long size)
+{
+	unsigned long i;
+
+	printf("Reading %ld bytes from %lx\r\n",size,start);
+	for (i = start; i < start+size; i++) {
+		if ((i % 0x10000) == 0) printf("Sector 0x%08lx\r\n", i);
+		*buf = read_flash_byte(i);
+		buf++;
+	}
+	return 0;
+}
+
+int read_jdec_id(struct flashchip *flash)
+{
+	unsigned char data;
+
+	start_SPI_firmware_mode_access();
+	short_delay();
+
+	docmd(READJDECID);
+	wait_cmd_sent();
+	docmd(DUMMY);
+	wait_cmd_sent();
+	data = rdata();
+	flash->manufacture_id = data;
+	docmd(DUMMY);
+	wait_cmd_sent();
+	data = rdata();
+	flash->model_type = data;
+	docmd(DUMMY);
+	wait_cmd_sent();
+	data = rdata();
+	flash->model_id = data;
+
+	end_SPI_firmware_mode_access();
+	
+	return 0;
+}
+
+int write_flash_byte(unsigned long addr, unsigned char data) {
+
+	send_write_enable();
+	short_delay();
+
+	start_SPI_firmware_mode_access();
+	short_delay();
+
+	docmd(BYTEPROGRAM);
+	wait_cmd_sent();
+
+	send_addr(addr);
+	wait_cmd_sent();
+
+	docmd(data);
+	wait_cmd_sent();
+
+	end_SPI_firmware_mode_access();
+
+	wait_write_done();
+/*
+	unsigned char verify;
+	verify =  read_flash_byte(addr);
+	if (verify != data) {
+		printf("addr 0x%x, want 0x%x, got 0x%x\n", 
+				addr, data, verify);
+		return -1;
+	}
+*/
+	return 0;
+}
+
+int write_flash_page(unsigned char *buf, unsigned long addr, unsigned long size)
+{
+	
+	send_write_enable();
+	short_delay();
+
+	start_SPI_firmware_mode_access();
+	short_delay();
+
+	docmd(BYTEPROGRAM);
+	wait_cmd_sent();
+
+	send_addr(addr);
+	wait_cmd_sent();
+
+	while (size > 0) {
+		docmd(*buf);
+		wait_cmd_sent();
+		size--;
+		buf++;
+	}
+
+	end_SPI_firmware_mode_access();
+
+	wait_write_done();
+/*
+	unsigned char verify;
+	verify =  read_flash_byte(addr);
+	if (verify != data) {
+		printf("addr 0x%x, want 0x%x, got 0x%x\n", 
+				addr, data, verify);
+		return -1;
+	}
+*/
+	return 0;
+}
+
+int
+write_flash(unsigned char *buf, unsigned long start, unsigned long size){
+	unsigned long p=0;
+	unsigned long pages=0;
+	unsigned long short_page=0;
+	
+	pages = (size+(PAGE_SIZE-1))/PAGE_SIZE;
+	short_page = size-(pages*PAGE_SIZE);
+
+	printf("Writing %ld bytes starting at address 0x%lx\r\n",size,start);
+
+	for (p=0;p<pages;p++) {
+		if ((start % 0x10000) == 0) printf("Sector 0x%08lx\r\n", start);
+		printf_debug("Page %ld/%ld\r",p+1,pages);
+
+		if (write_flash_page(buf,start,PAGE_SIZE)) {
+			return -1;
+		}
+
+		buf+=PAGE_SIZE;
+		start+=PAGE_SIZE;
+	}
+	printf_debug("\r\n");
+
+	if (short_page) {
+		printf_debug("Short Page of %ld bytes\r\n",short_page);	
+		printf_debug("Address %ld\r\n",start);	
+
+		if (write_flash_page(buf,start,short_page)) {
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+int verify_flash(unsigned char *buf, unsigned long start, unsigned long size)
+{
+	unsigned long idx;
+	unsigned char r_val;
+
+	printf("Verifying flash\n");
+	
+	if(verbose) printf("address: 0x00000000\b\b\b\b\b\b\b\b\b\b");
+	
+	for (idx = start; idx < start+size; idx++) {
+		if (verbose && ( (idx & 0xfff) == 0xfff ))
+			printf("0x%08lx", idx);
+
+		if ((idx % 0x10000) == 0)
+			printf("Sector 0x%08lx\r\n", idx);
+
+		r_val = read_flash_byte(idx);
+
+		if ( r_val != *buf ) {
+			printf("0x%08lx: ", idx);
+			printf("Expected 0x%02x Got 0x%02x\n",*buf,r_val);
+			printf("Verify FAILED\n");
+			return 1;
+		}
+		buf++;
+
+		if (verbose && ( (idx & 0xfff) == 0xfff ))
+			printf("\b\b\b\b\b\b\b\b\b\b");
+	}
+	if (verbose) 
+		printf("\b\b\b\b\b\b\b\b\b\b ");
+	
+	printf("- VERIFIED         \n");
+	return 0;
+}
+
+
+void usage(const char *name)
+{
+	printf("%s Ver: %d.%d.%d\n",name,VER_MAJOR,VER_MINOR,VER_RELEASE);
+	printf("usage: %s [-rwv] [-V] [file]\n", name);
+	printf("   -r | --read      read flash and save into file\n"
+	       "   -w | --write     write file into flash\n"
+	       "   -v | --verify    verify flash against file\n"
+	       "   -E | --erase     erase LinuxBIOS area (0x10000-0xfffff)\n"
+	       "   -V | --verbose   more verbose output\n"
+               "   -n | --noop Noop mode. Do the motions but no io\n"
+               "   -h | --help This message\n"
+	       "        --no-verify skip the autoverify on write\n"
+	       "   -P | --nobrick: Partial mode. Writes start @ 64Kib\n"	       
+	       "   -I | --id        print out part JDEC ID values\n"
+	       "   -f | --force-id <id>  Force a specific ID\n"
+	       "\n\n");
+	exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+	unsigned long size;
+	unsigned long start_addr=LINUXBIOS_START;
+	FILE *image;
+	int opt;
+	int option_index = 0;
+	int read_it = 0, 
+	    write_it = 0, 
+	    erase_it = 0, 
+	    verify_it = 0,
+	    show_id =0;
+	int auto_verify = 1;
+	int force_id = 0;
+	int brick_mode = 1;
+	int ret = 0;
+	int i=0;
+	int forced_id=0;
+	unsigned char buf[ROM_SIZE];
+	unsigned char* buf_start=NULL;
+
+	struct flashchip flash;
+
+	static struct option long_options[]= {
+		{ "read",		0, 0, 'r' },
+		{ "write",		0, 0, 'w' },
+		{ "erase",		0, 0, 'E' },
+		{ "verify", 		0, 0, 'v' },
+		{ "iobase",		1, 0, 'i' },
+		{ "verbose",		0, 0, 'V' },
+		{ "help", 		0, 0, 'h' },
+		{ "brick",		0, 0, 'B' },
+		{ "nobrick",		0, 0, 'P' },
+		{ "noop",		0, 0, 'n' },
+		{ "no-verify",		0, 0, 'a' },
+		{ "id",			0, 0, 'I' },
+		{ "force-id",		1, 0, 'f' },
+		{ 0, 0, 0, 0 }
+	};
+	
+	char *filename = NULL;
+
+	setbuf(stdout, NULL);
+	while ((opt = getopt_long(argc, argv, "rwvVEnIhPi:f:", long_options,
+					&option_index)) != EOF) {
+		switch (opt) {
+		case 'r':
+			read_it = 1;
+			break;
+		case 'w':
+			write_it = 1;
+			break;
+		case 'v':
+			verify_it = 1;
+			break;
+		case 'V':
+			verbose++;
+			break;
+		case 'E':
+			erase_it = 1;
+			break;
+		case 'i':
+			errno = 0;
+			iobase = (unsigned short) strtol(optarg,0,0);
+			if (errno || (iobase == 0)) {
+				printf("Invalid IO base\n");
+				exit(1);
+			}
+			break;
+		case 'B':
+			brick_mode = 1;
+			break;
+		case 'P':
+			brick_mode = 0;
+			break;
+		case 'n':
+			noop = 1;
+			break;
+		case 'a':
+			auto_verify = 0;
+			break;
+		case 'I':
+			show_id = 1;
+			break;
+
+		case 'f': 
+			force_id = 1;
+			errno = 0;
+			forced_id = (int) strtol(optarg,0,0);
+			if (errno || (forced_id  == 0)) {
+				printf("Invalid Mfg ID\n");
+				exit(1);
+			}
+			break;
+
+		case 'h':
+		default:
+			usage(argv[0]);
+			break;
+		}
+	}
+
+	if (argc > 1) {
+		/* Yes, print them. */
+		int i;
+		printf_debug ("The arguments are:\n");
+		for (i = 1; i < argc; ++i)
+			printf_debug ("%s\n", argv[i]);
+	}
+
+	if (!noop) {
+		if (iopl(3) < 0){
+			perror("iop(3)");
+			exit(1);
+		}
+	}
+
+	if (iobase != IOBASE_DEFAULT) {
+		printf("Useing IO base of 0x%x\n",(unsigned int)iobase);
+	}
+
+	if (read_it && write_it) {
+		printf("-r and -w are mutually exclusive\n");
+		usage(argv[0]);
+	}
+
+	if (optind < argc)
+		filename = argv[optind++];
+
+	if (!erase_it && !write_it && !read_it && !verify_it && !show_id) {
+		printf("No command specified so no operations performed\n");
+		printf("Use -h for details\n");
+		exit(2);
+	}
+
+	printf("Calibrating delay loop... ");
+	myusec_calibrate_delay();
+	printf("ok\n");
+
+	enable_flash_cmd();
+	/* 
+	 * This is required prior to _all_ commands. Otherwise the kbc can steal your data
+	 */
+	put_kbc_in_reset();
+
+	read_jdec_id(&flash);
+
+	if (show_id) {
+		printf("Manufacture ID = 0x%x\n",flash.manufacture_id);
+		printf("Model Type     = 0x%x\n",flash.model_type);
+		printf("Model ID       = 0x%x\n",flash.model_id);
+	}
+
+	if (force_id) {
+		flash.manufacture_id = forced_id;
+	}
+
+	switch (flash.manufacture_id) {
+
+		case SST:
+//			flash.write_page = write_flash_page_sst;
+			printf("SST part found\n");
+		break;
+
+		case WINBOND:
+			flash.write_page = write_flash_page;
+			printf("Windbond part found\n");
+		break;
+		case SPANSION:
+			flash.write_page = write_flash_page;
+			printf("Spansion part found\n");
+		break;
+
+		default:
+			printf("Unable to determine flash type\n");
+			printf("use the -f option to force\n");
+			exit(1);
+	}
+
+	size = ROM_SIZE;
+	start_addr = 0;
+	buf_start = buf;
+
+	for (i=0;i<size;i++) {
+		buf[i] = 0xff;
+	}
+
+	if (brick_mode != 1) {
+		// Normal image
+		// Skip the 1st 64k of the part and the 
+		// file we loaded
+		size -= EC_CODE_SIZE;
+		start_addr = LINUXBIOS_START;
+		buf_start+= EC_CODE_SIZE;
+
+		printf("Partial modei. Skipping first 64Kib\n");
+	}
+	else {
+		printf("Brick mode. Will operate on the first 64Kib\n");
+	}
+
+	if (erase_it) {
+		put_kbc_in_reset();
+		disable_flash_write_protect();
+		erase_flash(brick_mode);
+		enable_flash_write_protect();
+		exit(0);		
+	} else if (read_it) {
+		if ((image = fopen(filename, "w")) == NULL) {
+			perror(filename);
+			exit(1);
+		}
+
+		put_kbc_in_reset();
+
+		// Reading allways read the entire part
+		read_flash(buf,0,ROM_SIZE);
+
+		fwrite(buf, sizeof(char),ROM_SIZE, image);
+		fclose(image);
+		printf("done\n");
+
+	} else {
+		if ((image = fopen(filename, "r")) == NULL) {
+			perror(filename);
+			exit(1);
+		}
+		printf("Loading 0x%x bytes from %s\r\n",ROM_SIZE,filename);
+		fread(buf, sizeof(char), ROM_SIZE, image);
+		fclose(image);
+	}
+
+	if (write_it) {
+		put_kbc_in_reset();
+		disable_flash_write_protect();
+		erase_flash(brick_mode);
+		write_flash(buf_start,start_addr, size);
+		enable_flash_write_protect();
+		if (auto_verify) {
+			ret |= verify_flash(buf_start,start_addr,size);
+		}
+	}
+
+	if (verify_it) {
+		put_kbc_in_reset();
+		ret |= verify_flash(buf_start,start_addr,size);
+	}
+
+	printf("IMPORTANT! The kbc has been left in reset. You keyboard and mouse WILL NOT WORK until you POWER CYCLE.\n");
+	printf("A warm reboot is NOT good enough.\n");
+	return ret;
+}
+
Index: buildrom/packages/olpcflash/olpcflash.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/olpcflash/olpcflash.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,43 @@
+OLPCFLASH_DIR=$(BUILD_DIR)/olpcflash
+OLPCFLASH_SRC_DIR=$(OLPCFLASH_DIR)/olpcflash
+OLPCFLASH_STAMP_DIR=$(OLPCFLASH_DIR)/stamps
+OLPCFLASH_LOG_DIR=$(OLPCFLASH_DIR)/logs
+
+ifeq ($(CONFIG_VERBOSE),y)
+OLPCFLASH_BUILD_LOG=/dev/stdout
+OLPCFLASH_INSTALL_LOG=/dev/stdout
+else
+OLPCFLASH_BUILD_LOG=$(OLPCFLASH_LOG_DIR)/build.log
+OLPCFLASH_INSTALL_LOG=$(OLPCFLASH_LOG_DIR)/install.log
+endif
+
+$(OLPCFLASH_SRC_DIR)/olpcflash.c: $(PACKAGE_DIR)/olpcflash/Makefile $(PACKAGE_DIR)/olpcflash/olpcflash.c
+	@ mkdir -p $(OLPCFLASH_SRC_DIR)
+	@ cp $(PACKAGE_DIR)/olpcflash/Makefile $(OLPCFLASH_SRC_DIR)
+	@ cp $(PACKAGE_DIR)/olpcflash/olpcflash.c $(OLPCFLASH_SRC_DIR)
+
+$(OLPCFLASH_SRC_DIR)/olpcflash: $(OLPCFLASH_SRC_DIR)/olpcflash.c
+	@ echo "Building olpcflash..."
+	@ $(MAKE) -C $(OLPCFLASH_SRC_DIR) > $(OLPCFLASH_BUILD_LOG) 2>&1
+
+$(INITRD_DIR)/bin/olpcflash: $(OLPCFLASH_SRC_DIR)/olpcflash
+	@ install -d $(INITRD_DIR)/bin
+	@ install -m 0755 $(OLPCFLASH_SRC_DIR)/olpcflash $@
+	@ $(STRIP) $(INITRD_DIR)/bin/olpcflash
+
+$(OLPCFLASH_STAMP_DIR) $(OLPCFLASH_LOG_DIR):
+	@ mkdir -p $@
+
+olpcflash: $(OLPCFLASH_STAMP_DIR) $(OLPCFLASH_LOG_DIR) $(INITRD_DIR)/bin/olpcflash
+
+olpcflash-clean:
+	@ echo "Cleaning olpcflash..."
+	@ $(MAKE) -C $(OLPCFLASH_SRC_DIR) clean > /dev/null 2>&1
+
+olpcflash-distclean:
+	@ rm -rf $(OLPCFLASH_DIR)/*
+
+olpcflash-bom:
+	@ echo "Package: olpcflash"
+	@ echo "Source: (local) buildrom/packages/olpcflash/olpcflash.c"
+	@ echo ""
Index: buildrom/packages/uclibc/conf/defconfig
===================================================================
--- buildrom.orig/packages/uclibc/conf/defconfig	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/packages/uclibc/conf/defconfig	2007-05-01 17:21:24.000000000 -0600
@@ -32,8 +32,8 @@
 # CONFIG_386 is not set
 # CONFIG_486 is not set
 # CONFIG_586 is not set
-# CONFIG_586MMX is not set
-CONFIG_686=y
+CONFIG_586MMX=y
+# CONFIG_686 is not set
 # CONFIG_PENTIUMII is not set
 # CONFIG_PENTIUMIII is not set
 # CONFIG_PENTIUM4 is not set
Index: buildrom/packages/uclibc/uclibc.mk
===================================================================
--- buildrom.orig/packages/uclibc/uclibc.mk	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/packages/uclibc/uclibc.mk	2007-05-01 17:21:24.000000000 -0600
@@ -5,7 +5,7 @@
 UCLIBC_STAMP_DIR=$(UCLIBC_DIR)/stamps
 UCLIBC_LOG_DIR=$(UCLIBC_DIR)/logs
 
-ifeq ($(VERBOSE),y)
+ifeq ($(CONFIG_VERBOSE),y)
 UCLIBC_BUILD_LOG=/dev/stdout
 UCLIBC_INSTALL_LOG=/dev/stdout
 else
@@ -13,11 +13,8 @@
 UCLIBC_INSTALL_LOG=$(UCLIBC_LOG_DIR)/install.log
 endif
 
-ifeq ($(UCLIBC_DYNAMIC),y)
-UCLIBC_TARGET=$(INITRD_DIR)/lib/libc.so.0 $(STAGING_DIR)/bin/ldd
-else
-UCLIBC_TARGET=$(STAGING_DIR)/lib/libc.a $(STAGING_DIR)/bin/ldd
-endif
+# Default, if its not set in the platform config
+UCLIBC_ARCH ?= $(TARGET_ARCH)
 
 $(SOURCE_DIR)/$(UCLIBC_SOURCE):
 	@ mkdir -p $(SOURCE_DIR)
@@ -34,8 +31,9 @@
 $(UCLIBC_SRC_DIR)/lib/libc.a: $(UCLIBC_SRC_DIR)/.config
 	@ echo "Building uclibc..." 
 	@ ( unset CFLAGS; unset LDFLAGS; \
-	$(MAKE) -C $(UCLIBC_SRC_DIR) CC="$(CC)" HOSTCC="$(HOST_CC)" \
-	KERNEL_SOURCE="$(KERNEL_SRC_DIR)" \
+	$(MAKE) -C $(UCLIBC_SRC_DIR) TARGET_ARCH="$(UCLIBC_ARCH)" \
+	CC="$(CC) $(CROSS_CFLAGS)" LD="$(LD) $(CROSS_LDFLAGS)" \
+	HOSTCC="$(HOST_CC)" KERNEL_SOURCE="$(KERNEL_SRC_DIR)" \
 	RUNTIME_PREFIX="/" \
 	SHARED_LIB_LOADER_PATH="/lib" \
 	SHARED_LIB_LOADER_PREFIX="/lib" \
@@ -55,18 +53,10 @@
 	@ install -m 755 -d $(STAGING_DIR)/bin
 	@ install -m 755 $< $@
 
-$(INITRD_DIR)/lib/libc.so.0: $(STAGING_DIR)/lib/libc.a
-	@ install -d $(INITRD_DIR)
-	@ $(MAKE) -C $(UCLIBC_SRC_DIR) \
-	PREFIX=$(INITRD_DIR) \
-	DEVEL_PREFIX=/usr/ \
-	RUNTIME_PREFIX=/ \
-	install_runtime >> $(UCLIBC_INSTALL_LOG) 2>&1
-
 $(UCLIBC_STAMP_DIR) $(UCLIBC_LOG_DIR):
 	@ mkdir -p $@
 
-uclibc: $(UCLIBC_STAMP_DIR) $(UCLIBC_LOG_DIR) $(UCLIBC_TARGET)
+uclibc: $(UCLIBC_STAMP_DIR) $(UCLIBC_LOG_DIR) $(STAGING_DIR)/lib/libc.a
 
 uclibc-clean:
 	@ echo "Cleaning uclibc..."
@@ -75,4 +65,7 @@
 uclibc-distclean:
 	@ rm -rf $(UCLIBC_DIR)/*
 
-.PHONY: uclibc-message
+uclibc-bom:
+	@ echo "Package: uclibc"
+	@ echo "Source: $(UCLIBC_URL)/$(UCLIBC_SOURCE)"
+	@ echo ""
Index: buildrom/packages/unifdef/unifdef.mk
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/packages/unifdef/unifdef.mk	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,51 @@
+UNIFDEF_URL=http://www.cs.cmu.edu/~ajw/public/dist/
+UNIFDEF_SOURCE=unifdef-1.0.tar.gz
+UNIFDEF_DIR=$(BUILD_DIR)/unifdef
+UNIFDEF_SRC_DIR=$(UNIFDEF_DIR)/unifdef-1.0
+UNIFDEF_STAMP_DIR=$(UNIFDEF_DIR)/stamps
+UNIFDEF_LOG_DIR=$(UNIFDEF_DIR)/logs
+
+ifeq ($(CONFIG_VERBOSE),y)
+UNIFDEF_BUILD_LOG=/dev/stdout
+UNIFDEF_CONFIG_LOG=/dev/stdout
+else
+UNIFDEF_BUILD_LOG=$(UNIFDEF_LOG_DIR)/build.log
+UNIFDEF_CONFIG_LOG=$(UNIFDEF_LOG_DIR)/config.log
+endif
+
+$(SOURCE_DIR)/$(UNIFDEF_SOURCE):
+	@ mkdir -p $(SOURCE_DIR)
+	@ wget -P $(SOURCE_DIR) $(UNIFDEF_URL)/$(UNIFDEF_SOURCE)
+
+$(UNIFDEF_STAMP_DIR)/.unpacked: $(SOURCE_DIR)/$(UNIFDEF_SOURCE)
+	@ tar -C $(UNIFDEF_DIR) -zxf $(SOURCE_DIR)/$(UNIFDEF_SOURCE)
+	@ rm -f $(UNIFDEF_SRC_DIR)/unifdef 
+	@ rm -f $(UNIFDEF_SRC_DIR)/unifdef.o
+	@ touch $@	
+
+$(UNIFDEF_SRC_DIR)/unifdef: $(UNIFDEF_STAMP_DIR) $(UNIFDEF_LOG_DIR) $(UNIFDEF_STAMP_DIR)/.unpacked
+	@ echo "Building unifdef (host)..."
+	@ $(MAKE) -C $(UNIFDEF_SRC_DIR) CC=$(HOST_CC) > $(UNIFDEF_BUILD_LOG) 2>&1
+
+
+$(STAGING_DIR)/host/bin/unifdef: $(UNIFDEF_SRC_DIR)/unifdef
+	@ install -d $(STAGING_DIR)/host/bin
+	@ install -m 0755 $< $@
+
+$(UNIFDEF_STAMP_DIR) $(UNIFDEF_LOG_DIR):
+	@ mkdir -p $@
+
+unifdef: $(STAGING_DIR)/host/bin/unifdef
+
+unifdef-clean:
+	@ $(MAKE) -C $(UNIFDEF_SRC_DIR) clean > /dev/null 2>&1
+
+unifdef-distclean:
+	@ rm -rf $(UNIFDEF_DIR)/*
+
+unifdef-bom:
+	echo "Package: unifdef"
+	echo "Source: $(UNIFDEF_URL)/$(UNIFDEF_SOURCE)"
+	echo ""
+
+.PHONY: unifdef
Index: buildrom/packages/wireless-tools/wireless-tools.mk
===================================================================
--- buildrom.orig/packages/wireless-tools/wireless-tools.mk	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/packages/wireless-tools/wireless-tools.mk	2007-05-01 17:21:24.000000000 -0600
@@ -57,4 +57,12 @@
 wireless-tools-distclean:
 	@ rm -rf $(WIRELESS_DIR)/*
 
-.PHONY: wireless-tools
+wireless-tools-bom:
+	@ echo "Package: wireless-tools"
+	@ echo "Source: $(WIRELESS_URL)/$(WIRELESS_SOURCE)"
+	@ echo -n "Patches: "
+	@ for file in $(WIRELESS_PATCH); do \
+		echo -n `basename $$file`; \
+	done
+	@ echo ""
+	@ echo ""
Index: buildrom/README
===================================================================
--- buildrom.orig/README	2007-05-01 14:29:44.000000000 -0600
+++ buildrom/README	2007-05-01 17:21:24.000000000 -0600
@@ -5,23 +5,64 @@
 
 Introduction
 
-This is a simple makefile system that designed to build a ROM image for
-the OLPC board.  The intention is to build a minimal kernel, an initrd and
-the ROM all together with one step rather then the 6 or 8 individual steps
-one would take now.
+This is a simple makefile system that designed to build a ROM image for 
+LinuxBIOS based systems.  This system allows one to choose one of several
+different payloads for a variety of platforms.  The intention of buildROM
+is to build everythign together with one step, rather then the 6 or 8 
+individual steps that it would hae taken previously.
 
-HOWTO
+Payloads
+
+BuildROM supports 7 different payload configurations:
+
+* Custom - Allows you to specify an external ELF file
+* Etherboot
+* FILO
+* Kernel - build a kernel payload (just the kernel - no initramfs)
+* LAB - Build a kernel plus a Linux As Bootloader initramfs attached to it
+* OFW - Open Firmware 
+* Memtest - Memtest86
+
+Configuration
+
+To configure the system, type 'make oldconfig', and answer the questions.
+
+CONFIG_VERBOSE - show build output on stdout instead of a log file
+CONFIG_ADVANCED - select some advanced options:
+  CONFIG_USE_LZMA - Compress payloads with LZMA (requires LB support)
+  CONFIG_LB_USE_BUILD - Say 'y' here to specify an existing build 
+                        directory for LinuxBIOS.  This is useful if you
+			want build out of your development tree.  
+  CONFIG_LB_BUILDDIR - Specify your remote LinuxBIOS build directory here
+
+Some of the payload options have their own configuration:
+
+Custom:
+  CONFIG_CUSTOM_PAYLOAD - specify a filename for the custom payload
+
+Kernel:
+  CONFIG_CMDLINE - Specify a command line to use for the kernel build
+
+LaB:
+  CONFIG_KBL_KEXEC_ONLY - Build only the Kexec part of the KBL
+  CONFIG_KBL - Build Marcelo Toscatti's kernel boot loader
+  CONFIG_BUSYBOX - Build busybox
+  CONFIG_BOOTMENU - Build the OLPC bootmenu
+  CONFIG_OLPCFLASH - Build the 'olpcflash' utility
+
+memtest:
+  CONFIG_MEMTEST_SERIAL - say 'y' here to enable serial output for memtest
+
+etherboot:
+  CONFIG_ETHERBOOT_DRIVER - specify the name of the NIC driver for etherboot,
+  i.e 'natsemi'
+
+
+Building the ROM
 
 To run the system, type 'make'.  You'll need a connection to the net to
 suck down tarballs for the individual packages.  
 
-Currently - the system will build the following packages (in order):
+The end result is a .rom file in the deploy/ directory.
 
-uclibc
-busybox
-wireless-tools
-kernel
-mkelfImage
 
-The end result is a .elf file in the deploy/ directory, suitable for adding
-as the payload of a LinuxBIOS build.
Index: buildrom/README.signature
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/README.signature	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,35 @@
+Description of the fimrware signature
+
+Pulled from http://dev.laptop.org/ticket/153.
+
+Here's the format:
+
+At offset f.ffc0 in FLASH:
+BW2   Q1A82  Q1A
+------.....  ---
+  |     |     |
+  |     |     |---First 3 characters of revision
+  |     |
+  |     |---Revision
+  |
+  |--- Model
+
+Revision is:
+
+Q - Manufacturer, i.e. Quanta
+1 - board revision number
+A - Major firmware revision
+82- Minor firmware revision
+
+------- Quanta describes their release sequence:
+
+Let me explain our ISO sequence: Qxxxx First x: 1 for A test, 2 for B test, 3 for C test Second x: A~Z: milestone Third x: 1~9: change when test team release to customer, manufacture (outside R&D) Forth x: 1~9: change when sw team release to test team.(inside R&D)
+
+Take EC as example: Q1A11 when sw team release to test team. Test team find some problems, can not relase out Q1A12 when sw team fix the problem and release to test team again Test team test OK, and release out
+
+Next version sw team release will be Q1A21
+
+As I mentioned we will use file name to distinguish the release.
+
+EC release will be PQ1A21.bin (Leading by P) BIOS release will be BQ2A11.bin (leading by B) 
+
Index: buildrom/scripts/Build.settings
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/Build.settings	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,73 @@
+# Set any settings that remain unset from the configuration
+
+# Borrowed from the kernel
+
+try-run= $(shell set -e; \
+	   TMP=".$$$$.tmp"; \
+	   if ($(1)) > /dev/null 2>&1; \
+	   then echo "$(2)"; \
+	   else echo "$(3)"; \
+	   fi; rm -rf "$$TMP")
+
+cc-option= $(call try-run,\
+	$(CC) $(1) -S -xc /dev/null -o "$$TMP", $(1), $(2))
+
+CC ?= gcc
+STRIP ?= strip
+AS ?= as
+LC ?= ld
+
+BUILD_ARCH=$(shell uname -m)
+
+CROSS_CFLAGS=
+CROSS_ASFLAGS=
+CROSS_LDFLAGS=
+
+ifeq ($(BUILD_ARCH),x86_64)
+ifneq ($(BUILD_ARCH), $(TARGET_ARCH))
+CROSS_ASFLAGS=-m32
+CROSS_CFLAGS=-m32
+CROSS_LDFLAGS=-melf_i386
+endif
+endif
+
+# Get the GCC version
+
+GCCVER:=$(shell $(CC) --version | head -n 1 | awk '{print $$3}')
+GCCMAJ:=$(word 1, $(subst ., ,$(GCCVER)))
+GCCMIN:=$(word 2, $(subst ., ,$(GCCVER)))
+
+# Do a bit of groking of the GCC params
+
+GCCDIR:=$(shell $(CC) --print-search-dirs | grep install | awk '{print $$2}')
+LIBGCC:=$(shell $(CC) $(CROSS_CFLAGS) -print-libgcc-file-name)
+
+CFLAGS:=-nostdinc $(CROSS_CFLAGS) $(CFLAGS_platform) -Os -isystem $(STAGING_DIR)/include \
+-isystem $(GCCDIR)/include
+
+ASFLAGS=$(CROSS_ASFLAGS) $(ASFLAGS_platform)
+
+STACKPROTECT += $(call cc-option, -fno-stack-protector,)
+CFLAGS += $(STACKPROTECT)
+
+# Borrowed from busybox
+STRIPCMD := $(STRIP) -s --remove-section=.note --remove-section=.comment
+
+# This extra variable is needed because we need the original LDFLAGS
+# (without any cross flags) for at least busybox, and probably others too
+
+LDFLAGS_orig = -nostdlib -L$(STAGING_DIR)/lib \
+-Wl,-rpath-link,$(STAGING_DIR)/lib -Wl,--dynamic-linker,/lib/ld-uClibc.so.0 \
+$(LDFLAGS_platform)
+
+LDFLAGS=$(CROSS_LDFLAGS) $(LDFLAGS_orig)
+
+LIBS = $(STAGING_DIR)/lib/crt1.o -lc $(LIBGCC)
+
+HOST_CC=gcc
+HOST_CFLAGS=
+HOST_LDFLAGS=
+
+HOSTCC=$(HOST_CC)
+
+export CC CFLAGS LDFLAGS ASFLAGS LIBS
Index: buildrom/scripts/defconfig
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/defconfig	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,41 @@
+#
+# Automatically generated make config: don't edit
+# Busybox version: 
+# Wed Mar 14 15:09:23 2007
+#
+CONFIG_HAVE_DOT_CONFIG=y
+# CONFIG_VERBOSE is not set
+# CONFIG_ADVANCED is not set
+
+#
+# LinuxBIOS configuration
+#
+CONFIG_USE_LZMA=y
+# CONFIG_LB_USE_BUILD is not set
+CONFIG_LB_BUILDDIR=""
+CONFIG_PLATFORM=y
+CONFIG_PAYLOAD=y
+
+#
+# Platform Configuration
+#
+CONFIG_PLATFORM_NORWICH=y
+# CONFIG_PLATFORM_OLPC is not set
+
+#
+# Payload Configuration
+#
+CONFIG_PAYLOAD_LAB=y
+# CONFIG_PAYLOAD_OFW is not set
+# CONFIG_PAYLOAD_ETHERBOOT is not set
+# CONFIG_PAYLOAD_MEMTEST is not set
+
+#
+# LAB Configuration
+#
+CONFIG_KBL_KEXEC_ONLY=y
+CONFIG_KBL=y
+CONFIG_BUSYBOX=y
+CONFIG_BOOTMENU=y
+# CONFIG_OLPCFLASH is not set
+# CONFIG_MEMTEST_SERIAL is not set
Index: buildrom/scripts/kconfig/conf.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/conf.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,612 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/stat.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static void conf(struct menu *menu);
+static void check_conf(struct menu *menu);
+
+enum {
+	ask_all,
+	ask_new,
+	ask_silent,
+	set_default,
+	set_yes,
+	set_mod,
+	set_no,
+	set_random
+} input_mode = ask_all;
+char *defconfig_file;
+
+static int indent = 1;
+static int valid_stdin = 1;
+static int conf_cnt;
+static char line[128];
+static struct menu *rootEntry;
+
+static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
+
+static void strip(char *str)
+{
+	char *p = str;
+	int l;
+
+	while ((isspace(*p)))
+		p++;
+	l = strlen(p);
+	if (p != str)
+		memmove(str, p, l + 1);
+	if (!l)
+		return;
+	p = str + l - 1;
+	while ((isspace(*p)))
+		*p-- = 0;
+}
+
+static void check_stdin(void)
+{
+	if (!valid_stdin && input_mode == ask_silent) {
+		printf(_("aborted!\n\n"));
+		printf(_("Console input/output is redirected. "));
+		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
+		exit(1);
+	}
+}
+
+static void conf_askvalue(struct symbol *sym, const char *def)
+{
+	enum symbol_type type = sym_get_type(sym);
+	tristate val;
+
+	if (!sym_has_value(sym))
+		printf("(NEW) ");
+
+	line[0] = '\n';
+	line[1] = 0;
+
+	if (!sym_is_changable(sym)) {
+		printf("%s\n", def);
+		line[0] = '\n';
+		line[1] = 0;
+		return;
+	}
+
+	switch (input_mode) {
+	case set_no:
+	case set_mod:
+	case set_yes:
+	case set_random:
+		if (sym_has_value(sym)) {
+			printf("%s\n", def);
+			return;
+		}
+		break;
+	case ask_new:
+	case ask_silent:
+		if (sym_has_value(sym)) {
+			printf("%s\n", def);
+			return;
+		}
+		check_stdin();
+	case ask_all:
+		fflush(stdout);
+		fgets(line, 128, stdin);
+		return;
+	case set_default:
+		printf("%s\n", def);
+		return;
+	default:
+		break;
+	}
+
+	switch (type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		printf("%s\n", def);
+		return;
+	default:
+		;
+	}
+	switch (input_mode) {
+	case set_yes:
+		if (sym_tristate_within_range(sym, yes)) {
+			line[0] = 'y';
+			line[1] = '\n';
+			line[2] = 0;
+			break;
+		}
+	case set_mod:
+		if (type == S_TRISTATE) {
+			if (sym_tristate_within_range(sym, mod)) {
+				line[0] = 'm';
+				line[1] = '\n';
+				line[2] = 0;
+				break;
+			}
+		} else {
+			if (sym_tristate_within_range(sym, yes)) {
+				line[0] = 'y';
+				line[1] = '\n';
+				line[2] = 0;
+				break;
+			}
+		}
+	case set_no:
+		if (sym_tristate_within_range(sym, no)) {
+			line[0] = 'n';
+			line[1] = '\n';
+			line[2] = 0;
+			break;
+		}
+	case set_random:
+		do {
+			val = (tristate)(random() % 3);
+		} while (!sym_tristate_within_range(sym, val));
+		switch (val) {
+		case no: line[0] = 'n'; break;
+		case mod: line[0] = 'm'; break;
+		case yes: line[0] = 'y'; break;
+		}
+		line[1] = '\n';
+		line[2] = 0;
+		break;
+	default:
+		break;
+	}
+	printf("%s", line);
+}
+
+int conf_string(struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	const char *def, *help;
+
+	while (1) {
+		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		printf("(%s) ", sym->name);
+		def = sym_get_string_value(sym);
+		if (sym_get_string_value(sym))
+			printf("[%s] ", def);
+		conf_askvalue(sym, def);
+		switch (line[0]) {
+		case '\n':
+			break;
+		case '?':
+			/* print help */
+			if (line[1] == '\n') {
+				help = nohelp_text;
+				if (menu->sym->help)
+					help = menu->sym->help;
+				printf("\n%s\n", menu->sym->help);
+				def = NULL;
+				break;
+			}
+		default:
+			line[strlen(line)-1] = 0;
+			def = line;
+		}
+		if (def && sym_set_string_value(sym, def))
+			return 0;
+	}
+}
+
+static int conf_sym(struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	int type;
+	tristate oldval, newval;
+	const char *help;
+
+	while (1) {
+		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		if (sym->name)
+			printf("(%s) ", sym->name);
+		type = sym_get_type(sym);
+		putchar('[');
+		oldval = sym_get_tristate_value(sym);
+		switch (oldval) {
+		case no:
+			putchar('N');
+			break;
+		case mod:
+			putchar('M');
+			break;
+		case yes:
+			putchar('Y');
+			break;
+		}
+		if (oldval != no && sym_tristate_within_range(sym, no))
+			printf("/n");
+		if (oldval != mod && sym_tristate_within_range(sym, mod))
+			printf("/m");
+		if (oldval != yes && sym_tristate_within_range(sym, yes))
+			printf("/y");
+		if (sym->help)
+			printf("/?");
+		printf("] ");
+		conf_askvalue(sym, sym_get_string_value(sym));
+		strip(line);
+
+		switch (line[0]) {
+		case 'n':
+		case 'N':
+			newval = no;
+			if (!line[1] || !strcmp(&line[1], "o"))
+				break;
+			continue;
+		case 'm':
+		case 'M':
+			newval = mod;
+			if (!line[1])
+				break;
+			continue;
+		case 'y':
+		case 'Y':
+			newval = yes;
+			if (!line[1] || !strcmp(&line[1], "es"))
+				break;
+			continue;
+		case 0:
+			newval = oldval;
+			break;
+		case '?':
+			goto help;
+		default:
+			continue;
+		}
+		if (sym_set_tristate_value(sym, newval))
+			return 0;
+help:
+		help = nohelp_text;
+		if (sym->help)
+			help = sym->help;
+		printf("\n%s\n", help);
+	}
+}
+
+static int conf_choice(struct menu *menu)
+{
+	struct symbol *sym, *def_sym;
+	struct menu *child;
+	int type;
+	bool is_new;
+
+	sym = menu->sym;
+	type = sym_get_type(sym);
+	is_new = !sym_has_value(sym);
+	if (sym_is_changable(sym)) {
+		conf_sym(menu);
+		sym_calc_value(sym);
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			return 1;
+		case mod:
+			return 0;
+		case yes:
+			break;
+		}
+	} else {
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			return 1;
+		case mod:
+			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+			return 0;
+		case yes:
+			break;
+		}
+	}
+
+	while (1) {
+		int cnt, def;
+
+		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+		def_sym = sym_get_choice_value(sym);
+		cnt = def = 0;
+		line[0] = 0;
+		for (child = menu->list; child; child = child->next) {
+			if (!menu_is_visible(child))
+				continue;
+			if (!child->sym) {
+				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+				continue;
+			}
+			cnt++;
+			if (child->sym == def_sym) {
+				def = cnt;
+				printf("%*c", indent, '>');
+			} else
+				printf("%*c", indent, ' ');
+			printf(" %d. %s", cnt, menu_get_prompt(child));
+			if (child->sym->name)
+				printf(" (%s)", child->sym->name);
+			if (!sym_has_value(child->sym))
+				printf(" (NEW)");
+			printf("\n");
+		}
+		printf("%*schoice", indent - 1, "");
+		if (cnt == 1) {
+			printf("[1]: 1\n");
+			goto conf_childs;
+		}
+		printf("[1-%d", cnt);
+		if (sym->help)
+			printf("?");
+		printf("]: ");
+		switch (input_mode) {
+		case ask_new:
+		case ask_silent:
+			if (!is_new) {
+				cnt = def;
+				printf("%d\n", cnt);
+				break;
+			}
+			check_stdin();
+		case ask_all:
+			fflush(stdout);
+			fgets(line, 128, stdin);
+			strip(line);
+			if (line[0] == '?') {
+				printf("\n%s\n", menu->sym->help ?
+					menu->sym->help : nohelp_text);
+				continue;
+			}
+			if (!line[0])
+				cnt = def;
+			else if (isdigit(line[0]))
+				cnt = atoi(line);
+			else
+				continue;
+			break;
+		case set_random:
+			def = (random() % cnt) + 1;
+		case set_default:
+		case set_yes:
+		case set_mod:
+		case set_no:
+			cnt = def;
+			printf("%d\n", cnt);
+			break;
+		}
+
+	conf_childs:
+		for (child = menu->list; child; child = child->next) {
+			if (!child->sym || !menu_is_visible(child))
+				continue;
+			if (!--cnt)
+				break;
+		}
+		if (!child)
+			continue;
+		if (strlen(line) > 0 && line[strlen(line) - 1] == '?') {
+			printf("\n%s\n", child->sym->help ?
+				child->sym->help : nohelp_text);
+			continue;
+		}
+		sym_set_choice_value(sym, child->sym);
+		if (child->list) {
+			indent += 2;
+			conf(child->list);
+			indent -= 2;
+		}
+		return 1;
+	}
+}
+
+static void conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (prop) {
+		const char *prompt;
+
+		switch (prop->type) {
+		case P_MENU:
+			if (input_mode == ask_silent && rootEntry != menu) {
+				check_conf(menu);
+				return;
+			}
+		case P_COMMENT:
+			prompt = menu_get_prompt(menu);
+			if (prompt)
+				printf("%*c\n%*c %s\n%*c\n",
+					indent, '*',
+					indent, '*', prompt,
+					indent, '*');
+		default:
+			;
+		}
+	}
+
+	if (!sym)
+		goto conf_childs;
+
+	if (sym_is_choice(sym)) {
+		conf_choice(menu);
+		if (sym->curr.tri != mod)
+			return;
+		goto conf_childs;
+	}
+
+	switch (sym->type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		conf_string(menu);
+		break;
+	default:
+		conf_sym(menu);
+		break;
+	}
+
+conf_childs:
+	if (sym)
+		indent += 2;
+	for (child = menu->list; child; child = child->next)
+		conf(child);
+	if (sym)
+		indent -= 2;
+}
+
+static void check_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct menu *child;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	if (sym && !sym_has_value(sym)) {
+		if (sym_is_changable(sym) ||
+		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
+			if (!conf_cnt++)
+				printf(_("*\n* Restart config...\n*\n"));
+			rootEntry = menu_get_parent_menu(menu);
+			conf(rootEntry);
+		}
+	}
+
+	for (child = menu->list; child; child = child->next)
+		check_conf(child);
+}
+
+int main(int ac, char **av)
+{
+	int i = 1;
+	const char *name;
+	struct stat tmpstat;
+
+	if (ac > i && av[i][0] == '-') {
+		switch (av[i++][1]) {
+		case 'o':
+			input_mode = ask_new;
+			break;
+		case 's':
+			input_mode = ask_silent;
+			valid_stdin = isatty(0) && isatty(1) && isatty(2);
+			break;
+		case 'd':
+			input_mode = set_default;
+			break;
+		case 'D':
+			input_mode = set_default;
+			defconfig_file = av[i++];
+			if (!defconfig_file) {
+				printf(_("%s: No default config file specified\n"),
+					av[0]);
+				exit(1);
+			}
+			break;
+		case 'n':
+			input_mode = set_no;
+			break;
+		case 'm':
+			input_mode = set_mod;
+			break;
+		case 'y':
+			input_mode = set_yes;
+			break;
+		case 'r':
+			input_mode = set_random;
+			srandom(time(NULL));
+			break;
+		case 'h':
+		case '?':
+			fprintf(stderr, "See README for usage info\n");
+			exit(0);
+		}
+	}
+  	name = av[i];
+	if (!name) {
+		printf(_("%s: Kconfig file missing\n"), av[0]);
+	}
+	conf_parse(name);
+	//zconfdump(stdout);
+	switch (input_mode) {
+	case set_default:
+		if (!defconfig_file)
+			defconfig_file = conf_get_default_confname();
+		if (conf_read(defconfig_file)) {
+			printf("***\n"
+				"*** Can't find default configuration \"%s\"!\n"
+				"***\n", defconfig_file);
+			exit(1);
+		}
+		break;
+	case ask_silent:
+		if (stat(".config", &tmpstat)) {
+			printf(_("***\n"
+				"*** You have not yet configured buildrom!\n"
+				"***\n"
+				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+				"*** \"make menuconfig\" or \"make defconfig\").\n"
+				"***\n"));
+			exit(1);
+		}
+	case ask_all:
+	case ask_new:
+		conf_read(NULL);
+		break;
+	case set_no:
+	case set_mod:
+	case set_yes:
+	case set_random:
+		name = getenv("KCONFIG_ALLCONFIG");
+		if (name && !stat(name, &tmpstat)) {
+			conf_read_simple(name);
+			break;
+		}
+		switch (input_mode) {
+		case set_no:	 name = "allno.config"; break;
+		case set_mod:	 name = "allmod.config"; break;
+		case set_yes:	 name = "allyes.config"; break;
+		case set_random: name = "allrandom.config"; break;
+		default: break;
+		}
+		if (!stat(name, &tmpstat))
+			conf_read_simple(name);
+		else if (!stat("all.config", &tmpstat))
+			conf_read_simple("all.config");
+		break;
+	default:
+		break;
+	}
+
+	if (input_mode != ask_silent) {
+		rootEntry = &rootmenu;
+		conf(&rootmenu);
+		if (input_mode == ask_all) {
+			input_mode = ask_silent;
+			valid_stdin = 1;
+		}
+	}
+	do {
+		conf_cnt = 0;
+		check_conf(&rootmenu);
+	} while (conf_cnt);
+	if (conf_write(NULL)) {
+		fprintf(stderr, _("\n*** Error during writing of the buildrom configuration.\n\n"));
+		return 1;
+	}
+	return 0;
+}
Index: buildrom/scripts/kconfig/confdata.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/confdata.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,567 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <sys/stat.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static void conf_warning(const char *fmt, ...)
+	__attribute__ ((format (printf, 1, 2)));
+
+static const char *conf_filename;
+static int conf_lineno, conf_warnings, conf_unsaved;
+
+const char conf_def_filename[] = ".config";
+
+const char conf_defname[] = "scripts/defconfig";
+
+const char *conf_confnames[] = {
+	".config",
+	NULL,
+};
+
+static void conf_warning(const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+	conf_warnings++;
+}
+
+static char *conf_expand_value(const char *in)
+{
+	struct symbol *sym;
+	const char *src;
+	static char res_value[SYMBOL_MAXLENGTH];
+	char *dst, name[SYMBOL_MAXLENGTH];
+
+	res_value[0] = 0;
+	dst = name;
+	while ((src = strchr(in, '$'))) {
+		strncat(res_value, in, src - in);
+		src++;
+		dst = name;
+		while (isalnum(*src) || *src == '_')
+			*dst++ = *src++;
+		*dst = 0;
+		sym = sym_lookup(name, 0);
+		sym_calc_value(sym);
+		strcat(res_value, sym_get_string_value(sym));
+		in = src;
+	}
+	strcat(res_value, in);
+
+	return res_value;
+}
+
+char *conf_get_default_confname(void)
+{
+	struct stat buf;
+	static char fullname[PATH_MAX+1];
+	char *env, *name;
+
+	name = conf_expand_value(conf_defname);
+	env = getenv(SRCTREE);
+	if (env) {
+		sprintf(fullname, "%s/%s", env, name);
+		if (!stat(fullname, &buf))
+			return fullname;
+	}
+	return name;
+}
+
+int conf_read_simple(const char *name)
+{
+	FILE *in = NULL;
+	char line[1024];
+	char *p, *p2;
+	struct symbol *sym;
+	int i;
+
+	if (name) {
+		in = zconf_fopen(name);
+	} else {
+		const char **names = conf_confnames;
+		while ((name = *names++)) {
+			name = conf_expand_value(name);
+			in = zconf_fopen(name);
+			if (in) {
+				printf(_("#\n"
+				         "# using defaults found in %s\n"
+				         "#\n"), name);
+				break;
+			}
+		}
+	}
+	if (!in)
+		return 1;
+
+	conf_filename = name;
+	conf_lineno = 0;
+	conf_warnings = 0;
+	conf_unsaved = 0;
+
+	for_all_symbols(i, sym) {
+		sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED;
+		if (sym_is_choice(sym))
+			sym->flags &= ~SYMBOL_NEW;
+		sym->flags &= ~SYMBOL_VALID;
+		switch (sym->type) {
+		case S_INT:
+		case S_HEX:
+		case S_STRING:
+			if (sym->user.val)
+				free(sym->user.val);
+		default:
+			sym->user.val = NULL;
+			sym->user.tri = no;
+		}
+	}
+
+	while (fgets(line, sizeof(line), in)) {
+		conf_lineno++;
+		sym = NULL;
+		switch (line[0]) {
+		case '#':
+			if (memcmp(line + 2, "CONFIG_", 7))
+				continue;
+			p = strchr(line + 9, ' ');
+			if (!p)
+				continue;
+			*p++ = 0;
+			if (strncmp(p, "is not set", 10))
+				continue;
+			sym = sym_find(line + 9);
+			if (!sym) {
+				conf_warning("trying to assign nonexistent symbol %s", line + 9);
+				break;
+			} else if (!(sym->flags & SYMBOL_NEW)) {
+				conf_warning("trying to reassign symbol %s", sym->name);
+				break;
+			}
+			switch (sym->type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				sym->user.tri = no;
+				sym->flags &= ~SYMBOL_NEW;
+				break;
+			default:
+				;
+			}
+			break;
+		case 'C':
+			if (memcmp(line, "CONFIG_", 7)) {
+				conf_warning("unexpected data");
+				continue;
+			}
+			p = strchr(line + 7, '=');
+			if (!p)
+				continue;
+			*p++ = 0;
+			p2 = strchr(p, '\n');
+			if (p2)
+				*p2 = 0;
+			sym = sym_find(line + 7);
+			if (!sym) {
+				conf_warning("trying to assign nonexistent symbol %s", line + 7);
+				break;
+			} else if (!(sym->flags & SYMBOL_NEW)) {
+				conf_warning("trying to reassign symbol %s", sym->name);
+				break;
+			}
+			switch (sym->type) {
+			case S_TRISTATE:
+				if (p[0] == 'm') {
+					sym->user.tri = mod;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+			case S_BOOLEAN:
+				if (p[0] == 'y') {
+					sym->user.tri = yes;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+				if (p[0] == 'n') {
+					sym->user.tri = no;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+				conf_warning("symbol value '%s' invalid for %s", p, sym->name);
+				break;
+			case S_STRING:
+				if (*p++ != '"')
+					break;
+				for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
+					if (*p2 == '"') {
+						*p2 = 0;
+						break;
+					}
+					memmove(p2, p2 + 1, strlen(p2));
+				}
+				if (!p2) {
+					conf_warning("invalid string found");
+					continue;
+				}
+			case S_INT:
+			case S_HEX:
+				if (sym_string_valid(sym, p)) {
+					sym->user.val = strdup(p);
+					sym->flags &= ~SYMBOL_NEW;
+				} else {
+					conf_warning("symbol value '%s' invalid for %s", p, sym->name);
+					continue;
+				}
+				break;
+			default:
+				;
+			}
+			break;
+		case '\n':
+			break;
+		default:
+			conf_warning("unexpected data");
+			continue;
+		}
+		if (sym && sym_is_choice_value(sym)) {
+			struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+			switch (sym->user.tri) {
+			case no:
+				break;
+			case mod:
+				if (cs->user.tri == yes) {
+					conf_warning("%s creates inconsistent choice state", sym->name);
+					cs->flags |= SYMBOL_NEW;
+				}
+				break;
+			case yes:
+				if (cs->user.tri != no) {
+					conf_warning("%s creates inconsistent choice state", sym->name);
+					cs->flags |= SYMBOL_NEW;
+				} else
+					cs->user.val = sym;
+				break;
+			}
+			cs->user.tri = E_OR(cs->user.tri, sym->user.tri);
+		}
+	}
+	fclose(in);
+
+	if (modules_sym)
+		sym_calc_value(modules_sym);
+	return 0;
+}
+
+int conf_read(const char *name)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *e;
+	int i;
+
+	if (conf_read_simple(name))
+		return 1;
+
+	for_all_symbols(i, sym) {
+		sym_calc_value(sym);
+		if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
+			goto sym_ok;
+		if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
+			/* check that calculated value agrees with saved value */
+			switch (sym->type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				if (sym->user.tri != sym_get_tristate_value(sym))
+					break;
+				if (!sym_is_choice(sym))
+					goto sym_ok;
+			default:
+				if (!strcmp(sym->curr.val, sym->user.val))
+					goto sym_ok;
+				break;
+			}
+		} else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE))
+			/* no previous value and not saved */
+			goto sym_ok;
+		conf_unsaved++;
+		/* maybe print value in verbose mode... */
+	sym_ok:
+		if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
+			if (sym->visible == no)
+				sym->flags |= SYMBOL_NEW;
+			switch (sym->type) {
+			case S_STRING:
+			case S_INT:
+			case S_HEX:
+				if (!sym_string_within_range(sym, sym->user.val)) {
+					sym->flags |= SYMBOL_NEW;
+					sym->flags &= ~SYMBOL_VALID;
+				}
+			default:
+				break;
+			}
+		}
+		if (!sym_is_choice(sym))
+			continue;
+		prop = sym_get_choice_prop(sym);
+		for (e = prop->expr; e; e = e->left.expr)
+			if (e->right.sym->visible != no)
+				sym->flags |= e->right.sym->flags & SYMBOL_NEW;
+	}
+
+	sym_change_count = conf_warnings || conf_unsaved;
+
+	return 0;
+}
+
+int conf_write(const char *name)
+{
+	FILE *out, *out_h;
+	struct symbol *sym;
+	struct menu *menu;
+	const char *basename;
+	char dirname[128], tmpname[128], newname[128];
+	int type, l;
+	const char *str;
+	time_t now;
+	int use_timestamp = 1;
+	char *env;
+
+	dirname[0] = 0;
+	if (name && name[0]) {
+		struct stat st;
+		char *slash;
+
+		if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
+			strcpy(dirname, name);
+			strcat(dirname, "/");
+			basename = conf_def_filename;
+		} else if ((slash = strrchr(name, '/'))) {
+			int size = slash - name + 1;
+			memcpy(dirname, name, size);
+			dirname[size] = 0;
+			if (slash[1])
+				basename = slash + 1;
+			else
+				basename = conf_def_filename;
+		} else
+			basename = name;
+	} else
+		basename = conf_def_filename;
+
+	sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid());
+	out = fopen(newname, "w");
+	if (!out)
+		return 1;
+	out_h = NULL;
+	if (!name) {
+		out_h = fopen(".tmpconfig.h", "w");
+		if (!out_h)
+			return 1;
+		file_write_dep(NULL);
+	}
+	sym = sym_lookup("KERNELVERSION", 0);
+	sym_calc_value(sym);
+	time(&now);
+	env = getenv("KCONFIG_NOTIMESTAMP");
+	if (env && *env)
+		use_timestamp = 0;
+
+	fprintf(out, _("#\n"
+		       "# Automatically generated make config: don't edit\n"
+		       "# Buildrom version: %s\n"
+		       "%s%s"
+		       "#\n"),
+		     sym_get_string_value(sym),
+		     use_timestamp ? "# " : "",
+		     use_timestamp ? ctime(&now) : "");
+	if (out_h) {
+		char buf[sizeof("#define AUTOCONF_TIMESTAMP "
+				"\"YYYY-MM-DD HH:MM:SS some_timezone\"\n")];
+		buf[0] = '\0';
+		if (use_timestamp) {
+			size_t ret = \
+				strftime(buf, sizeof(buf), "#define AUTOCONF_TIMESTAMP "
+					"\"%Y-%m-%d %H:%M:%S %Z\"\n", localtime(&now));
+			/* if user has Factory timezone or some other odd install, the
+			 * %Z above will overflow the string leaving us with undefined
+			 * results ... so let's try again without the timezone.
+			 */
+			if (ret == 0)
+				strftime(buf, sizeof(buf), "#define AUTOCONF_TIMESTAMP "
+					"\"%Y-%m-%d %H:%M:%S\"\n", localtime(&now));
+		}
+		fprintf(out_h, "/*\n"
+			       " * Automatically generated C config: don't edit\n"
+			       " * Buildrom version: %s\n"
+			       " */\n"
+			       "%s"
+			       "\n",
+			       sym_get_string_value(sym),
+			       buf);
+	}
+	if (!sym_change_count)
+		sym_clear_all_valid();
+
+	menu = rootmenu.list;
+	while (menu) {
+		sym = menu->sym;
+		if (!sym) {
+			if (!menu_is_visible(menu))
+				goto next;
+			str = menu_get_prompt(menu);
+			fprintf(out, "\n"
+				     "#\n"
+				     "# %s\n"
+				     "#\n", str);
+			if (out_h)
+				fprintf(out_h, "\n"
+					       "/*\n"
+					       " * %s\n"
+					       " */\n", str);
+		} else if (!(sym->flags & SYMBOL_CHOICE)) {
+			sym_calc_value(sym);
+/* bbox: we want to all syms
+			if (!(sym->flags & SYMBOL_WRITE))
+				goto next;
+*/
+			sym->flags &= ~SYMBOL_WRITE;
+			type = sym->type;
+			if (type == S_TRISTATE) {
+				sym_calc_value(modules_sym);
+				if (modules_sym->curr.tri == no)
+					type = S_BOOLEAN;
+			}
+			switch (type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				switch (sym_get_tristate_value(sym)) {
+				case no:
+					fprintf(out, "# CONFIG_%s is not set\n", sym->name);
+					if (out_h) {
+						fprintf(out_h, "#undef CONFIG_%s\n", sym->name);
+						/* bbox */
+						fprintf(out_h, "#define ENABLE_%s 0\n", sym->name);
+						fprintf(out_h, "#define USE_%s(...)\n", sym->name);
+						fprintf(out_h, "#define SKIP_%s(...) __VA_ARGS__\n", sym->name);
+					}
+					break;
+				case mod:
+					fprintf(out, "CONFIG_%s=m\n", sym->name);
+					if (out_h)
+						fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
+					break;
+				case yes:
+					fprintf(out, "CONFIG_%s=y\n", sym->name);
+					if (out_h) {
+						fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
+						/* bbox */
+						fprintf(out_h, "#define ENABLE_%s 1\n", sym->name);
+						fprintf(out_h, "#define USE_%s(...) __VA_ARGS__\n", sym->name);
+						fprintf(out_h, "#define SKIP_%s(...)\n", sym->name);
+					}
+					break;
+				}
+				break;
+			case S_STRING:
+				// fix me
+				str = sym_get_string_value(sym);
+				fprintf(out, "CONFIG_%s=\"", sym->name);
+				if (out_h)
+					fprintf(out_h, "#define CONFIG_%s \"", sym->name);
+				do {
+					l = strcspn(str, "\"\\");
+					if (l) {
+						fwrite(str, l, 1, out);
+						if (out_h)
+							fwrite(str, l, 1, out_h);
+					}
+					str += l;
+					while (*str == '\\' || *str == '"') {
+						fprintf(out, "\\%c", *str);
+						if (out_h)
+							fprintf(out_h, "\\%c", *str);
+						str++;
+					}
+				} while (*str);
+				fputs("\"\n", out);
+				if (out_h) {
+					fputs("\"\n", out_h);
+					/* bbox */
+					fprintf(out_h, "#define ENABLE_%s 1\n", sym->name);
+					fprintf(out_h, "#define USE_%s(...) __VA_ARGS__\n", sym->name);
+					fprintf(out_h, "#define SKIP_%s(...)\n", sym->name);
+				}
+				break;
+			case S_HEX:
+				str = sym_get_string_value(sym);
+				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
+					fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
+					if (out_h) {
+						fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
+						/* bbox */
+						fprintf(out_h, "#define ENABLE_%s 1\n", sym->name);
+						fprintf(out_h, "#define USE_%s(...) __VA_ARGS__\n", sym->name);
+						fprintf(out_h, "#define SKIP_%s(...)\n", sym->name);
+					}
+					break;
+				}
+			case S_INT:
+				str = sym_get_string_value(sym);
+				fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
+				if (out_h) {
+					fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
+					/* bbox */
+					fprintf(out_h, "#define ENABLE_%s 1\n", sym->name);
+					fprintf(out_h, "#define USE_%s(...) __VA_ARGS__\n", sym->name);
+					fprintf(out_h, "#define SKIP_%s(...)\n", sym->name);
+				}
+				break;
+			}
+		}
+
+	next:
+		if (menu->list) {
+			menu = menu->list;
+			continue;
+		}
+		if (menu->next)
+			menu = menu->next;
+		else while ((menu = menu->parent)) {
+			if (menu->next) {
+				menu = menu->next;
+				break;
+			}
+		}
+	}
+	fclose(out);
+	if (out_h) {
+		fclose(out_h);
+		rename(".tmpconfig.h", "include/autoconf.h");
+	}
+	if (!name || basename != conf_def_filename) {
+		if (!name)
+			name = conf_def_filename;
+		sprintf(tmpname, "%s.old", name);
+		rename(name, tmpname);
+	}
+	sprintf(tmpname, "%s%s", dirname, basename);
+	if (rename(newname, tmpname))
+		return 1;
+
+	sym_change_count = 0;
+
+	return 0;
+}
Index: buildrom/scripts/kconfig/expr.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/expr.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,1099 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define DEBUG_EXPR	0
+
+struct expr *expr_alloc_symbol(struct symbol *sym)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = E_SYMBOL;
+	e->left.sym = sym;
+	return e;
+}
+
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.expr = ce;
+	return e;
+}
+
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.expr = e1;
+	e->right.expr = e2;
+	return e;
+}
+
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.sym = s1;
+	e->right.sym = s2;
+	return e;
+}
+
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
+{
+	if (!e1)
+		return e2;
+	return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
+}
+
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
+{
+	if (!e1)
+		return e2;
+	return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
+}
+
+struct expr *expr_copy(struct expr *org)
+{
+	struct expr *e;
+
+	if (!org)
+		return NULL;
+
+	e = malloc(sizeof(*org));
+	memcpy(e, org, sizeof(*org));
+	switch (org->type) {
+	case E_SYMBOL:
+		e->left = org->left;
+		break;
+	case E_NOT:
+		e->left.expr = expr_copy(org->left.expr);
+		break;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		e->left.sym = org->left.sym;
+		e->right.sym = org->right.sym;
+		break;
+	case E_AND:
+	case E_OR:
+	case E_CHOICE:
+		e->left.expr = expr_copy(org->left.expr);
+		e->right.expr = expr_copy(org->right.expr);
+		break;
+	default:
+		printf("can't copy type %d\n", e->type);
+		free(e);
+		e = NULL;
+		break;
+	}
+
+	return e;
+}
+
+void expr_free(struct expr *e)
+{
+	if (!e)
+		return;
+
+	switch (e->type) {
+	case E_SYMBOL:
+		break;
+	case E_NOT:
+		expr_free(e->left.expr);
+		return;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		break;
+	case E_OR:
+	case E_AND:
+		expr_free(e->left.expr);
+		expr_free(e->right.expr);
+		break;
+	default:
+		printf("how to free type %d?\n", e->type);
+		break;
+	}
+	free(e);
+}
+
+static int trans_count;
+
+#define e1 (*ep1)
+#define e2 (*ep2)
+
+static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+	if (e1->type == type) {
+		__expr_eliminate_eq(type, &e1->left.expr, &e2);
+		__expr_eliminate_eq(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		__expr_eliminate_eq(type, &e1, &e2->left.expr);
+		__expr_eliminate_eq(type, &e1, &e2->right.expr);
+		return;
+	}
+	if (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+	    e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO)))
+		return;
+	if (!expr_eq(e1, e2))
+		return;
+	trans_count++;
+	expr_free(e1); expr_free(e2);
+	switch (type) {
+	case E_OR:
+		e1 = expr_alloc_symbol(&symbol_no);
+		e2 = expr_alloc_symbol(&symbol_no);
+		break;
+	case E_AND:
+		e1 = expr_alloc_symbol(&symbol_yes);
+		e2 = expr_alloc_symbol(&symbol_yes);
+		break;
+	default:
+		;
+	}
+}
+
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
+{
+	if (!e1 || !e2)
+		return;
+	switch (e1->type) {
+	case E_OR:
+	case E_AND:
+		__expr_eliminate_eq(e1->type, ep1, ep2);
+	default:
+		;
+	}
+	if (e1->type != e2->type) switch (e2->type) {
+	case E_OR:
+	case E_AND:
+		__expr_eliminate_eq(e2->type, ep1, ep2);
+	default:
+		;
+	}
+	e1 = expr_eliminate_yn(e1);
+	e2 = expr_eliminate_yn(e2);
+}
+
+#undef e1
+#undef e2
+
+int expr_eq(struct expr *e1, struct expr *e2)
+{
+	int res, old_count;
+
+	if (e1->type != e2->type)
+		return 0;
+	switch (e1->type) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+		return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym;
+	case E_SYMBOL:
+		return e1->left.sym == e2->left.sym;
+	case E_NOT:
+		return expr_eq(e1->left.expr, e2->left.expr);
+	case E_AND:
+	case E_OR:
+		e1 = expr_copy(e1);
+		e2 = expr_copy(e2);
+		old_count = trans_count;
+		expr_eliminate_eq(&e1, &e2);
+		res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+		       e1->left.sym == e2->left.sym);
+		expr_free(e1);
+		expr_free(e2);
+		trans_count = old_count;
+		return res;
+	case E_CHOICE:
+	case E_RANGE:
+	case E_NONE:
+		/* panic */;
+	}
+
+	if (DEBUG_EXPR) {
+		expr_fprint(e1, stdout);
+		printf(" = ");
+		expr_fprint(e2, stdout);
+		printf(" ?\n");
+	}
+
+	return 0;
+}
+
+struct expr *expr_eliminate_yn(struct expr *e)
+{
+	struct expr *tmp;
+
+	if (e) switch (e->type) {
+	case E_AND:
+		e->left.expr = expr_eliminate_yn(e->left.expr);
+		e->right.expr = expr_eliminate_yn(e->right.expr);
+		if (e->left.expr->type == E_SYMBOL) {
+			if (e->left.expr->left.sym == &symbol_no) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				e->right.expr = NULL;
+				return e;
+			} else if (e->left.expr->left.sym == &symbol_yes) {
+				free(e->left.expr);
+				tmp = e->right.expr;
+				*e = *(e->right.expr);
+				free(tmp);
+				return e;
+			}
+		}
+		if (e->right.expr->type == E_SYMBOL) {
+			if (e->right.expr->left.sym == &symbol_no) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				e->right.expr = NULL;
+				return e;
+			} else if (e->right.expr->left.sym == &symbol_yes) {
+				free(e->right.expr);
+				tmp = e->left.expr;
+				*e = *(e->left.expr);
+				free(tmp);
+				return e;
+			}
+		}
+		break;
+	case E_OR:
+		e->left.expr = expr_eliminate_yn(e->left.expr);
+		e->right.expr = expr_eliminate_yn(e->right.expr);
+		if (e->left.expr->type == E_SYMBOL) {
+			if (e->left.expr->left.sym == &symbol_no) {
+				free(e->left.expr);
+				tmp = e->right.expr;
+				*e = *(e->right.expr);
+				free(tmp);
+				return e;
+			} else if (e->left.expr->left.sym == &symbol_yes) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				e->right.expr = NULL;
+				return e;
+			}
+		}
+		if (e->right.expr->type == E_SYMBOL) {
+			if (e->right.expr->left.sym == &symbol_no) {
+				free(e->right.expr);
+				tmp = e->left.expr;
+				*e = *(e->left.expr);
+				free(tmp);
+				return e;
+			} else if (e->right.expr->left.sym == &symbol_yes) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				e->right.expr = NULL;
+				return e;
+			}
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+/*
+ * bool FOO!=n => FOO
+ */
+struct expr *expr_trans_bool(struct expr *e)
+{
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_AND:
+	case E_OR:
+	case E_NOT:
+		e->left.expr = expr_trans_bool(e->left.expr);
+		e->right.expr = expr_trans_bool(e->right.expr);
+		break;
+	case E_UNEQUAL:
+		// FOO!=n -> FOO
+		if (e->left.sym->type == S_TRISTATE) {
+			if (e->right.sym == &symbol_no) {
+				e->type = E_SYMBOL;
+				e->right.sym = NULL;
+			}
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+/*
+ * e1 || e2 -> ?
+ */
+struct expr *expr_join_or(struct expr *e1, struct expr *e2)
+{
+	struct expr *tmp;
+	struct symbol *sym1, *sym2;
+
+	if (expr_eq(e1, e2))
+		return expr_copy(e1);
+	if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+		return NULL;
+	if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+		return NULL;
+	if (e1->type == E_NOT) {
+		tmp = e1->left.expr;
+		if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+			return NULL;
+		sym1 = tmp->left.sym;
+	} else
+		sym1 = e1->left.sym;
+	if (e2->type == E_NOT) {
+		if (e2->left.expr->type != E_SYMBOL)
+			return NULL;
+		sym2 = e2->left.expr->left.sym;
+	} else
+		sym2 = e2->left.sym;
+	if (sym1 != sym2)
+		return NULL;
+	if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+		return NULL;
+	if (sym1->type == S_TRISTATE) {
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+		     (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) {
+			// (a='y') || (a='m') -> (a!='n')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no);
+		}
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+		     (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) {
+			// (a='y') || (a='n') -> (a!='m')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod);
+		}
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+		     (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) {
+			// (a='m') || (a='n') -> (a!='y')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes);
+		}
+	}
+	if (sym1->type == S_BOOLEAN && sym1 == sym2) {
+		if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) ||
+		    (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL))
+			return expr_alloc_symbol(&symbol_yes);
+	}
+
+	if (DEBUG_EXPR) {
+		printf("optimize (");
+		expr_fprint(e1, stdout);
+		printf(") || (");
+		expr_fprint(e2, stdout);
+		printf(")?\n");
+	}
+	return NULL;
+}
+
+struct expr *expr_join_and(struct expr *e1, struct expr *e2)
+{
+	struct expr *tmp;
+	struct symbol *sym1, *sym2;
+
+	if (expr_eq(e1, e2))
+		return expr_copy(e1);
+	if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+		return NULL;
+	if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+		return NULL;
+	if (e1->type == E_NOT) {
+		tmp = e1->left.expr;
+		if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+			return NULL;
+		sym1 = tmp->left.sym;
+	} else
+		sym1 = e1->left.sym;
+	if (e2->type == E_NOT) {
+		if (e2->left.expr->type != E_SYMBOL)
+			return NULL;
+		sym2 = e2->left.expr->left.sym;
+	} else
+		sym2 = e2->left.sym;
+	if (sym1 != sym2)
+		return NULL;
+	if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+		return NULL;
+
+	if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) ||
+	    (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes))
+		// (a) && (a='y') -> (a='y')
+		return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+	if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) ||
+	    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no))
+		// (a) && (a!='n') -> (a)
+		return expr_alloc_symbol(sym1);
+
+	if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) ||
+	    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod))
+		// (a) && (a!='m') -> (a='y')
+		return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+	if (sym1->type == S_TRISTATE) {
+		if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) {
+			// (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+			sym2 = e1->right.sym;
+			if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+				return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+							     : expr_alloc_symbol(&symbol_no);
+		}
+		if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) {
+			// (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+			sym2 = e2->right.sym;
+			if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+				return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+							     : expr_alloc_symbol(&symbol_no);
+		}
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+			    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes)))
+			// (a!='y') && (a!='n') -> (a='m')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod);
+
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+			    (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes)))
+			// (a!='y') && (a!='m') -> (a='n')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_no);
+
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+			    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod)))
+			// (a!='m') && (a!='n') -> (a='m')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+		if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) ||
+		    (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) ||
+		    (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) ||
+		    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes))
+			return NULL;
+	}
+
+	if (DEBUG_EXPR) {
+		printf("optimize (");
+		expr_fprint(e1, stdout);
+		printf(") && (");
+		expr_fprint(e2, stdout);
+		printf(")?\n");
+	}
+	return NULL;
+}
+
+static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	struct expr *tmp;
+
+	if (e1->type == type) {
+		expr_eliminate_dups1(type, &e1->left.expr, &e2);
+		expr_eliminate_dups1(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_eliminate_dups1(type, &e1, &e2->left.expr);
+		expr_eliminate_dups1(type, &e1, &e2->right.expr);
+		return;
+	}
+	if (e1 == e2)
+		return;
+
+	switch (e1->type) {
+	case E_OR: case E_AND:
+		expr_eliminate_dups1(e1->type, &e1, &e1);
+	default:
+		;
+	}
+
+	switch (type) {
+	case E_OR:
+		tmp = expr_join_or(e1, e2);
+		if (tmp) {
+			expr_free(e1); expr_free(e2);
+			e1 = expr_alloc_symbol(&symbol_no);
+			e2 = tmp;
+			trans_count++;
+		}
+		break;
+	case E_AND:
+		tmp = expr_join_and(e1, e2);
+		if (tmp) {
+			expr_free(e1); expr_free(e2);
+			e1 = expr_alloc_symbol(&symbol_yes);
+			e2 = tmp;
+			trans_count++;
+		}
+		break;
+	default:
+		;
+	}
+#undef e1
+#undef e2
+}
+
+static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	struct expr *tmp, *tmp1, *tmp2;
+
+	if (e1->type == type) {
+		expr_eliminate_dups2(type, &e1->left.expr, &e2);
+		expr_eliminate_dups2(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_eliminate_dups2(type, &e1, &e2->left.expr);
+		expr_eliminate_dups2(type, &e1, &e2->right.expr);
+	}
+	if (e1 == e2)
+		return;
+
+	switch (e1->type) {
+	case E_OR:
+		expr_eliminate_dups2(e1->type, &e1, &e1);
+		// (FOO || BAR) && (!FOO && !BAR) -> n
+		tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+		tmp2 = expr_copy(e2);
+		tmp = expr_extract_eq_and(&tmp1, &tmp2);
+		if (expr_is_yes(tmp1)) {
+			expr_free(e1);
+			e1 = expr_alloc_symbol(&symbol_no);
+			trans_count++;
+		}
+		expr_free(tmp2);
+		expr_free(tmp1);
+		expr_free(tmp);
+		break;
+	case E_AND:
+		expr_eliminate_dups2(e1->type, &e1, &e1);
+		// (FOO && BAR) || (!FOO || !BAR) -> y
+		tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+		tmp2 = expr_copy(e2);
+		tmp = expr_extract_eq_or(&tmp1, &tmp2);
+		if (expr_is_no(tmp1)) {
+			expr_free(e1);
+			e1 = expr_alloc_symbol(&symbol_yes);
+			trans_count++;
+		}
+		expr_free(tmp2);
+		expr_free(tmp1);
+		expr_free(tmp);
+		break;
+	default:
+		;
+	}
+#undef e1
+#undef e2
+}
+
+struct expr *expr_eliminate_dups(struct expr *e)
+{
+	int oldcount;
+	if (!e)
+		return e;
+
+	oldcount = trans_count;
+	while (1) {
+		trans_count = 0;
+		switch (e->type) {
+		case E_OR: case E_AND:
+			expr_eliminate_dups1(e->type, &e, &e);
+			expr_eliminate_dups2(e->type, &e, &e);
+		default:
+			;
+		}
+		if (!trans_count)
+			break;
+		e = expr_eliminate_yn(e);
+	}
+	trans_count = oldcount;
+	return e;
+}
+
+struct expr *expr_transform(struct expr *e)
+{
+	struct expr *tmp;
+
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+	case E_SYMBOL:
+	case E_CHOICE:
+		break;
+	default:
+		e->left.expr = expr_transform(e->left.expr);
+		e->right.expr = expr_transform(e->right.expr);
+	}
+
+	switch (e->type) {
+	case E_EQUAL:
+		if (e->left.sym->type != S_BOOLEAN)
+			break;
+		if (e->right.sym == &symbol_no) {
+			e->type = E_NOT;
+			e->left.expr = expr_alloc_symbol(e->left.sym);
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_mod) {
+			printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name);
+			e->type = E_SYMBOL;
+			e->left.sym = &symbol_no;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_yes) {
+			e->type = E_SYMBOL;
+			e->right.sym = NULL;
+			break;
+		}
+		break;
+	case E_UNEQUAL:
+		if (e->left.sym->type != S_BOOLEAN)
+			break;
+		if (e->right.sym == &symbol_no) {
+			e->type = E_SYMBOL;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_mod) {
+			printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name);
+			e->type = E_SYMBOL;
+			e->left.sym = &symbol_yes;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_yes) {
+			e->type = E_NOT;
+			e->left.expr = expr_alloc_symbol(e->left.sym);
+			e->right.sym = NULL;
+			break;
+		}
+		break;
+	case E_NOT:
+		switch (e->left.expr->type) {
+		case E_NOT:
+			// !!a -> a
+			tmp = e->left.expr->left.expr;
+			free(e->left.expr);
+			free(e);
+			e = tmp;
+			e = expr_transform(e);
+			break;
+		case E_EQUAL:
+		case E_UNEQUAL:
+			// !a='x' -> a!='x'
+			tmp = e->left.expr;
+			free(e);
+			e = tmp;
+			e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
+			break;
+		case E_OR:
+			// !(a || b) -> !a && !b
+			tmp = e->left.expr;
+			e->type = E_AND;
+			e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+			tmp->type = E_NOT;
+			tmp->right.expr = NULL;
+			e = expr_transform(e);
+			break;
+		case E_AND:
+			// !(a && b) -> !a || !b
+			tmp = e->left.expr;
+			e->type = E_OR;
+			e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+			tmp->type = E_NOT;
+			tmp->right.expr = NULL;
+			e = expr_transform(e);
+			break;
+		case E_SYMBOL:
+			if (e->left.expr->left.sym == &symbol_yes) {
+				// !'y' -> 'n'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				break;
+			}
+			if (e->left.expr->left.sym == &symbol_mod) {
+				// !'m' -> 'm'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_mod;
+				break;
+			}
+			if (e->left.expr->left.sym == &symbol_no) {
+				// !'n' -> 'y'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				break;
+			}
+			break;
+		default:
+			;
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+int expr_contains_symbol(struct expr *dep, struct symbol *sym)
+{
+	if (!dep)
+		return 0;
+
+	switch (dep->type) {
+	case E_AND:
+	case E_OR:
+		return expr_contains_symbol(dep->left.expr, sym) ||
+		       expr_contains_symbol(dep->right.expr, sym);
+	case E_SYMBOL:
+		return dep->left.sym == sym;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		return dep->left.sym == sym ||
+		       dep->right.sym == sym;
+	case E_NOT:
+		return expr_contains_symbol(dep->left.expr, sym);
+	default:
+		;
+	}
+	return 0;
+}
+
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
+{
+	if (!dep)
+		return false;
+
+	switch (dep->type) {
+	case E_AND:
+		return expr_depends_symbol(dep->left.expr, sym) ||
+		       expr_depends_symbol(dep->right.expr, sym);
+	case E_SYMBOL:
+		return dep->left.sym == sym;
+	case E_EQUAL:
+		if (dep->left.sym == sym) {
+			if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod)
+				return true;
+		}
+		break;
+	case E_UNEQUAL:
+		if (dep->left.sym == sym) {
+			if (dep->right.sym == &symbol_no)
+				return true;
+		}
+		break;
+	default:
+		;
+	}
+ 	return false;
+}
+
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2)
+{
+	struct expr *tmp = NULL;
+	expr_extract_eq(E_AND, &tmp, ep1, ep2);
+	if (tmp) {
+		*ep1 = expr_eliminate_yn(*ep1);
+		*ep2 = expr_eliminate_yn(*ep2);
+	}
+	return tmp;
+}
+
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2)
+{
+	struct expr *tmp = NULL;
+	expr_extract_eq(E_OR, &tmp, ep1, ep2);
+	if (tmp) {
+		*ep1 = expr_eliminate_yn(*ep1);
+		*ep2 = expr_eliminate_yn(*ep2);
+	}
+	return tmp;
+}
+
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	if (e1->type == type) {
+		expr_extract_eq(type, ep, &e1->left.expr, &e2);
+		expr_extract_eq(type, ep, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_extract_eq(type, ep, ep1, &e2->left.expr);
+		expr_extract_eq(type, ep, ep1, &e2->right.expr);
+		return;
+	}
+	if (expr_eq(e1, e2)) {
+		*ep = *ep ? expr_alloc_two(type, *ep, e1) : e1;
+		expr_free(e2);
+		if (type == E_AND) {
+			e1 = expr_alloc_symbol(&symbol_yes);
+			e2 = expr_alloc_symbol(&symbol_yes);
+		} else if (type == E_OR) {
+			e1 = expr_alloc_symbol(&symbol_no);
+			e2 = expr_alloc_symbol(&symbol_no);
+		}
+	}
+#undef e1
+#undef e2
+}
+
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
+{
+	struct expr *e1, *e2;
+
+	if (!e) {
+		e = expr_alloc_symbol(sym);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	}
+	switch (e->type) {
+	case E_AND:
+		e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+		e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+		if (sym == &symbol_yes)
+			e = expr_alloc_two(E_AND, e1, e2);
+		if (sym == &symbol_no)
+			e = expr_alloc_two(E_OR, e1, e2);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	case E_OR:
+		e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+		e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+		if (sym == &symbol_yes)
+			e = expr_alloc_two(E_OR, e1, e2);
+		if (sym == &symbol_no)
+			e = expr_alloc_two(E_AND, e1, e2);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	case E_NOT:
+		return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym);
+	case E_UNEQUAL:
+	case E_EQUAL:
+		if (type == E_EQUAL) {
+			if (sym == &symbol_yes)
+				return expr_copy(e);
+			if (sym == &symbol_mod)
+				return expr_alloc_symbol(&symbol_no);
+			if (sym == &symbol_no)
+				return expr_alloc_one(E_NOT, expr_copy(e));
+		} else {
+			if (sym == &symbol_yes)
+				return expr_alloc_one(E_NOT, expr_copy(e));
+			if (sym == &symbol_mod)
+				return expr_alloc_symbol(&symbol_yes);
+			if (sym == &symbol_no)
+				return expr_copy(e);
+		}
+		break;
+	case E_SYMBOL:
+		return expr_alloc_comp(type, e->left.sym, sym);
+	case E_CHOICE:
+	case E_RANGE:
+	case E_NONE:
+		/* panic */;
+	}
+	return NULL;
+}
+
+tristate expr_calc_value(struct expr *e)
+{
+	tristate val1, val2;
+	const char *str1, *str2;
+
+	if (!e)
+		return yes;
+
+	switch (e->type) {
+	case E_SYMBOL:
+		sym_calc_value(e->left.sym);
+		return e->left.sym->curr.tri;
+	case E_AND:
+		val1 = expr_calc_value(e->left.expr);
+		val2 = expr_calc_value(e->right.expr);
+		return E_AND(val1, val2);
+	case E_OR:
+		val1 = expr_calc_value(e->left.expr);
+		val2 = expr_calc_value(e->right.expr);
+		return E_OR(val1, val2);
+	case E_NOT:
+		val1 = expr_calc_value(e->left.expr);
+		return E_NOT(val1);
+	case E_EQUAL:
+		sym_calc_value(e->left.sym);
+		sym_calc_value(e->right.sym);
+		str1 = sym_get_string_value(e->left.sym);
+		str2 = sym_get_string_value(e->right.sym);
+		return !strcmp(str1, str2) ? yes : no;
+	case E_UNEQUAL:
+		sym_calc_value(e->left.sym);
+		sym_calc_value(e->right.sym);
+		str1 = sym_get_string_value(e->left.sym);
+		str2 = sym_get_string_value(e->right.sym);
+		return !strcmp(str1, str2) ? no : yes;
+	default:
+		printf("expr_calc_value: %d?\n", e->type);
+		return no;
+	}
+}
+
+int expr_compare_type(enum expr_type t1, enum expr_type t2)
+{
+#if 0
+	return 1;
+#else
+	if (t1 == t2)
+		return 0;
+	switch (t1) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+		if (t2 == E_NOT)
+			return 1;
+	case E_NOT:
+		if (t2 == E_AND)
+			return 1;
+	case E_AND:
+		if (t2 == E_OR)
+			return 1;
+	case E_OR:
+		if (t2 == E_CHOICE)
+			return 1;
+	case E_CHOICE:
+		if (t2 == 0)
+			return 1;
+	default:
+		return -1;
+	}
+	printf("[%dgt%d?]", t1, t2);
+	return 0;
+#endif
+}
+
+void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)
+{
+	if (!e) {
+		fn(data, "y");
+		return;
+	}
+
+	if (expr_compare_type(prevtoken, e->type) > 0)
+		fn(data, "(");
+	switch (e->type) {
+	case E_SYMBOL:
+		if (e->left.sym->name)
+			fn(data, e->left.sym->name);
+		else
+			fn(data, "<choice>");
+		break;
+	case E_NOT:
+		fn(data, "!");
+		expr_print(e->left.expr, fn, data, E_NOT);
+		break;
+	case E_EQUAL:
+		fn(data, e->left.sym->name);
+		fn(data, "=");
+		fn(data, e->right.sym->name);
+		break;
+	case E_UNEQUAL:
+		fn(data, e->left.sym->name);
+		fn(data, "!=");
+		fn(data, e->right.sym->name);
+		break;
+	case E_OR:
+		expr_print(e->left.expr, fn, data, E_OR);
+		fn(data, " || ");
+		expr_print(e->right.expr, fn, data, E_OR);
+		break;
+	case E_AND:
+		expr_print(e->left.expr, fn, data, E_AND);
+		fn(data, " && ");
+		expr_print(e->right.expr, fn, data, E_AND);
+		break;
+	case E_CHOICE:
+		fn(data, e->right.sym->name);
+		if (e->left.expr) {
+			fn(data, " ^ ");
+			expr_print(e->left.expr, fn, data, E_CHOICE);
+		}
+		break;
+	case E_RANGE:
+		fn(data, "[");
+		fn(data, e->left.sym->name);
+		fn(data, " ");
+		fn(data, e->right.sym->name);
+		fn(data, "]");
+		break;
+	default:
+	  {
+		char buf[32];
+		sprintf(buf, "<unknown type %d>", e->type);
+		fn(data, buf);
+		break;
+	  }
+	}
+	if (expr_compare_type(prevtoken, e->type) > 0)
+		fn(data, ")");
+}
+
+static void expr_print_file_helper(void *data, const char *str)
+{
+	fwrite(str, strlen(str), 1, data);
+}
+
+void expr_fprint(struct expr *e, FILE *out)
+{
+	expr_print(e, expr_print_file_helper, out, E_NONE);
+}
+
+static void expr_print_gstr_helper(void *data, const char *str)
+{
+	str_append((struct gstr*)data, str);
+}
+
+void expr_gstr_print(struct expr *e, struct gstr *gs)
+{
+	expr_print(e, expr_print_gstr_helper, gs, E_NONE);
+}
Index: buildrom/scripts/kconfig/expr.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/expr.h	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef EXPR_H
+#define EXPR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
+
+struct file {
+	struct file *next;
+	struct file *parent;
+	char *name;
+	int lineno;
+	int flags;
+};
+
+#define FILE_BUSY		0x0001
+#define FILE_SCANNED		0x0002
+#define FILE_PRINTED		0x0004
+
+typedef enum tristate {
+	no, mod, yes
+} tristate;
+
+enum expr_type {
+	E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
+};
+
+union expr_data {
+	struct expr *expr;
+	struct symbol *sym;
+};
+
+struct expr {
+	enum expr_type type;
+	union expr_data left, right;
+};
+
+#define E_OR(dep1, dep2)	(((dep1)>(dep2))?(dep1):(dep2))
+#define E_AND(dep1, dep2)	(((dep1)<(dep2))?(dep1):(dep2))
+#define E_NOT(dep)		(2-(dep))
+
+struct expr_value {
+	struct expr *expr;
+	tristate tri;
+};
+
+struct symbol_value {
+	void *val;
+	tristate tri;
+};
+
+enum symbol_type {
+	S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
+};
+
+struct symbol {
+	struct symbol *next;
+	char *name;
+	char *help;
+	enum symbol_type type;
+	struct symbol_value curr, user;
+	tristate visible;
+	int flags;
+	struct property *prop;
+	struct expr *dep, *dep2;
+	struct expr_value rev_dep;
+};
+
+#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
+
+#define SYMBOL_YES		0x0001
+#define SYMBOL_MOD		0x0002
+#define SYMBOL_NO		0x0004
+#define SYMBOL_CONST		0x0007
+#define SYMBOL_CHECK		0x0008
+#define SYMBOL_CHOICE		0x0010
+#define SYMBOL_CHOICEVAL	0x0020
+#define SYMBOL_PRINTED		0x0040
+#define SYMBOL_VALID		0x0080
+#define SYMBOL_OPTIONAL		0x0100
+#define SYMBOL_WRITE		0x0200
+#define SYMBOL_CHANGED		0x0400
+#define SYMBOL_NEW		0x0800
+#define SYMBOL_AUTO		0x1000
+#define SYMBOL_CHECKED		0x2000
+#define SYMBOL_WARNED		0x8000
+
+#define SYMBOL_MAXLENGTH	256
+#define SYMBOL_HASHSIZE		257
+#define SYMBOL_HASHMASK		0xff
+
+enum prop_type {
+	P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
+};
+
+struct property {
+	struct property *next;
+	struct symbol *sym;
+	enum prop_type type;
+	const char *text;
+	struct expr_value visible;
+	struct expr *expr;
+	struct menu *menu;
+	struct file *file;
+	int lineno;
+};
+
+#define for_all_properties(sym, st, tok) \
+	for (st = sym->prop; st; st = st->next) \
+		if (st->type == (tok))
+#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
+#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
+#define for_all_prompts(sym, st) \
+	for (st = sym->prop; st; st = st->next) \
+		if (st->text)
+
+struct menu {
+	struct menu *next;
+	struct menu *parent;
+	struct menu *list;
+	struct symbol *sym;
+	struct property *prompt;
+	struct expr *dep;
+	unsigned int flags;
+	//char *help;
+	struct file *file;
+	int lineno;
+	void *data;
+};
+
+#define MENU_CHANGED		0x0001
+#define MENU_ROOT		0x0002
+
+#ifndef SWIG
+
+extern struct file *file_list;
+extern struct file *current_file;
+struct file *lookup_file(const char *name);
+
+extern struct symbol symbol_yes, symbol_no, symbol_mod;
+extern struct symbol *modules_sym;
+extern int cdebug;
+struct expr *expr_alloc_symbol(struct symbol *sym);
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
+struct expr *expr_copy(struct expr *org);
+void expr_free(struct expr *e);
+int expr_eq(struct expr *e1, struct expr *e2);
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
+tristate expr_calc_value(struct expr *e);
+struct expr *expr_eliminate_yn(struct expr *e);
+struct expr *expr_trans_bool(struct expr *e);
+struct expr *expr_eliminate_dups(struct expr *e);
+struct expr *expr_transform(struct expr *e);
+int expr_contains_symbol(struct expr *dep, struct symbol *sym);
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
+
+void expr_fprint(struct expr *e, FILE *out);
+struct gstr; /* forward */
+void expr_gstr_print(struct expr *e, struct gstr *gs);
+
+static inline int expr_is_yes(struct expr *e)
+{
+	return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
+}
+
+static inline int expr_is_no(struct expr *e)
+{
+	return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EXPR_H */
Index: buildrom/scripts/kconfig/kconfig_load.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/kconfig_load.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,35 @@
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "lkc.h"
+
+#define P(name,type,arg)	type (*name ## _p) arg
+#include "lkc_proto.h"
+#undef P
+
+void kconfig_load(void)
+{
+	void *handle;
+	char *error;
+
+	handle = dlopen("./libkconfig.so", RTLD_LAZY);
+	if (!handle) {
+		handle = dlopen("./scripts/kconfig/libkconfig.so", RTLD_LAZY);
+		if (!handle) {
+			fprintf(stderr, "%s\n", dlerror());
+			exit(1);
+		}
+	}
+
+#define P(name,type,arg)			\
+{						\
+	name ## _p = dlsym(handle, #name);	\
+        if ((error = dlerror()))  {		\
+                fprintf(stderr, "%s\n", error);	\
+		exit(1);			\
+	}					\
+}
+#include "lkc_proto.h"
+#undef P
+}
Index: buildrom/scripts/kconfig/kxgettext.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/kxgettext.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,227 @@
+/*
+ * Arnaldo Carvalho de Melo <acme at conectiva.com.br>, 2005
+ *
+ * Released under the terms of the GNU GPL v2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static char *escape(const char* text, char *bf, int len)
+{
+	char *bfp = bf;
+	int multiline = strchr(text, '\n') != NULL;
+	int eol = 0;
+	int textlen = strlen(text);
+
+	if ((textlen > 0) && (text[textlen-1] == '\n'))
+		eol = 1;
+
+	*bfp++ = '"';
+	--len;
+
+	if (multiline) {
+		*bfp++ = '"';
+		*bfp++ = '\n';
+		*bfp++ = '"';
+		len -= 3;
+	}
+
+	while (*text != '\0' && len > 1) {
+		if (*text == '"')
+			*bfp++ = '\\';
+		else if (*text == '\n') {
+			*bfp++ = '\\';
+			*bfp++ = 'n';
+			*bfp++ = '"';
+			*bfp++ = '\n';
+			*bfp++ = '"';
+			len -= 5;
+			++text;
+			goto next;
+		}
+		*bfp++ = *text++;
+next:
+		--len;
+	}
+
+	if (multiline && eol)
+		bfp -= 3;
+
+	*bfp++ = '"';
+	*bfp = '\0';
+
+	return bf;
+}
+
+struct file_line {
+	struct file_line *next;
+	char*		 file;
+	int		 lineno;
+};
+
+static struct file_line *file_line__new(char *file, int lineno)
+{
+	struct file_line *self = malloc(sizeof(*self));
+
+	if (self == NULL)
+		goto out;
+
+	self->file   = file;
+	self->lineno = lineno;
+	self->next   = NULL;
+out:
+	return self;
+}
+
+struct message {
+	const char	 *msg;
+	const char	 *option;
+	struct message	 *next;
+	struct file_line *files;
+};
+
+static struct message *message__list;
+
+static struct message *message__new(const char *msg, char *option, char *file, int lineno)
+{
+	struct message *self = malloc(sizeof(*self));
+
+	if (self == NULL)
+		goto out;
+
+	self->files = file_line__new(file, lineno);
+	if (self->files == NULL)
+		goto out_fail;
+
+	self->msg = strdup(msg);
+	if (self->msg == NULL)
+		goto out_fail_msg;
+
+	self->option = option;
+	self->next = NULL;
+out:
+	return self;
+out_fail_msg:
+	free(self->files);
+out_fail:
+	free(self);
+	self = NULL;
+	goto out;
+}
+
+static struct message *mesage__find(const char *msg)
+{
+	struct message *m = message__list;
+
+	while (m != NULL) {
+		if (strcmp(m->msg, msg) == 0)
+			break;
+		m = m->next;
+	}
+
+	return m;
+}
+
+static int message__add_file_line(struct message *self, char *file, int lineno)
+{
+	int rc = -1;
+	struct file_line *fl = file_line__new(file, lineno);
+
+	if (fl == NULL)
+		goto out;
+
+	fl->next    = self->files;
+	self->files = fl;
+	rc = 0;
+out:
+	return rc;
+}
+
+static int message__add(const char *msg, char *option, char *file, int lineno)
+{
+	int rc = 0;
+	char bf[16384];
+	char *escaped = escape(msg, bf, sizeof(bf));
+	struct message *m = mesage__find(escaped);
+
+	if (m != NULL)
+		rc = message__add_file_line(m, file, lineno);
+	else {
+		m = message__new(escaped, option, file, lineno);
+
+		if (m != NULL) {
+			m->next	      = message__list;
+			message__list = m;
+		} else
+			rc = -1;
+	}
+	return rc;
+}
+
+void menu_build_message_list(struct menu *menu)
+{
+	struct menu *child;
+
+	message__add(menu_get_prompt(menu), NULL,
+		     menu->file == NULL ? "Root Menu" : menu->file->name,
+		     menu->lineno);
+
+	if (menu->sym != NULL && menu->sym->help != NULL)
+		message__add(menu->sym->help, menu->sym->name,
+			     menu->file == NULL ? "Root Menu" : menu->file->name,
+			     menu->lineno);
+
+	for (child = menu->list; child != NULL; child = child->next)
+		if (child->prompt != NULL)
+			menu_build_message_list(child);
+}
+
+static void message__print_file_lineno(struct message *self)
+{
+	struct file_line *fl = self->files;
+
+	putchar('\n');
+	if (self->option != NULL)
+		printf("# %s:00000\n", self->option);
+
+	printf("#: %s:%d", fl->file, fl->lineno);
+	fl = fl->next;
+
+	while (fl != NULL) {
+		printf(", %s:%d", fl->file, fl->lineno);
+		fl = fl->next;
+	}
+
+	putchar('\n');
+}
+
+static void message__print_gettext_msgid_msgstr(struct message *self)
+{
+	message__print_file_lineno(self);
+
+	printf("msgid %s\n"
+	       "msgstr \"\"\n", self->msg);
+}
+
+void menu__xgettext(void)
+{
+	struct message *m = message__list;
+
+	while (m != NULL) {
+		message__print_gettext_msgid_msgstr(m);
+		m = m->next;
+	}
+}
+
+int main(int ac, char **av)
+{
+	conf_parse(av[1]);
+
+	menu_build_message_list(menu_get_root_menu(NULL));
+	menu__xgettext();
+	return 0;
+}
Index: buildrom/scripts/kconfig/lex.zconf.c_shipped
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lex.zconf.c_shipped	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,2317 @@
+
+#line 3 "scripts/kconfig/lex.zconf.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE zconfrestart(zconfin  )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int zconfleng;
+
+extern FILE *zconfin, *zconfout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
+		YY_RESTORE_YY_MORE_OFFSET \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up zconftext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr)  )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via zconfrestart()), so that the user can continue scanning by
+	 * just pointing zconfin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+
+	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when zconftext is formed. */
+static char yy_hold_char;
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+int zconfleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow zconfwrap()'s to do buffer switches
+ * instead of setting up a fresh zconfin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void zconfrestart (FILE *input_file  );
+void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size  );
+void zconf_delete_buffer (YY_BUFFER_STATE b  );
+void zconf_flush_buffer (YY_BUFFER_STATE b  );
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer  );
+void zconfpop_buffer_state (void );
+
+static void zconfensure_buffer_stack (void );
+static void zconf_load_buffer_state (void );
+static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len  );
+
+void *zconfalloc (yy_size_t  );
+void *zconfrealloc (void *,yy_size_t  );
+void zconffree (void *  );
+
+#define yy_new_buffer zconf_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        zconfensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){\
+        zconfensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define zconfwrap() 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int zconflineno;
+
+int zconflineno = 1;
+
+extern char *zconftext;
+#define yytext_ptr zconftext
+static yyconst flex_int16_t yy_nxt[][17] =
+    {
+    {
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0
+    },
+
+    {
+       11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12
+    },
+
+    {
+       11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   16
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   16
+
+    },
+
+    {
+       11,   19,   20,   21,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19
+    },
+
+    {
+       11,   19,   20,   21,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19
+    },
+
+    {
+       11,   22,   22,   23,   22,   24,   22,   22,   24,   22,
+       22,   22,   22,   22,   22,   25,   22
+    },
+
+    {
+       11,   22,   22,   23,   22,   24,   22,   22,   24,   22,
+       22,   22,   22,   22,   22,   25,   22
+    },
+
+    {
+       11,   26,   26,   27,   28,   29,   30,   31,   29,   32,
+       33,   34,   35,   35,   36,   37,   38
+
+    },
+
+    {
+       11,   26,   26,   27,   28,   29,   30,   31,   29,   32,
+       33,   34,   35,   35,   36,   37,   38
+    },
+
+    {
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
+      -11,  -11,  -11,  -11,  -11,  -11,  -11
+    },
+
+    {
+       11,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+      -12,  -12,  -12,  -12,  -12,  -12,  -12
+    },
+
+    {
+       11,  -13,   39,   40,  -13,  -13,   41,  -13,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13
+    },
+
+    {
+       11,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14
+
+    },
+
+    {
+       11,   42,   42,   43,   42,   42,   42,   42,   42,   42,
+       42,   42,   42,   42,   42,   42,   42
+    },
+
+    {
+       11,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,  -16,  -16,  -16,  -16,  -16,  -16
+    },
+
+    {
+       11,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17
+    },
+
+    {
+       11,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,   44,  -18,  -18,  -18
+    },
+
+    {
+       11,   45,   45,  -19,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45
+
+    },
+
+    {
+       11,  -20,   46,   47,  -20,  -20,  -20,  -20,  -20,  -20,
+      -20,  -20,  -20,  -20,  -20,  -20,  -20
+    },
+
+    {
+       11,   48,  -21,  -21,   48,   48,   48,   48,   48,   48,
+       48,   48,   48,   48,   48,   48,   48
+    },
+
+    {
+       11,   49,   49,   50,   49,  -22,   49,   49,  -22,   49,
+       49,   49,   49,   49,   49,  -22,   49
+    },
+
+    {
+       11,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
+      -23,  -23,  -23,  -23,  -23,  -23,  -23
+    },
+
+    {
+       11,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
+      -24,  -24,  -24,  -24,  -24,  -24,  -24
+
+    },
+
+    {
+       11,   51,   51,   52,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,   51,   51,   51
+    },
+
+    {
+       11,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
+      -26,  -26,  -26,  -26,  -26,  -26,  -26
+    },
+
+    {
+       11,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
+      -27,  -27,  -27,  -27,  -27,  -27,  -27
+    },
+
+    {
+       11,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
+      -28,  -28,  -28,  -28,   53,  -28,  -28
+    },
+
+    {
+       11,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29
+
+    },
+
+    {
+       11,   54,   54,  -30,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54
+    },
+
+    {
+       11,  -31,  -31,  -31,  -31,  -31,  -31,   55,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31
+    },
+
+    {
+       11,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
+      -32,  -32,  -32,  -32,  -32,  -32,  -32
+    },
+
+    {
+       11,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
+      -33,  -33,  -33,  -33,  -33,  -33,  -33
+    },
+
+    {
+       11,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,
+      -34,   56,   57,   57,  -34,  -34,  -34
+
+    },
+
+    {
+       11,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,   57,   57,   57,  -35,  -35,  -35
+    },
+
+    {
+       11,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36
+    },
+
+    {
+       11,  -37,  -37,   58,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37
+    },
+
+    {
+       11,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,   59
+    },
+
+    {
+       11,  -39,   39,   40,  -39,  -39,   41,  -39,  -39,  -39,
+      -39,  -39,  -39,  -39,  -39,  -39,  -39
+
+    },
+
+    {
+       11,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,  -40,  -40,  -40
+    },
+
+    {
+       11,   42,   42,   43,   42,   42,   42,   42,   42,   42,
+       42,   42,   42,   42,   42,   42,   42
+    },
+
+    {
+       11,   42,   42,   43,   42,   42,   42,   42,   42,   42,
+       42,   42,   42,   42,   42,   42,   42
+    },
+
+    {
+       11,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
+      -43,  -43,  -43,  -43,  -43,  -43,  -43
+    },
+
+    {
+       11,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+      -44,  -44,  -44,   44,  -44,  -44,  -44
+
+    },
+
+    {
+       11,   45,   45,  -45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45
+    },
+
+    {
+       11,  -46,   46,   47,  -46,  -46,  -46,  -46,  -46,  -46,
+      -46,  -46,  -46,  -46,  -46,  -46,  -46
+    },
+
+    {
+       11,   48,  -47,  -47,   48,   48,   48,   48,   48,   48,
+       48,   48,   48,   48,   48,   48,   48
+    },
+
+    {
+       11,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48
+    },
+
+    {
+       11,   49,   49,   50,   49,  -49,   49,   49,  -49,   49,
+       49,   49,   49,   49,   49,  -49,   49
+
+    },
+
+    {
+       11,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
+      -50,  -50,  -50,  -50,  -50,  -50,  -50
+    },
+
+    {
+       11,  -51,  -51,   52,  -51,  -51,  -51,  -51,  -51,  -51,
+      -51,  -51,  -51,  -51,  -51,  -51,  -51
+    },
+
+    {
+       11,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
+      -52,  -52,  -52,  -52,  -52,  -52,  -52
+    },
+
+    {
+       11,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53
+    },
+
+    {
+       11,   54,   54,  -54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54
+
+    },
+
+    {
+       11,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,
+      -55,  -55,  -55,  -55,  -55,  -55,  -55
+    },
+
+    {
+       11,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,
+      -56,   60,   57,   57,  -56,  -56,  -56
+    },
+
+    {
+       11,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+      -57,   57,   57,   57,  -57,  -57,  -57
+    },
+
+    {
+       11,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,
+      -58,  -58,  -58,  -58,  -58,  -58,  -58
+    },
+
+    {
+       11,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,
+      -59,  -59,  -59,  -59,  -59,  -59,  -59
+
+    },
+
+    {
+       11,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,
+      -60,   57,   57,   57,  -60,  -60,  -60
+    },
+
+    } ;
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up zconftext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	(yytext_ptr) = yy_bp; \
+	zconfleng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
+	*yy_cp = '\0'; \
+	(yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 33
+#define YY_END_OF_BUFFER 34
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_accept[61] =
+    {   0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       34,    5,    4,    2,    3,    7,    8,    6,   32,   29,
+       31,   24,   28,   27,   26,   22,   17,   13,   16,   20,
+       22,   11,   12,   19,   19,   14,   22,   22,    4,    2,
+        3,    3,    1,    6,   32,   29,   31,   30,   24,   23,
+       26,   25,   15,   20,    9,   19,   19,   21,   10,   18
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    4,    5,    6,    1,    1,    7,    8,    9,
+       10,    1,    1,    1,   11,   12,   12,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,    1,    1,    1,
+       14,    1,    1,    1,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+        1,   15,    1,    1,   13,    1,   13,   13,   13,   13,
+
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,    1,   16,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+extern int zconf_flex_debug;
+int zconf_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *zconftext;
+
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define START_STRSIZE	16
+
+static struct {
+	struct file *file;
+	int lineno;
+} current_pos;
+
+static char *text;
+static int text_size, text_asize;
+
+struct buffer {
+        struct buffer *parent;
+        YY_BUFFER_STATE state;
+};
+
+struct buffer *current_buf;
+
+static int last_ts, first_ts;
+
+static void zconf_endhelp(void);
+static void zconf_endfile(void);
+
+void new_string(void)
+{
+	text = malloc(START_STRSIZE);
+	text_asize = START_STRSIZE;
+	text_size = 0;
+	*text = 0;
+}
+
+void append_string(const char *str, int size)
+{
+	int new_size = text_size + size + 1;
+	if (new_size > text_asize) {
+		new_size += START_STRSIZE - 1;
+		new_size &= -START_STRSIZE;
+		text = realloc(text, new_size);
+		text_asize = new_size;
+	}
+	memcpy(text + text_size, str, size);
+	text_size += size;
+	text[text_size] = 0;
+}
+
+void alloc_string(const char *str, int size)
+{
+	text = malloc(size + 1);
+	memcpy(text, str, size);
+	text[size] = 0;
+}
+
+#define INITIAL 0
+#define COMMAND 1
+#define HELP 2
+#define STRING 3
+#define PARAM 4
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int zconfwrap (void );
+#else
+extern int zconfwrap (void );
+#endif
+#endif
+
+    static void yyunput (int c,char *buf_ptr  );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	errno=0; \
+	while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \
+	{ \
+		if( errno != EINTR) \
+		{ \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+			break; \
+		} \
+		errno=0; \
+		clearerr(zconfin); \
+	}\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int zconflex (void);
+
+#define YY_DECL int zconflex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after zconftext and zconfleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+
+	int str = 0;
+	int ts, i;
+
+	if ( (yy_init) )
+		{
+		(yy_init) = 0;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! (yy_start) )
+			(yy_start) = 1;	/* first start state */
+
+		if ( ! zconfin )
+			zconfin = stdin;
+
+		if ( ! zconfout )
+			zconfout = stdout;
+
+		if ( ! YY_CURRENT_BUFFER ) {
+			zconfensure_buffer_stack ();
+			YY_CURRENT_BUFFER_LVALUE =
+				zconf_create_buffer(zconfin,YY_BUF_SIZE );
+		}
+
+		zconf_load_buffer_state( );
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = (yy_c_buf_p);
+
+		/* Support of zconftext. */
+		*yy_cp = (yy_hold_char);
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = (yy_start);
+yy_match:
+		while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)]  ]) > 0 )
+			++yy_cp;
+
+		yy_current_state = -yy_current_state;
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+
+		YY_DO_BEFORE_ACTION;
+
+do_action:	/* This label is used only to access EOF actions. */
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+case 1:
+/* rule 1 can match eol */
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+{
+	current_file->lineno++;
+	return T_EOL;
+}
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+{
+	BEGIN(COMMAND);
+}
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+{
+	unput(zconftext[0]);
+	BEGIN(COMMAND);
+}
+	YY_BREAK
+
+case 6:
+YY_RULE_SETUP
+{
+		struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
+		BEGIN(PARAM);
+		current_pos.file = current_file;
+		current_pos.lineno = current_file->lineno;
+		if (id && id->flags & TF_COMMAND) {
+			zconflval.id = id;
+			return id->token;
+		}
+		alloc_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+
+	YY_BREAK
+case 8:
+/* rule 8 can match eol */
+YY_RULE_SETUP
+{
+		BEGIN(INITIAL);
+		current_file->lineno++;
+		return T_EOL;
+	}
+	YY_BREAK
+
+case 9:
+YY_RULE_SETUP
+return T_AND;
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+return T_OR;
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+return T_OPEN_PAREN;
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+return T_CLOSE_PAREN;
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+return T_NOT;
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+return T_EQUAL;
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+return T_UNEQUAL;
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+{
+		str = zconftext[0];
+		new_string();
+		BEGIN(STRING);
+	}
+	YY_BREAK
+case 17:
+/* rule 17 can match eol */
+YY_RULE_SETUP
+BEGIN(INITIAL); current_file->lineno++; return T_EOL;
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+/* ignore */
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+{
+		struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
+		if (id && id->flags & TF_PARAM) {
+			zconflval.id = id;
+			return id->token;
+		}
+		alloc_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+/* comment */
+	YY_BREAK
+case 21:
+/* rule 21 can match eol */
+YY_RULE_SETUP
+current_file->lineno++;
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+
+	YY_BREAK
+case YY_STATE_EOF(PARAM):
+{
+		BEGIN(INITIAL);
+	}
+	YY_BREAK
+
+case 23:
+/* rule 23 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+	}
+	YY_BREAK
+case 25:
+/* rule 25 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		append_string(zconftext + 1, zconfleng - 1);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+{
+		append_string(zconftext + 1, zconfleng - 1);
+	}
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+{
+		if (str == zconftext[0]) {
+			BEGIN(PARAM);
+			zconflval.string = text;
+			return T_WORD_QUOTE;
+		} else
+			append_string(zconftext, 1);
+	}
+	YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+{
+		printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
+		current_file->lineno++;
+		BEGIN(INITIAL);
+		return T_EOL;
+	}
+	YY_BREAK
+case YY_STATE_EOF(STRING):
+{
+		BEGIN(INITIAL);
+	}
+	YY_BREAK
+
+case 29:
+YY_RULE_SETUP
+{
+		ts = 0;
+		for (i = 0; i < zconfleng; i++) {
+			if (zconftext[i] == '\t')
+				ts = (ts & ~7) + 8;
+			else
+				ts++;
+		}
+		last_ts = ts;
+		if (first_ts) {
+			if (ts < first_ts) {
+				zconf_endhelp();
+				return T_HELPTEXT;
+			}
+			ts -= first_ts;
+			while (ts > 8) {
+				append_string("        ", 8);
+				ts -= 8;
+			}
+			append_string("        ", ts);
+		}
+	}
+	YY_BREAK
+case 30:
+/* rule 30 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		current_file->lineno++;
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+{
+		current_file->lineno++;
+		append_string("\n", 1);
+	}
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+		if (!first_ts)
+			first_ts = last_ts;
+	}
+	YY_BREAK
+case YY_STATE_EOF(HELP):
+{
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	YY_BREAK
+
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(COMMAND):
+{
+	if (current_file) {
+		zconf_endfile();
+		return T_EOL;
+	}
+	fclose(zconfin);
+	yyterminate();
+}
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+YY_FATAL_ERROR( "flex scanner jammed" );
+	YY_BREAK
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = (yy_hold_char);
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed zconfin at a new source and called
+			 * zconflex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state(  );
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++(yy_c_buf_p);
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = (yy_c_buf_p);
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer(  ) )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				(yy_did_buffer_switch_on_eof) = 0;
+
+				if ( zconfwrap( ) )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * zconftext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				(yy_c_buf_p) =
+					(yytext_ptr) + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				(yy_c_buf_p) =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+} /* end of zconflex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = (yytext_ptr);
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+	else
+		{
+			size_t num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+			int yy_c_buf_p_offset =
+				(int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+						number_to_move - 1;
+
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			(yy_n_chars), num_to_read );
+
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	if ( (yy_n_chars) == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			zconfrestart(zconfin  );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	(yy_n_chars) += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+	return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (void)
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+
+	yy_current_state = (yy_start);
+
+	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+		{
+		yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)];
+		}
+
+	return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
+	register int yy_is_jam;
+
+	yy_current_state = yy_nxt[yy_current_state][1];
+	yy_is_jam = (yy_current_state <= 0);
+
+	return yy_is_jam ? 0 : yy_current_state;
+}
+
+    static void yyunput (int c, register char * yy_bp )
+{
+	register char *yy_cp;
+
+    yy_cp = (yy_c_buf_p);
+
+	/* undo effects of setting up zconftext */
+	*yy_cp = (yy_hold_char);
+
+	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = (yy_n_chars) + 2;
+		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+		register char *source =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+	(yytext_ptr) = yy_bp;
+	(yy_hold_char) = *yy_cp;
+	(yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (void)
+#else
+    static int input  (void)
+#endif
+
+{
+	int c;
+
+	*(yy_c_buf_p) = (yy_hold_char);
+
+	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			/* This was really a NUL. */
+			*(yy_c_buf_p) = '\0';
+
+		else
+			{ /* need more input */
+			int offset = (yy_c_buf_p) - (yytext_ptr);
+			++(yy_c_buf_p);
+
+			switch ( yy_get_next_buffer(  ) )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					zconfrestart(zconfin );
+
+					/*FALLTHROUGH*/
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( zconfwrap( ) )
+						return EOF;
+
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					(yy_c_buf_p) = (yytext_ptr) + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+	*(yy_c_buf_p) = '\0';	/* preserve zconftext */
+	(yy_hold_char) = *++(yy_c_buf_p);
+
+	return c;
+}
+#endif	/* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void zconfrestart  (FILE * input_file )
+{
+
+	if ( ! YY_CURRENT_BUFFER ){
+        zconfensure_buffer_stack ();
+		YY_CURRENT_BUFFER_LVALUE =
+            zconf_create_buffer(zconfin,YY_BUF_SIZE );
+	}
+
+	zconf_init_buffer(YY_CURRENT_BUFFER,input_file );
+	zconf_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+    void zconf_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		zconfpop_buffer_state();
+	 *		zconfpush_buffer_state(new_buffer);
+     */
+	zconfensure_buffer_stack ();
+	if ( YY_CURRENT_BUFFER == new_buffer )
+		return;
+
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	zconf_load_buffer_state( );
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (zconfwrap()) processing, but the only time this flag
+	 * is looked at is after zconfwrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void zconf_load_buffer_state  (void)
+{
+    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	(yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE zconf_create_buffer  (FILE * file, int  size )
+{
+	YY_BUFFER_STATE b;
+
+	b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2  );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	zconf_init_buffer(b,file );
+
+	return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with zconf_create_buffer()
+ *
+ */
+    void zconf_delete_buffer (YY_BUFFER_STATE  b )
+{
+
+	if ( ! b )
+		return;
+
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		zconffree((void *) b->yy_ch_buf  );
+
+	zconffree((void *) b  );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a zconfrestart() or at EOF.
+ */
+    static void zconf_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+
+{
+	int oerrno = errno;
+
+	zconf_flush_buffer(b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then zconf_init_buffer was _probably_
+     * called from zconfrestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = 0;
+
+	errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+    void zconf_flush_buffer (YY_BUFFER_STATE  b )
+{
+    	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == YY_CURRENT_BUFFER )
+		zconf_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *
+ */
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+    	if (new_buffer == NULL)
+		return;
+
+	zconfensure_buffer_stack();
+
+	/* This block is copied from zconf_switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		(yy_buffer_stack_top)++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from zconf_switch_to_buffer. */
+	zconf_load_buffer_state( );
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *
+ */
+void zconfpop_buffer_state (void)
+{
+    	if (!YY_CURRENT_BUFFER)
+		return;
+
+	zconf_delete_buffer(YY_CURRENT_BUFFER );
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if ((yy_buffer_stack_top) > 0)
+		--(yy_buffer_stack_top);
+
+	if (YY_CURRENT_BUFFER) {
+		zconf_load_buffer_state( );
+		(yy_did_buffer_switch_on_eof) = 1;
+	}
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void zconfensure_buffer_stack (void)
+{
+	int num_to_alloc;
+
+	if (!(yy_buffer_stack)) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		(yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+
+		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+		(yy_buffer_stack_max) = num_to_alloc;
+		(yy_buffer_stack_top) = 0;
+		return;
+	}
+
+	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = (yy_buffer_stack_max) + grow_size;
+		(yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc
+								((yy_buffer_stack),
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+
+		/* zero only the new slots.*/
+		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+		(yy_buffer_stack_max) = num_to_alloc;
+	}
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE zconf_scan_buffer  (char * base, yy_size_t  size )
+{
+	YY_BUFFER_STATE b;
+
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	zconf_switch_to_buffer(b  );
+
+	return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to zconflex() will
+ * scan from a @e copy of @a str.
+ * @param yy_str a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       zconf_scan_bytes() instead.
+ */
+YY_BUFFER_STATE zconf_scan_string (yyconst char * yy_str )
+{
+
+	return zconf_scan_bytes(yy_str,strlen(yy_str) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE zconf_scan_bytes  (yyconst char * bytes, int  len )
+{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = len + 2;
+	buf = (char *) zconfalloc(n  );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" );
+
+	for ( i = 0; i < len; ++i )
+		buf[i] = bytes[i];
+
+	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = zconf_scan_buffer(buf,n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+    	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		zconftext[zconfleng] = (yy_hold_char); \
+		(yy_c_buf_p) = zconftext + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		zconfleng = yyless_macro_arg; \
+		} \
+	while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int zconfget_lineno  (void)
+{
+
+    return zconflineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *zconfget_in  (void)
+{
+        return zconfin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *zconfget_out  (void)
+{
+        return zconfout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int zconfget_leng  (void)
+{
+        return zconfleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *zconfget_text  (void)
+{
+        return zconftext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void zconfset_lineno (int  line_number )
+{
+
+    zconflineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see zconf_switch_to_buffer
+ */
+void zconfset_in (FILE *  in_str )
+{
+        zconfin = in_str ;
+}
+
+void zconfset_out (FILE *  out_str )
+{
+        zconfout = out_str ;
+}
+
+int zconfget_debug  (void)
+{
+        return zconf_flex_debug;
+}
+
+void zconfset_debug (int  bdebug )
+{
+        zconf_flex_debug = bdebug ;
+}
+
+/* zconflex_destroy is for both reentrant and non-reentrant scanners. */
+int zconflex_destroy  (void)
+{
+
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		zconf_delete_buffer(YY_CURRENT_BUFFER  );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		zconfpop_buffer_state();
+	}
+
+	/* Destroy the stack itself. */
+	zconffree((yy_buffer_stack) );
+	(yy_buffer_stack) = NULL;
+
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+	register int i;
+    	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+	register int n;
+    	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+}
+#endif
+
+void *zconfalloc (yy_size_t  size )
+{
+	return (void *) malloc( size );
+}
+
+void *zconfrealloc  (void * ptr, yy_size_t  size )
+{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+}
+
+void zconffree (void * ptr )
+{
+	free( (char *) ptr );	/* see zconfrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#undef YY_NEW_FILE
+#undef YY_FLUSH_BUFFER
+#undef yy_set_bol
+#undef yy_new_buffer
+#undef yy_set_interactive
+#undef yytext_ptr
+#undef YY_DO_BEFORE_ACTION
+
+#ifdef YY_DECL_IS_OURS
+#undef YY_DECL_IS_OURS
+#undef YY_DECL
+#endif
+
+void zconf_starthelp(void)
+{
+	new_string();
+	last_ts = first_ts = 0;
+	BEGIN(HELP);
+}
+
+static void zconf_endhelp(void)
+{
+	zconflval.string = text;
+	BEGIN(INITIAL);
+}
+
+/*
+ * Try to open specified file with following names:
+ * ./name
+ * $(srctree)/name
+ * The latter is used when srctree is separate from objtree
+ * when compiling the kernel.
+ * Return NULL if file is not found.
+ */
+FILE *zconf_fopen(const char *name)
+{
+	char *env, fullname[PATH_MAX+1];
+	FILE *f;
+
+	f = fopen(name, "r");
+	if (!f && name[0] != '/') {
+		env = getenv(SRCTREE);
+		if (env) {
+			sprintf(fullname, "%s/%s", env, name);
+			f = fopen(fullname, "r");
+		}
+	}
+	return f;
+}
+
+void zconf_initscan(const char *name)
+{
+	zconfin = zconf_fopen(name);
+	if (!zconfin) {
+		printf("can't find file %s\n", name);
+		exit(1);
+	}
+
+	current_buf = malloc(sizeof(*current_buf));
+	memset(current_buf, 0, sizeof(*current_buf));
+
+	current_file = file_lookup(name);
+	current_file->lineno = 1;
+	current_file->flags = FILE_BUSY;
+}
+
+void zconf_nextfile(const char *name)
+{
+	struct file *file = file_lookup(name);
+	struct buffer *buf = malloc(sizeof(*buf));
+	memset(buf, 0, sizeof(*buf));
+
+	current_buf->state = YY_CURRENT_BUFFER;
+	zconfin = zconf_fopen(name);
+	if (!zconfin) {
+		printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
+		exit(1);
+	}
+	zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
+	buf->parent = current_buf;
+	current_buf = buf;
+
+	if (file->flags & FILE_BUSY) {
+		printf("recursive scan (%s)?\n", name);
+		exit(1);
+	}
+	if (file->flags & FILE_SCANNED) {
+		printf("file %s already scanned?\n", name);
+		exit(1);
+	}
+	file->flags |= FILE_BUSY;
+	file->lineno = 1;
+	file->parent = current_file;
+	current_file = file;
+}
+
+static void zconf_endfile(void)
+{
+	struct buffer *parent;
+
+	current_file->flags |= FILE_SCANNED;
+	current_file->flags &= ~FILE_BUSY;
+	current_file = current_file->parent;
+
+	parent = current_buf->parent;
+	if (parent) {
+		fclose(zconfin);
+		zconf_delete_buffer(YY_CURRENT_BUFFER);
+		zconf_switch_to_buffer(parent->state);
+	}
+	free(current_buf);
+	current_buf = parent;
+}
+
+int zconf_lineno(void)
+{
+	return current_pos.lineno;
+}
+
+char *zconf_curname(void)
+{
+	return current_pos.file ? current_pos.file->name : "<none>";
+}
+
Index: buildrom/scripts/kconfig/lkc.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lkc.h	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef LKC_H
+#define LKC_H
+
+#include "expr.h"
+
+#ifndef KBUILD_NO_NLS
+# include <libintl.h>
+#else
+# define gettext(Msgid) ((const char *) (Msgid))
+# define textdomain(Domainname) ((const char *) (Domainname))
+# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef LKC_DIRECT_LINK
+#define P(name,type,arg)	extern type name arg
+#else
+#include "lkc_defs.h"
+#define P(name,type,arg)	extern type (*name ## _p) arg
+#endif
+#include "lkc_proto.h"
+#undef P
+
+#define SRCTREE "srctree"
+
+#define PACKAGE "linux"
+#define LOCALEDIR "/usr/share/locale"
+
+#define _(text) gettext(text)
+#define N_(text) (text)
+
+
+#define TF_COMMAND	0x0001
+#define TF_PARAM	0x0002
+
+struct kconf_id {
+	int name;
+	int token;
+	unsigned int flags;
+	enum symbol_type stype;
+};
+
+int zconfparse(void);
+void zconfdump(FILE *out);
+
+extern int zconfdebug;
+void zconf_starthelp(void);
+FILE *zconf_fopen(const char *name);
+void zconf_initscan(const char *name);
+void zconf_nextfile(const char *name);
+int zconf_lineno(void);
+char *zconf_curname(void);
+
+/* confdata.c */
+extern const char conf_def_filename[];
+
+char *conf_get_default_confname(void);
+
+/* kconfig_load.c */
+void kconfig_load(void);
+
+/* menu.c */
+void menu_init(void);
+struct menu *menu_add_menu(void);
+void menu_end_menu(void);
+void menu_add_entry(struct symbol *sym);
+void menu_end_entry(void);
+void menu_add_dep(struct expr *dep);
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
+struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
+void menu_finalize(struct menu *parent);
+void menu_set_type(int type);
+
+/* util.c */
+struct file *file_lookup(const char *name);
+int file_write_dep(const char *name);
+
+struct gstr {
+	size_t len;
+	char  *s;
+};
+struct gstr str_new(void);
+struct gstr str_assign(const char *s);
+void str_free(struct gstr *gs);
+void str_append(struct gstr *gs, const char *s);
+void str_printf(struct gstr *gs, const char *fmt, ...);
+const char *str_get(struct gstr *gs);
+
+/* symbol.c */
+void sym_init(void);
+void sym_clear_all_valid(void);
+void sym_set_changed(struct symbol *sym);
+struct symbol *sym_check_deps(struct symbol *sym);
+struct property *prop_alloc(enum prop_type type, struct symbol *sym);
+struct symbol *prop_get_symbol(struct property *prop);
+
+static inline tristate sym_get_tristate_value(struct symbol *sym)
+{
+	return sym->curr.tri;
+}
+
+
+static inline struct symbol *sym_get_choice_value(struct symbol *sym)
+{
+	return (struct symbol *)sym->curr.val;
+}
+
+static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
+{
+	return sym_set_tristate_value(chval, yes);
+}
+
+static inline bool sym_is_choice(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_CHOICE ? true : false;
+}
+
+static inline bool sym_is_choice_value(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_CHOICEVAL ? true : false;
+}
+
+static inline bool sym_is_optional(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_OPTIONAL ? true : false;
+}
+
+static inline bool sym_has_value(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_NEW ? false : true;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LKC_H */
Index: buildrom/scripts/kconfig/lkc_proto.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lkc_proto.h	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,41 @@
+
+/* confdata.c */
+P(conf_parse,void,(const char *name));
+P(conf_read,int,(const char *name));
+P(conf_read_simple,int,(const char *name));
+P(conf_write,int,(const char *name));
+
+/* menu.c */
+P(rootmenu,struct menu,);
+
+P(menu_is_visible,bool,(struct menu *menu));
+P(menu_get_prompt,const char *,(struct menu *menu));
+P(menu_get_root_menu,struct menu *,(struct menu *menu));
+P(menu_get_parent_menu,struct menu *,(struct menu *menu));
+
+/* symbol.c */
+P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
+P(sym_change_count,int,);
+
+P(sym_lookup,struct symbol *,(const char *name, int isconst));
+P(sym_find,struct symbol *,(const char *name));
+P(sym_re_search,struct symbol **,(const char *pattern));
+P(sym_type_name,const char *,(enum symbol_type type));
+P(sym_calc_value,void,(struct symbol *sym));
+P(sym_get_type,enum symbol_type,(struct symbol *sym));
+P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
+P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
+P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
+P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
+P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
+P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
+P(sym_is_changable,bool,(struct symbol *sym));
+P(sym_get_choice_prop,struct property *,(struct symbol *sym));
+P(sym_get_default_prop,struct property *,(struct symbol *sym));
+P(sym_get_string_value,const char *,(struct symbol *sym));
+
+P(prop_get_type_name,const char *,(enum prop_type type));
+
+/* expr.c */
+P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
+P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken));
Index: buildrom/scripts/kconfig/lxdialog/BIG.FAT.WARNING
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/BIG.FAT.WARNING	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,4 @@
+This is NOT the official version of dialog.  This version has been
+significantly modified from the original.  It is for use by the Linux
+busybox configuration script.  Please do not bother Savio Lam with
+questions about this program.
Index: buildrom/scripts/kconfig/lxdialog/checklist.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/checklist.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,333 @@
+/*
+ *  checklist.c -- implements the checklist box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *     Stuart Herbert - S.Herbert at sheffield.ac.uk: radiolist extension
+ *     Alessandro Rubini - rubini at ipvvis.unipv.it: merged the two
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap at cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static int list_width, check_x, item_x;
+
+/*
+ * Print list item
+ */
+static void print_item(WINDOW * win, const char *item, int status, int choice,
+		       int selected)
+{
+	int i;
+
+	/* Clear 'residue' of last item */
+	wattrset(win, menubox_attr);
+	wmove(win, choice, 0);
+	for (i = 0; i < list_width; i++)
+		waddch(win, ' ');
+
+	wmove(win, choice, check_x);
+	wattrset(win, selected ? check_selected_attr : check_attr);
+	wprintw(win, "(%c)", status ? 'X' : ' ');
+
+	wattrset(win, selected ? tag_selected_attr : tag_attr);
+	mvwaddch(win, choice, item_x, item[0]);
+	wattrset(win, selected ? item_selected_attr : item_attr);
+	waddstr(win, (char *)item + 1);
+	if (selected) {
+		wmove(win, choice, check_x + 1);
+		wrefresh(win);
+	}
+}
+
+/*
+ * Print the scroll indicators.
+ */
+static void print_arrows(WINDOW * win, int choice, int item_no, int scroll,
+	     int y, int x, int height)
+{
+	wmove(win, y, x);
+
+	if (scroll > 0) {
+		wattrset(win, uarrow_attr);
+		waddch(win, ACS_UARROW);
+		waddstr(win, "(-)");
+	} else {
+		wattrset(win, menubox_attr);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+	}
+
+	y = y + height + 1;
+	wmove(win, y, x);
+
+	if ((height < item_no) && (scroll + choice < item_no - 1)) {
+		wattrset(win, darrow_attr);
+		waddch(win, ACS_DARROW);
+		waddstr(win, "(+)");
+	} else {
+		wattrset(win, menubox_border_attr);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+	}
+}
+
+/*
+ *  Display the termination buttons
+ */
+static void print_buttons(WINDOW * dialog, int height, int width, int selected)
+{
+	int x = width / 2 - 11;
+	int y = height - 2;
+
+	print_button(dialog, "Select", y, x, selected == 0);
+	print_button(dialog, " Help ", y, x + 14, selected == 1);
+
+	wmove(dialog, y, x + 1 + 14 * selected);
+	wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ * in the style of radiolist (only one option turned on at a time).
+ */
+int dialog_checklist(const char *title, const char *prompt, int height,
+		     int width, int list_height, int item_no,
+		     const char *const *items)
+{
+	int i, x, y, box_x, box_y;
+	int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
+	WINDOW *dialog, *list;
+
+	/* Allocate space for storing item on/off status */
+	if ((status = malloc(sizeof(int) * item_no)) == NULL) {
+		endwin();
+		fprintf(stderr,
+			"\nCan't allocate memory in dialog_checklist().\n");
+		exit(-1);
+	}
+
+	/* Initializes status */
+	for (i = 0; i < item_no; i++) {
+		status[i] = !strcasecmp(items[i * 3 + 2], "on");
+		if ((!choice && status[i])
+		    || !strcasecmp(items[i * 3 + 2], "selected"))
+			choice = i + 1;
+	}
+	if (choice)
+		choice--;
+
+	max_choice = MIN(list_height, item_no);
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+	wattrset(dialog, border_attr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dialog_attr);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dialog_attr);
+	print_autowrap(dialog, prompt, width - 2, 1, 3);
+
+	list_width = width - 6;
+	box_y = height - list_height - 5;
+	box_x = (width - list_width) / 2 - 1;
+
+	/* create new window for the list */
+	list = subwin(dialog, list_height, list_width, y + box_y + 1,
+	              x + box_x + 1);
+
+	keypad(list, TRUE);
+
+	/* draw a box around the list items */
+	draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2,
+	         menubox_border_attr, menubox_attr);
+
+	/* Find length of longest item in order to center checklist */
+	check_x = 0;
+	for (i = 0; i < item_no; i++)
+		check_x = MAX(check_x, +strlen(items[i * 3 + 1]) + 4);
+
+	check_x = (list_width - check_x) / 2;
+	item_x = check_x + 4;
+
+	if (choice >= list_height) {
+		scroll = choice - list_height + 1;
+		choice -= scroll;
+	}
+
+	/* Print the list */
+	for (i = 0; i < max_choice; i++) {
+		print_item(list, items[(scroll + i) * 3 + 1],
+			   status[i + scroll], i, i == choice);
+	}
+
+	print_arrows(dialog, choice, item_no, scroll,
+		     box_y, box_x + check_x + 5, list_height);
+
+	print_buttons(dialog, height, width, 0);
+
+	wnoutrefresh(dialog);
+	wnoutrefresh(list);
+	doupdate();
+
+	while (key != ESC) {
+		key = wgetch(dialog);
+
+		for (i = 0; i < max_choice; i++)
+			if (toupper(key) ==
+			    toupper(items[(scroll + i) * 3 + 1][0]))
+				break;
+
+		if (i < max_choice || key == KEY_UP || key == KEY_DOWN ||
+		    key == '+' || key == '-') {
+			if (key == KEY_UP || key == '-') {
+				if (!choice) {
+					if (!scroll)
+						continue;
+					/* Scroll list down */
+					if (list_height > 1) {
+						/* De-highlight current first item */
+						print_item(list, items[scroll * 3 + 1],
+							   status[scroll], 0, FALSE);
+						scrollok(list, TRUE);
+						wscrl(list, -1);
+						scrollok(list, FALSE);
+					}
+					scroll--;
+					print_item(list, items[scroll * 3 + 1], status[scroll], 0, TRUE);
+					print_arrows(dialog, choice, item_no,
+						     scroll, box_y, box_x + check_x + 5, list_height);
+
+					wnoutrefresh(dialog);
+					wrefresh(list);
+
+					continue;	/* wait for another key press */
+				} else
+					i = choice - 1;
+			} else if (key == KEY_DOWN || key == '+') {
+				if (choice == max_choice - 1) {
+					if (scroll + choice >= item_no - 1)
+						continue;
+					/* Scroll list up */
+					if (list_height > 1) {
+						/* De-highlight current last item before scrolling up */
+						print_item(list, items[(scroll + max_choice - 1) * 3 + 1],
+							   status[scroll + max_choice - 1],
+							   max_choice - 1, FALSE);
+						scrollok(list, TRUE);
+						wscrl(list, 1);
+						scrollok(list, FALSE);
+					}
+					scroll++;
+					print_item(list, items[(scroll + max_choice - 1) * 3 + 1],
+						   status[scroll + max_choice - 1], max_choice - 1, TRUE);
+
+					print_arrows(dialog, choice, item_no,
+						     scroll, box_y, box_x + check_x + 5, list_height);
+
+					wnoutrefresh(dialog);
+					wrefresh(list);
+
+					continue;	/* wait for another key press */
+				} else
+					i = choice + 1;
+			}
+			if (i != choice) {
+				/* De-highlight current item */
+				print_item(list, items[(scroll + choice) * 3 + 1],
+					   status[scroll + choice], choice, FALSE);
+				/* Highlight new item */
+				choice = i;
+				print_item(list, items[(scroll + choice) * 3 + 1],
+					   status[scroll + choice], choice, TRUE);
+				wnoutrefresh(dialog);
+				wrefresh(list);
+			}
+			continue;	/* wait for another key press */
+		}
+		switch (key) {
+		case 'H':
+		case 'h':
+		case '?':
+			fprintf(stderr, "%s", items[(scroll + choice) * 3]);
+			delwin(dialog);
+			free(status);
+			return 1;
+		case TAB:
+		case KEY_LEFT:
+		case KEY_RIGHT:
+			button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			    ? 1 : (button > 1 ? 0 : button);
+
+			print_buttons(dialog, height, width, button);
+			wrefresh(dialog);
+			break;
+		case 'S':
+		case 's':
+		case ' ':
+		case '\n':
+			if (!button) {
+				if (!status[scroll + choice]) {
+					for (i = 0; i < item_no; i++)
+						status[i] = 0;
+					status[scroll + choice] = 1;
+					for (i = 0; i < max_choice; i++)
+						print_item(list, items[(scroll + i) * 3 + 1],
+							   status[scroll + i], i, i == choice);
+				}
+				wnoutrefresh(dialog);
+				wrefresh(list);
+
+				for (i = 0; i < item_no; i++)
+					if (status[i])
+						fprintf(stderr, "%s", items[i * 3]);
+			} else
+				fprintf(stderr, "%s", items[(scroll + choice) * 3]);
+			delwin(dialog);
+			free(status);
+			return button;
+		case 'X':
+		case 'x':
+			key = ESC;
+		case ESC:
+			break;
+		}
+
+		/* Now, update everything... */
+		doupdate();
+	}
+
+	delwin(dialog);
+	free(status);
+	return -1;		/* ESC pressed */
+}
Index: buildrom/scripts/kconfig/lxdialog/check-lxdialog.sh
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/check-lxdialog.sh	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,84 @@
+#!/bin/sh
+# Check ncurses compatibility
+
+# What library to link
+ldflags()
+{
+	$cc -print-file-name=libncursesw.so | grep -q /
+	if [ $? -eq 0 ]; then
+		echo '-lncursesw'
+		exit
+	fi
+	$cc -print-file-name=libncurses.so | grep -q /
+	if [ $? -eq 0 ]; then
+		echo '-lncurses'
+		exit
+	fi
+	$cc -print-file-name=libcurses.so | grep -q /
+	if [ $? -eq 0 ]; then
+		echo '-lcurses'
+		exit
+	fi
+	exit 1
+}
+
+# Where is ncurses.h?
+ccflags()
+{
+	if [ -f /usr/include/ncurses/ncurses.h ]; then
+		echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"'
+	elif [ -f /usr/include/ncurses/curses.h ]; then
+		echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"'
+	elif [ -f /usr/include/ncurses.h ]; then
+		echo '-DCURSES_LOC="<ncurses.h>"'
+	else
+		echo '-DCURSES_LOC="<curses.h>"'
+	fi
+}
+
+# Temp file, try to clean up after us
+tmp=.lxdialog.tmp
+trap "rm -f $tmp" 0 1 2 3 15
+
+# Check if we can link to ncurses
+check() {
+	echo "main() {}" | $cc -xc - -o $tmp 2> /dev/null
+	if [ $? != 0 ]; then
+		echo " *** Unable to find the ncurses libraries."          1>&2
+		echo " *** make menuconfig require the ncurses libraries"  1>&2
+		echo " *** "                                               1>&2
+		echo " *** Install ncurses (ncurses-devel) and try again"  1>&2
+		echo " *** "                                               1>&2
+		exit 1
+	fi
+}
+
+usage() {
+	printf "Usage: $0 [-check compiler options|-header|-library]\n"
+}
+
+if [ $# == 0 ]; then
+	usage
+	exit 1
+fi
+
+cc=""
+case "$1" in
+	"-check")
+		shift
+		cc="$@"
+		check
+		;;
+	"-ccflags")
+		ccflags
+		;;
+	"-ldflags")
+		shift
+		cc="$@"
+		ldflags
+		;;
+	"*")
+		usage
+		exit 1
+		;;
+esac
Index: buildrom/scripts/kconfig/lxdialog/colors.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/colors.h	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,154 @@
+/*
+ *  colors.h -- color attribute definitions
+ *
+ *  AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ *   Default color definitions
+ *
+ *   *_FG = foreground
+ *   *_BG = background
+ *   *_HL = highlight?
+ */
+#define SCREEN_FG                    COLOR_CYAN
+#define SCREEN_BG                    COLOR_BLUE
+#define SCREEN_HL                    TRUE
+
+#define SHADOW_FG                    COLOR_BLACK
+#define SHADOW_BG                    COLOR_BLACK
+#define SHADOW_HL                    TRUE
+
+#define DIALOG_FG                    COLOR_BLACK
+#define DIALOG_BG                    COLOR_WHITE
+#define DIALOG_HL                    FALSE
+
+#define TITLE_FG                     COLOR_YELLOW
+#define TITLE_BG                     COLOR_WHITE
+#define TITLE_HL                     TRUE
+
+#define BORDER_FG                    COLOR_WHITE
+#define BORDER_BG                    COLOR_WHITE
+#define BORDER_HL                    TRUE
+
+#define BUTTON_ACTIVE_FG             COLOR_WHITE
+#define BUTTON_ACTIVE_BG             COLOR_BLUE
+#define BUTTON_ACTIVE_HL             TRUE
+
+#define BUTTON_INACTIVE_FG           COLOR_BLACK
+#define BUTTON_INACTIVE_BG           COLOR_WHITE
+#define BUTTON_INACTIVE_HL           FALSE
+
+#define BUTTON_KEY_ACTIVE_FG         COLOR_WHITE
+#define BUTTON_KEY_ACTIVE_BG         COLOR_BLUE
+#define BUTTON_KEY_ACTIVE_HL         TRUE
+
+#define BUTTON_KEY_INACTIVE_FG       COLOR_RED
+#define BUTTON_KEY_INACTIVE_BG       COLOR_WHITE
+#define BUTTON_KEY_INACTIVE_HL       FALSE
+
+#define BUTTON_LABEL_ACTIVE_FG       COLOR_YELLOW
+#define BUTTON_LABEL_ACTIVE_BG       COLOR_BLUE
+#define BUTTON_LABEL_ACTIVE_HL       TRUE
+
+#define BUTTON_LABEL_INACTIVE_FG     COLOR_BLACK
+#define BUTTON_LABEL_INACTIVE_BG     COLOR_WHITE
+#define BUTTON_LABEL_INACTIVE_HL     TRUE
+
+#define INPUTBOX_FG                  COLOR_BLACK
+#define INPUTBOX_BG                  COLOR_WHITE
+#define INPUTBOX_HL                  FALSE
+
+#define INPUTBOX_BORDER_FG           COLOR_BLACK
+#define INPUTBOX_BORDER_BG           COLOR_WHITE
+#define INPUTBOX_BORDER_HL           FALSE
+
+#define SEARCHBOX_FG                 COLOR_BLACK
+#define SEARCHBOX_BG                 COLOR_WHITE
+#define SEARCHBOX_HL                 FALSE
+
+#define SEARCHBOX_TITLE_FG           COLOR_YELLOW
+#define SEARCHBOX_TITLE_BG           COLOR_WHITE
+#define SEARCHBOX_TITLE_HL           TRUE
+
+#define SEARCHBOX_BORDER_FG          COLOR_WHITE
+#define SEARCHBOX_BORDER_BG          COLOR_WHITE
+#define SEARCHBOX_BORDER_HL          TRUE
+
+#define POSITION_INDICATOR_FG        COLOR_YELLOW
+#define POSITION_INDICATOR_BG        COLOR_WHITE
+#define POSITION_INDICATOR_HL        TRUE
+
+#define MENUBOX_FG                   COLOR_BLACK
+#define MENUBOX_BG                   COLOR_WHITE
+#define MENUBOX_HL                   FALSE
+
+#define MENUBOX_BORDER_FG            COLOR_WHITE
+#define MENUBOX_BORDER_BG            COLOR_WHITE
+#define MENUBOX_BORDER_HL            TRUE
+
+#define ITEM_FG                      COLOR_BLACK
+#define ITEM_BG                      COLOR_WHITE
+#define ITEM_HL                      FALSE
+
+#define ITEM_SELECTED_FG             COLOR_WHITE
+#define ITEM_SELECTED_BG             COLOR_BLUE
+#define ITEM_SELECTED_HL             TRUE
+
+#define TAG_FG                       COLOR_YELLOW
+#define TAG_BG                       COLOR_WHITE
+#define TAG_HL                       TRUE
+
+#define TAG_SELECTED_FG              COLOR_YELLOW
+#define TAG_SELECTED_BG              COLOR_BLUE
+#define TAG_SELECTED_HL              TRUE
+
+#define TAG_KEY_FG                   COLOR_YELLOW
+#define TAG_KEY_BG                   COLOR_WHITE
+#define TAG_KEY_HL                   TRUE
+
+#define TAG_KEY_SELECTED_FG          COLOR_YELLOW
+#define TAG_KEY_SELECTED_BG          COLOR_BLUE
+#define TAG_KEY_SELECTED_HL          TRUE
+
+#define CHECK_FG                     COLOR_BLACK
+#define CHECK_BG                     COLOR_WHITE
+#define CHECK_HL                     FALSE
+
+#define CHECK_SELECTED_FG            COLOR_WHITE
+#define CHECK_SELECTED_BG            COLOR_BLUE
+#define CHECK_SELECTED_HL            TRUE
+
+#define UARROW_FG                    COLOR_GREEN
+#define UARROW_BG                    COLOR_WHITE
+#define UARROW_HL                    TRUE
+
+#define DARROW_FG                    COLOR_GREEN
+#define DARROW_BG                    COLOR_WHITE
+#define DARROW_HL                    TRUE
+
+/* End of default color definitions */
+
+#define C_ATTR(x,y)                  ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
+#define COLOR_NAME_LEN               10
+#define COLOR_COUNT                  8
+
+/*
+ * Global variables
+ */
+
+extern int color_table[][3];
Index: buildrom/scripts/kconfig/lxdialog/dialog.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/dialog.h	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,177 @@
+/*
+ *  dialog.h -- common declarations for all dialog modules
+ *
+ *  AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __sun__
+#define CURS_MACROS
+#endif
+#include CURSES_LOC
+
+/*
+ * Colors in ncurses 1.9.9e do not work properly since foreground and
+ * background colors are OR'd rather than separately masked.  This version
+ * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
+ * with standard curses.  The simplest fix (to make this work with standard
+ * curses) uses the wbkgdset() function, not used in the original hack.
+ * Turn it off if we're building with 1.9.9e, since it just confuses things.
+ */
+#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
+#define OLD_NCURSES 1
+#undef  wbkgdset
+#define wbkgdset(w,p)		/*nothing */
+#else
+#define OLD_NCURSES 0
+#endif
+
+#define TR(params) _tracef params
+
+#define ESC 27
+#define TAB 9
+#define MAX_LEN 2048
+#define BUF_SIZE (10*1024)
+#define MIN(x,y) (x < y ? x : y)
+#define MAX(x,y) (x > y ? x : y)
+
+#ifndef ACS_ULCORNER
+#define ACS_ULCORNER '+'
+#endif
+#ifndef ACS_LLCORNER
+#define ACS_LLCORNER '+'
+#endif
+#ifndef ACS_URCORNER
+#define ACS_URCORNER '+'
+#endif
+#ifndef ACS_LRCORNER
+#define ACS_LRCORNER '+'
+#endif
+#ifndef ACS_HLINE
+#define ACS_HLINE '-'
+#endif
+#ifndef ACS_VLINE
+#define ACS_VLINE '|'
+#endif
+#ifndef ACS_LTEE
+#define ACS_LTEE '+'
+#endif
+#ifndef ACS_RTEE
+#define ACS_RTEE '+'
+#endif
+#ifndef ACS_UARROW
+#define ACS_UARROW '^'
+#endif
+#ifndef ACS_DARROW
+#define ACS_DARROW 'v'
+#endif
+
+/*
+ * Attribute names
+ */
+#define screen_attr                   attributes[0]
+#define shadow_attr                   attributes[1]
+#define dialog_attr                   attributes[2]
+#define title_attr                    attributes[3]
+#define border_attr                   attributes[4]
+#define button_active_attr            attributes[5]
+#define button_inactive_attr          attributes[6]
+#define button_key_active_attr        attributes[7]
+#define button_key_inactive_attr      attributes[8]
+#define button_label_active_attr      attributes[9]
+#define button_label_inactive_attr    attributes[10]
+#define inputbox_attr                 attributes[11]
+#define inputbox_border_attr          attributes[12]
+#define searchbox_attr                attributes[13]
+#define searchbox_title_attr          attributes[14]
+#define searchbox_border_attr         attributes[15]
+#define position_indicator_attr       attributes[16]
+#define menubox_attr                  attributes[17]
+#define menubox_border_attr           attributes[18]
+#define item_attr                     attributes[19]
+#define item_selected_attr            attributes[20]
+#define tag_attr                      attributes[21]
+#define tag_selected_attr             attributes[22]
+#define tag_key_attr                  attributes[23]
+#define tag_key_selected_attr         attributes[24]
+#define check_attr                    attributes[25]
+#define check_selected_attr           attributes[26]
+#define uarrow_attr                   attributes[27]
+#define darrow_attr                   attributes[28]
+
+/* number of attributes */
+#define ATTRIBUTE_COUNT               29
+
+/*
+ * Global variables
+ */
+extern bool use_colors;
+extern bool use_shadow;
+
+extern chtype attributes[];
+
+extern const char *backtitle;
+
+/*
+ * Function prototypes
+ */
+extern void create_rc(const char *filename);
+extern int parse_rc(void);
+
+void init_dialog(void);
+void end_dialog(void);
+void attr_clear(WINDOW * win, int height, int width, chtype attr);
+void dialog_clear(void);
+void color_setup(void);
+void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x);
+void print_button(WINDOW * win, const char *label, int y, int x, int selected);
+void print_title(WINDOW *dialog, const char *title, int width);
+void draw_box(WINDOW * win, int y, int x, int height, int width, chtype box,
+	      chtype border);
+void draw_shadow(WINDOW * win, int y, int x, int height, int width);
+
+int first_alpha(const char *string, const char *exempt);
+int dialog_yesno(const char *title, const char *prompt, int height, int width);
+int dialog_msgbox(const char *title, const char *prompt, int height,
+		  int width, int pause);
+int dialog_textbox(const char *title, const char *file, int height, int width);
+int dialog_menu(const char *title, const char *prompt, int height, int width,
+		int menu_height, const char *choice, int item_no,
+		const char *const *items);
+int dialog_checklist(const char *title, const char *prompt, int height,
+		     int width, int list_height, int item_no,
+		     const char *const *items);
+extern char dialog_input_result[];
+int dialog_inputbox(const char *title, const char *prompt, int height,
+		    int width, const char *init);
+
+/*
+ * This is the base for fictitious keys, which activate
+ * the buttons.
+ *
+ * Mouse-generated keys are the following:
+ *   -- the first 32 are used as numbers, in addition to '0'-'9'
+ *   -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
+ *   -- uppercase chars are used to invoke the button (M_EVENT + 'O')
+ */
+#define M_EVENT (KEY_MAX+1)
Index: buildrom/scripts/kconfig/lxdialog/inputbox.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/inputbox.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,224 @@
+/*
+ *  inputbox.c -- implements the input box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap at cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+char dialog_input_result[MAX_LEN + 1];
+
+/*
+ *  Print the termination buttons
+ */
+static void print_buttons(WINDOW * dialog, int height, int width, int selected)
+{
+	int x = width / 2 - 11;
+	int y = height - 2;
+
+	print_button(dialog, "  Ok  ", y, x, selected == 0);
+	print_button(dialog, " Help ", y, x + 14, selected == 1);
+
+	wmove(dialog, y, x + 1 + 14 * selected);
+	wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box for inputing a string
+ */
+int dialog_inputbox(const char *title, const char *prompt, int height, int width,
+                    const char *init)
+{
+	int i, x, y, box_y, box_x, box_width;
+	int input_x = 0, scroll = 0, key = 0, button = -1;
+	char *instr = dialog_input_result;
+	WINDOW *dialog;
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+	wattrset(dialog, border_attr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dialog_attr);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dialog_attr);
+	print_autowrap(dialog, prompt, width - 2, 1, 3);
+
+	/* Draw the input field box */
+	box_width = width - 6;
+	getyx(dialog, y, x);
+	box_y = y + 2;
+	box_x = (width - box_width) / 2;
+	draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, border_attr, dialog_attr);
+
+	print_buttons(dialog, height, width, 0);
+
+	/* Set up the initial value */
+	wmove(dialog, box_y, box_x);
+	wattrset(dialog, inputbox_attr);
+
+	if (!init)
+		instr[0] = '\0';
+	else
+		strcpy(instr, init);
+
+	input_x = strlen(instr);
+
+	if (input_x >= box_width) {
+		scroll = input_x - box_width + 1;
+		input_x = box_width - 1;
+		for (i = 0; i < box_width - 1; i++)
+			waddch(dialog, instr[scroll + i]);
+	} else {
+		waddstr(dialog, instr);
+	}
+
+	wmove(dialog, box_y, box_x + input_x);
+
+	wrefresh(dialog);
+
+	while (key != ESC) {
+		key = wgetch(dialog);
+
+		if (button == -1) {	/* Input box selected */
+			switch (key) {
+			case TAB:
+			case KEY_UP:
+			case KEY_DOWN:
+				break;
+			case KEY_LEFT:
+				continue;
+			case KEY_RIGHT:
+				continue;
+			case KEY_BACKSPACE:
+			case 127:
+				if (input_x || scroll) {
+					wattrset(dialog, inputbox_attr);
+					if (!input_x) {
+						scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1);
+						wmove(dialog, box_y, box_x);
+						for (i = 0; i < box_width; i++)
+							waddch(dialog,
+							       instr[scroll + input_x + i] ?
+							       instr[scroll + input_x + i] : ' ');
+						input_x = strlen(instr) - scroll;
+					} else
+						input_x--;
+					instr[scroll + input_x] = '\0';
+					mvwaddch(dialog, box_y, input_x + box_x, ' ');
+					wmove(dialog, box_y, input_x + box_x);
+					wrefresh(dialog);
+				}
+				continue;
+			default:
+				if (key < 0x100 && isprint(key)) {
+					if (scroll + input_x < MAX_LEN) {
+						wattrset(dialog, inputbox_attr);
+						instr[scroll + input_x] = key;
+						instr[scroll + input_x + 1] = '\0';
+						if (input_x == box_width - 1) {
+							scroll++;
+							wmove(dialog, box_y, box_x);
+							for (i = 0; i < box_width - 1; i++)
+								waddch(dialog, instr [scroll + i]);
+						} else {
+							wmove(dialog, box_y, input_x++ + box_x);
+							waddch(dialog, key);
+						}
+						wrefresh(dialog);
+					} else
+						flash();	/* Alarm user about overflow */
+					continue;
+				}
+			}
+		}
+		switch (key) {
+		case 'O':
+		case 'o':
+			delwin(dialog);
+			return 0;
+		case 'H':
+		case 'h':
+			delwin(dialog);
+			return 1;
+		case KEY_UP:
+		case KEY_LEFT:
+			switch (button) {
+			case -1:
+				button = 1;	/* Indicates "Cancel" button is selected */
+				print_buttons(dialog, height, width, 1);
+				break;
+			case 0:
+				button = -1;	/* Indicates input box is selected */
+				print_buttons(dialog, height, width, 0);
+				wmove(dialog, box_y, box_x + input_x);
+				wrefresh(dialog);
+				break;
+			case 1:
+				button = 0;	/* Indicates "OK" button is selected */
+				print_buttons(dialog, height, width, 0);
+				break;
+			}
+			break;
+		case TAB:
+		case KEY_DOWN:
+		case KEY_RIGHT:
+			switch (button) {
+			case -1:
+				button = 0;	/* Indicates "OK" button is selected */
+				print_buttons(dialog, height, width, 0);
+				break;
+			case 0:
+				button = 1;	/* Indicates "Cancel" button is selected */
+				print_buttons(dialog, height, width, 1);
+				break;
+			case 1:
+				button = -1;	/* Indicates input box is selected */
+				print_buttons(dialog, height, width, 0);
+				wmove(dialog, box_y, box_x + input_x);
+				wrefresh(dialog);
+				break;
+			}
+			break;
+		case ' ':
+		case '\n':
+			delwin(dialog);
+			return (button == -1 ? 0 : button);
+		case 'X':
+		case 'x':
+			key = ESC;
+		case ESC:
+			break;
+		}
+	}
+
+	delwin(dialog);
+	return -1;		/* ESC pressed */
+}
Index: buildrom/scripts/kconfig/lxdialog/lxdialog.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/lxdialog.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,204 @@
+/*
+ *  dialog - Display simple dialog boxes from shell scripts
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap at cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static void Usage(const char *name);
+
+typedef int (jumperFn) (const char *title, int argc, const char *const *argv);
+
+struct Mode {
+	char *name;
+	int argmin, argmax, argmod;
+	jumperFn *jumper;
+};
+
+jumperFn j_menu, j_radiolist, j_yesno, j_textbox, j_inputbox;
+jumperFn j_msgbox, j_infobox;
+
+static struct Mode modes[] = {
+	{"--menu", 9, 0, 3, j_menu},
+	{"--radiolist", 9, 0, 3, j_radiolist},
+	{"--yesno", 5, 5, 1, j_yesno},
+	{"--textbox", 5, 5, 1, j_textbox},
+	{"--inputbox", 5, 6, 1, j_inputbox},
+	{"--msgbox", 5, 5, 1, j_msgbox},
+	{"--infobox", 5, 5, 1, j_infobox},
+	{NULL, 0, 0, 0, NULL}
+};
+
+static struct Mode *modePtr;
+
+#ifdef LOCALE
+#include <locale.h>
+#endif
+
+int main(int argc, const char *const *argv)
+{
+	int offset = 0, opt_clear = 0, end_common_opts = 0, retval;
+	const char *title = NULL;
+
+#ifdef LOCALE
+	(void)setlocale(LC_ALL, "");
+#endif
+
+#ifdef TRACE
+	trace(TRACE_CALLS | TRACE_UPDATE);
+#endif
+	if (argc < 2) {
+		Usage(argv[0]);
+		exit(-1);
+	}
+
+	while (offset < argc - 1 && !end_common_opts) {	/* Common options */
+		if (!strcmp(argv[offset + 1], "--title")) {
+			if (argc - offset < 3 || title != NULL) {
+				Usage(argv[0]);
+				exit(-1);
+			} else {
+				title = argv[offset + 2];
+				offset += 2;
+			}
+		} else if (!strcmp(argv[offset + 1], "--backtitle")) {
+			if (backtitle != NULL) {
+				Usage(argv[0]);
+				exit(-1);
+			} else {
+				backtitle = argv[offset + 2];
+				offset += 2;
+			}
+		} else if (!strcmp(argv[offset + 1], "--clear")) {
+			if (opt_clear) {	/* Hey, "--clear" can't appear twice! */
+				Usage(argv[0]);
+				exit(-1);
+			} else if (argc == 2) {	/* we only want to clear the screen */
+				init_dialog();
+				refresh();	/* init_dialog() will clear the screen for us */
+				end_dialog();
+				return 0;
+			} else {
+				opt_clear = 1;
+				offset++;
+			}
+		} else		/* no more common options */
+			end_common_opts = 1;
+	}
+
+	if (argc - 1 == offset) {	/* no more options */
+		Usage(argv[0]);
+		exit(-1);
+	}
+	/* use a table to look for the requested mode, to avoid code duplication */
+
+	for (modePtr = modes; modePtr->name; modePtr++)	/* look for the mode */
+		if (!strcmp(argv[offset + 1], modePtr->name))
+			break;
+
+	if (!modePtr->name)
+		Usage(argv[0]);
+	if (argc - offset < modePtr->argmin)
+		Usage(argv[0]);
+	if (modePtr->argmax && argc - offset > modePtr->argmax)
+		Usage(argv[0]);
+
+	init_dialog();
+	retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
+
+	if (opt_clear) {	/* clear screen before exit */
+		attr_clear(stdscr, LINES, COLS, screen_attr);
+		refresh();
+	}
+	end_dialog();
+
+	exit(retval);
+}
+
+/*
+ * Print program usage
+ */
+static void Usage(const char *name)
+{
+	fprintf(stderr, "\
+\ndialog, by Savio Lam (lam836 at cs.cuhk.hk).\
+\n  patched by Stuart Herbert (S.Herbert at shef.ac.uk)\
+\n  modified/gutted for use as a Linux kernel config tool by \
+\n  William Roadcap (roadcapw at cfw.com)\
+\n\
+\n* Display dialog boxes from shell scripts *\
+\n\
+\nUsage: %s --clear\
+\n       %s [--title <title>] [--backtitle <backtitle>] --clear <Box options>\
+\n\
+\nBox options:\
+\n\
+\n  --menu      <text> <height> <width> <menu height> <tag1> <item1>...\
+\n  --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
+\n  --textbox   <file> <height> <width>\
+\n  --inputbox  <text> <height> <width> [<init>]\
+\n  --yesno     <text> <height> <width>\
+\n", name, name);
+	exit(-1);
+}
+
+/*
+ * These are the program jumpers
+ */
+
+int j_menu(const char *t, int ac, const char *const *av)
+{
+	return dialog_menu(t, av[2], atoi(av[3]), atoi(av[4]),
+			   atoi(av[5]), av[6], (ac - 6) / 2, av + 7);
+}
+
+int j_radiolist(const char *t, int ac, const char *const *av)
+{
+	return dialog_checklist(t, av[2], atoi(av[3]), atoi(av[4]),
+				atoi(av[5]), (ac - 6) / 3, av + 6);
+}
+
+int j_textbox(const char *t, int ac, const char *const *av)
+{
+	return dialog_textbox(t, av[2], atoi(av[3]), atoi(av[4]));
+}
+
+int j_yesno(const char *t, int ac, const char *const *av)
+{
+	return dialog_yesno(t, av[2], atoi(av[3]), atoi(av[4]));
+}
+
+int j_inputbox(const char *t, int ac, const char *const *av)
+{
+	int ret = dialog_inputbox(t, av[2], atoi(av[3]), atoi(av[4]),
+				  ac == 6 ? av[5] : (char *)NULL);
+	if (ret == 0)
+		fprintf(stderr, dialog_input_result);
+	return ret;
+}
+
+int j_msgbox(const char *t, int ac, const char *const *av)
+{
+	return dialog_msgbox(t, av[2], atoi(av[3]), atoi(av[4]), 1);
+}
+
+int j_infobox(const char *t, int ac, const char *const *av)
+{
+	return dialog_msgbox(t, av[2], atoi(av[3]), atoi(av[4]), 0);
+}
Index: buildrom/scripts/kconfig/lxdialog/Makefile
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/Makefile	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,26 @@
+# Makefile to build lxdialog package
+#
+
+check-lxdialog  := ./check-lxdialog.sh
+
+HOSTCC ?= gcc
+
+# Use reursively expanded variables so we do not call gcc unless
+# we really need to do so. (Do not call gcc as part of make mrproper)
+HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
+HOST_LOADLIBES   = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
+
+HOST_EXTRACFLAGS += -DLOCALE
+
+PHONY += dochecklxdialog
+dochecklxdialog:
+	$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_LOADLIBES)
+
+hostprogs-y	:= lxdialog
+always		:= $(hostprogs-y) dochecklxdialog
+
+lxdialog-objs := checklist.o menubox.o textbox.o yesno.o inputbox.o \
+		 util.o lxdialog.o msgbox.o
+
+lxdialog: $(lxdialog-objs)
+	$(CC) -o lxdialog $(lxdialog-objs)
Index: buildrom/scripts/kconfig/lxdialog/menubox.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/menubox.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,426 @@
+/*
+ *  menubox.c -- implements the menu box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw at cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ *  Changes by Clifford Wolf (god at clifford.at)
+ *
+ *  [ 1998-06-13 ]
+ *
+ *    *)  A bugfix for the Page-Down problem
+ *
+ *    *)  Formerly when I used Page Down and Page Up, the cursor would be set
+ *        to the first position in the menu box.  Now lxdialog is a bit
+ *        smarter and works more like other menu systems (just have a look at
+ *        it).
+ *
+ *    *)  Formerly if I selected something my scrolling would be broken because
+ *        lxdialog is re-invoked by the Menuconfig shell script, can't
+ *        remember the last scrolling position, and just sets it so that the
+ *        cursor is at the bottom of the box.  Now it writes the temporary file
+ *        lxdialog.scrltmp which contains this information. The file is
+ *        deleted by lxdialog if the user leaves a submenu or enters a new
+ *        one, but it would be nice if Menuconfig could make another "rm -f"
+ *        just to be sure.  Just try it out - you will recognise a difference!
+ *
+ *  [ 1998-06-14 ]
+ *
+ *    *)  Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
+ *        and menus change their size on the fly.
+ *
+ *    *)  If for some reason the last scrolling position is not saved by
+ *        lxdialog, it sets the scrolling so that the selected item is in the
+ *        middle of the menu box, not at the bottom.
+ *
+ * 02 January 1999, Michael Elizabeth Chastain (mec at shout.net)
+ * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
+ * This fixes a bug in Menuconfig where using ' ' to descend into menus
+ * would leave mis-synchronized lxdialog.scrltmp files lying around,
+ * fscanf would read in 'scroll', and eventually that value would get used.
+ */
+
+#include "dialog.h"
+
+static int menu_width, item_x;
+
+/*
+ * Print menu item
+ */
+static void do_print_item(WINDOW * win, const char *item, int choice,
+                          int selected, int hotkey)
+{
+	int j;
+	char *menu_item = malloc(menu_width + 1);
+
+	strncpy(menu_item, item, menu_width - item_x);
+	menu_item[menu_width] = 0;
+	j = first_alpha(menu_item, "YyNnMmHh");
+
+	/* Clear 'residue' of last item */
+	wattrset(win, menubox_attr);
+	wmove(win, choice, 0);
+#if OLD_NCURSES
+	{
+		int i;
+		for (i = 0; i < menu_width; i++)
+			waddch(win, ' ');
+	}
+#else
+	wclrtoeol(win);
+#endif
+	wattrset(win, selected ? item_selected_attr : item_attr);
+	mvwaddstr(win, choice, item_x, menu_item);
+	if (hotkey) {
+		wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
+		mvwaddch(win, choice, item_x + j, menu_item[j]);
+	}
+	if (selected) {
+		wmove(win, choice, item_x + 1);
+	}
+	free(menu_item);
+	wrefresh(win);
+}
+
+#define print_item(index, choice, selected) \
+do {\
+	int hotkey = (items[(index) * 2][0] != ':'); \
+	do_print_item(menu, items[(index) * 2 + 1], choice, selected, hotkey); \
+} while (0)
+
+/*
+ * Print the scroll indicators.
+ */
+static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x,
+			 int height)
+{
+	int cur_y, cur_x;
+
+	getyx(win, cur_y, cur_x);
+
+	wmove(win, y, x);
+
+	if (scroll > 0) {
+		wattrset(win, uarrow_attr);
+		waddch(win, ACS_UARROW);
+		waddstr(win, "(-)");
+	} else {
+		wattrset(win, menubox_attr);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+	}
+
+	y = y + height + 1;
+	wmove(win, y, x);
+	wrefresh(win);
+
+	if ((height < item_no) && (scroll + height < item_no)) {
+		wattrset(win, darrow_attr);
+		waddch(win, ACS_DARROW);
+		waddstr(win, "(+)");
+	} else {
+		wattrset(win, menubox_border_attr);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+	}
+
+	wmove(win, cur_y, cur_x);
+	wrefresh(win);
+}
+
+/*
+ * Display the termination buttons.
+ */
+static void print_buttons(WINDOW * win, int height, int width, int selected)
+{
+	int x = width / 2 - 16;
+	int y = height - 2;
+
+	print_button(win, "Select", y, x, selected == 0);
+	print_button(win, " Exit ", y, x + 12, selected == 1);
+	print_button(win, " Help ", y, x + 24, selected == 2);
+
+	wmove(win, y, x + 1 + 12 * selected);
+	wrefresh(win);
+}
+
+/* scroll up n lines (n may be negative) */
+static void do_scroll(WINDOW *win, int *scroll, int n)
+{
+	/* Scroll menu up */
+	scrollok(win, TRUE);
+	wscrl(win, n);
+	scrollok(win, FALSE);
+	*scroll = *scroll + n;
+	wrefresh(win);
+}
+
+/*
+ * Display a menu for choosing among a number of options
+ */
+int dialog_menu(const char *title, const char *prompt, int height, int width,
+		int menu_height, const char *current, int item_no,
+		const char *const *items)
+{
+	int i, j, x, y, box_x, box_y;
+	int key = 0, button = 0, scroll = 0, choice = 0;
+	int first_item =  0, max_choice;
+	WINDOW *dialog, *menu;
+	FILE *f;
+
+	max_choice = MIN(menu_height, item_no);
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+	wattrset(dialog, border_attr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dialog_attr);
+	wbkgdset(dialog, dialog_attr & A_COLOR);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dialog_attr);
+	print_autowrap(dialog, prompt, width - 2, 1, 3);
+
+	menu_width = width - 6;
+	box_y = height - menu_height - 5;
+	box_x = (width - menu_width) / 2 - 1;
+
+	/* create new window for the menu */
+	menu = subwin(dialog, menu_height, menu_width,
+		      y + box_y + 1, x + box_x + 1);
+	keypad(menu, TRUE);
+
+	/* draw a box around the menu items */
+	draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2,
+		 menubox_border_attr, menubox_attr);
+
+	item_x = (menu_width - 70) / 2;
+
+	/* Set choice to default item */
+	for (i = 0; i < item_no; i++)
+		if (strcmp(current, items[i * 2]) == 0)
+			choice = i;
+
+	/* get the scroll info from the temp file */
+	if ((f = fopen("lxdialog.scrltmp", "r")) != NULL) {
+		if ((fscanf(f, "%d\n", &scroll) == 1) && (scroll <= choice) &&
+		    (scroll + max_choice > choice) && (scroll >= 0) &&
+		    (scroll + max_choice <= item_no)) {
+			first_item = scroll;
+			choice = choice - scroll;
+			fclose(f);
+		} else {
+			scroll = 0;
+			remove("lxdialog.scrltmp");
+			fclose(f);
+			f = NULL;
+		}
+	}
+	if ((choice >= max_choice) || (f == NULL && choice >= max_choice / 2)) {
+		if (choice >= item_no - max_choice / 2)
+			scroll = first_item = item_no - max_choice;
+		else
+			scroll = first_item = choice - max_choice / 2;
+		choice = choice - scroll;
+	}
+
+	/* Print the menu */
+	for (i = 0; i < max_choice; i++) {
+		print_item(first_item + i, i, i == choice);
+	}
+
+	wnoutrefresh(menu);
+
+	print_arrows(dialog, item_no, scroll,
+		     box_y, box_x + item_x + 1, menu_height);
+
+	print_buttons(dialog, height, width, 0);
+	wmove(menu, choice, item_x + 1);
+	wrefresh(menu);
+
+	while (key != ESC) {
+		key = wgetch(menu);
+
+		if (key < 256 && isalpha(key))
+			key = tolower(key);
+
+		if (strchr("ynmh", key))
+			i = max_choice;
+		else {
+			for (i = choice + 1; i < max_choice; i++) {
+				j = first_alpha(items[(scroll + i) * 2 + 1], "YyNnMmHh");
+				if (key == tolower(items[(scroll + i) * 2 + 1][j]))
+					break;
+			}
+			if (i == max_choice)
+				for (i = 0; i < max_choice; i++) {
+					j = first_alpha(items [(scroll + i) * 2 + 1], "YyNnMmHh");
+					if (key == tolower(items[(scroll + i) * 2 + 1][j]))
+						break;
+				}
+		}
+
+		if (i < max_choice ||
+		    key == KEY_UP || key == KEY_DOWN ||
+		    key == '-' || key == '+' ||
+		    key == KEY_PPAGE || key == KEY_NPAGE) {
+			/* Remove highligt of current item */
+			print_item(scroll + choice, choice, FALSE);
+
+			if (key == KEY_UP || key == '-') {
+				if (choice < 2 && scroll) {
+					/* Scroll menu down */
+					do_scroll(menu, &scroll, -1);
+
+					print_item(scroll, 0, FALSE);
+				} else
+					choice = MAX(choice - 1, 0);
+
+			} else if (key == KEY_DOWN || key == '+') {
+				print_item(scroll+choice, choice, FALSE);
+
+				if ((choice > max_choice - 3) &&
+				    (scroll + max_choice < item_no)) {
+					/* Scroll menu up */
+					do_scroll(menu, &scroll, 1);
+
+					print_item(scroll+max_choice - 1,
+						   max_choice - 1, FALSE);
+				} else
+					choice = MIN(choice + 1, max_choice - 1);
+
+			} else if (key == KEY_PPAGE) {
+				scrollok(menu, TRUE);
+				for (i = 0; (i < max_choice); i++) {
+					if (scroll > 0) {
+						do_scroll(menu, &scroll, -1);
+						print_item(scroll, 0, FALSE);
+					} else {
+						if (choice > 0)
+							choice--;
+					}
+				}
+
+			} else if (key == KEY_NPAGE) {
+				for (i = 0; (i < max_choice); i++) {
+					if (scroll + max_choice < item_no) {
+						do_scroll(menu, &scroll, 1);
+						print_item(scroll+max_choice-1,
+							   max_choice - 1, FALSE);
+					} else {
+						if (choice + 1 < max_choice)
+							choice++;
+					}
+				}
+			} else
+				choice = i;
+
+			print_item(scroll + choice, choice, TRUE);
+
+			print_arrows(dialog, item_no, scroll,
+				     box_y, box_x + item_x + 1, menu_height);
+
+			wnoutrefresh(dialog);
+			wrefresh(menu);
+
+			continue;	/* wait for another key press */
+		}
+
+		switch (key) {
+		case KEY_LEFT:
+		case TAB:
+		case KEY_RIGHT:
+			button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			    ? 2 : (button > 2 ? 0 : button);
+
+			print_buttons(dialog, height, width, button);
+			wrefresh(menu);
+			break;
+		case ' ':
+		case 's':
+		case 'y':
+		case 'n':
+		case 'm':
+		case '/':
+			/* save scroll info */
+			if ((f = fopen("lxdialog.scrltmp", "w")) != NULL) {
+				fprintf(f, "%d\n", scroll);
+				fclose(f);
+			}
+			delwin(dialog);
+			fprintf(stderr, "%s\n", items[(scroll + choice) * 2]);
+			switch (key) {
+			case 's':
+				return 3;
+			case 'y':
+				return 3;
+			case 'n':
+				return 4;
+			case 'm':
+				return 5;
+			case ' ':
+				return 6;
+			case '/':
+				return 7;
+			}
+			return 0;
+		case 'h':
+		case '?':
+			button = 2;
+		case '\n':
+			delwin(dialog);
+			if (button == 2)
+				fprintf(stderr, "%s \"%s\"\n",
+					items[(scroll + choice) * 2],
+					items[(scroll + choice) * 2 + 1] +
+					first_alpha(items [(scroll + choice) * 2 + 1], ""));
+			else
+				fprintf(stderr, "%s\n",
+					items[(scroll + choice) * 2]);
+
+			remove("lxdialog.scrltmp");
+			return button;
+		case 'e':
+		case 'x':
+			key = ESC;
+		case ESC:
+			break;
+		}
+	}
+
+	delwin(dialog);
+	remove("lxdialog.scrltmp");
+	return -1;		/* ESC pressed */
+}
Index: buildrom/scripts/kconfig/lxdialog/msgbox.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/msgbox.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,71 @@
+/*
+ *  msgbox.c -- implements the message box and info box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw at cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+/*
+ * Display a message box. Program will pause and display an "OK" button
+ * if the parameter 'pause' is non-zero.
+ */
+int dialog_msgbox(const char *title, const char *prompt, int height, int width,
+                  int pause)
+{
+	int i, x, y, key = 0;
+	WINDOW *dialog;
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dialog_attr);
+	print_autowrap(dialog, prompt, width - 2, 1, 2);
+
+	if (pause) {
+		wattrset(dialog, border_attr);
+		mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+		for (i = 0; i < width - 2; i++)
+			waddch(dialog, ACS_HLINE);
+		wattrset(dialog, dialog_attr);
+		waddch(dialog, ACS_RTEE);
+
+		print_button(dialog, "  Ok  ", height - 2, width / 2 - 4, TRUE);
+
+		wrefresh(dialog);
+		while (key != ESC && key != '\n' && key != ' ' &&
+		       key != 'O' && key != 'o' && key != 'X' && key != 'x')
+			key = wgetch(dialog);
+	} else {
+		key = '\n';
+		wrefresh(dialog);
+	}
+
+	delwin(dialog);
+	return key == ESC ? -1 : 0;
+}
Index: buildrom/scripts/kconfig/lxdialog/textbox.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/textbox.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,533 @@
+/*
+ *  textbox.c -- implements the text box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap at cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static void back_lines(int n);
+static void print_page(WINDOW * win, int height, int width);
+static void print_line(WINDOW * win, int row, int width);
+static char *get_line(void);
+static void print_position(WINDOW * win, int height, int width);
+
+static int hscroll, fd, file_size, bytes_read;
+static int begin_reached = 1, end_reached, page_length;
+static char *buf, *page;
+
+/*
+ * Display text from a file in a dialog box.
+ */
+int dialog_textbox(const char *title, const char *file, int height, int width)
+{
+	int i, x, y, cur_x, cur_y, fpos, key = 0;
+	int passed_end;
+	char search_term[MAX_LEN + 1];
+	WINDOW *dialog, *text;
+
+	search_term[0] = '\0';	/* no search term entered yet */
+
+	/* Open input file for reading */
+	if ((fd = open(file, O_RDONLY)) == -1) {
+		endwin();
+		fprintf(stderr, "\nCan't open input file in dialog_textbox().\n");
+		exit(-1);
+	}
+	/* Get file size. Actually, 'file_size' is the real file size - 1,
+	   since it's only the last byte offset from the beginning */
+	if ((file_size = lseek(fd, 0, SEEK_END)) == -1) {
+		endwin();
+		fprintf(stderr, "\nError getting file size in dialog_textbox().\n");
+		exit(-1);
+	}
+	/* Restore file pointer to beginning of file after getting file size */
+	if (lseek(fd, 0, SEEK_SET) == -1) {
+		endwin();
+		fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+		exit(-1);
+	}
+	/* Allocate space for read buffer */
+	if ((buf = malloc(BUF_SIZE + 1)) == NULL) {
+		endwin();
+		fprintf(stderr, "\nCan't allocate memory in dialog_textbox().\n");
+		exit(-1);
+	}
+	if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
+		endwin();
+		fprintf(stderr, "\nError reading file in dialog_textbox().\n");
+		exit(-1);
+	}
+	buf[bytes_read] = '\0';	/* mark end of valid data */
+	page = buf;		/* page is pointer to start of page to be displayed */
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	/* Create window for text region, used for scrolling text */
+	text = subwin(dialog, height - 4, width - 2, y + 1, x + 1);
+	wattrset(text, dialog_attr);
+	wbkgdset(text, dialog_attr & A_COLOR);
+
+	keypad(text, TRUE);
+
+	/* register the new window, along with its borders */
+	draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+	wattrset(dialog, border_attr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dialog_attr);
+	wbkgdset(dialog, dialog_attr & A_COLOR);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
+	wnoutrefresh(dialog);
+	getyx(dialog, cur_y, cur_x);	/* Save cursor position */
+
+	/* Print first page of text */
+	attr_clear(text, height - 4, width - 2, dialog_attr);
+	print_page(text, height - 4, width - 2);
+	print_position(dialog, height, width);
+	wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
+	wrefresh(dialog);
+
+	while ((key != ESC) && (key != '\n')) {
+		key = wgetch(dialog);
+		switch (key) {
+		case 'E':	/* Exit */
+		case 'e':
+		case 'X':
+		case 'x':
+			delwin(dialog);
+			free(buf);
+			close(fd);
+			return 0;
+		case 'g':	/* First page */
+		case KEY_HOME:
+			if (!begin_reached) {
+				begin_reached = 1;
+				/* First page not in buffer? */
+				if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+					endwin();
+					fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+					exit(-1);
+				}
+				if (fpos > bytes_read) {	/* Yes, we have to read it in */
+					if (lseek(fd, 0, SEEK_SET) == -1) {
+						endwin();
+						fprintf(stderr, "\nError moving file pointer in "
+							        "dialog_textbox().\n");
+						exit(-1);
+					}
+					if ((bytes_read =
+					     read(fd, buf, BUF_SIZE)) == -1) {
+						endwin();
+						fprintf(stderr, "\nError reading file in dialog_textbox().\n");
+						exit(-1);
+					}
+					buf[bytes_read] = '\0';
+				}
+				page = buf;
+				print_page(text, height - 4, width - 2);
+				print_position(dialog, height, width);
+				wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
+				wrefresh(dialog);
+			}
+			break;
+		case 'G':	/* Last page */
+		case KEY_END:
+
+			end_reached = 1;
+			/* Last page not in buffer? */
+			if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+				endwin();
+				fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+				exit(-1);
+			}
+			if (fpos < file_size) {	/* Yes, we have to read it in */
+				if (lseek(fd, -BUF_SIZE, SEEK_END) == -1) {
+					endwin();
+					fprintf(stderr, "\nError moving file pointer in dialog_textbox().\n");
+					exit(-1);
+				}
+				if ((bytes_read =
+				     read(fd, buf, BUF_SIZE)) == -1) {
+					endwin();
+					fprintf(stderr, "\nError reading file in dialog_textbox().\n");
+					exit(-1);
+				}
+				buf[bytes_read] = '\0';
+			}
+			page = buf + bytes_read;
+			back_lines(height - 4);
+			print_page(text, height - 4, width - 2);
+			print_position(dialog, height, width);
+			wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
+			wrefresh(dialog);
+			break;
+		case 'K':	/* Previous line */
+		case 'k':
+		case KEY_UP:
+			if (!begin_reached) {
+				back_lines(page_length + 1);
+
+				/* We don't call print_page() here but use scrolling to ensure
+				   faster screen update. However, 'end_reached' and
+				   'page_length' should still be updated, and 'page' should
+				   point to start of next page. This is done by calling
+				   get_line() in the following 'for' loop. */
+				scrollok(text, TRUE);
+				wscrl(text, -1);	/* Scroll text region down one line */
+				scrollok(text, FALSE);
+				page_length = 0;
+				passed_end = 0;
+				for (i = 0; i < height - 4; i++) {
+					if (!i) {
+						/* print first line of page */
+						print_line(text, 0, width - 2);
+						wnoutrefresh(text);
+					} else
+						/* Called to update 'end_reached' and 'page' */
+						get_line();
+					if (!passed_end)
+						page_length++;
+					if (end_reached && !passed_end)
+						passed_end = 1;
+				}
+
+				print_position(dialog, height, width);
+				wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
+				wrefresh(dialog);
+			}
+			break;
+		case 'B':	/* Previous page */
+		case 'b':
+		case KEY_PPAGE:
+			if (begin_reached)
+				break;
+			back_lines(page_length + height - 4);
+			print_page(text, height - 4, width - 2);
+			print_position(dialog, height, width);
+			wmove(dialog, cur_y, cur_x);
+			wrefresh(dialog);
+			break;
+		case 'J':	/* Next line */
+		case 'j':
+		case KEY_DOWN:
+			if (!end_reached) {
+				begin_reached = 0;
+				scrollok(text, TRUE);
+				scroll(text);	/* Scroll text region up one line */
+				scrollok(text, FALSE);
+				print_line(text, height - 5, width - 2);
+				wnoutrefresh(text);
+				print_position(dialog, height, width);
+				wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
+				wrefresh(dialog);
+			}
+			break;
+		case KEY_NPAGE:	/* Next page */
+		case ' ':
+			if (end_reached)
+				break;
+
+			begin_reached = 0;
+			print_page(text, height - 4, width - 2);
+			print_position(dialog, height, width);
+			wmove(dialog, cur_y, cur_x);
+			wrefresh(dialog);
+			break;
+		case '0':	/* Beginning of line */
+		case 'H':	/* Scroll left */
+		case 'h':
+		case KEY_LEFT:
+			if (hscroll <= 0)
+				break;
+
+			if (key == '0')
+				hscroll = 0;
+			else
+				hscroll--;
+			/* Reprint current page to scroll horizontally */
+			back_lines(page_length);
+			print_page(text, height - 4, width - 2);
+			wmove(dialog, cur_y, cur_x);
+			wrefresh(dialog);
+			break;
+		case 'L':	/* Scroll right */
+		case 'l':
+		case KEY_RIGHT:
+			if (hscroll >= MAX_LEN)
+				break;
+			hscroll++;
+			/* Reprint current page to scroll horizontally */
+			back_lines(page_length);
+			print_page(text, height - 4, width - 2);
+			wmove(dialog, cur_y, cur_x);
+			wrefresh(dialog);
+			break;
+		case ESC:
+			break;
+		}
+	}
+
+	delwin(dialog);
+	free(buf);
+	close(fd);
+	return -1;		/* ESC pressed */
+}
+
+/*
+ * Go back 'n' lines in text file. Called by dialog_textbox().
+ * 'page' will be updated to point to the desired line in 'buf'.
+ */
+static void back_lines(int n)
+{
+	int i, fpos;
+
+	begin_reached = 0;
+	/* We have to distinguish between end_reached and !end_reached
+	   since at end of file, the line is not ended by a '\n'.
+	   The code inside 'if' basically does a '--page' to move one
+	   character backward so as to skip '\n' of the previous line */
+	if (!end_reached) {
+		/* Either beginning of buffer or beginning of file reached? */
+		if (page == buf) {
+			if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+				endwin();
+				fprintf(stderr, "\nError moving file pointer in "
+					        "back_lines().\n");
+				exit(-1);
+			}
+			if (fpos > bytes_read) {	/* Not beginning of file yet */
+				/* We've reached beginning of buffer, but not beginning of
+				   file yet, so read previous part of file into buffer.
+				   Note that we only move backward for BUF_SIZE/2 bytes,
+				   but not BUF_SIZE bytes to avoid re-reading again in
+				   print_page() later */
+				/* Really possible to move backward BUF_SIZE/2 bytes? */
+				if (fpos < BUF_SIZE / 2 + bytes_read) {
+					/* No, move less then */
+					if (lseek(fd, 0, SEEK_SET) == -1) {
+						endwin();
+						fprintf(stderr, "\nError moving file pointer in "
+						                "back_lines().\n");
+						exit(-1);
+					}
+					page = buf + fpos - bytes_read;
+				} else {	/* Move backward BUF_SIZE/2 bytes */
+					if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) == -1) {
+						endwin();
+						fprintf(stderr, "\nError moving file pointer "
+						                "in back_lines().\n");
+						exit(-1);
+					}
+					page = buf + BUF_SIZE / 2;
+				}
+				if ((bytes_read =
+				     read(fd, buf, BUF_SIZE)) == -1) {
+					endwin();
+					fprintf(stderr, "\nError reading file in back_lines().\n");
+					exit(-1);
+				}
+				buf[bytes_read] = '\0';
+			} else {	/* Beginning of file reached */
+				begin_reached = 1;
+				return;
+			}
+		}
+		if (*(--page) != '\n') {	/* '--page' here */
+			/* Something's wrong... */
+			endwin();
+			fprintf(stderr, "\nInternal error in back_lines().\n");
+			exit(-1);
+		}
+	}
+	/* Go back 'n' lines */
+	for (i = 0; i < n; i++)
+		do {
+			if (page == buf) {
+				if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+					endwin();
+					fprintf(stderr, "\nError moving file pointer in back_lines().\n");
+					exit(-1);
+				}
+				if (fpos > bytes_read) {
+					/* Really possible to move backward BUF_SIZE/2 bytes? */
+					if (fpos < BUF_SIZE / 2 + bytes_read) {
+						/* No, move less then */
+						if (lseek(fd, 0, SEEK_SET) == -1) {
+							endwin();
+							fprintf(stderr, "\nError moving file pointer "
+							                "in back_lines().\n");
+							exit(-1);
+						}
+						page = buf + fpos - bytes_read;
+					} else {	/* Move backward BUF_SIZE/2 bytes */
+						if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) == -1) {
+							endwin();
+							fprintf(stderr, "\nError moving file pointer"
+							                " in back_lines().\n");
+							exit(-1);
+						}
+						page = buf + BUF_SIZE / 2;
+					}
+					if ((bytes_read =
+					     read(fd, buf, BUF_SIZE)) == -1) {
+						endwin();
+						fprintf(stderr, "\nError reading file in "
+						                "back_lines().\n");
+						exit(-1);
+					}
+					buf[bytes_read] = '\0';
+				} else {	/* Beginning of file reached */
+					begin_reached = 1;
+					return;
+				}
+			}
+		} while (*(--page) != '\n');
+	page++;
+}
+
+/*
+ * Print a new page of text. Called by dialog_textbox().
+ */
+static void print_page(WINDOW * win, int height, int width)
+{
+	int i, passed_end = 0;
+
+	page_length = 0;
+	for (i = 0; i < height; i++) {
+		print_line(win, i, width);
+		if (!passed_end)
+			page_length++;
+		if (end_reached && !passed_end)
+			passed_end = 1;
+	}
+	wnoutrefresh(win);
+}
+
+/*
+ * Print a new line of text. Called by dialog_textbox() and print_page().
+ */
+static void print_line(WINDOW * win, int row, int width)
+{
+	int y, x;
+	char *line;
+
+	line = get_line();
+	line += MIN(strlen(line), hscroll);	/* Scroll horizontally */
+	wmove(win, row, 0);	/* move cursor to correct line */
+	waddch(win, ' ');
+	waddnstr(win, line, MIN(strlen(line), width - 2));
+
+	getyx(win, y, x);
+	/* Clear 'residue' of previous line */
+#if OLD_NCURSES
+	{
+		int i;
+		for (i = 0; i < width - x; i++)
+			waddch(win, ' ');
+	}
+#else
+	wclrtoeol(win);
+#endif
+}
+
+/*
+ * Return current line of text. Called by dialog_textbox() and print_line().
+ * 'page' should point to start of current line before calling, and will be
+ * updated to point to start of next line.
+ */
+static char *get_line(void)
+{
+	int i = 0, fpos;
+	static char line[MAX_LEN + 1];
+
+	end_reached = 0;
+	while (*page != '\n') {
+		if (*page == '\0') {
+			/* Either end of file or end of buffer reached */
+			if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+				endwin();
+				fprintf(stderr, "\nError moving file pointer in "
+				                "get_line().\n");
+				exit(-1);
+			}
+			if (fpos < file_size) {	/* Not end of file yet */
+				/* We've reached end of buffer, but not end of file yet,
+				   so read next part of file into buffer */
+				if ((bytes_read =
+				     read(fd, buf, BUF_SIZE)) == -1) {
+					endwin();
+					fprintf(stderr, "\nError reading file in get_line().\n");
+					exit(-1);
+				}
+				buf[bytes_read] = '\0';
+				page = buf;
+			} else {
+				if (!end_reached)
+					end_reached = 1;
+				break;
+			}
+		} else if (i < MAX_LEN)
+			line[i++] = *(page++);
+		else {
+			/* Truncate lines longer than MAX_LEN characters */
+			if (i == MAX_LEN)
+				line[i++] = '\0';
+			page++;
+		}
+	}
+	if (i <= MAX_LEN)
+		line[i] = '\0';
+	if (!end_reached)
+		page++;		/* move pass '\n' */
+
+	return line;
+}
+
+/*
+ * Print current position
+ */
+static void print_position(WINDOW * win, int height, int width)
+{
+	int fpos, percent;
+
+	if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
+		endwin();
+		fprintf(stderr, "\nError moving file pointer in print_position().\n");
+		exit(-1);
+	}
+	wattrset(win, position_indicator_attr);
+	wbkgdset(win, position_indicator_attr & A_COLOR);
+	percent = !file_size ?
+	    100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
+	wmove(win, height - 3, width - 9);
+	wprintw(win, "(%3d%%)", percent);
+}
Index: buildrom/scripts/kconfig/lxdialog/util.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/util.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,362 @@
+/*
+ *  util.c
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap at cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+/* use colors by default? */
+bool use_colors = 1;
+
+const char *backtitle = NULL;
+
+/*
+ * Attribute values, default is for mono display
+ */
+chtype attributes[] = {
+	A_NORMAL,		/* screen_attr */
+	A_NORMAL,		/* shadow_attr */
+	A_NORMAL,		/* dialog_attr */
+	A_BOLD,			/* title_attr */
+	A_NORMAL,		/* border_attr */
+	A_REVERSE,		/* button_active_attr */
+	A_DIM,			/* button_inactive_attr */
+	A_REVERSE,		/* button_key_active_attr */
+	A_BOLD,			/* button_key_inactive_attr */
+	A_REVERSE,		/* button_label_active_attr */
+	A_NORMAL,		/* button_label_inactive_attr */
+	A_NORMAL,		/* inputbox_attr */
+	A_NORMAL,		/* inputbox_border_attr */
+	A_NORMAL,		/* searchbox_attr */
+	A_BOLD,			/* searchbox_title_attr */
+	A_NORMAL,		/* searchbox_border_attr */
+	A_BOLD,			/* position_indicator_attr */
+	A_NORMAL,		/* menubox_attr */
+	A_NORMAL,		/* menubox_border_attr */
+	A_NORMAL,		/* item_attr */
+	A_REVERSE,		/* item_selected_attr */
+	A_BOLD,			/* tag_attr */
+	A_REVERSE,		/* tag_selected_attr */
+	A_BOLD,			/* tag_key_attr */
+	A_REVERSE,		/* tag_key_selected_attr */
+	A_BOLD,			/* check_attr */
+	A_REVERSE,		/* check_selected_attr */
+	A_BOLD,			/* uarrow_attr */
+	A_BOLD			/* darrow_attr */
+};
+
+#include "colors.h"
+
+/*
+ * Table of color values
+ */
+int color_table[][3] = {
+	{SCREEN_FG, SCREEN_BG, SCREEN_HL},
+	{SHADOW_FG, SHADOW_BG, SHADOW_HL},
+	{DIALOG_FG, DIALOG_BG, DIALOG_HL},
+	{TITLE_FG, TITLE_BG, TITLE_HL},
+	{BORDER_FG, BORDER_BG, BORDER_HL},
+	{BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
+	{BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
+	{BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
+	{BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG,
+	 BUTTON_KEY_INACTIVE_HL},
+	{BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG,
+	 BUTTON_LABEL_ACTIVE_HL},
+	{BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
+	 BUTTON_LABEL_INACTIVE_HL},
+	{INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
+	{INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
+	{SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
+	{SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
+	{SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
+	{POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
+	{MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
+	{MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
+	{ITEM_FG, ITEM_BG, ITEM_HL},
+	{ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
+	{TAG_FG, TAG_BG, TAG_HL},
+	{TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
+	{TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
+	{TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
+	{CHECK_FG, CHECK_BG, CHECK_HL},
+	{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
+	{UARROW_FG, UARROW_BG, UARROW_HL},
+	{DARROW_FG, DARROW_BG, DARROW_HL},
+};				/* color_table */
+
+/*
+ * Set window to attribute 'attr'
+ */
+void attr_clear(WINDOW * win, int height, int width, chtype attr)
+{
+	int i, j;
+
+	wattrset(win, attr);
+	for (i = 0; i < height; i++) {
+		wmove(win, i, 0);
+		for (j = 0; j < width; j++)
+			waddch(win, ' ');
+	}
+	touchwin(win);
+}
+
+void dialog_clear(void)
+{
+	attr_clear(stdscr, LINES, COLS, screen_attr);
+	/* Display background title if it exists ... - SLH */
+	if (backtitle != NULL) {
+		int i;
+
+		wattrset(stdscr, screen_attr);
+		mvwaddstr(stdscr, 0, 1, (char *)backtitle);
+		wmove(stdscr, 1, 1);
+		for (i = 1; i < COLS - 1; i++)
+			waddch(stdscr, ACS_HLINE);
+	}
+	wnoutrefresh(stdscr);
+}
+
+/*
+ * Do some initialization for dialog
+ */
+void init_dialog(void)
+{
+	initscr();		/* Init curses */
+	keypad(stdscr, TRUE);
+	cbreak();
+	noecho();
+
+	if (use_colors)		/* Set up colors */
+		color_setup();
+
+	dialog_clear();
+}
+
+/*
+ * Setup for color display
+ */
+void color_setup(void)
+{
+	int i;
+
+	if (has_colors()) {	/* Terminal supports color? */
+		start_color();
+
+		/* Initialize color pairs */
+		for (i = 0; i < ATTRIBUTE_COUNT; i++)
+			init_pair(i + 1, color_table[i][0], color_table[i][1]);
+
+		/* Setup color attributes */
+		for (i = 0; i < ATTRIBUTE_COUNT; i++)
+			attributes[i] = C_ATTR(color_table[i][2], i + 1);
+	}
+}
+
+/*
+ * End using dialog functions.
+ */
+void end_dialog(void)
+{
+	endwin();
+}
+
+/* Print the title of the dialog. Center the title and truncate
+ * tile if wider than dialog (- 2 chars).
+ **/
+void print_title(WINDOW *dialog, const char *title, int width)
+{
+	if (title) {
+		int tlen = MIN(width - 2, strlen(title));
+		wattrset(dialog, title_attr);
+		mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' ');
+		mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen);
+		waddch(dialog, ' ');
+	}
+}
+
+/*
+ * Print a string of text in a window, automatically wrap around to the
+ * next line if the string is too long to fit on one line. Newline
+ * characters '\n' are replaced by spaces.  We start on a new line
+ * if there is no room for at least 4 nonblanks following a double-space.
+ */
+void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
+{
+	int newl, cur_x, cur_y;
+	int i, prompt_len, room, wlen;
+	char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
+
+	strcpy(tempstr, prompt);
+
+	prompt_len = strlen(tempstr);
+
+	/*
+	 * Remove newlines
+	 */
+	for (i = 0; i < prompt_len; i++) {
+		if (tempstr[i] == '\n')
+			tempstr[i] = ' ';
+	}
+
+	if (prompt_len <= width - x * 2) {	/* If prompt is short */
+		wmove(win, y, (width - prompt_len) / 2);
+		waddstr(win, tempstr);
+	} else {
+		cur_x = x;
+		cur_y = y;
+		newl = 1;
+		word = tempstr;
+		while (word && *word) {
+			sp = index(word, ' ');
+			if (sp)
+				*sp++ = 0;
+
+			/* Wrap to next line if either the word does not fit,
+			   or it is the first word of a new sentence, and it is
+			   short, and the next word does not fit. */
+			room = width - cur_x;
+			wlen = strlen(word);
+			if (wlen > room ||
+			    (newl && wlen < 4 && sp
+			     && wlen + 1 + strlen(sp) > room
+			     && (!(sp2 = index(sp, ' '))
+				 || wlen + 1 + (sp2 - sp) > room))) {
+				cur_y++;
+				cur_x = x;
+			}
+			wmove(win, cur_y, cur_x);
+			waddstr(win, word);
+			getyx(win, cur_y, cur_x);
+			cur_x++;
+			if (sp && *sp == ' ') {
+				cur_x++;	/* double space */
+				while (*++sp == ' ') ;
+				newl = 1;
+			} else
+				newl = 0;
+			word = sp;
+		}
+	}
+}
+
+/*
+ * Print a button
+ */
+void print_button(WINDOW * win, const char *label, int y, int x, int selected)
+{
+	int i, temp;
+
+	wmove(win, y, x);
+	wattrset(win, selected ? button_active_attr : button_inactive_attr);
+	waddstr(win, "<");
+	temp = strspn(label, " ");
+	label += temp;
+	wattrset(win, selected ? button_label_active_attr
+		 : button_label_inactive_attr);
+	for (i = 0; i < temp; i++)
+		waddch(win, ' ');
+	wattrset(win, selected ? button_key_active_attr
+		 : button_key_inactive_attr);
+	waddch(win, label[0]);
+	wattrset(win, selected ? button_label_active_attr
+		 : button_label_inactive_attr);
+	waddstr(win, (char *)label + 1);
+	wattrset(win, selected ? button_active_attr : button_inactive_attr);
+	waddstr(win, ">");
+	wmove(win, y, x + temp + 1);
+}
+
+/*
+ * Draw a rectangular box with line drawing characters
+ */
+void
+draw_box(WINDOW * win, int y, int x, int height, int width,
+	 chtype box, chtype border)
+{
+	int i, j;
+
+	wattrset(win, 0);
+	for (i = 0; i < height; i++) {
+		wmove(win, y + i, x);
+		for (j = 0; j < width; j++)
+			if (!i && !j)
+				waddch(win, border | ACS_ULCORNER);
+			else if (i == height - 1 && !j)
+				waddch(win, border | ACS_LLCORNER);
+			else if (!i && j == width - 1)
+				waddch(win, box | ACS_URCORNER);
+			else if (i == height - 1 && j == width - 1)
+				waddch(win, box | ACS_LRCORNER);
+			else if (!i)
+				waddch(win, border | ACS_HLINE);
+			else if (i == height - 1)
+				waddch(win, box | ACS_HLINE);
+			else if (!j)
+				waddch(win, border | ACS_VLINE);
+			else if (j == width - 1)
+				waddch(win, box | ACS_VLINE);
+			else
+				waddch(win, box | ' ');
+	}
+}
+
+/*
+ * Draw shadows along the right and bottom edge to give a more 3D look
+ * to the boxes
+ */
+void draw_shadow(WINDOW * win, int y, int x, int height, int width)
+{
+	int i;
+
+	if (has_colors()) {	/* Whether terminal supports color? */
+		wattrset(win, shadow_attr);
+		wmove(win, y + height, x + 2);
+		for (i = 0; i < width; i++)
+			waddch(win, winch(win) & A_CHARTEXT);
+		for (i = y + 1; i < y + height + 1; i++) {
+			wmove(win, i, x + width);
+			waddch(win, winch(win) & A_CHARTEXT);
+			waddch(win, winch(win) & A_CHARTEXT);
+		}
+		wnoutrefresh(win);
+	}
+}
+
+/*
+ *  Return the position of the first alphabetic character in a string.
+ */
+int first_alpha(const char *string, const char *exempt)
+{
+	int i, in_paren = 0, c;
+
+	for (i = 0; i < strlen(string); i++) {
+		c = tolower(string[i]);
+
+		if (strchr("<[(", c))
+			++in_paren;
+		if (strchr(">])", c) && in_paren > 0)
+			--in_paren;
+
+		if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0)
+			return i;
+	}
+
+	return 0;
+}
Index: buildrom/scripts/kconfig/lxdialog/yesno.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/lxdialog/yesno.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,102 @@
+/*
+ *  yesno.c -- implements the yes/no box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836 at cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap at cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+/*
+ * Display termination buttons
+ */
+static void print_buttons(WINDOW * dialog, int height, int width, int selected)
+{
+	int x = width / 2 - 10;
+	int y = height - 2;
+
+	print_button(dialog, " Yes ", y, x, selected == 0);
+	print_button(dialog, "  No  ", y, x + 13, selected == 1);
+
+	wmove(dialog, y, x + 1 + 13 * selected);
+	wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box with two buttons - Yes and No
+ */
+int dialog_yesno(const char *title, const char *prompt, int height, int width)
+{
+	int i, x, y, key = 0, button = 0;
+	WINDOW *dialog;
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+	wattrset(dialog, border_attr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dialog_attr);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dialog_attr);
+	print_autowrap(dialog, prompt, width - 2, 1, 3);
+
+	print_buttons(dialog, height, width, 0);
+
+	while (key != ESC) {
+		key = wgetch(dialog);
+		switch (key) {
+		case 'Y':
+		case 'y':
+			delwin(dialog);
+			return 0;
+		case 'N':
+		case 'n':
+			delwin(dialog);
+			return 1;
+
+		case TAB:
+		case KEY_LEFT:
+		case KEY_RIGHT:
+			button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button);
+
+			print_buttons(dialog, height, width, button);
+			wrefresh(dialog);
+			break;
+		case ' ':
+		case '\n':
+			delwin(dialog);
+			return button;
+		case ESC:
+			break;
+		}
+	}
+
+	delwin(dialog);
+	return -1;		/* ESC pressed */
+}
Index: buildrom/scripts/kconfig/Makefile
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/Makefile	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,107 @@
+# Makefile for Pixil config 
+# Originally from Busybox
+
+HOSTCC ?= gcc
+HOSTCFLAGS=-O0 -g
+
+all: ncurses conf mconf
+
+LIBS = -lncurses
+ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
+	HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
+	HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h))
+	HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h))
+	HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
+	HOSTNCURSES += -DCURSES_LOC="<ncurses.h>"
+else
+	HOSTNCURSES += -DCURSES_LOC="<curses.h>"
+endif
+endif
+endif
+endif
+endif
+
+CONF_SRC  =conf.c
+MCONF_SRC =mconf.c lxdialog/checklist.c lxdialog/menubox.c lxdialog/textbox.c lxdialog/yesno.c lxdialog/inputbox.c lxdialog/util.c lxdialog/msgbox.c
+SHARED_SRC=zconf.tab.c
+SHARED_DEPS:=lkc.h lkc_proto.h lkc_defs.h expr.h zconf.hash.c
+CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC))
+MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC))
+SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC))
+
+conf: $(CONF_OBJS) $(SHARED_OBJS) 
+	$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
+
+mconf: $(MCONF_OBJS) $(SHARED_OBJS)
+	$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS)
+
+$(CONF_OBJS): %.o : %.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+$(MCONF_OBJS): %.o : %.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) $(HOSTNCURSES) -I. -c $< -o $@
+
+lkc_defs.h: lkc_proto.h
+	@sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
+
+###
+# The following requires flex/bison
+# By default we use the _shipped versions, uncomment the 
+# following line if you are modifying the flex/bison src.
+#LKC_GENPARSER := 1
+
+ifdef LKC_GENPARSER
+
+%.tab.c %.tab.h: %.y
+	bison -t -d -v -b $* -p $(notdir $*) $<
+
+lex.%.c: %.l
+	flex -P$(notdir $*) -o$@ $<
+else
+
+lex.zconf.o: lex.zconf.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+lex.zconf.c: lex.zconf.c_shipped
+	cp lex.zconf.c_shipped lex.zconf.c
+
+zconf.hash.c: zconf.hash.c_shipped
+	cp $< $@
+
+zconf.tab.o: zconf.tab.c lex.zconf.c confdata.c expr.c symbol.c menu.c $(SHARED_DEPS)
+	$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+zconf.tab.c: zconf.tab.c_shipped
+	cp zconf.tab.c_shipped zconf.tab.c
+
+endif
+
+.PHONY: ncurses
+
+ncurses:
+	@echo "main() {}" > lxtemp.c
+	@if $(HOSTCC) lxtemp.c $(LIBS) ; then \
+		rm -f lxtemp.c a.out; \
+	else \
+		rm -f lxtemp.c; \
+		echo -e "\007" ;\
+		echo ">> Unable to find the Ncurses libraries." ;\
+		echo ">>" ;\
+		echo ">> You must have Ncurses installed in order" ;\
+		echo ">> to use 'make menuconfig'" ;\
+		echo ;\
+		exit 1 ;\
+	fi
+
+clean:
+	@ rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \
+		conf mconf zconf.tab.c lex.zconf.c lkc_defs.h
+
Index: buildrom/scripts/kconfig/mconf.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/mconf.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,1098 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ *
+ * Introduced single menu mode (show all sub-menus in one large tree).
+ * 2002-11-06 Petr Baudis <pasky at ucw.cz>
+ *
+ * i18n, 2005, Arnaldo Carvalho de Melo <acme at conectiva.com.br>
+ */
+
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#include <locale.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static char menu_backtitle[128];
+static const char mconf_readme[] = N_(
+"Overview\n"
+"--------\n"
+"Some features may be built directly into buildrom.\n"
+"Some may be made into standalone applets.  Some features\n"
+"may be completely removed altogether.  There are also certain\n"
+"parameters which are not really features, but must be\n"
+"entered in as decimal or hexadecimal numbers or possibly text.\n"
+"\n"
+"Menu items beginning with [*], <M> or [ ] represent features\n"
+"configured to be built in, modularized or removed respectively.\n"
+"Pointed brackets <> represent module capable features.\n"
+"\n"
+"To change any of these features, highlight it with the cursor\n"
+"keys and press <Y> to build it in, <M> to make it a module or\n"
+"<N> to removed it.  You may also press the <Space Bar> to cycle\n"
+"through the available options (ie. Y->N->M->Y).\n"
+"\n"
+"Some additional keyboard hints:\n"
+"\n"
+"Menus\n"
+"----------\n"
+"o  Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
+"   you wish to change or submenu wish to select and press <Enter>.\n"
+"   Submenus are designated by \"--->\".\n"
+"\n"
+"   Shortcut: Press the option's highlighted letter (hotkey).\n"
+"             Pressing a hotkey more than once will sequence\n"
+"             through all visible items which use that hotkey.\n"
+"\n"
+"   You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
+"   unseen options into view.\n"
+"\n"
+"o  To exit a menu use the cursor keys to highlight the <Exit> button\n"
+"   and press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
+"             using those letters.  You may press a single <ESC>, but\n"
+"             there is a delayed response which you may find annoying.\n"
+"\n"
+"   Also, the <TAB> and cursor keys will cycle between <Select>,\n"
+"   <Exit> and <Help>\n"
+"\n"
+"o  To get help with an item, use the cursor keys to highlight <Help>\n"
+"   and Press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <H> or <?>.\n"
+"\n"
+"\n"
+"Radiolists  (Choice lists)\n"
+"-----------\n"
+"o  Use the cursor keys to select the option you wish to set and press\n"
+"   <S> or the <SPACE BAR>.\n"
+"\n"
+"   Shortcut: Press the first letter of the option you wish to set then\n"
+"             press <S> or <SPACE BAR>.\n"
+"\n"
+"o  To see available help for the item, use the cursor keys to highlight\n"
+"   <Help> and Press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <H> or <?>.\n"
+"\n"
+"   Also, the <TAB> and cursor keys will cycle between <Select> and\n"
+"   <Help>\n"
+"\n"
+"\n"
+"Data Entry\n"
+"-----------\n"
+"o  Enter the requested information and press <ENTER>\n"
+"   If you are entering hexadecimal values, it is not necessary to\n"
+"   add the '0x' prefix to the entry.\n"
+"\n"
+"o  For help, use the <TAB> or cursor keys to highlight the help option\n"
+"   and press <ENTER>.  You can try <TAB><H> as well.\n"
+"\n"
+"\n"
+"Text Box    (Help Window)\n"
+"--------\n"
+"o  Use the cursor keys to scroll up/down/left/right.  The VI editor\n"
+"   keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
+"   who are familiar with less and lynx.\n"
+"\n"
+"o  Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
+"\n"
+"\n"
+"Alternate Configuration Files\n"
+"-----------------------------\n"
+"Menuconfig supports the use of alternate configuration files for\n"
+"those who, for various reasons, find it necessary to switch\n"
+"between different buildrom configurations.\n"
+"\n"
+"At the end of the main menu you will find two options.  One is\n"
+"for saving the current configuration to a file of your choosing.\n"
+"The other option is for loading a previously saved alternate\n"
+"configuration.\n"
+"\n"
+"Even if you don't use alternate configuration files, but you\n"
+"find during a Menuconfig session that you have completely messed\n"
+"up your settings, you may use the \"Load Alternate...\" option to\n"
+"restore your previously saved settings from \".config\" without\n"
+"restarting Menuconfig.\n"
+"\n"
+"Other information\n"
+"-----------------\n"
+"If you use Menuconfig in an XTERM window make sure you have your\n"
+"$TERM variable set to point to a xterm definition which supports color.\n"
+"Otherwise, Menuconfig will look rather bad.  Menuconfig will not\n"
+"display correctly in a RXVT window because rxvt displays only one\n"
+"intensity of color, bright.\n"
+"\n"
+"Menuconfig will display larger menus on screens or xterms which are\n"
+"set to display more than the standard 25 row by 80 column geometry.\n"
+"In order for this to work, the \"stty size\" command must be able to\n"
+"display the screen's current row and column geometry.  I STRONGLY\n"
+"RECOMMEND that you make sure you do NOT have the shell variables\n"
+"LINES and COLUMNS exported into your environment.  Some distributions\n"
+"export those variables via /etc/profile.  Some ncurses programs can\n"
+"become confused when those variables (LINES & COLUMNS) don't reflect\n"
+"the true screen size.\n"
+"\n"
+"Optional personality available\n"
+"------------------------------\n"
+"If you prefer to have all of the buildrom options listed in a single\n"
+"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
+"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
+"\n"
+"make MENUCONFIG_MODE=single_menu menuconfig\n"
+"\n"
+"<Enter> will then unroll the appropriate category, or enfold it if it\n"
+"is already unrolled.\n"
+"\n"
+"Note that this mode can eventually be a little more CPU expensive\n"
+"(especially with a larger number of unrolled categories) than the\n"
+"default mode.\n"),
+menu_instructions[] = N_(
+	"Arrow keys navigate the menu.  "
+	"<Enter> selects submenus --->.  "
+	"Highlighted letters are hotkeys.  "
+	"Pressing <Y> includes, <N> excludes, <M> modularizes features.  "
+	"Press <Esc><Esc> to exit, <?> for Help, </> for Search.  "
+	"Legend: [*] built-in  [ ] excluded  <M> module  < > module capable"),
+radiolist_instructions[] = N_(
+	"Use the arrow keys to navigate this window or "
+	"press the hotkey of the item you wish to select "
+	"followed by the <SPACE BAR>. "
+	"Press <?> for additional information about this option."),
+inputbox_instructions_int[] = N_(
+	"Please enter a decimal value. "
+	"Fractions will not be accepted.  "
+	"Use the <TAB> key to move from the input field to the buttons below it."),
+inputbox_instructions_hex[] = N_(
+	"Please enter a hexadecimal value. "
+	"Use the <TAB> key to move from the input field to the buttons below it."),
+inputbox_instructions_string[] = N_(
+	"Please enter a string value. "
+	"Use the <TAB> key to move from the input field to the buttons below it."),
+setmod_text[] = N_(
+	"This feature depends on another which has been configured as a module.\n"
+	"As a result, this feature will be built as a module."),
+nohelp_text[] = N_(
+	"There is no help available for this option.\n"),
+load_config_text[] = N_(
+	"Enter the name of the configuration file you wish to load.  "
+	"Accept the name shown to restore the configuration you "
+	"last retrieved.  Leave blank to abort."),
+load_config_help[] = N_(
+	"\n"
+	"For various reasons, one may wish to keep several different buildrom\n"
+	"configurations available on a single machine.\n"
+	"\n"
+	"If you have saved a previous configuration in a file other than \n"
+	"buildrom default, entering the name of the file here will allow you\n"
+	"to modify that configuration.\n"
+	"\n"
+	"If you are uncertain, then you have probably never used alternate\n"
+	"configuration files.  You should therefor leave this blank to abort.\n"),
+save_config_text[] = N_(
+	"Enter a filename to which this configuration should be saved "
+	"as an alternate.  Leave blank to abort."),
+save_config_help[] = N_(
+	"\n"
+	"For various reasons, one may wish to keep different buildrom\n"
+	"configurations available on a single machine.\n"
+	"\n"
+	"Entering a file name here will allow you to later retrieve, modify\n"
+	"and use the current configuration as an alternate to whatever\n"
+	"configuration options you have selected at that time.\n"
+	"\n"
+	"If you are uncertain what all this means then you should probably\n"
+	"leave this blank.\n"),
+search_help[] = N_(
+	"\n"
+	"Search for CONFIG_ symbols and display their relations.\n"
+	"Regular expressions are allowed.\n"
+	"Example: search for \"^FOO\"\n"
+	"Result:\n"
+	"-----------------------------------------------------------------\n"
+	"Symbol: FOO [=m]\n"
+	"Prompt: Foo bus is used to drive the bar HW\n"
+	"Defined at drivers/pci/Kconfig:47\n"
+	"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
+	"Location:\n"
+	"  -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
+	"    -> PCI support (PCI [=y])\n"
+	"      -> PCI access mode (<choice> [=y])\n"
+	"Selects: LIBCRC32\n"
+	"Selected by: BAR\n"
+	"-----------------------------------------------------------------\n"
+	"o The line 'Prompt:' shows the text used in the menu structure for\n"
+	"  this CONFIG_ symbol\n"
+	"o The 'Defined at' line tell at what file / line number the symbol\n"
+	"  is defined\n"
+	"o The 'Depends on:' line tell what symbols needs to be defined for\n"
+	"  this symbol to be visible in the menu (selectable)\n"
+	"o The 'Location:' lines tell where in the menu structure this symbol\n"
+	"  is located\n"
+	"    A location followed by a [=y] indicate that this is a selectable\n"
+	"    menu item - and current value is displayed inside brackets.\n"
+	"o The 'Selects:' line tell what symbol will be automatically\n"
+	"  selected if this symbol is selected (y or m)\n"
+	"o The 'Selected by' line tell what symbol has selected this symbol\n"
+	"\n"
+	"Only relevant lines are shown.\n"
+	"\n\n"
+	"Search examples:\n"
+	"Examples: USB	=> find all CONFIG_ symbols containing USB\n"
+	"          ^USB => find all CONFIG_ symbols starting with USB\n"
+	"          USB$ => find all CONFIG_ symbols ending with USB\n"
+	"\n");
+
+static char buf[4096], *bufptr = buf;
+static char input_buf[4096];
+static char filename[PATH_MAX+1] = ".config";
+static char *args[1024], **argptr = args;
+static int indent;
+static struct termios ios_org;
+static int rows = 0, cols = 0;
+static struct menu *current_menu;
+static int child_count;
+static int do_resize;
+static int single_menu_mode;
+
+static void conf(struct menu *menu);
+static void conf_choice(struct menu *menu);
+static void conf_string(struct menu *menu);
+static void conf_load(void);
+static void conf_save(void);
+static void show_textbox(const char *title, const char *text, int r, int c);
+static void show_helptext(const char *title, const char *text);
+static void show_help(struct menu *menu);
+static void show_file(const char *filename, const char *title, int r, int c);
+
+static void cprint_init(void);
+static int cprint1(const char *fmt, ...);
+static void cprint_done(void);
+static int cprint(const char *fmt, ...);
+
+static void init_wsize(void)
+{
+	struct winsize ws;
+	char *env;
+
+	if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
+		rows = ws.ws_row;
+		cols = ws.ws_col;
+	}
+
+	if (!rows) {
+		env = getenv("LINES");
+		if (env)
+			rows = atoi(env);
+		if (!rows)
+			rows = 24;
+	}
+	if (!cols) {
+		env = getenv("COLUMNS");
+		if (env)
+			cols = atoi(env);
+		if (!cols)
+			cols = 80;
+	}
+
+	if (rows < 19 || cols < 80) {
+		fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
+		fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
+		exit(1);
+	}
+
+	rows -= 4;
+	cols -= 5;
+}
+
+static void cprint_init(void)
+{
+	bufptr = buf;
+	argptr = args;
+	memset(args, 0, sizeof(args));
+	indent = 0;
+	child_count = 0;
+	cprint("./scripts/kconfig/lxdialog/lxdialog");
+	cprint("--backtitle");
+	cprint(menu_backtitle);
+}
+
+static int cprint1(const char *fmt, ...)
+{
+	va_list ap;
+	int res;
+
+	if (!*argptr)
+		*argptr = bufptr;
+	va_start(ap, fmt);
+	res = vsprintf(bufptr, fmt, ap);
+	va_end(ap);
+	bufptr += res;
+
+	return res;
+}
+
+static void cprint_done(void)
+{
+	*bufptr++ = 0;
+	argptr++;
+}
+
+static int cprint(const char *fmt, ...)
+{
+	va_list ap;
+	int res;
+
+	*argptr++ = bufptr;
+	va_start(ap, fmt);
+	res = vsprintf(bufptr, fmt, ap);
+	va_end(ap);
+	bufptr += res;
+	*bufptr++ = 0;
+
+	return res;
+}
+
+static void get_prompt_str(struct gstr *r, struct property *prop)
+{
+	int i, j;
+	struct menu *submenu[8], *menu;
+
+	str_printf(r, "Prompt: %s\n", prop->text);
+	str_printf(r, "  Defined at %s:%d\n", prop->menu->file->name,
+		prop->menu->lineno);
+	if (!expr_is_yes(prop->visible.expr)) {
+		str_append(r, "  Depends on: ");
+		expr_gstr_print(prop->visible.expr, r);
+		str_append(r, "\n");
+	}
+	menu = prop->menu->parent;
+	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
+		submenu[i++] = menu;
+	if (i > 0) {
+		str_printf(r, "  Location:\n");
+		for (j = 4; --i >= 0; j += 2) {
+			menu = submenu[i];
+			str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
+			if (menu->sym) {
+				str_printf(r, " (%s [=%s])", menu->sym->name ?
+					menu->sym->name : "<choice>",
+					sym_get_string_value(menu->sym));
+			}
+			str_append(r, "\n");
+		}
+	}
+}
+
+static void get_symbol_str(struct gstr *r, struct symbol *sym)
+{
+	bool hit;
+	struct property *prop;
+
+	str_printf(r, "Symbol: %s [=%s]\n", sym->name,
+	                               sym_get_string_value(sym));
+	for_all_prompts(sym, prop)
+		get_prompt_str(r, prop);
+	hit = false;
+	for_all_properties(sym, prop, P_SELECT) {
+		if (!hit) {
+			str_append(r, "  Selects: ");
+			hit = true;
+		} else
+			str_printf(r, " && ");
+		expr_gstr_print(prop->expr, r);
+	}
+	if (hit)
+		str_append(r, "\n");
+	if (sym->rev_dep.expr) {
+		str_append(r, "  Selected by: ");
+		expr_gstr_print(sym->rev_dep.expr, r);
+		str_append(r, "\n");
+	}
+	str_append(r, "\n\n");
+}
+
+static struct gstr get_relations_str(struct symbol **sym_arr)
+{
+	struct symbol *sym;
+	struct gstr res = str_new();
+	int i;
+
+	for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
+		get_symbol_str(&res, sym);
+	if (!i)
+		str_append(&res, "No matches found.\n");
+	return res;
+}
+
+pid_t pid;
+
+static void winch_handler(int sig)
+{
+	if (!do_resize) {
+		kill(pid, SIGINT);
+		do_resize = 1;
+	}
+}
+
+static int exec_conf(void)
+{
+	int pipefd[2], stat, size;
+	struct sigaction sa;
+	sigset_t sset, osset;
+
+	sigemptyset(&sset);
+	sigaddset(&sset, SIGINT);
+	sigprocmask(SIG_BLOCK, &sset, &osset);
+
+	signal(SIGINT, SIG_DFL);
+
+	sa.sa_handler = winch_handler;
+	sigemptyset(&sa.sa_mask);
+	sa.sa_flags = SA_RESTART;
+	sigaction(SIGWINCH, &sa, NULL);
+
+	*argptr++ = NULL;
+
+	pipe(pipefd);
+	pid = fork();
+	if (pid == 0) {
+		sigprocmask(SIG_SETMASK, &osset, NULL);
+		dup2(pipefd[1], 2);
+		close(pipefd[0]);
+		close(pipefd[1]);
+		execv(args[0], args);
+		_exit(EXIT_FAILURE);
+	}
+
+	close(pipefd[1]);
+	bufptr = input_buf;
+	while (1) {
+		size = input_buf + sizeof(input_buf) - bufptr;
+		size = read(pipefd[0], bufptr, size);
+		if (size <= 0) {
+			if (size < 0) {
+				if (errno == EINTR || errno == EAGAIN)
+					continue;
+				perror("read");
+			}
+			break;
+		}
+		bufptr += size;
+	}
+	*bufptr++ = 0;
+	close(pipefd[0]);
+	waitpid(pid, &stat, 0);
+
+	if (do_resize) {
+		init_wsize();
+		do_resize = 0;
+		sigprocmask(SIG_SETMASK, &osset, NULL);
+		return -1;
+	}
+	if (WIFSIGNALED(stat)) {
+		printf("\finterrupted(%d)\n", WTERMSIG(stat));
+		exit(1);
+	}
+#if 0
+	printf("\fexit state: %d\nexit data: '%s'\n", WEXITSTATUS(stat), input_buf);
+	sleep(1);
+#endif
+	sigpending(&sset);
+	if (sigismember(&sset, SIGINT)) {
+		printf("\finterrupted\n");
+		exit(1);
+	}
+	sigprocmask(SIG_SETMASK, &osset, NULL);
+
+	return WEXITSTATUS(stat);
+}
+
+static void search_conf(void)
+{
+	struct symbol **sym_arr;
+	int stat;
+	struct gstr res;
+
+again:
+	cprint_init();
+	cprint("--title");
+	cprint(_("Search Configuration Parameter"));
+	cprint("--inputbox");
+	cprint(_("Enter CONFIG_ (sub)string to search for (omit CONFIG_)"));
+	cprint("10");
+	cprint("75");
+	cprint("");
+	stat = exec_conf();
+	if (stat < 0)
+		goto again;
+	switch (stat) {
+	case 0:
+		break;
+	case 1:
+		show_helptext(_("Search Configuration"), search_help);
+		goto again;
+	default:
+		return;
+	}
+
+	sym_arr = sym_re_search(input_buf);
+	res = get_relations_str(sym_arr);
+	free(sym_arr);
+	show_textbox(_("Search Results"), str_get(&res), 0, 0);
+	str_free(&res);
+}
+
+static void build_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+	int type, tmp, doint = 2;
+	tristate val;
+	char ch;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (!sym) {
+		if (prop && menu != current_menu) {
+			const char *prompt = menu_get_prompt(menu);
+			switch (prop->type) {
+			case P_MENU:
+				child_count++;
+				cprint("m%p", menu);
+
+				if (single_menu_mode) {
+					cprint1("%s%*c%s",
+						menu->data ? "-->" : "++>",
+						indent + 1, ' ', prompt);
+				} else
+					cprint1("   %*c%s  --->", indent + 1, ' ', prompt);
+
+				cprint_done();
+				if (single_menu_mode && menu->data)
+					goto conf_childs;
+				return;
+			default:
+				if (prompt) {
+					child_count++;
+					cprint(":%p", menu);
+					cprint("---%*c%s", indent + 1, ' ', prompt);
+				}
+			}
+		} else
+			doint = 0;
+		goto conf_childs;
+	}
+
+	type = sym_get_type(sym);
+	if (sym_is_choice(sym)) {
+		struct symbol *def_sym = sym_get_choice_value(sym);
+		struct menu *def_menu = NULL;
+
+		child_count++;
+		for (child = menu->list; child; child = child->next) {
+			if (menu_is_visible(child) && child->sym == def_sym)
+				def_menu = child;
+		}
+
+		val = sym_get_tristate_value(sym);
+		if (sym_is_changable(sym)) {
+			cprint("t%p", menu);
+			switch (type) {
+			case S_BOOLEAN:
+				cprint1("[%c]", val == no ? ' ' : '*');
+				break;
+			case S_TRISTATE:
+				switch (val) {
+				case yes: ch = '*'; break;
+				case mod: ch = 'M'; break;
+				default:  ch = ' '; break;
+				}
+				cprint1("<%c>", ch);
+				break;
+			}
+		} else {
+			cprint("%c%p", def_menu ? 't' : ':', menu);
+			cprint1("   ");
+		}
+
+		cprint1("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+		if (val == yes) {
+			if (def_menu) {
+				cprint1(" (%s)", menu_get_prompt(def_menu));
+				cprint1("  --->");
+				cprint_done();
+				if (def_menu->list) {
+					indent += 2;
+					build_conf(def_menu);
+					indent -= 2;
+				}
+			} else
+				cprint_done();
+			return;
+		}
+		cprint_done();
+	} else {
+		if (menu == current_menu) {
+			cprint(":%p", menu);
+			cprint("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+			goto conf_childs;
+		}
+		child_count++;
+		val = sym_get_tristate_value(sym);
+		if (sym_is_choice_value(sym) && val == yes) {
+			cprint(":%p", menu);
+			cprint1("   ");
+		} else {
+			switch (type) {
+			case S_BOOLEAN:
+				cprint("t%p", menu);
+				if (sym_is_changable(sym))
+					cprint1("[%c]", val == no ? ' ' : '*');
+				else
+					cprint1("---");
+				break;
+			case S_TRISTATE:
+				cprint("t%p", menu);
+				switch (val) {
+				case yes: ch = '*'; break;
+				case mod: ch = 'M'; break;
+				default:  ch = ' '; break;
+				}
+				if (sym_is_changable(sym))
+					cprint1("<%c>", ch);
+				else
+					cprint1("---");
+				break;
+			default:
+				cprint("s%p", menu);
+				tmp = cprint1("(%s)", sym_get_string_value(sym));
+				tmp = indent - tmp + 4;
+				if (tmp < 0)
+					tmp = 0;
+				cprint1("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
+					(sym_has_value(sym) || !sym_is_changable(sym)) ?
+					"" : " (NEW)");
+				cprint_done();
+				goto conf_childs;
+			}
+		}
+		cprint1("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
+			(sym_has_value(sym) || !sym_is_changable(sym)) ?
+			"" : " (NEW)");
+		if (menu->prompt->type == P_MENU) {
+			cprint1("  --->");
+			cprint_done();
+			return;
+		}
+		cprint_done();
+	}
+
+conf_childs:
+	indent += doint;
+	for (child = menu->list; child; child = child->next)
+		build_conf(child);
+	indent -= doint;
+}
+
+static void conf(struct menu *menu)
+{
+	struct menu *submenu;
+	const char *prompt = menu_get_prompt(menu);
+	struct symbol *sym;
+	char active_entry[40];
+	int stat, type, i;
+
+	unlink("lxdialog.scrltmp");
+	active_entry[0] = 0;
+	while (1) {
+		cprint_init();
+		cprint("--title");
+		cprint("%s", prompt ? prompt : _("Main Menu"));
+		cprint("--menu");
+		cprint(_(menu_instructions));
+		cprint("%d", rows);
+		cprint("%d", cols);
+		cprint("%d", rows - 10);
+		cprint("%s", active_entry);
+		current_menu = menu;
+		build_conf(menu);
+		if (!child_count)
+			break;
+		if (menu == &rootmenu) {
+			cprint(":");
+			cprint("--- ");
+			cprint("L");
+			cprint(_("    Load an Alternate Configuration File"));
+			cprint("S");
+			cprint(_("    Save Configuration to an Alternate File"));
+		}
+		stat = exec_conf();
+		if (stat < 0)
+			continue;
+
+		if (stat == 1 || stat == 255)
+			break;
+
+		type = input_buf[0];
+		if (!type)
+			continue;
+
+		for (i = 0; input_buf[i] && !isspace(input_buf[i]); i++)
+			;
+		if (i >= sizeof(active_entry))
+			i = sizeof(active_entry) - 1;
+		input_buf[i] = 0;
+		strcpy(active_entry, input_buf);
+
+		sym = NULL;
+		submenu = NULL;
+		if (sscanf(input_buf + 1, "%p", &submenu) == 1)
+			sym = submenu->sym;
+
+		switch (stat) {
+		case 0:
+			switch (type) {
+			case 'm':
+				if (single_menu_mode)
+					submenu->data = (void *) (long) !submenu->data;
+				else
+					conf(submenu);
+				break;
+			case 't':
+				if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
+					conf_choice(submenu);
+				else if (submenu->prompt->type == P_MENU)
+					conf(submenu);
+				break;
+			case 's':
+				conf_string(submenu);
+				break;
+			case 'L':
+				conf_load();
+				break;
+			case 'S':
+				conf_save();
+				break;
+			}
+			break;
+		case 2:
+			if (sym)
+				show_help(submenu);
+			else
+				show_helptext("README", _(mconf_readme));
+			break;
+		case 3:
+			if (type == 't') {
+				if (sym_set_tristate_value(sym, yes))
+					break;
+				if (sym_set_tristate_value(sym, mod))
+					show_textbox(NULL, setmod_text, 6, 74);
+			}
+			break;
+		case 4:
+			if (type == 't')
+				sym_set_tristate_value(sym, no);
+			break;
+		case 5:
+			if (type == 't')
+				sym_set_tristate_value(sym, mod);
+			break;
+		case 6:
+			if (type == 't')
+				sym_toggle_tristate_value(sym);
+			else if (type == 'm')
+				conf(submenu);
+			break;
+		case 7:
+			search_conf();
+			break;
+		}
+	}
+}
+
+static void show_textbox(const char *title, const char *text, int r, int c)
+{
+	int fd;
+
+	fd = creat(".help.tmp", 0777);
+	write(fd, text, strlen(text));
+	close(fd);
+	show_file(".help.tmp", title, r, c);
+	unlink(".help.tmp");
+}
+
+static void show_helptext(const char *title, const char *text)
+{
+	show_textbox(title, text, 0, 0);
+}
+
+static void show_help(struct menu *menu)
+{
+	struct gstr help = str_new();
+	struct symbol *sym = menu->sym;
+
+	if (sym->help)
+	{
+		if (sym->name) {
+			str_printf(&help, "CONFIG_%s:\n\n", sym->name);
+			str_append(&help, _(sym->help));
+			str_append(&help, "\n");
+		}
+	} else {
+		str_append(&help, nohelp_text);
+	}
+	get_symbol_str(&help, sym);
+	show_helptext(menu_get_prompt(menu), str_get(&help));
+	str_free(&help);
+}
+
+static void show_file(const char *filename, const char *title, int r, int c)
+{
+	do {
+		cprint_init();
+		if (title) {
+			cprint("--title");
+			cprint("%s", title);
+		}
+		cprint("--textbox");
+		cprint("%s", filename);
+		cprint("%d", r ? r : rows);
+		cprint("%d", c ? c : cols);
+	} while (exec_conf() < 0);
+}
+
+static void conf_choice(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+	struct menu *child;
+	struct symbol *active;
+	int stat;
+
+	active = sym_get_choice_value(menu->sym);
+	while (1) {
+		cprint_init();
+		cprint("--title");
+		cprint("%s", prompt ? prompt : _("Main Menu"));
+		cprint("--radiolist");
+		cprint(_(radiolist_instructions));
+		cprint("15");
+		cprint("70");
+		cprint("6");
+
+		current_menu = menu;
+		for (child = menu->list; child; child = child->next) {
+			if (!menu_is_visible(child))
+				continue;
+			cprint("%p", child);
+			cprint("%s", menu_get_prompt(child));
+			if (child->sym == sym_get_choice_value(menu->sym))
+				cprint("ON");
+			else if (child->sym == active)
+				cprint("SELECTED");
+			else
+				cprint("OFF");
+		}
+
+		stat = exec_conf();
+		switch (stat) {
+		case 0:
+			if (sscanf(input_buf, "%p", &child) != 1)
+				break;
+			sym_set_tristate_value(child->sym, yes);
+			return;
+		case 1:
+			if (sscanf(input_buf, "%p", &child) == 1) {
+				show_help(child);
+				active = child->sym;
+			} else
+				show_help(menu);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_string(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+	int stat;
+
+	while (1) {
+		cprint_init();
+		cprint("--title");
+		cprint("%s", prompt ? prompt : _("Main Menu"));
+		cprint("--inputbox");
+		switch (sym_get_type(menu->sym)) {
+		case S_INT:
+			cprint(_(inputbox_instructions_int));
+			break;
+		case S_HEX:
+			cprint(_(inputbox_instructions_hex));
+			break;
+		case S_STRING:
+			cprint(_(inputbox_instructions_string));
+			break;
+		default:
+			/* panic? */;
+		}
+		cprint("10");
+		cprint("75");
+		cprint("%s", sym_get_string_value(menu->sym));
+		stat = exec_conf();
+		switch (stat) {
+		case 0:
+			if (sym_set_string_value(menu->sym, input_buf))
+				return;
+			show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
+			break;
+		case 1:
+			show_help(menu);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_load(void)
+{
+	int stat;
+
+	while (1) {
+		cprint_init();
+		cprint("--inputbox");
+		cprint(load_config_text);
+		cprint("11");
+		cprint("55");
+		cprint("%s", filename);
+		stat = exec_conf();
+		switch(stat) {
+		case 0:
+			if (!input_buf[0])
+				return;
+			if (!conf_read(input_buf))
+				return;
+			show_textbox(NULL, _("File does not exist!"), 5, 38);
+			break;
+		case 1:
+			show_helptext(_("Load Alternate Configuration"), load_config_help);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_save(void)
+{
+	int stat;
+
+	while (1) {
+		cprint_init();
+		cprint("--inputbox");
+		cprint(save_config_text);
+		cprint("11");
+		cprint("55");
+		cprint("%s", filename);
+		stat = exec_conf();
+		switch(stat) {
+		case 0:
+			if (!input_buf[0])
+				return;
+			if (!conf_write(input_buf))
+				return;
+			show_textbox(NULL, _("Can't create file!  Probably a nonexistent directory."), 5, 60);
+			break;
+		case 1:
+			show_helptext(_("Save Alternate Configuration"), save_config_help);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_cleanup(void)
+{
+	tcsetattr(1, TCSAFLUSH, &ios_org);
+	unlink(".help.tmp");
+	unlink("lxdialog.scrltmp");
+}
+
+int main(int ac, char **av)
+{
+	struct symbol *sym;
+	char *mode;
+	int stat;
+
+	setlocale(LC_ALL, "");
+	bindtextdomain(PACKAGE, LOCALEDIR);
+	textdomain(PACKAGE);
+
+	conf_parse(av[1]);
+	conf_read(NULL);
+
+	sym = sym_lookup("KERNELVERSION", 0);
+	sym_calc_value(sym);
+	sprintf(menu_backtitle, _("BusyBox %s Configuration"),
+		sym_get_string_value(sym));
+
+	mode = getenv("MENUCONFIG_MODE");
+	if (mode) {
+		if (!strcasecmp(mode, "single_menu"))
+			single_menu_mode = 1;
+	}
+
+	tcgetattr(1, &ios_org);
+	atexit(conf_cleanup);
+	init_wsize();
+	conf(&rootmenu);
+
+	do {
+		cprint_init();
+		cprint("--yesno");
+		cprint(_("Do you wish to save your new buildrom configuration?"));
+		cprint("5");
+		cprint("60");
+		stat = exec_conf();
+	} while (stat < 0);
+
+	if (stat == 0) {
+		if (conf_write(NULL)) {
+			fprintf(stderr, _("\n\n"
+				"Error during writing of the buildrom configuration.\n"
+				"Your buildrom configuration changes were NOT saved."
+				"\n\n"));
+			return 1;
+		}
+		printf(_("\n\n"
+			"*** End of buildrom configuration.\n"
+			"*** Execute 'make' to build buildrom or try 'make help'."
+			"\n\n"));
+	} else {
+		fprintf(stderr, _("\n\n"
+			"Your buildrom configuration changes were NOT saved."
+			"\n\n"));
+	}
+
+	return 0;
+}
Index: buildrom/scripts/kconfig/menu.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/menu.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,397 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+struct menu rootmenu;
+static struct menu **last_entry_ptr;
+
+struct file *file_list;
+struct file *current_file;
+
+static void menu_warn(struct menu *menu, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+static void prop_warn(struct property *prop, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+void menu_init(void)
+{
+	current_entry = current_menu = &rootmenu;
+	last_entry_ptr = &rootmenu.list;
+}
+
+void menu_add_entry(struct symbol *sym)
+{
+	struct menu *menu;
+
+	menu = malloc(sizeof(*menu));
+	memset(menu, 0, sizeof(*menu));
+	menu->sym = sym;
+	menu->parent = current_menu;
+	menu->file = current_file;
+	menu->lineno = zconf_lineno();
+
+	*last_entry_ptr = menu;
+	last_entry_ptr = &menu->next;
+	current_entry = menu;
+}
+
+void menu_end_entry(void)
+{
+}
+
+struct menu *menu_add_menu(void)
+{
+	menu_end_entry();
+	last_entry_ptr = &current_entry->list;
+	return current_menu = current_entry;
+}
+
+void menu_end_menu(void)
+{
+	last_entry_ptr = &current_menu->next;
+	current_menu = current_menu->parent;
+}
+
+struct expr *menu_check_dep(struct expr *e)
+{
+	if (!e)
+		return e;
+
+	switch (e->type) {
+	case E_NOT:
+		e->left.expr = menu_check_dep(e->left.expr);
+		break;
+	case E_OR:
+	case E_AND:
+		e->left.expr = menu_check_dep(e->left.expr);
+		e->right.expr = menu_check_dep(e->right.expr);
+		break;
+	case E_SYMBOL:
+		/* change 'm' into 'm' && MODULES */
+		if (e->left.sym == &symbol_mod)
+			return expr_alloc_and(e, expr_alloc_symbol(modules_sym));
+		break;
+	default:
+		break;
+	}
+	return e;
+}
+
+void menu_add_dep(struct expr *dep)
+{
+	current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
+}
+
+void menu_set_type(int type)
+{
+	struct symbol *sym = current_entry->sym;
+
+	if (sym->type == type)
+		return;
+	if (sym->type == S_UNKNOWN) {
+		sym->type = type;
+		return;
+	}
+	menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n",
+	    sym->name ? sym->name : "<choice>",
+	    sym_type_name(sym->type), sym_type_name(type));
+}
+
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
+{
+	struct property *prop = prop_alloc(type, current_entry->sym);
+
+	prop->menu = current_entry;
+	prop->text = prompt;
+	prop->expr = expr;
+	prop->visible.expr = menu_check_dep(dep);
+
+	if (prompt) {
+		if (current_entry->prompt)
+			menu_warn(current_entry, "prompt redefined\n");
+		current_entry->prompt = prop;
+	}
+
+	return prop;
+}
+
+struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep)
+{
+	return menu_add_prop(type, prompt, NULL, dep);
+}
+
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep)
+{
+	menu_add_prop(type, NULL, expr, dep);
+}
+
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
+{
+	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
+}
+
+static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2)
+{
+	return sym2->type == S_INT || sym2->type == S_HEX ||
+	       (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));
+}
+
+void sym_check_prop(struct symbol *sym)
+{
+	struct property *prop;
+	struct symbol *sym2;
+	for (prop = sym->prop; prop; prop = prop->next) {
+		switch (prop->type) {
+		case P_DEFAULT:
+			if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
+			    prop->expr->type != E_SYMBOL)
+				prop_warn(prop,
+				    "default for config symbol '%'"
+				    " must be a single symbol", sym->name);
+			break;
+		case P_SELECT:
+			sym2 = prop_get_symbol(prop);
+			if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
+				prop_warn(prop,
+				    "config symbol '%s' uses select, but is "
+				    "not boolean or tristate", sym->name);
+			else if (sym2->type == S_UNKNOWN)
+				prop_warn(prop,
+				    "'select' used by config symbol '%s' "
+				    "refer to undefined symbol '%s'",
+				    sym->name, sym2->name);
+			else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
+				prop_warn(prop,
+				    "'%s' has wrong type. 'select' only "
+				    "accept arguments of boolean and "
+				    "tristate type", sym2->name);
+			break;
+		case P_RANGE:
+			if (sym->type != S_INT && sym->type != S_HEX)
+				prop_warn(prop, "range is only allowed "
+				                "for int or hex symbols");
+			if (!menu_range_valid_sym(sym, prop->expr->left.sym) ||
+			    !menu_range_valid_sym(sym, prop->expr->right.sym))
+				prop_warn(prop, "range is invalid");
+			break;
+		default:
+			;
+		}
+	}
+}
+
+void menu_finalize(struct menu *parent)
+{
+	struct menu *menu, *last_menu;
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *parentdep, *basedep, *dep, *dep2, **ep;
+
+	sym = parent->sym;
+	if (parent->list) {
+		if (sym && sym_is_choice(sym)) {
+			/* find the first choice value and find out choice type */
+			for (menu = parent->list; menu; menu = menu->next) {
+				if (menu->sym) {
+					current_entry = parent;
+					menu_set_type(menu->sym->type);
+					current_entry = menu;
+					menu_set_type(sym->type);
+					break;
+				}
+			}
+			parentdep = expr_alloc_symbol(sym);
+		} else if (parent->prompt)
+			parentdep = parent->prompt->visible.expr;
+		else
+			parentdep = parent->dep;
+
+		for (menu = parent->list; menu; menu = menu->next) {
+			basedep = expr_transform(menu->dep);
+			basedep = expr_alloc_and(expr_copy(parentdep), basedep);
+			basedep = expr_eliminate_dups(basedep);
+			menu->dep = basedep;
+			if (menu->sym)
+				prop = menu->sym->prop;
+			else
+				prop = menu->prompt;
+			for (; prop; prop = prop->next) {
+				if (prop->menu != menu)
+					continue;
+				dep = expr_transform(prop->visible.expr);
+				dep = expr_alloc_and(expr_copy(basedep), dep);
+				dep = expr_eliminate_dups(dep);
+				if (menu->sym && menu->sym->type != S_TRISTATE)
+					dep = expr_trans_bool(dep);
+				prop->visible.expr = dep;
+				if (prop->type == P_SELECT) {
+					struct symbol *es = prop_get_symbol(prop);
+					es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
+							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+				}
+			}
+		}
+		for (menu = parent->list; menu; menu = menu->next)
+			menu_finalize(menu);
+	} else if (sym) {
+		basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
+		basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
+		basedep = expr_eliminate_dups(expr_transform(basedep));
+		last_menu = NULL;
+		for (menu = parent->next; menu; menu = menu->next) {
+			dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
+			if (!expr_contains_symbol(dep, sym))
+				break;
+			if (expr_depends_symbol(dep, sym))
+				goto next;
+			dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no);
+			dep = expr_eliminate_dups(expr_transform(dep));
+			dep2 = expr_copy(basedep);
+			expr_eliminate_eq(&dep, &dep2);
+			expr_free(dep);
+			if (!expr_is_yes(dep2)) {
+				expr_free(dep2);
+				break;
+			}
+			expr_free(dep2);
+		next:
+			menu_finalize(menu);
+			menu->parent = parent;
+			last_menu = menu;
+		}
+		if (last_menu) {
+			parent->list = parent->next;
+			parent->next = last_menu->next;
+			last_menu->next = NULL;
+		}
+	}
+	for (menu = parent->list; menu; menu = menu->next) {
+		if (sym && sym_is_choice(sym) && menu->sym) {
+			menu->sym->flags |= SYMBOL_CHOICEVAL;
+			if (!menu->prompt)
+				menu_warn(menu, "choice value must have a prompt");
+			for (prop = menu->sym->prop; prop; prop = prop->next) {
+				if (prop->type == P_PROMPT && prop->menu != menu) {
+					prop_warn(prop, "choice values "
+					    "currently only support a "
+					    "single prompt");
+				}
+				if (prop->type == P_DEFAULT)
+					prop_warn(prop, "defaults for choice "
+					    "values not supported");
+			}
+			current_entry = menu;
+			menu_set_type(sym->type);
+			menu_add_symbol(P_CHOICE, sym, NULL);
+			prop = sym_get_choice_prop(sym);
+			for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
+				;
+			*ep = expr_alloc_one(E_CHOICE, NULL);
+			(*ep)->right.sym = menu->sym;
+		}
+		if (menu->list && (!menu->prompt || !menu->prompt->text)) {
+			for (last_menu = menu->list; ; last_menu = last_menu->next) {
+				last_menu->parent = parent;
+				if (!last_menu->next)
+					break;
+			}
+			last_menu->next = menu->next;
+			menu->next = menu->list;
+			menu->list = NULL;
+		}
+	}
+
+	if (sym && !(sym->flags & SYMBOL_WARNED)) {
+		if (sym->type == S_UNKNOWN)
+			menu_warn(parent, "config symbol defined "
+			    "without type\n");
+
+		if (sym_is_choice(sym) && !parent->prompt)
+			menu_warn(parent, "choice must have a prompt\n");
+
+		/* Check properties connected to this symbol */
+		sym_check_prop(sym);
+		sym->flags |= SYMBOL_WARNED;
+	}
+
+	if (sym && !sym_is_optional(sym) && parent->prompt) {
+		sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
+				expr_alloc_and(parent->prompt->visible.expr,
+					expr_alloc_symbol(&symbol_mod)));
+	}
+}
+
+bool menu_is_visible(struct menu *menu)
+{
+	struct menu *child;
+	struct symbol *sym;
+	tristate visible;
+
+	if (!menu->prompt)
+		return false;
+	sym = menu->sym;
+	if (sym) {
+		sym_calc_value(sym);
+		visible = menu->prompt->visible.tri;
+	} else
+		visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr);
+
+	if (visible != no)
+		return true;
+	if (!sym || sym_get_tristate_value(menu->sym) == no)
+		return false;
+
+	for (child = menu->list; child; child = child->next)
+		if (menu_is_visible(child))
+			return true;
+	return false;
+}
+
+const char *menu_get_prompt(struct menu *menu)
+{
+	if (menu->prompt)
+		return _(menu->prompt->text);
+	else if (menu->sym)
+		return _(menu->sym->name);
+	return NULL;
+}
+
+struct menu *menu_get_root_menu(struct menu *menu)
+{
+	return &rootmenu;
+}
+
+struct menu *menu_get_parent_menu(struct menu *menu)
+{
+	enum prop_type type;
+
+	for (; menu != &rootmenu; menu = menu->parent) {
+		type = menu->prompt ? menu->prompt->type : 0;
+		if (type == P_MENU)
+			break;
+	}
+	return menu;
+}
+
Index: buildrom/scripts/kconfig/POTFILES.in
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/POTFILES.in	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,5 @@
+scripts/kconfig/mconf.c
+scripts/kconfig/conf.c
+scripts/kconfig/confdata.c
+scripts/kconfig/gconf.c
+scripts/kconfig/qconf.cc
Index: buildrom/scripts/kconfig/symbol.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/symbol.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,882 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <regex.h>
+#include <sys/utsname.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+struct symbol symbol_yes = {
+	.name = "y",
+	.curr = { "y", yes },
+	.flags = SYMBOL_YES|SYMBOL_VALID,
+}, symbol_mod = {
+	.name = "m",
+	.curr = { "m", mod },
+	.flags = SYMBOL_MOD|SYMBOL_VALID,
+}, symbol_no = {
+	.name = "n",
+	.curr = { "n", no },
+	.flags = SYMBOL_NO|SYMBOL_VALID,
+}, symbol_empty = {
+	.name = "",
+	.curr = { "", no },
+	.flags = SYMBOL_VALID,
+};
+
+int sym_change_count;
+struct symbol *modules_sym;
+tristate modules_val;
+
+void sym_add_default(struct symbol *sym, const char *def)
+{
+	struct property *prop = prop_alloc(P_DEFAULT, sym);
+
+	prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
+}
+
+void sym_init(void)
+{
+	struct symbol *sym;
+	struct utsname uts;
+	char *p;
+	static bool inited = false;
+
+	if (inited)
+		return;
+	inited = true;
+
+	uname(&uts);
+
+	sym = sym_lookup("ARCH", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	p = getenv("ARCH");
+	if (p)
+		sym_add_default(sym, p);
+
+	sym = sym_lookup("KERNELVERSION", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	p = getenv("KERNELVERSION");
+	if (p)
+		sym_add_default(sym, p);
+
+	sym = sym_lookup("UNAME_RELEASE", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	sym_add_default(sym, uts.release);
+}
+
+enum symbol_type sym_get_type(struct symbol *sym)
+{
+	enum symbol_type type = sym->type;
+
+	if (type == S_TRISTATE) {
+		if (sym_is_choice_value(sym) && sym->visible == yes)
+			type = S_BOOLEAN;
+		else if (modules_val == no)
+			type = S_BOOLEAN;
+	}
+	return type;
+}
+
+const char *sym_type_name(enum symbol_type type)
+{
+	switch (type) {
+	case S_BOOLEAN:
+		return "boolean";
+	case S_TRISTATE:
+		return "tristate";
+	case S_INT:
+		return "integer";
+	case S_HEX:
+		return "hex";
+	case S_STRING:
+		return "string";
+	case S_UNKNOWN:
+		return "unknown";
+	case S_OTHER:
+		break;
+	}
+	return "???";
+}
+
+struct property *sym_get_choice_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_choices(sym, prop)
+		return prop;
+	return NULL;
+}
+
+struct property *sym_get_default_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_defaults(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri != no)
+			return prop;
+	}
+	return NULL;
+}
+
+struct property *sym_get_range_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_properties(sym, prop, P_RANGE) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri != no)
+			return prop;
+	}
+	return NULL;
+}
+
+static int sym_get_range_val(struct symbol *sym, int base)
+{
+	sym_calc_value(sym);
+	switch (sym->type) {
+	case S_INT:
+		base = 10;
+		break;
+	case S_HEX:
+		base = 16;
+		break;
+	default:
+		break;
+	}
+	return strtol(sym->curr.val, NULL, base);
+}
+
+static void sym_validate_range(struct symbol *sym)
+{
+	struct property *prop;
+	int base, val, val2;
+	char str[64];
+
+	switch (sym->type) {
+	case S_INT:
+		base = 10;
+		break;
+	case S_HEX:
+		base = 16;
+		break;
+	default:
+		return;
+	}
+	prop = sym_get_range_prop(sym);
+	if (!prop)
+		return;
+	val = strtol(sym->curr.val, NULL, base);
+	val2 = sym_get_range_val(prop->expr->left.sym, base);
+	if (val >= val2) {
+		val2 = sym_get_range_val(prop->expr->right.sym, base);
+		if (val <= val2)
+			return;
+	}
+	if (sym->type == S_INT)
+		sprintf(str, "%d", val2);
+	else
+		sprintf(str, "0x%x", val2);
+	sym->curr.val = strdup(str);
+}
+
+static void sym_calc_visibility(struct symbol *sym)
+{
+	struct property *prop;
+	tristate tri;
+
+	/* any prompt visible? */
+	tri = no;
+	for_all_prompts(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		tri = E_OR(tri, prop->visible.tri);
+	}
+	if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
+		tri = yes;
+	if (sym->visible != tri) {
+		sym->visible = tri;
+		sym_set_changed(sym);
+	}
+	if (sym_is_choice_value(sym))
+		return;
+	tri = no;
+	if (sym->rev_dep.expr)
+		tri = expr_calc_value(sym->rev_dep.expr);
+	if (tri == mod && sym_get_type(sym) == S_BOOLEAN)
+		tri = yes;
+	if (sym->rev_dep.tri != tri) {
+		sym->rev_dep.tri = tri;
+		sym_set_changed(sym);
+	}
+}
+
+static struct symbol *sym_calc_choice(struct symbol *sym)
+{
+	struct symbol *def_sym;
+	struct property *prop;
+	struct expr *e;
+
+	/* is the user choice visible? */
+	def_sym = sym->user.val;
+	if (def_sym) {
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* any of the defaults visible? */
+	for_all_defaults(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri == no)
+			continue;
+		def_sym = prop_get_symbol(prop);
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* just get the first visible value */
+	prop = sym_get_choice_prop(sym);
+	for (e = prop->expr; e; e = e->left.expr) {
+		def_sym = e->right.sym;
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* no choice? reset tristate value */
+	sym->curr.tri = no;
+	return NULL;
+}
+
+void sym_calc_value(struct symbol *sym)
+{
+	struct symbol_value newval, oldval;
+	struct property *prop;
+	struct expr *e;
+
+	if (!sym)
+		return;
+
+	if (sym->flags & SYMBOL_VALID)
+		return;
+	sym->flags |= SYMBOL_VALID;
+
+	oldval = sym->curr;
+
+	switch (sym->type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		newval = symbol_empty.curr;
+		break;
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		newval = symbol_no.curr;
+		break;
+	default:
+		sym->curr.val = sym->name;
+		sym->curr.tri = no;
+		return;
+	}
+	if (!sym_is_choice_value(sym))
+		sym->flags &= ~SYMBOL_WRITE;
+
+	sym_calc_visibility(sym);
+
+	/* set default if recursively called */
+	sym->curr = newval;
+
+	switch (sym_get_type(sym)) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		if (sym_is_choice_value(sym) && sym->visible == yes) {
+			prop = sym_get_choice_prop(sym);
+			newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
+		} else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
+			sym->flags |= SYMBOL_WRITE;
+			if (sym_has_value(sym))
+				newval.tri = sym->user.tri;
+			else if (!sym_is_choice(sym)) {
+				prop = sym_get_default_prop(sym);
+				if (prop)
+					newval.tri = expr_calc_value(prop->expr);
+			}
+			newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
+		} else if (!sym_is_choice(sym)) {
+			prop = sym_get_default_prop(sym);
+			if (prop) {
+				sym->flags |= SYMBOL_WRITE;
+				newval.tri = expr_calc_value(prop->expr);
+			}
+		}
+		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
+			newval.tri = yes;
+		break;
+	case S_STRING:
+	case S_HEX:
+	case S_INT:
+		if (sym->visible != no) {
+			sym->flags |= SYMBOL_WRITE;
+			if (sym_has_value(sym)) {
+				newval.val = sym->user.val;
+				break;
+			}
+		}
+		prop = sym_get_default_prop(sym);
+		if (prop) {
+			struct symbol *ds = prop_get_symbol(prop);
+			if (ds) {
+				sym->flags |= SYMBOL_WRITE;
+				sym_calc_value(ds);
+				newval.val = ds->curr.val;
+			}
+		}
+		break;
+	default:
+		;
+	}
+
+	sym->curr = newval;
+	if (sym_is_choice(sym) && newval.tri == yes)
+		sym->curr.val = sym_calc_choice(sym);
+	sym_validate_range(sym);
+
+	if (memcmp(&oldval, &sym->curr, sizeof(oldval)))
+		sym_set_changed(sym);
+	if (modules_sym == sym)
+		modules_val = modules_sym->curr.tri;
+
+	if (sym_is_choice(sym)) {
+		int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
+		prop = sym_get_choice_prop(sym);
+		for (e = prop->expr; e; e = e->left.expr) {
+			e->right.sym->flags |= flags;
+			if (flags & SYMBOL_CHANGED)
+				sym_set_changed(e->right.sym);
+		}
+	}
+}
+
+void sym_clear_all_valid(void)
+{
+	struct symbol *sym;
+	int i;
+
+	for_all_symbols(i, sym)
+		sym->flags &= ~SYMBOL_VALID;
+	sym_change_count++;
+	if (modules_sym)
+		sym_calc_value(modules_sym);
+}
+
+void sym_set_changed(struct symbol *sym)
+{
+	struct property *prop;
+
+	sym->flags |= SYMBOL_CHANGED;
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu)
+			prop->menu->flags |= MENU_CHANGED;
+	}
+}
+
+void sym_set_all_changed(void)
+{
+	struct symbol *sym;
+	int i;
+
+	for_all_symbols(i, sym)
+		sym_set_changed(sym);
+}
+
+bool sym_tristate_within_range(struct symbol *sym, tristate val)
+{
+	int type = sym_get_type(sym);
+
+	if (sym->visible == no)
+		return false;
+
+	if (type != S_BOOLEAN && type != S_TRISTATE)
+		return false;
+
+	if (type == S_BOOLEAN && val == mod)
+		return false;
+	if (sym->visible <= sym->rev_dep.tri)
+		return false;
+	if (sym_is_choice_value(sym) && sym->visible == yes)
+		return val == yes;
+	return val >= sym->rev_dep.tri && val <= sym->visible;
+}
+
+bool sym_set_tristate_value(struct symbol *sym, tristate val)
+{
+	tristate oldval = sym_get_tristate_value(sym);
+
+	if (oldval != val && !sym_tristate_within_range(sym, val))
+		return false;
+
+	if (sym->flags & SYMBOL_NEW) {
+		sym->flags &= ~SYMBOL_NEW;
+		sym_set_changed(sym);
+	}
+	/*
+	 * setting a choice value also resets the new flag of the choice
+	 * symbol and all other choice values.
+	 */
+	if (sym_is_choice_value(sym) && val == yes) {
+		struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+		struct property *prop;
+		struct expr *e;
+
+		cs->user.val = sym;
+		cs->flags &= ~SYMBOL_NEW;
+		prop = sym_get_choice_prop(cs);
+		for (e = prop->expr; e; e = e->left.expr) {
+			if (e->right.sym->visible != no)
+				e->right.sym->flags &= ~SYMBOL_NEW;
+		}
+	}
+
+	sym->user.tri = val;
+	if (oldval != val) {
+		sym_clear_all_valid();
+		if (sym == modules_sym)
+			sym_set_all_changed();
+	}
+
+	return true;
+}
+
+tristate sym_toggle_tristate_value(struct symbol *sym)
+{
+	tristate oldval, newval;
+
+	oldval = newval = sym_get_tristate_value(sym);
+	do {
+		switch (newval) {
+		case no:
+			newval = mod;
+			break;
+		case mod:
+			newval = yes;
+			break;
+		case yes:
+			newval = no;
+			break;
+		}
+		if (sym_set_tristate_value(sym, newval))
+			break;
+	} while (oldval != newval);
+	return newval;
+}
+
+bool sym_string_valid(struct symbol *sym, const char *str)
+{
+	signed char ch;
+
+	switch (sym->type) {
+	case S_STRING:
+		return true;
+	case S_INT:
+		ch = *str++;
+		if (ch == '-')
+			ch = *str++;
+		if (!isdigit(ch))
+			return false;
+		if (ch == '0' && *str != 0)
+			return false;
+		while ((ch = *str++)) {
+			if (!isdigit(ch))
+				return false;
+		}
+		return true;
+	case S_HEX:
+		if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
+			str += 2;
+		ch = *str++;
+		do {
+			if (!isxdigit(ch))
+				return false;
+		} while ((ch = *str++));
+		return true;
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (str[0]) {
+		case 'y': case 'Y':
+		case 'm': case 'M':
+		case 'n': case 'N':
+			return true;
+		}
+		return false;
+	default:
+		return false;
+	}
+}
+
+bool sym_string_within_range(struct symbol *sym, const char *str)
+{
+	struct property *prop;
+	int val;
+
+	switch (sym->type) {
+	case S_STRING:
+		return sym_string_valid(sym, str);
+	case S_INT:
+		if (!sym_string_valid(sym, str))
+			return false;
+		prop = sym_get_range_prop(sym);
+		if (!prop)
+			return true;
+		val = strtol(str, NULL, 10);
+		return val >= sym_get_range_val(prop->expr->left.sym, 10) &&
+		       val <= sym_get_range_val(prop->expr->right.sym, 10);
+	case S_HEX:
+		if (!sym_string_valid(sym, str))
+			return false;
+		prop = sym_get_range_prop(sym);
+		if (!prop)
+			return true;
+		val = strtol(str, NULL, 16);
+		return val >= sym_get_range_val(prop->expr->left.sym, 16) &&
+		       val <= sym_get_range_val(prop->expr->right.sym, 16);
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (str[0]) {
+		case 'y': case 'Y':
+			return sym_tristate_within_range(sym, yes);
+		case 'm': case 'M':
+			return sym_tristate_within_range(sym, mod);
+		case 'n': case 'N':
+			return sym_tristate_within_range(sym, no);
+		}
+		return false;
+	default:
+		return false;
+	}
+}
+
+bool sym_set_string_value(struct symbol *sym, const char *newval)
+{
+	const char *oldval;
+	char *val;
+	int size;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (newval[0]) {
+		case 'y': case 'Y':
+			return sym_set_tristate_value(sym, yes);
+		case 'm': case 'M':
+			return sym_set_tristate_value(sym, mod);
+		case 'n': case 'N':
+			return sym_set_tristate_value(sym, no);
+		}
+		return false;
+	default:
+		;
+	}
+
+	if (!sym_string_within_range(sym, newval))
+		return false;
+
+	if (sym->flags & SYMBOL_NEW) {
+		sym->flags &= ~SYMBOL_NEW;
+		sym_set_changed(sym);
+	}
+
+	oldval = sym->user.val;
+	size = strlen(newval) + 1;
+	if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {
+		size += 2;
+		sym->user.val = val = malloc(size);
+		*val++ = '0';
+		*val++ = 'x';
+	} else if (!oldval || strcmp(oldval, newval))
+		sym->user.val = val = malloc(size);
+	else
+		return true;
+
+	strcpy(val, newval);
+	free((void *)oldval);
+	sym_clear_all_valid();
+
+	return true;
+}
+
+const char *sym_get_string_value(struct symbol *sym)
+{
+	tristate val;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		val = sym_get_tristate_value(sym);
+		switch (val) {
+		case no:
+			return "n";
+		case mod:
+			return "m";
+		case yes:
+			return "y";
+		}
+		break;
+	default:
+		;
+	}
+	return (const char *)sym->curr.val;
+}
+
+bool sym_is_changable(struct symbol *sym)
+{
+	return sym->visible > sym->rev_dep.tri;
+}
+
+struct symbol *sym_lookup(const char *name, int isconst)
+{
+	struct symbol *symbol;
+	const char *ptr;
+	char *new_name;
+	int hash = 0;
+
+	if (name) {
+		if (name[0] && !name[1]) {
+			switch (name[0]) {
+			case 'y': return &symbol_yes;
+			case 'm': return &symbol_mod;
+			case 'n': return &symbol_no;
+			}
+		}
+		for (ptr = name; *ptr; ptr++)
+			hash += *ptr;
+		hash &= 0xff;
+
+		for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+			if (!strcmp(symbol->name, name)) {
+				if ((isconst && symbol->flags & SYMBOL_CONST) ||
+				    (!isconst && !(symbol->flags & SYMBOL_CONST)))
+					return symbol;
+			}
+		}
+		new_name = strdup(name);
+	} else {
+		new_name = NULL;
+		hash = 256;
+	}
+
+	symbol = malloc(sizeof(*symbol));
+	memset(symbol, 0, sizeof(*symbol));
+	symbol->name = new_name;
+	symbol->type = S_UNKNOWN;
+	symbol->flags = SYMBOL_NEW;
+	if (isconst)
+		symbol->flags |= SYMBOL_CONST;
+
+	symbol->next = symbol_hash[hash];
+	symbol_hash[hash] = symbol;
+
+	return symbol;
+}
+
+struct symbol *sym_find(const char *name)
+{
+	struct symbol *symbol = NULL;
+	const char *ptr;
+	int hash = 0;
+
+	if (!name)
+		return NULL;
+
+	if (name[0] && !name[1]) {
+		switch (name[0]) {
+		case 'y': return &symbol_yes;
+		case 'm': return &symbol_mod;
+		case 'n': return &symbol_no;
+		}
+	}
+	for (ptr = name; *ptr; ptr++)
+		hash += *ptr;
+	hash &= 0xff;
+
+	for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+		if (!strcmp(symbol->name, name) &&
+		    !(symbol->flags & SYMBOL_CONST))
+				break;
+	}
+
+	return symbol;
+}
+
+struct symbol **sym_re_search(const char *pattern)
+{
+	struct symbol *sym, **sym_arr = NULL;
+	int i, cnt, size;
+	regex_t re;
+
+	cnt = size = 0;
+	/* Skip if empty */
+	if (strlen(pattern) == 0)
+		return NULL;
+	if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE))
+		return NULL;
+
+	for_all_symbols(i, sym) {
+		if (sym->flags & SYMBOL_CONST || !sym->name)
+			continue;
+		if (regexec(&re, sym->name, 0, NULL, 0))
+			continue;
+		if (cnt + 1 >= size) {
+			void *tmp = sym_arr;
+			size += 16;
+			sym_arr = realloc(sym_arr, size * sizeof(struct symbol *));
+			if (!sym_arr) {
+				free(tmp);
+				return NULL;
+			}
+		}
+		sym_arr[cnt++] = sym;
+	}
+	if (sym_arr)
+		sym_arr[cnt] = NULL;
+	regfree(&re);
+
+	return sym_arr;
+}
+
+
+struct symbol *sym_check_deps(struct symbol *sym);
+
+static struct symbol *sym_check_expr_deps(struct expr *e)
+{
+	struct symbol *sym;
+
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_OR:
+	case E_AND:
+		sym = sym_check_expr_deps(e->left.expr);
+		if (sym)
+			return sym;
+		return sym_check_expr_deps(e->right.expr);
+	case E_NOT:
+		return sym_check_expr_deps(e->left.expr);
+	case E_EQUAL:
+	case E_UNEQUAL:
+		sym = sym_check_deps(e->left.sym);
+		if (sym)
+			return sym;
+		return sym_check_deps(e->right.sym);
+	case E_SYMBOL:
+		return sym_check_deps(e->left.sym);
+	default:
+		break;
+	}
+	printf("Oops! How to check %d?\n", e->type);
+	return NULL;
+}
+
+struct symbol *sym_check_deps(struct symbol *sym)
+{
+	struct symbol *sym2;
+	struct property *prop;
+
+	if (sym->flags & SYMBOL_CHECK) {
+		printf("Warning! Found recursive dependency: %s", sym->name);
+		return sym;
+	}
+	if (sym->flags & SYMBOL_CHECKED)
+		return NULL;
+
+	sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
+	sym2 = sym_check_expr_deps(sym->rev_dep.expr);
+	if (sym2)
+		goto out;
+
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->type == P_CHOICE || prop->type == P_SELECT)
+			continue;
+		sym2 = sym_check_expr_deps(prop->visible.expr);
+		if (sym2)
+			goto out;
+		if (prop->type != P_DEFAULT || sym_is_choice(sym))
+			continue;
+		sym2 = sym_check_expr_deps(prop->expr);
+		if (sym2)
+			goto out;
+	}
+out:
+	if (sym2) {
+		printf(" %s", sym->name);
+		if (sym2 == sym) {
+			printf("\n");
+			sym2 = NULL;
+		}
+	}
+	sym->flags &= ~SYMBOL_CHECK;
+	return sym2;
+}
+
+struct property *prop_alloc(enum prop_type type, struct symbol *sym)
+{
+	struct property *prop;
+	struct property **propp;
+
+	prop = malloc(sizeof(*prop));
+	memset(prop, 0, sizeof(*prop));
+	prop->type = type;
+	prop->sym = sym;
+	prop->file = current_file;
+	prop->lineno = zconf_lineno();
+
+	/* append property to the prop list of symbol */
+	if (sym) {
+		for (propp = &sym->prop; *propp; propp = &(*propp)->next)
+			;
+		*propp = prop;
+	}
+
+	return prop;
+}
+
+struct symbol *prop_get_symbol(struct property *prop)
+{
+	if (prop->expr && (prop->expr->type == E_SYMBOL ||
+			   prop->expr->type == E_CHOICE))
+		return prop->expr->left.sym;
+	return NULL;
+}
+
+const char *prop_get_type_name(enum prop_type type)
+{
+	switch (type) {
+	case P_PROMPT:
+		return "prompt";
+	case P_COMMENT:
+		return "comment";
+	case P_MENU:
+		return "menu";
+	case P_DEFAULT:
+		return "default";
+	case P_CHOICE:
+		return "choice";
+	case P_SELECT:
+		return "select";
+	case P_RANGE:
+		return "range";
+	case P_UNKNOWN:
+		break;
+	}
+	return "unknown";
+}
Index: buildrom/scripts/kconfig/util.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/util.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2002-2005 Roman Zippel <zippel at linux-m68k.org>
+ * Copyright (C) 2002-2005 Sam Ravnborg <sam at ravnborg.org>
+ *
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <string.h>
+#include "lkc.h"
+
+/* file already present in list? If not add it */
+struct file *file_lookup(const char *name)
+{
+	struct file *file;
+
+	for (file = file_list; file; file = file->next) {
+		if (!strcmp(name, file->name))
+			return file;
+	}
+
+	file = malloc(sizeof(*file));
+	memset(file, 0, sizeof(*file));
+	file->name = strdup(name);
+	file->next = file_list;
+	file_list = file;
+	return file;
+}
+
+/* write a dependency file as used by kbuild to track dependencies */
+int file_write_dep(const char *name)
+{
+	struct file *file;
+	FILE *out;
+
+	if (!name)
+		name = ".kconfig.d";
+	out = fopen("..config.tmp", "w");
+	if (!out)
+		return 1;
+	fprintf(out, "deps_config := \\\n");
+	for (file = file_list; file; file = file->next) {
+		if (file->next)
+			fprintf(out, "\t%s \\\n", file->name);
+		else
+			fprintf(out, "\t%s\n", file->name);
+	}
+	fprintf(out, "\n.config include/autoconf.h: $(deps_config)\n\n$(deps_config):\n");
+	fclose(out);
+	rename("..config.tmp", name);
+	return 0;
+}
+
+
+/* Allocate initial growable sting */
+struct gstr str_new(void)
+{
+	struct gstr gs;
+	gs.s = malloc(sizeof(char) * 64);
+	gs.len = 16;
+	strcpy(gs.s, "\0");
+	return gs;
+}
+
+/* Allocate and assign growable string */
+struct gstr str_assign(const char *s)
+{
+	struct gstr gs;
+	gs.s = strdup(s);
+	gs.len = strlen(s) + 1;
+	return gs;
+}
+
+/* Free storage for growable string */
+void str_free(struct gstr *gs)
+{
+	if (gs->s)
+		free(gs->s);
+	gs->s = NULL;
+	gs->len = 0;
+}
+
+/* Append to growable string */
+void str_append(struct gstr *gs, const char *s)
+{
+	size_t l = strlen(gs->s) + strlen(s) + 1;
+	if (l > gs->len) {
+		gs->s   = realloc(gs->s, l);
+		gs->len = l;
+	}
+	strcat(gs->s, s);
+}
+
+/* Append printf formatted string to growable string */
+void str_printf(struct gstr *gs, const char *fmt, ...)
+{
+	va_list ap;
+	char s[10000]; /* big enough... */
+	va_start(ap, fmt);
+	vsnprintf(s, sizeof(s), fmt, ap);
+	str_append(gs, s);
+	va_end(ap);
+}
+
+/* Retrieve value of growable string */
+const char *str_get(struct gstr *gs)
+{
+	return gs->s;
+}
+
Index: buildrom/scripts/kconfig/zconf.gperf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/zconf.gperf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,43 @@
+%language=ANSI-C
+%define hash-function-name kconf_id_hash
+%define lookup-function-name kconf_id_lookup
+%define string-pool-name kconf_id_strings
+%compare-strncmp
+%enum
+%pic
+%struct-type
+
+struct kconf_id;
+
+%%
+mainmenu,	T_MAINMENU,	TF_COMMAND
+menu,		T_MENU,		TF_COMMAND
+endmenu,	T_ENDMENU,	TF_COMMAND
+source,		T_SOURCE,	TF_COMMAND
+choice,		T_CHOICE,	TF_COMMAND
+endchoice,	T_ENDCHOICE,	TF_COMMAND
+comment,	T_COMMENT,	TF_COMMAND
+config,		T_CONFIG,	TF_COMMAND
+menuconfig,	T_MENUCONFIG,	TF_COMMAND
+help,		T_HELP,		TF_COMMAND
+if,		T_IF,		TF_COMMAND|TF_PARAM
+endif,		T_ENDIF,	TF_COMMAND
+depends,	T_DEPENDS,	TF_COMMAND
+requires,	T_REQUIRES,	TF_COMMAND
+optional,	T_OPTIONAL,	TF_COMMAND
+default,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN
+prompt,		T_PROMPT,	TF_COMMAND
+tristate,	T_TYPE,		TF_COMMAND, S_TRISTATE
+def_tristate,	T_DEFAULT,	TF_COMMAND, S_TRISTATE
+bool,		T_TYPE,		TF_COMMAND, S_BOOLEAN
+boolean,	T_TYPE,		TF_COMMAND, S_BOOLEAN
+def_bool,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN
+def_boolean,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN
+int,		T_TYPE,		TF_COMMAND, S_INT
+hex,		T_TYPE,		TF_COMMAND, S_HEX
+string,		T_TYPE,		TF_COMMAND, S_STRING
+select,		T_SELECT,	TF_COMMAND
+enable,		T_SELECT,	TF_COMMAND
+range,		T_RANGE,	TF_COMMAND
+on,		T_ON,		TF_PARAM
+%%
Index: buildrom/scripts/kconfig/zconf.hash.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/zconf.hash.c	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,231 @@
+/* ANSI-C code produced by gperf version 3.0.1 */
+/* Command-line: gperf  */
+/* Computed positions: -k'1,3' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf at gnu.org>."
+#endif
+
+struct kconf_id;
+/* maximum key range = 45, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+kconf_id_hash (register const char *str, register unsigned int len)
+{
+  static unsigned char asso_values[] =
+    {
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 25, 10, 15,
+       0,  0,  5, 47,  0,  0, 47, 47,  0, 10,
+       0, 20, 20, 20,  5,  0,  0, 20, 47, 47,
+      20, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval;
+}
+
+struct kconf_id_strings_t
+  {
+    char kconf_id_strings_str2[sizeof("if")];
+    char kconf_id_strings_str3[sizeof("int")];
+    char kconf_id_strings_str4[sizeof("help")];
+    char kconf_id_strings_str5[sizeof("endif")];
+    char kconf_id_strings_str6[sizeof("select")];
+    char kconf_id_strings_str7[sizeof("endmenu")];
+    char kconf_id_strings_str8[sizeof("tristate")];
+    char kconf_id_strings_str9[sizeof("endchoice")];
+    char kconf_id_strings_str10[sizeof("range")];
+    char kconf_id_strings_str11[sizeof("string")];
+    char kconf_id_strings_str12[sizeof("default")];
+    char kconf_id_strings_str13[sizeof("def_bool")];
+    char kconf_id_strings_str14[sizeof("menu")];
+    char kconf_id_strings_str16[sizeof("def_boolean")];
+    char kconf_id_strings_str17[sizeof("def_tristate")];
+    char kconf_id_strings_str18[sizeof("mainmenu")];
+    char kconf_id_strings_str20[sizeof("menuconfig")];
+    char kconf_id_strings_str21[sizeof("config")];
+    char kconf_id_strings_str22[sizeof("on")];
+    char kconf_id_strings_str23[sizeof("hex")];
+    char kconf_id_strings_str26[sizeof("source")];
+    char kconf_id_strings_str27[sizeof("depends")];
+    char kconf_id_strings_str28[sizeof("optional")];
+    char kconf_id_strings_str31[sizeof("enable")];
+    char kconf_id_strings_str32[sizeof("comment")];
+    char kconf_id_strings_str33[sizeof("requires")];
+    char kconf_id_strings_str34[sizeof("bool")];
+    char kconf_id_strings_str37[sizeof("boolean")];
+    char kconf_id_strings_str41[sizeof("choice")];
+    char kconf_id_strings_str46[sizeof("prompt")];
+  };
+static struct kconf_id_strings_t kconf_id_strings_contents =
+  {
+    "if",
+    "int",
+    "help",
+    "endif",
+    "select",
+    "endmenu",
+    "tristate",
+    "endchoice",
+    "range",
+    "string",
+    "default",
+    "def_bool",
+    "menu",
+    "def_boolean",
+    "def_tristate",
+    "mainmenu",
+    "menuconfig",
+    "config",
+    "on",
+    "hex",
+    "source",
+    "depends",
+    "optional",
+    "enable",
+    "comment",
+    "requires",
+    "bool",
+    "boolean",
+    "choice",
+    "prompt"
+  };
+#define kconf_id_strings ((const char *) &kconf_id_strings_contents)
+#ifdef __GNUC__
+__inline
+#endif
+struct kconf_id *
+kconf_id_lookup (register const char *str, register unsigned int len)
+{
+  enum
+    {
+      TOTAL_KEYWORDS = 30,
+      MIN_WORD_LENGTH = 2,
+      MAX_WORD_LENGTH = 12,
+      MIN_HASH_VALUE = 2,
+      MAX_HASH_VALUE = 46
+    };
+
+  static struct kconf_id wordlist[] =
+    {
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_IF,		TF_COMMAND|TF_PARAM},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_TYPE,		TF_COMMAND, S_INT},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str4,		T_HELP,		TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,		T_ENDIF,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_SELECT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_ENDMENU,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_TYPE,		TF_COMMAND, S_TRISTATE},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,	T_ENDCHOICE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,		T_RANGE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,		T_TYPE,		TF_COMMAND, S_STRING},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,		T_MENU,		TF_COMMAND},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_MAINMENU,	TF_COMMAND},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20,	T_MENUCONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_CONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,		T_ON,		TF_PARAM},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,		T_TYPE,		TF_COMMAND, S_HEX},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,		T_SOURCE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_DEPENDS,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_OPTIONAL,	TF_COMMAND},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_SELECT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_COMMENT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,	T_REQUIRES,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {-1}, {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_CHOICE,	TF_COMMAND},
+      {-1}, {-1}, {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_PROMPT,	TF_COMMAND}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = kconf_id_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register int o = wordlist[key].name;
+          if (o >= 0)
+            {
+              register const char *s = o + kconf_id_strings;
+
+              if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+                return &wordlist[key];
+            }
+        }
+    }
+  return 0;
+}
+
Index: buildrom/scripts/kconfig/zconf.hash.c_shipped
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/zconf.hash.c_shipped	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,231 @@
+/* ANSI-C code produced by gperf version 3.0.1 */
+/* Command-line: gperf  */
+/* Computed positions: -k'1,3' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf at gnu.org>."
+#endif
+
+struct kconf_id;
+/* maximum key range = 45, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+kconf_id_hash (register const char *str, register unsigned int len)
+{
+  static unsigned char asso_values[] =
+    {
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 25, 10, 15,
+       0,  0,  5, 47,  0,  0, 47, 47,  0, 10,
+       0, 20, 20, 20,  5,  0,  0, 20, 47, 47,
+      20, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval;
+}
+
+struct kconf_id_strings_t
+  {
+    char kconf_id_strings_str2[sizeof("if")];
+    char kconf_id_strings_str3[sizeof("int")];
+    char kconf_id_strings_str4[sizeof("help")];
+    char kconf_id_strings_str5[sizeof("endif")];
+    char kconf_id_strings_str6[sizeof("select")];
+    char kconf_id_strings_str7[sizeof("endmenu")];
+    char kconf_id_strings_str8[sizeof("tristate")];
+    char kconf_id_strings_str9[sizeof("endchoice")];
+    char kconf_id_strings_str10[sizeof("range")];
+    char kconf_id_strings_str11[sizeof("string")];
+    char kconf_id_strings_str12[sizeof("default")];
+    char kconf_id_strings_str13[sizeof("def_bool")];
+    char kconf_id_strings_str14[sizeof("menu")];
+    char kconf_id_strings_str16[sizeof("def_boolean")];
+    char kconf_id_strings_str17[sizeof("def_tristate")];
+    char kconf_id_strings_str18[sizeof("mainmenu")];
+    char kconf_id_strings_str20[sizeof("menuconfig")];
+    char kconf_id_strings_str21[sizeof("config")];
+    char kconf_id_strings_str22[sizeof("on")];
+    char kconf_id_strings_str23[sizeof("hex")];
+    char kconf_id_strings_str26[sizeof("source")];
+    char kconf_id_strings_str27[sizeof("depends")];
+    char kconf_id_strings_str28[sizeof("optional")];
+    char kconf_id_strings_str31[sizeof("enable")];
+    char kconf_id_strings_str32[sizeof("comment")];
+    char kconf_id_strings_str33[sizeof("requires")];
+    char kconf_id_strings_str34[sizeof("bool")];
+    char kconf_id_strings_str37[sizeof("boolean")];
+    char kconf_id_strings_str41[sizeof("choice")];
+    char kconf_id_strings_str46[sizeof("prompt")];
+  };
+static struct kconf_id_strings_t kconf_id_strings_contents =
+  {
+    "if",
+    "int",
+    "help",
+    "endif",
+    "select",
+    "endmenu",
+    "tristate",
+    "endchoice",
+    "range",
+    "string",
+    "default",
+    "def_bool",
+    "menu",
+    "def_boolean",
+    "def_tristate",
+    "mainmenu",
+    "menuconfig",
+    "config",
+    "on",
+    "hex",
+    "source",
+    "depends",
+    "optional",
+    "enable",
+    "comment",
+    "requires",
+    "bool",
+    "boolean",
+    "choice",
+    "prompt"
+  };
+#define kconf_id_strings ((const char *) &kconf_id_strings_contents)
+#ifdef __GNUC__
+__inline
+#endif
+struct kconf_id *
+kconf_id_lookup (register const char *str, register unsigned int len)
+{
+  enum
+    {
+      TOTAL_KEYWORDS = 30,
+      MIN_WORD_LENGTH = 2,
+      MAX_WORD_LENGTH = 12,
+      MIN_HASH_VALUE = 2,
+      MAX_HASH_VALUE = 46
+    };
+
+  static struct kconf_id wordlist[] =
+    {
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_IF,		TF_COMMAND|TF_PARAM},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_TYPE,		TF_COMMAND, S_INT},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str4,		T_HELP,		TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,		T_ENDIF,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_SELECT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_ENDMENU,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_TYPE,		TF_COMMAND, S_TRISTATE},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,	T_ENDCHOICE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,		T_RANGE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,		T_TYPE,		TF_COMMAND, S_STRING},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,		T_MENU,		TF_COMMAND},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_MAINMENU,	TF_COMMAND},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20,	T_MENUCONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_CONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,		T_ON,		TF_PARAM},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,		T_TYPE,		TF_COMMAND, S_HEX},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,		T_SOURCE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_DEPENDS,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_OPTIONAL,	TF_COMMAND},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_SELECT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_COMMENT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,	T_REQUIRES,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {-1}, {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_CHOICE,	TF_COMMAND},
+      {-1}, {-1}, {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_PROMPT,	TF_COMMAND}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = kconf_id_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register int o = wordlist[key].name;
+          if (o >= 0)
+            {
+              register const char *s = o + kconf_id_strings;
+
+              if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+                return &wordlist[key];
+            }
+        }
+    }
+  return 0;
+}
+
Index: buildrom/scripts/kconfig/zconf.l
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/zconf.l	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,350 @@
+%option backup nostdinit noyywrap never-interactive full ecs
+%option 8bit backup nodefault perf-report perf-report
+%x COMMAND HELP STRING PARAM
+%{
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define START_STRSIZE	16
+
+static struct {
+	struct file *file;
+	int lineno;
+} current_pos;
+
+static char *text;
+static int text_size, text_asize;
+
+struct buffer {
+        struct buffer *parent;
+        YY_BUFFER_STATE state;
+};
+
+struct buffer *current_buf;
+
+static int last_ts, first_ts;
+
+static void zconf_endhelp(void);
+static void zconf_endfile(void);
+
+void new_string(void)
+{
+	text = malloc(START_STRSIZE);
+	text_asize = START_STRSIZE;
+	text_size = 0;
+	*text = 0;
+}
+
+void append_string(const char *str, int size)
+{
+	int new_size = text_size + size + 1;
+	if (new_size > text_asize) {
+		new_size += START_STRSIZE - 1;
+		new_size &= -START_STRSIZE;
+		text = realloc(text, new_size);
+		text_asize = new_size;
+	}
+	memcpy(text + text_size, str, size);
+	text_size += size;
+	text[text_size] = 0;
+}
+
+void alloc_string(const char *str, int size)
+{
+	text = malloc(size + 1);
+	memcpy(text, str, size);
+	text[size] = 0;
+}
+%}
+
+ws	[ \n\t]
+n	[A-Za-z0-9_]
+
+%%
+	int str = 0;
+	int ts, i;
+
+[ \t]*#.*\n	|
+[ \t]*\n	{
+	current_file->lineno++;
+	return T_EOL;
+}
+[ \t]*#.*
+
+
+[ \t]+	{
+	BEGIN(COMMAND);
+}
+
+.	{
+	unput(yytext[0]);
+	BEGIN(COMMAND);
+}
+
+
+<COMMAND>{
+	{n}+	{
+		struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
+		BEGIN(PARAM);
+		current_pos.file = current_file;
+		current_pos.lineno = current_file->lineno;
+		if (id && id->flags & TF_COMMAND) {
+			zconflval.id = id;
+			return id->token;
+		}
+		alloc_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	.
+	\n	{
+		BEGIN(INITIAL);
+		current_file->lineno++;
+		return T_EOL;
+	}
+}
+
+<PARAM>{
+	"&&"	return T_AND;
+	"||"	return T_OR;
+	"("	return T_OPEN_PAREN;
+	")"	return T_CLOSE_PAREN;
+	"!"	return T_NOT;
+	"="	return T_EQUAL;
+	"!="	return T_UNEQUAL;
+	\"|\'	{
+		str = yytext[0];
+		new_string();
+		BEGIN(STRING);
+	}
+	\n	BEGIN(INITIAL); current_file->lineno++; return T_EOL;
+	---	/* ignore */
+	({n}|[-/.])+	{
+		struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
+		if (id && id->flags & TF_PARAM) {
+			zconflval.id = id;
+			return id->token;
+		}
+		alloc_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	#.*	/* comment */
+	\\\n	current_file->lineno++;
+	.
+	<<EOF>> {
+		BEGIN(INITIAL);
+	}
+}
+
+<STRING>{
+	[^'"\\\n]+/\n	{
+		append_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	[^'"\\\n]+	{
+		append_string(yytext, yyleng);
+	}
+	\\.?/\n	{
+		append_string(yytext + 1, yyleng - 1);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	\\.?	{
+		append_string(yytext + 1, yyleng - 1);
+	}
+	\'|\"	{
+		if (str == yytext[0]) {
+			BEGIN(PARAM);
+			zconflval.string = text;
+			return T_WORD_QUOTE;
+		} else
+			append_string(yytext, 1);
+	}
+	\n	{
+		printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
+		current_file->lineno++;
+		BEGIN(INITIAL);
+		return T_EOL;
+	}
+	<<EOF>>	{
+		BEGIN(INITIAL);
+	}
+}
+
+<HELP>{
+	[ \t]+	{
+		ts = 0;
+		for (i = 0; i < yyleng; i++) {
+			if (yytext[i] == '\t')
+				ts = (ts & ~7) + 8;
+			else
+				ts++;
+		}
+		last_ts = ts;
+		if (first_ts) {
+			if (ts < first_ts) {
+				zconf_endhelp();
+				return T_HELPTEXT;
+			}
+			ts -= first_ts;
+			while (ts > 8) {
+				append_string("        ", 8);
+				ts -= 8;
+			}
+			append_string("        ", ts);
+		}
+	}
+	[ \t]*\n/[^ \t\n] {
+		current_file->lineno++;
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	[ \t]*\n	{
+		current_file->lineno++;
+		append_string("\n", 1);
+	}
+	[^ \t\n].* {
+		append_string(yytext, yyleng);
+		if (!first_ts)
+			first_ts = last_ts;
+	}
+	<<EOF>>	{
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+}
+
+<<EOF>>	{
+	if (current_file) {
+		zconf_endfile();
+		return T_EOL;
+	}
+	fclose(yyin);
+	yyterminate();
+}
+
+%%
+void zconf_starthelp(void)
+{
+	new_string();
+	last_ts = first_ts = 0;
+	BEGIN(HELP);
+}
+
+static void zconf_endhelp(void)
+{
+	zconflval.string = text;
+	BEGIN(INITIAL);
+}
+
+
+/*
+ * Try to open specified file with following names:
+ * ./name
+ * $(srctree)/name
+ * The latter is used when srctree is separate from objtree
+ * when compiling the kernel.
+ * Return NULL if file is not found.
+ */
+FILE *zconf_fopen(const char *name)
+{
+	char *env, fullname[PATH_MAX+1];
+	FILE *f;
+
+	f = fopen(name, "r");
+	if (!f && name[0] != '/') {
+		env = getenv(SRCTREE);
+		if (env) {
+			sprintf(fullname, "%s/%s", env, name);
+			f = fopen(fullname, "r");
+		}
+	}
+	return f;
+}
+
+void zconf_initscan(const char *name)
+{
+	yyin = zconf_fopen(name);
+	if (!yyin) {
+		printf("can't find file %s\n", name);
+		exit(1);
+	}
+
+	current_buf = malloc(sizeof(*current_buf));
+	memset(current_buf, 0, sizeof(*current_buf));
+
+	current_file = file_lookup(name);
+	current_file->lineno = 1;
+	current_file->flags = FILE_BUSY;
+}
+
+void zconf_nextfile(const char *name)
+{
+	struct file *file = file_lookup(name);
+	struct buffer *buf = malloc(sizeof(*buf));
+	memset(buf, 0, sizeof(*buf));
+
+	current_buf->state = YY_CURRENT_BUFFER;
+	yyin = zconf_fopen(name);
+	if (!yyin) {
+		printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
+		exit(1);
+	}
+	yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
+	buf->parent = current_buf;
+	current_buf = buf;
+
+	if (file->flags & FILE_BUSY) {
+		printf("recursive scan (%s)?\n", name);
+		exit(1);
+	}
+	if (file->flags & FILE_SCANNED) {
+		printf("file %s already scanned?\n", name);
+		exit(1);
+	}
+	file->flags |= FILE_BUSY;
+	file->lineno = 1;
+	file->parent = current_file;
+	current_file = file;
+}
+
+static void zconf_endfile(void)
+{
+	struct buffer *parent;
+
+	current_file->flags |= FILE_SCANNED;
+	current_file->flags &= ~FILE_BUSY;
+	current_file = current_file->parent;
+
+	parent = current_buf->parent;
+	if (parent) {
+		fclose(yyin);
+		yy_delete_buffer(YY_CURRENT_BUFFER);
+		yy_switch_to_buffer(parent->state);
+	}
+	free(current_buf);
+	current_buf = parent;
+}
+
+int zconf_lineno(void)
+{
+	return current_pos.lineno;
+}
+
+char *zconf_curname(void)
+{
+	return current_pos.file ? current_pos.file->name : "<none>";
+}
Index: buildrom/scripts/kconfig/zconf.tab.c_shipped
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/zconf.tab.c_shipped	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,2173 @@
+/* A Bison parser, made by GNU Bison 2.0.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names.  */
+#define yyparse zconfparse
+#define yylex   zconflex
+#define yyerror zconferror
+#define yylval  zconflval
+#define yychar  zconfchar
+#define yydebug zconfdebug
+#define yynerrs zconfnerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     T_MAINMENU = 258,
+     T_MENU = 259,
+     T_ENDMENU = 260,
+     T_SOURCE = 261,
+     T_CHOICE = 262,
+     T_ENDCHOICE = 263,
+     T_COMMENT = 264,
+     T_CONFIG = 265,
+     T_MENUCONFIG = 266,
+     T_HELP = 267,
+     T_HELPTEXT = 268,
+     T_IF = 269,
+     T_ENDIF = 270,
+     T_DEPENDS = 271,
+     T_REQUIRES = 272,
+     T_OPTIONAL = 273,
+     T_PROMPT = 274,
+     T_TYPE = 275,
+     T_DEFAULT = 276,
+     T_SELECT = 277,
+     T_RANGE = 278,
+     T_ON = 279,
+     T_WORD = 280,
+     T_WORD_QUOTE = 281,
+     T_UNEQUAL = 282,
+     T_CLOSE_PAREN = 283,
+     T_OPEN_PAREN = 284,
+     T_EOL = 285,
+     T_OR = 286,
+     T_AND = 287,
+     T_EQUAL = 288,
+     T_NOT = 289
+   };
+#endif
+#define T_MAINMENU 258
+#define T_MENU 259
+#define T_ENDMENU 260
+#define T_SOURCE 261
+#define T_CHOICE 262
+#define T_ENDCHOICE 263
+#define T_COMMENT 264
+#define T_CONFIG 265
+#define T_MENUCONFIG 266
+#define T_HELP 267
+#define T_HELPTEXT 268
+#define T_IF 269
+#define T_ENDIF 270
+#define T_DEPENDS 271
+#define T_REQUIRES 272
+#define T_OPTIONAL 273
+#define T_PROMPT 274
+#define T_TYPE 275
+#define T_DEFAULT 276
+#define T_SELECT 277
+#define T_RANGE 278
+#define T_ON 279
+#define T_WORD 280
+#define T_WORD_QUOTE 281
+#define T_UNEQUAL 282
+#define T_CLOSE_PAREN 283
+#define T_OPEN_PAREN 284
+#define T_EOL 285
+#define T_OR 286
+#define T_AND 287
+#define T_EQUAL 288
+#define T_NOT 289
+
+
+
+
+/* Copy the first part of user declarations.  */
+
+
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#include "zconf.hash.c"
+
+#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
+
+#define PRINTD		0x0001
+#define DEBUG_PARSE	0x0002
+
+int cdebug = PRINTD;
+
+extern int zconflex(void);
+static void zconfprint(const char *err, ...);
+static void zconf_error(const char *err, ...);
+static void zconferror(const char *err);
+static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
+
+struct symbol *symbol_hash[257];
+
+static struct menu *current_menu, *current_entry;
+
+#define YYDEBUG 0
+#if YYDEBUG
+#define YYERROR_VERBOSE
+#endif
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+
+typedef union YYSTYPE {
+	char *string;
+	struct file *file;
+	struct symbol *symbol;
+	struct expr *expr;
+	struct menu *menu;
+	struct kconf_id *id;
+} YYSTYPE;
+/* Line 190 of yacc.c.  */
+
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 213 of yacc.c.  */
+
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+# ifndef YYFREE
+#  define YYFREE free
+# endif
+# ifndef YYMALLOC
+#  define YYMALLOC malloc
+# endif
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short int yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined (__GNUC__) && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  register YYSIZE_T yyi;		\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)					\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack, Stack, yysize);				\
+	Stack = &yyptr->Stack;						\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short int yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  3
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   264
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  35
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  42
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  104
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  175
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   289
+
+#define YYTRANSLATE(YYX) 						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned short int yyprhs[] =
+{
+       0,     0,     3,     5,     6,     9,    12,    15,    20,    23,
+      28,    33,    37,    39,    41,    43,    45,    47,    49,    51,
+      53,    55,    57,    59,    61,    63,    67,    70,    74,    77,
+      81,    84,    85,    88,    91,    94,    97,   100,   104,   109,
+     114,   119,   125,   128,   131,   133,   137,   138,   141,   144,
+     147,   150,   153,   158,   162,   165,   170,   171,   174,   178,
+     180,   184,   185,   188,   191,   194,   198,   201,   203,   207,
+     208,   211,   214,   217,   221,   225,   228,   231,   234,   235,
+     238,   241,   244,   249,   253,   257,   258,   261,   263,   265,
+     268,   271,   274,   276,   279,   280,   283,   285,   289,   293,
+     297,   300,   304,   308,   310
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      36,     0,    -1,    37,    -1,    -1,    37,    39,    -1,    37,
+      50,    -1,    37,    61,    -1,    37,     3,    71,    73,    -1,
+      37,    72,    -1,    37,    25,     1,    30,    -1,    37,    38,
+       1,    30,    -1,    37,     1,    30,    -1,    16,    -1,    19,
+      -1,    20,    -1,    22,    -1,    18,    -1,    23,    -1,    21,
+      -1,    30,    -1,    56,    -1,    65,    -1,    42,    -1,    44,
+      -1,    63,    -1,    25,     1,    30,    -1,     1,    30,    -1,
+      10,    25,    30,    -1,    41,    45,    -1,    11,    25,    30,
+      -1,    43,    45,    -1,    -1,    45,    46,    -1,    45,    69,
+      -1,    45,    67,    -1,    45,    40,    -1,    45,    30,    -1,
+      20,    70,    30,    -1,    19,    71,    74,    30,    -1,    21,
+      75,    74,    30,    -1,    22,    25,    74,    30,    -1,    23,
+      76,    76,    74,    30,    -1,     7,    30,    -1,    47,    51,
+      -1,    72,    -1,    48,    53,    49,    -1,    -1,    51,    52,
+      -1,    51,    69,    -1,    51,    67,    -1,    51,    30,    -1,
+      51,    40,    -1,    19,    71,    74,    30,    -1,    20,    70,
+      30,    -1,    18,    30,    -1,    21,    25,    74,    30,    -1,
+      -1,    53,    39,    -1,    14,    75,    73,    -1,    72,    -1,
+      54,    57,    55,    -1,    -1,    57,    39,    -1,    57,    61,
+      -1,    57,    50,    -1,     4,    71,    30,    -1,    58,    68,
+      -1,    72,    -1,    59,    62,    60,    -1,    -1,    62,    39,
+      -1,    62,    61,    -1,    62,    50,    -1,     6,    71,    30,
+      -1,     9,    71,    30,    -1,    64,    68,    -1,    12,    30,
+      -1,    66,    13,    -1,    -1,    68,    69,    -1,    68,    30,
+      -1,    68,    40,    -1,    16,    24,    75,    30,    -1,    16,
+      75,    30,    -1,    17,    75,    30,    -1,    -1,    71,    74,
+      -1,    25,    -1,    26,    -1,     5,    30,    -1,     8,    30,
+      -1,    15,    30,    -1,    30,    -1,    73,    30,    -1,    -1,
+      14,    75,    -1,    76,    -1,    76,    33,    76,    -1,    76,
+      27,    76,    -1,    29,    75,    28,    -1,    34,    75,    -1,
+      75,    31,    75,    -1,    75,    32,    75,    -1,    25,    -1,
+      26,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned short int yyrline[] =
+{
+       0,   103,   103,   105,   107,   108,   109,   110,   111,   112,
+     113,   117,   121,   121,   121,   121,   121,   121,   121,   125,
+     126,   127,   128,   129,   130,   134,   135,   141,   149,   155,
+     163,   173,   175,   176,   177,   178,   179,   182,   190,   196,
+     206,   212,   220,   229,   234,   242,   245,   247,   248,   249,
+     250,   251,   254,   260,   271,   277,   287,   289,   294,   302,
+     310,   313,   315,   316,   317,   322,   329,   334,   342,   345,
+     347,   348,   349,   352,   360,   367,   374,   380,   387,   389,
+     390,   391,   394,   399,   404,   412,   414,   419,   420,   423,
+     424,   425,   429,   430,   433,   434,   437,   438,   439,   440,
+     441,   442,   443,   446,   447
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
+  "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
+  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
+  "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT",
+  "T_SELECT", "T_RANGE", "T_ON", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL",
+  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", "T_EQUAL",
+  "T_NOT", "$accept", "input", "stmt_list", "option_name", "common_stmt",
+  "option_error", "config_entry_start", "config_stmt",
+  "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
+  "config_option", "choice", "choice_entry", "choice_end", "choice_stmt",
+  "choice_option_list", "choice_option", "choice_block", "if_entry",
+  "if_end", "if_stmt", "if_block", "menu", "menu_entry", "menu_end",
+  "menu_stmt", "menu_block", "source_stmt", "comment", "comment_stmt",
+  "help_start", "help", "depends_list", "depends", "prompt_stmt_opt",
+  "prompt", "end", "nl", "if_expr", "expr", "symbol", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short int yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    35,    36,    37,    37,    37,    37,    37,    37,    37,
+      37,    37,    38,    38,    38,    38,    38,    38,    38,    39,
+      39,    39,    39,    39,    39,    40,    40,    41,    42,    43,
+      44,    45,    45,    45,    45,    45,    45,    46,    46,    46,
+      46,    46,    47,    48,    49,    50,    51,    51,    51,    51,
+      51,    51,    52,    52,    52,    52,    53,    53,    54,    55,
+      56,    57,    57,    57,    57,    58,    59,    60,    61,    62,
+      62,    62,    62,    63,    64,    65,    66,    67,    68,    68,
+      68,    68,    69,    69,    69,    70,    70,    71,    71,    72,
+      72,    72,    73,    73,    74,    74,    75,    75,    75,    75,
+      75,    75,    75,    76,    76
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     1,     0,     2,     2,     2,     4,     2,     4,
+       4,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     3,     2,     3,     2,     3,
+       2,     0,     2,     2,     2,     2,     2,     3,     4,     4,
+       4,     5,     2,     2,     1,     3,     0,     2,     2,     2,
+       2,     2,     4,     3,     2,     4,     0,     2,     3,     1,
+       3,     0,     2,     2,     2,     3,     2,     1,     3,     0,
+       2,     2,     2,     3,     3,     2,     2,     2,     0,     2,
+       2,     2,     4,     3,     3,     0,     2,     1,     1,     2,
+       2,     2,     1,     2,     0,     2,     1,     3,     3,     3,
+       2,     3,     3,     1,     1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       3,     0,     0,     1,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    12,    16,    13,    14,
+      18,    15,    17,     0,    19,     0,     4,    31,    22,    31,
+      23,    46,    56,     5,    61,    20,    78,    69,     6,    24,
+      78,    21,     8,    11,    87,    88,     0,     0,    89,     0,
+      42,    90,     0,     0,     0,   103,   104,     0,     0,     0,
+      96,    91,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    92,     7,    65,    73,    74,    27,    29,     0,
+     100,     0,     0,    58,     0,     0,     9,    10,     0,     0,
+       0,     0,     0,    85,     0,     0,     0,     0,    36,    35,
+      32,     0,    34,    33,     0,     0,    85,     0,    50,    51,
+      47,    49,    48,    57,    45,    44,    62,    64,    60,    63,
+      59,    80,    81,    79,    70,    72,    68,    71,    67,    93,
+      99,   101,   102,    98,    97,    26,    76,     0,     0,     0,
+      94,     0,    94,    94,    94,     0,     0,    77,    54,    94,
+       0,    94,     0,    83,    84,     0,     0,    37,    86,     0,
+       0,    94,    25,     0,    53,     0,    82,    95,    38,    39,
+      40,     0,    52,    55,    41
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const short int yydefgoto[] =
+{
+      -1,     1,     2,    25,    26,    99,    27,    28,    29,    30,
+      64,   100,    31,    32,   114,    33,    66,   110,    67,    34,
+     118,    35,    68,    36,    37,   126,    38,    70,    39,    40,
+      41,   101,   102,    69,   103,   141,   142,    42,    73,   156,
+      59,    60
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -78
+static const short int yypact[] =
+{
+     -78,     2,   159,   -78,   -21,     0,     0,   -12,     0,     1,
+       4,     0,    27,    38,    60,    58,   -78,   -78,   -78,   -78,
+     -78,   -78,   -78,   100,   -78,   104,   -78,   -78,   -78,   -78,
+     -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,
+     -78,   -78,   -78,   -78,   -78,   -78,    86,   113,   -78,   114,
+     -78,   -78,   125,   127,   128,   -78,   -78,    60,    60,   210,
+      65,   -78,   141,   142,    39,   103,   182,   200,     6,    66,
+       6,   131,   -78,   146,   -78,   -78,   -78,   -78,   -78,   196,
+     -78,    60,    60,   146,    40,    40,   -78,   -78,   155,   156,
+      -2,    60,     0,     0,    60,   105,    40,   194,   -78,   -78,
+     -78,   206,   -78,   -78,   183,     0,     0,   195,   -78,   -78,
+     -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,
+     -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,   -78,
+     -78,   197,   -78,   -78,   -78,   -78,   -78,    60,   213,   216,
+     212,   203,   212,   190,   212,    40,   208,   -78,   -78,   212,
+     222,   212,   219,   -78,   -78,    60,   223,   -78,   -78,   224,
+     225,   212,   -78,   226,   -78,   227,   -78,    47,   -78,   -78,
+     -78,   228,   -78,   -78,   -78
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const short int yypgoto[] =
+{
+     -78,   -78,   -78,   -78,   164,   -36,   -78,   -78,   -78,   -78,
+     230,   -78,   -78,   -78,   -78,    29,   -78,   -78,   -78,   -78,
+     -78,   -78,   -78,   -78,   -78,   -78,    59,   -78,   -78,   -78,
+     -78,   -78,   198,   220,    24,   157,    -5,   169,   202,    74,
+     -53,   -77
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -76
+static const short int yytable[] =
+{
+      46,    47,     3,    49,    79,    80,    52,   133,   134,    43,
+       6,     7,     8,     9,    10,    11,    12,    13,    48,   145,
+      14,    15,   137,    55,    56,    44,    45,    57,   131,   132,
+     109,    50,    58,   122,    51,   122,    24,   138,   139,   -28,
+      88,   143,   -28,   -28,   -28,   -28,   -28,   -28,   -28,   -28,
+     -28,    89,    53,   -28,   -28,    90,    91,   -28,    92,    93,
+      94,    95,    96,    54,    97,    55,    56,    88,   161,    98,
+     -66,   -66,   -66,   -66,   -66,   -66,   -66,   -66,    81,    82,
+     -66,   -66,    90,    91,   152,    55,    56,   140,    61,    57,
+     112,    97,    84,   123,    58,   123,   121,   117,    85,   125,
+     149,    62,   167,   -30,    88,    63,   -30,   -30,   -30,   -30,
+     -30,   -30,   -30,   -30,   -30,    89,    72,   -30,   -30,    90,
+      91,   -30,    92,    93,    94,    95,    96,   119,    97,   127,
+     144,   -75,    88,    98,   -75,   -75,   -75,   -75,   -75,   -75,
+     -75,   -75,   -75,    74,    75,   -75,   -75,    90,    91,   -75,
+     -75,   -75,   -75,   -75,   -75,    76,    97,    77,    78,    -2,
+       4,   121,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    86,    87,    14,    15,    16,   129,    17,    18,    19,
+      20,    21,    22,    88,    23,   135,   136,   -43,   -43,    24,
+     -43,   -43,   -43,   -43,    89,   146,   -43,   -43,    90,    91,
+     104,   105,   106,   107,   155,     7,     8,    97,    10,    11,
+      12,    13,   108,   148,    14,    15,   158,   159,   160,   147,
+     151,    81,    82,   163,   130,   165,   155,    81,    82,    82,
+      24,   113,   116,   157,   124,   171,   115,   120,   162,   128,
+      72,    81,    82,   153,    81,    82,   154,    81,    82,   166,
+      81,    82,   164,   168,   169,   170,   172,   173,   174,    65,
+      71,    83,     0,   150,   111
+};
+
+static const short int yycheck[] =
+{
+       5,     6,     0,     8,    57,    58,    11,    84,    85,    30,
+       4,     5,     6,     7,     8,     9,    10,    11,    30,    96,
+      14,    15,    24,    25,    26,    25,    26,    29,    81,    82,
+      66,    30,    34,    69,    30,    71,    30,    90,    91,     0,
+       1,    94,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    25,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    25,    25,    25,    26,     1,   145,    30,
+       4,     5,     6,     7,     8,     9,    10,    11,    31,    32,
+      14,    15,    16,    17,   137,    25,    26,    92,    30,    29,
+      66,    25,    27,    69,    34,    71,    30,    68,    33,    70,
+     105,     1,   155,     0,     1,     1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    30,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    68,    25,    70,
+      25,     0,     1,    30,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    30,    30,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    30,    25,    30,    30,     0,
+       1,    30,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    30,    30,    14,    15,    16,    30,    18,    19,    20,
+      21,    22,    23,     1,    25,    30,    30,     5,     6,    30,
+       8,     9,    10,    11,    12,     1,    14,    15,    16,    17,
+      18,    19,    20,    21,    14,     5,     6,    25,     8,     9,
+      10,    11,    30,    30,    14,    15,   142,   143,   144,    13,
+      25,    31,    32,   149,    28,   151,    14,    31,    32,    32,
+      30,    67,    68,    30,    70,   161,    67,    68,    30,    70,
+      30,    31,    32,    30,    31,    32,    30,    31,    32,    30,
+      31,    32,    30,    30,    30,    30,    30,    30,    30,    29,
+      40,    59,    -1,   106,    66
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,    36,    37,     0,     1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    14,    15,    16,    18,    19,    20,
+      21,    22,    23,    25,    30,    38,    39,    41,    42,    43,
+      44,    47,    48,    50,    54,    56,    58,    59,    61,    63,
+      64,    65,    72,    30,    25,    26,    71,    71,    30,    71,
+      30,    30,    71,    25,    25,    25,    26,    29,    34,    75,
+      76,    30,     1,     1,    45,    45,    51,    53,    57,    68,
+      62,    68,    30,    73,    30,    30,    30,    30,    30,    75,
+      75,    31,    32,    73,    27,    33,    30,    30,     1,    12,
+      16,    17,    19,    20,    21,    22,    23,    25,    30,    40,
+      46,    66,    67,    69,    18,    19,    20,    21,    30,    40,
+      52,    67,    69,    39,    49,    72,    39,    50,    55,    61,
+      72,    30,    40,    69,    39,    50,    60,    61,    72,    30,
+      28,    75,    75,    76,    76,    30,    30,    24,    75,    75,
+      71,    70,    71,    75,    25,    76,     1,    13,    30,    71,
+      70,    25,    75,    30,    30,    14,    74,    30,    74,    74,
+      74,    76,    30,    74,    30,    74,    30,    75,    30,    30,
+      30,    74,    30,    30,    30
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		(-2)
+#define YYEOF		0
+
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT		goto yyabortlab
+#define YYERROR		goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL		goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      yytoken = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { 								\
+      yyerror ("syntax error: cannot back up");\
+      YYERROR;							\
+    }								\
+while (0)
+
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)				\
+    do									\
+      if (N)								\
+	{								\
+	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
+	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
+	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
+	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
+	}								\
+      else								\
+	{								\
+	  (Current).first_line   = (Current).last_line   =		\
+	    YYRHSLOC (Rhs, 0).last_line;				\
+	  (Current).first_column = (Current).last_column =		\
+	    YYRHSLOC (Rhs, 0).last_column;				\
+	}								\
+    while (0)
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)			\
+     fprintf (File, "%d.%d-%d.%d",			\
+              (Loc).first_line, (Loc).first_column,	\
+              (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (0)
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
+do {								\
+  if (yydebug)							\
+    {								\
+      YYFPRINTF (stderr, "%s ", Title);				\
+      yysymprint (stderr, 					\
+                  Type, Value);	\
+      YYFPRINTF (stderr, "\n");					\
+    }								\
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short int *bottom;
+    short int *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+             yyrule - 1, yylno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (Rule);		\
+} while (0)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+      case 48: /* choice_entry */
+
+        {
+	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
+	if (current_menu == (yyvaluep->menu))
+		menu_end_menu();
+};
+
+        break;
+      case 54: /* if_entry */
+
+        {
+	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
+	if (current_menu == (yyvaluep->menu))
+		menu_end_menu();
+};
+
+        break;
+      case 59: /* menu_entry */
+
+        {
+	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
+	if (current_menu == (yyvaluep->menu))
+		menu_end_menu();
+};
+
+        break;
+
+      default:
+        break;
+    }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The look-ahead symbol.  */
+int yychar;
+
+/* The semantic value of the look-ahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Look-ahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short int yyssa[YYINITDEPTH];
+  short int *yyss = yyssa;
+  register short int *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+
+  yyvsp[0] = yylval;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack. Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	short int *yyss1 = yyss;
+
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow ("parser stack overflow",
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyoverflowlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	short int *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyoverflowlab;
+	YYSTACK_RELOCATE (yyss);
+	YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a look-ahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to look-ahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a look-ahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the look-ahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 8:
+
+    { zconf_error("unexpected end statement"); ;}
+    break;
+
+  case 9:
+
+    { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); ;}
+    break;
+
+  case 10:
+
+    {
+	zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[-2].id)->name);
+;}
+    break;
+
+  case 11:
+
+    { zconf_error("invalid statement"); ;}
+    break;
+
+  case 25:
+
+    { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); ;}
+    break;
+
+  case 26:
+
+    { zconf_error("invalid option"); ;}
+    break;
+
+  case 27:
+
+    {
+	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+;}
+    break;
+
+  case 28:
+
+    {
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 29:
+
+    {
+	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+;}
+    break;
+
+  case 30:
+
+    {
+	if (current_entry->prompt)
+		current_entry->prompt->type = P_MENU;
+	else
+		zconfprint("warning: menuconfig statement without prompt");
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 37:
+
+    {
+	menu_set_type((yyvsp[-2].id)->stype);
+	printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
+		zconf_curname(), zconf_lineno(),
+		(yyvsp[-2].id)->stype);
+;}
+    break;
+
+  case 38:
+
+    {
+	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 39:
+
+    {
+	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
+	if ((yyvsp[-3].id)->stype != S_UNKNOWN)
+		menu_set_type((yyvsp[-3].id)->stype);
+	printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
+		zconf_curname(), zconf_lineno(),
+		(yyvsp[-3].id)->stype);
+;}
+    break;
+
+  case 40:
+
+    {
+	menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 41:
+
+    {
+	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 42:
+
+    {
+	struct symbol *sym = sym_lookup(NULL, 0);
+	sym->flags |= SYMBOL_CHOICE;
+	menu_add_entry(sym);
+	menu_add_expr(P_CHOICE, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 43:
+
+    {
+	(yyval.menu) = menu_add_menu();
+;}
+    break;
+
+  case 44:
+
+    {
+	if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 52:
+
+    {
+	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 53:
+
+    {
+	if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) {
+		menu_set_type((yyvsp[-2].id)->stype);
+		printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
+			zconf_curname(), zconf_lineno(),
+			(yyvsp[-2].id)->stype);
+	} else
+		YYERROR;
+;}
+    break;
+
+  case 54:
+
+    {
+	current_entry->sym->flags |= SYMBOL_OPTIONAL;
+	printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 55:
+
+    {
+	if ((yyvsp[-3].id)->stype == S_UNKNOWN) {
+		menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
+		printd(DEBUG_PARSE, "%s:%d:default\n",
+			zconf_curname(), zconf_lineno());
+	} else
+		YYERROR;
+;}
+    break;
+
+  case 58:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
+	menu_add_entry(NULL);
+	menu_add_dep((yyvsp[-1].expr));
+	(yyval.menu) = menu_add_menu();
+;}
+    break;
+
+  case 59:
+
+    {
+	if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 65:
+
+    {
+	menu_add_entry(NULL);
+	menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
+	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 66:
+
+    {
+	(yyval.menu) = menu_add_menu();
+;}
+    break;
+
+  case 67:
+
+    {
+	if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 73:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+	zconf_nextfile((yyvsp[-1].string));
+;}
+    break;
+
+  case 74:
+
+    {
+	menu_add_entry(NULL);
+	menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL);
+	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 75:
+
+    {
+	menu_end_entry();
+;}
+    break;
+
+  case 76:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+	zconf_starthelp();
+;}
+    break;
+
+  case 77:
+
+    {
+	current_entry->sym->help = (yyvsp[0].string);
+;}
+    break;
+
+  case 82:
+
+    {
+	menu_add_dep((yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 83:
+
+    {
+	menu_add_dep((yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 84:
+
+    {
+	menu_add_dep((yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 86:
+
+    {
+	menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr));
+;}
+    break;
+
+  case 89:
+
+    { (yyval.id) = (yyvsp[-1].id); ;}
+    break;
+
+  case 90:
+
+    { (yyval.id) = (yyvsp[-1].id); ;}
+    break;
+
+  case 91:
+
+    { (yyval.id) = (yyvsp[-1].id); ;}
+    break;
+
+  case 94:
+
+    { (yyval.expr) = NULL; ;}
+    break;
+
+  case 95:
+
+    { (yyval.expr) = (yyvsp[0].expr); ;}
+    break;
+
+  case 96:
+
+    { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;}
+    break;
+
+  case 97:
+
+    { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;}
+    break;
+
+  case 98:
+
+    { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;}
+    break;
+
+  case 99:
+
+    { (yyval.expr) = (yyvsp[-1].expr); ;}
+    break;
+
+  case 100:
+
+    { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;}
+    break;
+
+  case 101:
+
+    { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    break;
+
+  case 102:
+
+    { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    break;
+
+  case 103:
+
+    { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); ;}
+    break;
+
+  case 104:
+
+    { (yyval.symbol) = sym_lookup((yyvsp[0].string), 1); free((yyvsp[0].string)); ;}
+    break;
+
+
+    }
+
+/* Line 1037 of yacc.c.  */
+
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+	{
+	  YYSIZE_T yysize = 0;
+	  int yytype = YYTRANSLATE (yychar);
+	  const char* yyprefix;
+	  char *yymsg;
+	  int yyx;
+
+	  /* Start YYX at -YYN if negative to avoid negative indexes in
+	     YYCHECK.  */
+	  int yyxbegin = yyn < 0 ? -yyn : 0;
+
+	  /* Stay within bounds of both yycheck and yytname.  */
+	  int yychecklim = YYLAST - yyn;
+	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+	  int yycount = 0;
+
+	  yyprefix = ", expecting ";
+	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	      {
+		yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
+		yycount += 1;
+		if (yycount == 5)
+		  {
+		    yysize = 0;
+		    break;
+		  }
+	      }
+	  yysize += (sizeof ("syntax error, unexpected ")
+		     + yystrlen (yytname[yytype]));
+	  yymsg = (char *) YYSTACK_ALLOC (yysize);
+	  if (yymsg != 0)
+	    {
+	      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+	      yyp = yystpcpy (yyp, yytname[yytype]);
+
+	      if (yycount < 5)
+		{
+		  yyprefix = ", expecting ";
+		  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+		      {
+			yyp = yystpcpy (yyp, yyprefix);
+			yyp = yystpcpy (yyp, yytname[yyx]);
+			yyprefix = " or ";
+		      }
+		}
+	      yyerror (yymsg);
+	      YYSTACK_FREE (yymsg);
+	    }
+	  else
+	    yyerror ("syntax error; also virtual memory exhausted");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror ("syntax error");
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse look-ahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+        {
+          /* If at end of input, pop the error token,
+	     then the rest of the stack, then return failure.  */
+	  if (yychar == YYEOF)
+	     for (;;)
+	       {
+
+		 YYPOPSTACK;
+		 if (yyssp == yyss)
+		   YYABORT;
+		 yydestruct ("Error: popping",
+                             yystos[*yyssp], yyvsp);
+	       }
+        }
+      else
+	{
+	  yydestruct ("Error: discarding", yytoken, &yylval);
+	  yychar = YYEMPTY;
+	}
+    }
+
+  /* Else will try to reuse look-ahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+#ifdef __GNUC__
+  /* Pacify GCC when the user code never invokes YYERROR and the label
+     yyerrorlab therefore never appears in user code.  */
+  if (0)
+     goto yyerrorlab;
+#endif
+
+yyvsp -= yylen;
+  yyssp -= yylen;
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+
+      yydestruct ("Error: popping", yystos[yystate], yyvsp);
+      YYPOPSTACK;
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token. */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yydestruct ("Error: discarding lookahead",
+              yytoken, &yylval);
+  yychar = YYEMPTY;
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+
+
+
+void conf_parse(const char *name)
+{
+	struct symbol *sym;
+	int i;
+
+	zconf_initscan(name);
+
+	sym_init();
+	menu_init();
+	modules_sym = sym_lookup("MODULES", 0);
+	rootmenu.prompt = menu_add_prompt(P_MENU, "Buildrom Configuration", NULL);
+
+#if YYDEBUG
+	if (getenv("ZCONF_DEBUG"))
+		zconfdebug = 1;
+#endif
+	zconfparse();
+	if (zconfnerrs)
+		exit(1);
+	menu_finalize(&rootmenu);
+	for_all_symbols(i, sym) {
+		sym_check_deps(sym);
+        }
+
+	sym_change_count = 1;
+}
+
+const char *zconf_tokenname(int token)
+{
+	switch (token) {
+	case T_MENU:		return "menu";
+	case T_ENDMENU:		return "endmenu";
+	case T_CHOICE:		return "choice";
+	case T_ENDCHOICE:	return "endchoice";
+	case T_IF:		return "if";
+	case T_ENDIF:		return "endif";
+	case T_DEPENDS:		return "depends";
+	}
+	return "<token>";
+}
+
+static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken)
+{
+	if (id->token != endtoken) {
+		zconf_error("unexpected '%s' within %s block",
+			kconf_id_strings + id->name, zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	if (current_menu->file != current_file) {
+		zconf_error("'%s' in different file than '%s'",
+			kconf_id_strings + id->name, zconf_tokenname(starttoken));
+		fprintf(stderr, "%s:%d: location of the '%s'\n",
+			current_menu->file->name, current_menu->lineno,
+			zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	return true;
+}
+
+static void zconfprint(const char *err, ...)
+{
+	va_list ap;
+
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconf_error(const char *err, ...)
+{
+	va_list ap;
+
+	zconfnerrs++;
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconferror(const char *err)
+{
+#if YYDEBUG
+	fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
+#endif
+}
+
+void print_quoted_string(FILE *out, const char *str)
+{
+	const char *p;
+	int len;
+
+	putc('"', out);
+	while ((p = strchr(str, '"'))) {
+		len = p - str;
+		if (len)
+			fprintf(out, "%.*s", len, str);
+		fputs("\\\"", out);
+		str = p + 1;
+	}
+	fputs(str, out);
+	putc('"', out);
+}
+
+void print_symbol(FILE *out, struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	struct property *prop;
+
+	if (sym_is_choice(sym))
+		fprintf(out, "choice\n");
+	else
+		fprintf(out, "config %s\n", sym->name);
+	switch (sym->type) {
+	case S_BOOLEAN:
+		fputs("  boolean\n", out);
+		break;
+	case S_TRISTATE:
+		fputs("  tristate\n", out);
+		break;
+	case S_STRING:
+		fputs("  string\n", out);
+		break;
+	case S_INT:
+		fputs("  integer\n", out);
+		break;
+	case S_HEX:
+		fputs("  hex\n", out);
+		break;
+	default:
+		fputs("  ???\n", out);
+		break;
+	}
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu != menu)
+			continue;
+		switch (prop->type) {
+		case P_PROMPT:
+			fputs("  prompt ", out);
+			print_quoted_string(out, prop->text);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_DEFAULT:
+			fputs( "  default ", out);
+			expr_fprint(prop->expr, out);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_CHOICE:
+			fputs("  #choice value\n", out);
+			break;
+		default:
+			fprintf(out, "  unknown prop %d!\n", prop->type);
+			break;
+		}
+	}
+	if (sym->help) {
+		int len = strlen(sym->help);
+		while (sym->help[--len] == '\n')
+			sym->help[len] = 0;
+		fprintf(out, "  help\n%s\n", sym->help);
+	}
+	fputc('\n', out);
+}
+
+void zconfdump(FILE *out)
+{
+	struct property *prop;
+	struct symbol *sym;
+	struct menu *menu;
+
+	menu = rootmenu.list;
+	while (menu) {
+		if ((sym = menu->sym))
+			print_symbol(out, menu);
+		else if ((prop = menu->prompt)) {
+			switch (prop->type) {
+			case P_COMMENT:
+				fputs("\ncomment ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			case P_MENU:
+				fputs("\nmenu ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			default:
+				;
+			}
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs("  depends ", out);
+				expr_fprint(prop->visible.expr, out);
+				fputc('\n', out);
+			}
+			fputs("\n", out);
+		}
+
+		if (menu->list)
+			menu = menu->list;
+		else if (menu->next)
+			menu = menu->next;
+		else while ((menu = menu->parent)) {
+			if (menu->prompt && menu->prompt->type == P_MENU)
+				fputs("\nendmenu\n", out);
+			if (menu->next) {
+				menu = menu->next;
+				break;
+			}
+		}
+	}
+}
+
+#include "lex.zconf.c"
+#include "util.c"
+#include "confdata.c"
+#include "expr.c"
+#include "symbol.c"
+#include "menu.c"
+
+
Index: buildrom/scripts/kconfig/zconf.y
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/kconfig/zconf.y	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,681 @@
+%{
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#include "zconf.hash.c"
+
+#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
+
+#define PRINTD		0x0001
+#define DEBUG_PARSE	0x0002
+
+int cdebug = PRINTD;
+
+extern int zconflex(void);
+static void zconfprint(const char *err, ...);
+static void zconf_error(const char *err, ...);
+static void zconferror(const char *err);
+static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
+
+struct symbol *symbol_hash[257];
+
+static struct menu *current_menu, *current_entry;
+
+#define YYDEBUG 0
+#if YYDEBUG
+#define YYERROR_VERBOSE
+#endif
+%}
+%expect 26
+
+%union
+{
+	char *string;
+	struct file *file;
+	struct symbol *symbol;
+	struct expr *expr;
+	struct menu *menu;
+	struct kconf_id *id;
+}
+
+%token <id>T_MAINMENU
+%token <id>T_MENU
+%token <id>T_ENDMENU
+%token <id>T_SOURCE
+%token <id>T_CHOICE
+%token <id>T_ENDCHOICE
+%token <id>T_COMMENT
+%token <id>T_CONFIG
+%token <id>T_MENUCONFIG
+%token <id>T_HELP
+%token <string> T_HELPTEXT
+%token <id>T_IF
+%token <id>T_ENDIF
+%token <id>T_DEPENDS
+%token <id>T_REQUIRES
+%token <id>T_OPTIONAL
+%token <id>T_PROMPT
+%token <id>T_TYPE
+%token <id>T_DEFAULT
+%token <id>T_SELECT
+%token <id>T_RANGE
+%token <id>T_ON
+%token <string> T_WORD
+%token <string> T_WORD_QUOTE
+%token T_UNEQUAL
+%token T_CLOSE_PAREN
+%token T_OPEN_PAREN
+%token T_EOL
+
+%left T_OR
+%left T_AND
+%left T_EQUAL T_UNEQUAL
+%nonassoc T_NOT
+
+%type <string> prompt
+%type <symbol> symbol
+%type <expr> expr
+%type <expr> if_expr
+%type <id> end
+%type <id> option_name
+%type <menu> if_entry menu_entry choice_entry
+
+%destructor {
+	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+		$$->file->name, $$->lineno);
+	if (current_menu == $$)
+		menu_end_menu();
+} if_entry menu_entry choice_entry
+
+%%
+input: stmt_list;
+
+stmt_list:
+	  /* empty */
+	| stmt_list common_stmt
+	| stmt_list choice_stmt
+	| stmt_list menu_stmt
+	| stmt_list T_MAINMENU prompt nl
+	| stmt_list end			{ zconf_error("unexpected end statement"); }
+	| stmt_list T_WORD error T_EOL	{ zconf_error("unknown statement \"%s\"", $2); }
+	| stmt_list option_name error T_EOL
+{
+	zconf_error("unexpected option \"%s\"", kconf_id_strings + $2->name);
+}
+	| stmt_list error T_EOL		{ zconf_error("invalid statement"); }
+;
+
+option_name:
+	T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL | T_RANGE | T_DEFAULT
+;
+
+common_stmt:
+	  T_EOL
+	| if_stmt
+	| comment_stmt
+	| config_stmt
+	| menuconfig_stmt
+	| source_stmt
+;
+
+option_error:
+	  T_WORD error T_EOL		{ zconf_error("unknown option \"%s\"", $1); }
+	| error T_EOL			{ zconf_error("invalid option"); }
+;
+
+
+/* config/menuconfig entry */
+
+config_entry_start: T_CONFIG T_WORD T_EOL
+{
+	struct symbol *sym = sym_lookup($2, 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+config_stmt: config_entry_start config_option_list
+{
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
+menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
+{
+	struct symbol *sym = sym_lookup($2, 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+menuconfig_stmt: menuconfig_entry_start config_option_list
+{
+	if (current_entry->prompt)
+		current_entry->prompt->type = P_MENU;
+	else
+		zconfprint("warning: menuconfig statement without prompt");
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
+config_option_list:
+	  /* empty */
+	| config_option_list config_option
+	| config_option_list depends
+	| config_option_list help
+	| config_option_list option_error
+	| config_option_list T_EOL
+;
+
+config_option: T_TYPE prompt_stmt_opt T_EOL
+{
+	menu_set_type($1->stype);
+	printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
+		zconf_curname(), zconf_lineno(),
+		$1->stype);
+};
+
+config_option: T_PROMPT prompt if_expr T_EOL
+{
+	menu_add_prompt(P_PROMPT, $2, $3);
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_DEFAULT expr if_expr T_EOL
+{
+	menu_add_expr(P_DEFAULT, $2, $3);
+	if ($1->stype != S_UNKNOWN)
+		menu_set_type($1->stype);
+	printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
+		zconf_curname(), zconf_lineno(),
+		$1->stype);
+};
+
+config_option: T_SELECT T_WORD if_expr T_EOL
+{
+	menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
+	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_RANGE symbol symbol if_expr T_EOL
+{
+	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
+	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+};
+
+/* choice entry */
+
+choice: T_CHOICE T_EOL
+{
+	struct symbol *sym = sym_lookup(NULL, 0);
+	sym->flags |= SYMBOL_CHOICE;
+	menu_add_entry(sym);
+	menu_add_expr(P_CHOICE, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
+};
+
+choice_entry: choice choice_option_list
+{
+	$$ = menu_add_menu();
+};
+
+choice_end: end
+{
+	if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+choice_stmt: choice_entry choice_block choice_end
+;
+
+choice_option_list:
+	  /* empty */
+	| choice_option_list choice_option
+	| choice_option_list depends
+	| choice_option_list help
+	| choice_option_list T_EOL
+	| choice_option_list option_error
+;
+
+choice_option: T_PROMPT prompt if_expr T_EOL
+{
+	menu_add_prompt(P_PROMPT, $2, $3);
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_TYPE prompt_stmt_opt T_EOL
+{
+	if ($1->stype == S_BOOLEAN || $1->stype == S_TRISTATE) {
+		menu_set_type($1->stype);
+		printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
+			zconf_curname(), zconf_lineno(),
+			$1->stype);
+	} else
+		YYERROR;
+};
+
+choice_option: T_OPTIONAL T_EOL
+{
+	current_entry->sym->flags |= SYMBOL_OPTIONAL;
+	printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_DEFAULT T_WORD if_expr T_EOL
+{
+	if ($1->stype == S_UNKNOWN) {
+		menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
+		printd(DEBUG_PARSE, "%s:%d:default\n",
+			zconf_curname(), zconf_lineno());
+	} else
+		YYERROR;
+};
+
+choice_block:
+	  /* empty */
+	| choice_block common_stmt
+;
+
+/* if entry */
+
+if_entry: T_IF expr nl
+{
+	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
+	menu_add_entry(NULL);
+	menu_add_dep($2);
+	$$ = menu_add_menu();
+};
+
+if_end: end
+{
+	if (zconf_endtoken($1, T_IF, T_ENDIF)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+if_stmt: if_entry if_block if_end
+;
+
+if_block:
+	  /* empty */
+	| if_block common_stmt
+	| if_block menu_stmt
+	| if_block choice_stmt
+;
+
+/* menu entry */
+
+menu: T_MENU prompt T_EOL
+{
+	menu_add_entry(NULL);
+	menu_add_prompt(P_MENU, $2, NULL);
+	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
+};
+
+menu_entry: menu depends_list
+{
+	$$ = menu_add_menu();
+};
+
+menu_end: end
+{
+	if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+menu_stmt: menu_entry menu_block menu_end
+;
+
+menu_block:
+	  /* empty */
+	| menu_block common_stmt
+	| menu_block menu_stmt
+	| menu_block choice_stmt
+;
+
+source_stmt: T_SOURCE prompt T_EOL
+{
+	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
+	zconf_nextfile($2);
+};
+
+/* comment entry */
+
+comment: T_COMMENT prompt T_EOL
+{
+	menu_add_entry(NULL);
+	menu_add_prompt(P_COMMENT, $2, NULL);
+	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+};
+
+comment_stmt: comment depends_list
+{
+	menu_end_entry();
+};
+
+/* help option */
+
+help_start: T_HELP T_EOL
+{
+	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+	zconf_starthelp();
+};
+
+help: help_start T_HELPTEXT
+{
+	current_entry->sym->help = $2;
+};
+
+/* depends option */
+
+depends_list:
+	  /* empty */
+	| depends_list depends
+	| depends_list T_EOL
+	| depends_list option_error
+;
+
+depends: T_DEPENDS T_ON expr T_EOL
+{
+	menu_add_dep($3);
+	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
+}
+	| T_DEPENDS expr T_EOL
+{
+	menu_add_dep($2);
+	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
+}
+	| T_REQUIRES expr T_EOL
+{
+	menu_add_dep($2);
+	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
+};
+
+/* prompt statement */
+
+prompt_stmt_opt:
+	  /* empty */
+	| prompt if_expr
+{
+	menu_add_prompt(P_PROMPT, $1, $2);
+};
+
+prompt:	  T_WORD
+	| T_WORD_QUOTE
+;
+
+end:	  T_ENDMENU T_EOL	{ $$ = $1; }
+	| T_ENDCHOICE T_EOL	{ $$ = $1; }
+	| T_ENDIF T_EOL		{ $$ = $1; }
+;
+
+nl:
+	  T_EOL
+	| nl T_EOL
+;
+
+if_expr:  /* empty */			{ $$ = NULL; }
+	| T_IF expr			{ $$ = $2; }
+;
+
+expr:	  symbol				{ $$ = expr_alloc_symbol($1); }
+	| symbol T_EQUAL symbol			{ $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
+	| symbol T_UNEQUAL symbol		{ $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
+	| T_OPEN_PAREN expr T_CLOSE_PAREN	{ $$ = $2; }
+	| T_NOT expr				{ $$ = expr_alloc_one(E_NOT, $2); }
+	| expr T_OR expr			{ $$ = expr_alloc_two(E_OR, $1, $3); }
+	| expr T_AND expr			{ $$ = expr_alloc_two(E_AND, $1, $3); }
+;
+
+symbol:	  T_WORD	{ $$ = sym_lookup($1, 0); free($1); }
+	| T_WORD_QUOTE	{ $$ = sym_lookup($1, 1); free($1); }
+;
+
+%%
+
+void conf_parse(const char *name)
+{
+	struct symbol *sym;
+	int i;
+
+	zconf_initscan(name);
+
+	sym_init();
+	menu_init();
+	modules_sym = sym_lookup("MODULES", 0);
+	rootmenu.prompt = menu_add_prompt(P_MENU, "Buildrom Configuration", NULL);
+
+#if YYDEBUG
+	if (getenv("ZCONF_DEBUG"))
+		zconfdebug = 1;
+#endif
+	zconfparse();
+	if (zconfnerrs)
+		exit(1);
+	menu_finalize(&rootmenu);
+	for_all_symbols(i, sym) {
+		sym_check_deps(sym);
+        }
+
+	sym_change_count = 1;
+}
+
+const char *zconf_tokenname(int token)
+{
+	switch (token) {
+	case T_MENU:		return "menu";
+	case T_ENDMENU:		return "endmenu";
+	case T_CHOICE:		return "choice";
+	case T_ENDCHOICE:	return "endchoice";
+	case T_IF:		return "if";
+	case T_ENDIF:		return "endif";
+	case T_DEPENDS:		return "depends";
+	}
+	return "<token>";
+}
+
+static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken)
+{
+	if (id->token != endtoken) {
+		zconf_error("unexpected '%s' within %s block",
+			kconf_id_strings + id->name, zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	if (current_menu->file != current_file) {
+		zconf_error("'%s' in different file than '%s'",
+			kconf_id_strings + id->name, zconf_tokenname(starttoken));
+		fprintf(stderr, "%s:%d: location of the '%s'\n",
+			current_menu->file->name, current_menu->lineno,
+			zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	return true;
+}
+
+static void zconfprint(const char *err, ...)
+{
+	va_list ap;
+
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconf_error(const char *err, ...)
+{
+	va_list ap;
+
+	zconfnerrs++;
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconferror(const char *err)
+{
+#if YYDEBUG
+	fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
+#endif
+}
+
+void print_quoted_string(FILE *out, const char *str)
+{
+	const char *p;
+	int len;
+
+	putc('"', out);
+	while ((p = strchr(str, '"'))) {
+		len = p - str;
+		if (len)
+			fprintf(out, "%.*s", len, str);
+		fputs("\\\"", out);
+		str = p + 1;
+	}
+	fputs(str, out);
+	putc('"', out);
+}
+
+void print_symbol(FILE *out, struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	struct property *prop;
+
+	if (sym_is_choice(sym))
+		fprintf(out, "choice\n");
+	else
+		fprintf(out, "config %s\n", sym->name);
+	switch (sym->type) {
+	case S_BOOLEAN:
+		fputs("  boolean\n", out);
+		break;
+	case S_TRISTATE:
+		fputs("  tristate\n", out);
+		break;
+	case S_STRING:
+		fputs("  string\n", out);
+		break;
+	case S_INT:
+		fputs("  integer\n", out);
+		break;
+	case S_HEX:
+		fputs("  hex\n", out);
+		break;
+	default:
+		fputs("  ???\n", out);
+		break;
+	}
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu != menu)
+			continue;
+		switch (prop->type) {
+		case P_PROMPT:
+			fputs("  prompt ", out);
+			print_quoted_string(out, prop->text);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_DEFAULT:
+			fputs( "  default ", out);
+			expr_fprint(prop->expr, out);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_CHOICE:
+			fputs("  #choice value\n", out);
+			break;
+		default:
+			fprintf(out, "  unknown prop %d!\n", prop->type);
+			break;
+		}
+	}
+	if (sym->help) {
+		int len = strlen(sym->help);
+		while (sym->help[--len] == '\n')
+			sym->help[len] = 0;
+		fprintf(out, "  help\n%s\n", sym->help);
+	}
+	fputc('\n', out);
+}
+
+void zconfdump(FILE *out)
+{
+	struct property *prop;
+	struct symbol *sym;
+	struct menu *menu;
+
+	menu = rootmenu.list;
+	while (menu) {
+		if ((sym = menu->sym))
+			print_symbol(out, menu);
+		else if ((prop = menu->prompt)) {
+			switch (prop->type) {
+			case P_COMMENT:
+				fputs("\ncomment ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			case P_MENU:
+				fputs("\nmenu ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			default:
+				;
+			}
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs("  depends ", out);
+				expr_fprint(prop->visible.expr, out);
+				fputc('\n', out);
+			}
+			fputs("\n", out);
+		}
+
+		if (menu->list)
+			menu = menu->list;
+		else if (menu->next)
+			menu = menu->next;
+		else while ((menu = menu->parent)) {
+			if (menu->prompt && menu->prompt->type == P_MENU)
+				fputs("\nendmenu\n", out);
+			if (menu->next) {
+				menu = menu->next;
+				break;
+			}
+		}
+	}
+}
+
+#include "lex.zconf.c"
+#include "util.c"
+#include "confdata.c"
+#include "expr.c"
+#include "symbol.c"
+#include "menu.c"
Index: buildrom/scripts/Makefile.generic
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/Makefile.generic	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,7 @@
+# Generic payload target
+# Used by: OFW, etherboot, memtest
+
+$(PAYLOAD_ELF): $(PAYLOAD-y)
+$(PAYLOAD_COMPRESSED): $(PAYLOAD_ELF)
+	@ echo "Compressing the ELF payload with lzma..."
+	@ $(STAGING_DIR)/bin/lzma e $< 2> /dev/null $@ 
Index: buildrom/scripts/Makefile.kernel
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/Makefile.kernel	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,13 @@
+# Targets specifically for the kernel payload
+
+$(OUTPUT_DIR)/kernel-payload.elf: $(PAYLOAD-y)
+	@ echo "Building the ELF payload..."
+	@ rm -f $@
+	@ $(STAGING_DIR)/sbin/mkelfImage --type bzImage-i386 \
+	--command-line=$(COMMAND_LINE) $(OUTPUT_DIR)/bzImage $@
+	@ chmod 0644 $@
+
+$(OUTPUT_DIR)/kernel-payload.elf.lzma: $(OUTPUT_DIR)/kernel-payload.elf
+	@ echo "Compressing the ELF payload with lzma..."
+	@ $(STAGING_DIR)/bin/lzma e $< 2> /dev/null $@ 
+	@ $(BIN_DIR)/checkrom.sh $@
Index: buildrom/scripts/Makefile.lab
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/scripts/Makefile.lab	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,47 @@
+# Targets specifically for the LAB payload
+
+$(OUTPUT_DIR)/initrd.uncompressed: $(PAYLOAD-y)
+	@ cp -af $(SKELETON_DIR)/* $(INITRD_DIR)
+	@ chmod 0755 $(INITRD_DIR)/linuxrc
+
+	@ echo "Cleaning up shared libraries..."
+
+	find $(INITRD_DIR) -type f -perm +100 -exec file -rNF '' {} \; | \
+	awk ' /executable.*dynamically/ { print $$1}' > $(INITRD_DIR)/.list
+
+	(cd $(INITRD_DIR); export CFLAGS="$(CROSS_CFLAGS)"; \
+	python $(BIN_DIR)/mklibs.py \
+	--root $(STAGING_DIR) -d ./ `cat $(INITRD_DIR)/.list` > /dev/null)
+	rm -f $(INITRD_DIR)/.list
+
+	echo "BUILDROM LAB $(ROM_VERSION)" > $(INITRD_DIR)/buildrom-version
+	echo -n "Build timestamp: " >> $(INITRD_DIR)/buildrom-version 
+	date "+%Y%m%d %H:%M:%S" >> $(INITRD_DIR)/buildrom-version
+
+	echo "Building the initrd..."
+	install -d $(OUTPUT_DIR)
+	cd $(INITRD_DIR); find . | cpio -o -H newc 2> /dev/null > $@
+
+$(OUTPUT_DIR)/initrd: $(OUTPUT_DIR)/initrd.uncompressed
+	@  gzip -9 -c -n $< > $@
+
+$(OUTPUT_DIR)/lab-payload-uncompressed.elf: $(OUTPUT_DIR)/initrd.uncompressed
+	@ echo "Building the uncompressed ELF payload..."
+	@ rm -f $@
+	@ $(STAGING_DIR)/sbin/mkelfImage --command-line="$(COMMAND_LINE)" \
+	--ramdisk=$(OUTPUT_DIR)/initrd.uncompressed \
+	$(OUTPUT_DIR)/vmlinux $@
+	@ chmod 0644 $@
+
+$(OUTPUT_DIR)/lab-payload.elf: $(OUTPUT_DIR)/initrd
+	@ echo "Building the ELF payload..."
+	@ rm -f $@
+	@ $(STAGING_DIR)/sbin/mkelfImage --command-line="$(COMMAND_LINE)" \
+	--ramdisk=$(OUTPUT_DIR)/initrd $(OUTPUT_DIR)/bzImage $@
+	@ chmod 0644 $@
+	@ $(BIN_DIR)/checkrom.sh $@
+
+$(OUTPUT_DIR)/lab-payload.elf.lzma: $(OUTPUT_DIR)/lab-payload-uncompressed.elf
+	@ echo "Compressing the ELF payload with lzma..."
+	@ $(STAGING_DIR)/bin/lzma e $< 2> /dev/null $@ 
+	@ $(BIN_DIR)/checkrom.sh $@
Index: buildrom/skeleton/bin/boot.functions
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/skeleton/bin/boot.functions	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,50 @@
+# This file is sourced by boot-usb and boot-nand
+# This provides the common boot functions
+
+# Note - these are being kept for compatablity purposes
+# The best solution is to use olpc-boot.sh
+
+CMDLINE="root=/dev/sda1 console=ttyS0,115200 console=tty0 rootdelay=10 rw"
+KERNEL="/bzImage"
+INITRD=""
+VT="1"
+
+# Any of the above can be over-ridden by /boot.conf
+
+if [ -f /boot.conf ]; then
+	. /boot.conf
+fi
+
+message() {
+	echo $1 > /dev/tty$VT
+	echo $1
+}
+
+doboot() {
+	DIR=$1
+
+	# Switch to the mounted directory to make life easier for the script
+	cd $DIR 
+
+	if [ -x ./boot/olpc-boot.sh ]; then
+		. ./boot/olpc-boot.sh
+		message "Unable to execute the olpc-boot.sh script"
+		return
+	fi
+
+	if [ -x ./olpc-boot.sh ]; then
+		. ./olpc-boot.sh
+		message "Unable to execute the olpc-boot.sh script"
+		return
+	fi
+
+	# For backwards compatablity - try to find the kernel
+
+	if [ ! -f $DIR$KERNEL ]; then
+		message "ERROR: $DIR$KERNEL doesn't exist."
+		return
+	fi
+
+	/sbin/kbl-kexec $DIR$KERNEL "$CMDLINE" $INITRD
+	message "ERROR: can't run kbl-kexec $DIR$KERNEL $CMDLINE $INITRD"
+}
Index: buildrom/skeleton/bin/boot-nand
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/skeleton/bin/boot-nand	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,20 @@
+#!/bin/sh
+# Try to boot from the NAND flash
+# Usage:  boot-nand
+# boot-func shouldn't return - if it does, then we assume error
+
+. /bin/boot.functions
+
+DIR=/flash
+
+mkdir $DIR
+mount -t jffs2 mtd0 /flash
+
+if [ $? -eq 0 ]; then
+	doboot $DIR
+	message "ERROR:  Couldn't boot from the NAND flash."
+	exit 1
+fi
+
+message "ERROR:  Couldn't mount the NAND flash."
+exit 1
Index: buildrom/skeleton/bin/boot-usb
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/skeleton/bin/boot-usb	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Try to boot from a USB key
+# Usage:  boot-usb
+# boot-func shouldn't return - if it does, then we assume error
+
+. /bin/boot.functions
+
+DIR=/key
+slumber=40
+
+try_mount() {
+	mount -oro /dev/sda1 $DIR
+	
+	if [ $? -eq 0 ]; then
+		doboot $DIR
+		message "ERROR:  Couldn't boot from the USB key."
+		exit 1
+	fi
+}
+
+mkdir $DIR
+
+while [ $slumber -gt 0 ]; do
+	try_mount 
+	/bin/usleep 200000
+	slumber=$(( $slumber - 1 ))
+done
+message "ERROR: Couldn't boot from the USB key."
+exit 1
+
Index: buildrom/skeleton/bootmenu.conf
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ buildrom/skeleton/bootmenu.conf	2007-05-01 17:21:24.000000000 -0600
@@ -0,0 +1,6 @@
+# Bootmenu configuration
+
+icon:/images/wireless1.ppm:/images/wireless2.ppm:Boot from Wireless
+icon:/images/ethernet1.ppm:/images/ethernet2.ppm:Boot from Ethernet
+icon:/images/usbKey1.ppm:/images/usbKey2.ppm:Boot from USB Key
+icon:/images/olpc1.ppm:/images/olpc2.ppm:Shell
Index: buildrom/skeleton/device.txt
===================================================================
--- buildrom.orig/skeleton/device.txt	2007-05-01 14:29:43.000000000 -0600
+++ buildrom/skeleton/device.txt	2007-05-01 17:21:24.000000000 -0600
@@ -2,6 +2,7 @@
 zero   c       640     0       0       1       5
 tty    c       640     0       0       5       0
 tty0   c       640     0       0       4       0
+tty1	c	640	0	0	4	1
 console        c       640     0       0       5       1
 sda    b       660     0       0       8       0
 sda1   b       660     0       0       8       1
Index: buildrom/skeleton/linuxrc
===================================================================
--- buildrom.orig/skeleton/linuxrc	2007-05-01 14:29:43.000000000 -0600
+++ buildrom/skeleton/linuxrc	2007-05-01 17:21:24.000000000 -0600
@@ -1,37 +1,23 @@
 #!/bin/sh
 
-CMDLINE="root=/dev/sda1 console=ttyS0,115200 console=tty0 rootdelay=10 rw"
-KERNEL="/bzImage"
-INITRD=""
+# We need boot functions for message()
+. /bin/boot.functions
 
-# Any of the above can be surplanted by /boot.conf
-
-if [ -f /boot.conf ]; then
-	. /boot.conf
-fi
-
-# This will load a bzImage from the USB key
-
-load_usb() {
-	mkdir /key
+boot_default() {
+	sh /bin/boot-nand
+	sh /bin/boot-usb
+}
 
-	mount /dev/sda1 /key || {
-		echo "ERROR: Couldn't mount the USB key."
-		return
-	}
-
-	if [ ! -f /key$KERNEL ]; then
-		echo "ERROR: /key$KERNEL doesn't exist."
-		return
-	fi
+# Make the null device by hand, since we use it in the makedevs step.
 
-	/sbin/kbl-kexec /key$KERNEL "$CMDLINE" $INITRD
-	echo "ERROR: can't run kbl-kexec /key$KERNEL $CMDLINE $INITRD"
-}
+mknod /dev/null c 1 3
 
 mkdir /proc
 mount -t proc proc /proc
 
+# For debug purposes
+mount -t usbfs usbfs /proc/bus/usb
+
 # Makedevs returns seemingly nasty error messages, even though the
 # files are still created (we're missing something in the minimal kernel 
 # that causes chown to return ENOSYS).
@@ -39,28 +25,38 @@
 
 /sbin/makedevs /dev < device.txt > /dev/null 2>&1
 
+# Show the version 
+cat /buildrom-version
+cat /buildrom-version > /dev/tty$VT
+
 # FIXME - bad!
 
+message "Starting bootmenu."
 cd /bin
 ./bootmenu
 RET=$?
 cd /
-clear
 
-# Handle the return values.  Modes 0 - 2 shouldn't return
-# If they are successful.  If they aren't successful, then 
-# we drop into a shell at the end.  Mode 3 puts us into the
-# shell regardless.
+# Bootmenu now returns 0 if the timeout happened (meaning, 
+# we want to boot the default - which in this case is nand
+# then USB key.  $RET > 0 means to select the menu item
+
+# NOTE:  Should 3 be boot_default, or boot-usb only?
 
 if [ $RET -eq 0 ]; then
-	echo "ERROR: Wired mode isn't supported right now."
+	message "NOTICE: Booting default"
+	boot_default
 elif [ $RET -eq 1 ]; then
-	echo "ERROR: Wireless mode isn't supported right now."
+	message "ERROR: Wired mode isn't supported right now."
 elif [ $RET -eq 2 ]; then
-	load_usb
+	message "ERROR: Wireless mode isn't supported right now."
+elif [ $RET -eq 3 ]; then
+	sh /bin/boot-usb
 elif [ $RET -eq -1 ]; then
-	echo "ERROR: The bootmenu was not successful."
+	message "ERROR: The bootmenu was not successful."
 fi
 
-echo "NOTICE: Starting the shell..."
+message "NOTICE: Starting the shell..."
+
+openvt $VT /bin/ash
 exec /bin/ash
Index: buildrom/Vars.mk
===================================================================
--- buildrom.orig/Vars.mk	2007-05-01 14:29:44.000000000 -0600
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,24 +0,0 @@
-SOURCE_DIR=$(BASE_DIR)/sources
-BUILD_DIR=$(BASE_DIR)/work
-INITRD_DIR=$(BASE_DIR)/initrd-rootfs
-STAGING_DIR=$(BASE_DIR)/staging
-SKELETON_DIR=$(BASE_DIR)/skeleton
-OUTPUT_DIR=$(BASE_DIR)/deploy
-PACKAGE_DIR=$(BASE_DIR)/packages
-BIN_DIR=$(BASE_DIR)/bin
-
-CC=gcc
-CFLAGS=-fpic -m32 -Os -march=i686 -I$(STAGING_DIR)/include
-STRIP=strip
-
-LIBGCC:=$(shell $(CC) $(LIBGCC_CFLAGS) -print-libgcc-file-name)
-
-LDFLAGS=-nostdlib -L$(STAGING_DIR)/lib -Wl,-rpath-link,$(STAGING_DIR)/lib \
--Wl,--dynamic-linker,/lib/ld-uClibc.so.0
-LIBS =  $(STAGING_DIR)/lib/crt1.o -lc $(LIBGCC)
-
-HOST_CC=gcc
-HOST_CFLAGS=
-HOST_LDFLAGS=
-
-export CC CFLAGS LDFLAGS LIBS


More information about the coreboot mailing list