Stefan Tauner (stefan.tauner@gmx.at) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9322
-gerrit
commit d07484398ab2ae2bacc0c5bcc34d3720634abd13 Author: Stefan Tauner stefan.tauner@gmx.at Date: Mon Apr 6 12:40:17 2015 +0200
utils: pool together single-file scripts into a single directory
This will most probably break things - do not commit yet! I want to get consensus about naming and what files to move at all before fixing anything. Shall we move gitconfig/ in there too?
Signed-off-by: Stefan Tauner stefan.tauner@gmx.at Change-Id: I17d3f622a9c64724fe3471a92c243e6bd87ff7ca --- util/acpi/acpidump-all | 50 ------- util/dtd_parser/dtd_parser.py | 213 --------------------------- util/exynos/fixed_cksum.py | 59 -------- util/exynos/variable_cksum.py | 59 -------- util/find_usbdebug/find_usbdebug.sh | 149 ------------------- util/genbuild_h/genbuild_h.sh | 64 -------- util/ipqheader/ipqheader.py | 130 ---------------- util/rockchip/LICENSE | 25 ---- util/rockchip/make_idb.py | 124 ---------------- util/scripts/acpidump-all | 50 +++++++ util/scripts/dtd_parser.py | 213 +++++++++++++++++++++++++++ util/scripts/exynos_fixed_cksum.py | 59 ++++++++ util/scripts/exynos_variable_cksum.py | 59 ++++++++ util/scripts/find_usbdebug.sh | 149 +++++++++++++++++++ util/scripts/genbuild_h.sh | 64 ++++++++ util/scripts/ipqheader.py | 130 ++++++++++++++++ util/scripts/rk_make_idb.py | 150 +++++++++++++++++++ util/scripts/xcompile | 269 ++++++++++++++++++++++++++++++++++ util/xcompile/xcompile | 269 ---------------------------------- 19 files changed, 1143 insertions(+), 1142 deletions(-)
diff --git a/util/acpi/acpidump-all b/util/acpi/acpidump-all deleted file mode 100755 index aa73a15..0000000 --- a/util/acpi/acpidump-all +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2007-2010 by coresystems GmbH -# -# 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; version 2 of the License. -# -# 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 -# - -rm -rf out -mkdir out - -# walk through all ACPI tables with their addresses -# example: -# RSDT @ 0xcf6794ba -# we can not just dump the tables by their names because some -# machines have double ACPI tables - -acpidump | grep "@ 0x" | while read line -do - NAME=$( echo `echo $line|cut -f1 -d@` ) - FNAME=$( echo $NAME | sed s/\ /_/g |sed s/!/b/g ) - ADDR=$( echo `echo $line|cut -f2 -d@` ) - if [ "${!FNAME}" == "" ]; then - eval $FNAME=0 - else - eval $FNAME=$(( ${!FNAME} + 1 )) - fi - printf "Processing table "$NAME" at $ADDR ... " - printf "${!FNAME} tables of that kind found before.\n" - - # acpidump -s ${!FNAME} --table "$NAME" > out/$FNAME-$ADDR-${!FNAME}.txt - acpidump -b -s ${!FNAME} --table "$NAME" > out/$FNAME-$ADDR-${!FNAME}.bin - if [ "`file -b out/$FNAME-$ADDR-${!FNAME}.bin`" != "ASCII text" ]; then - iasl -d out/$FNAME-$ADDR-${!FNAME}.bin &>/dev/null - else - printf "Skipping $NAME because it was not dumped correctly.\n\n" - fi - -done - diff --git a/util/dtd_parser/dtd_parser.py b/util/dtd_parser/dtd_parser.py deleted file mode 100755 index 23cc7e7..0000000 --- a/util/dtd_parser/dtd_parser.py +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/python -# dtd_parser.py - DTD structure parser -# -# Copyright (C) 2012 The ChromiumOS Authors. All rights reserved. -# -# 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; version 2 of the License -# -# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -''' -DTD string parser/generator. - -Detailed timing descriptor (DTD) is an 18 byte array describing video mode -(screen resolution, display properties, etc.) in EDID and used by Intel Option -ROM. Option ROM can support multiple video modes, specific mode is picked by -the BIOS through the appropriate Option ROM callback function. - -This program allows to interpret the 18 byte hex DTD dump, and/or modify -certain values and generate a new DTD. -''' - -import sys - -# -# The DTD array format description can be found in -# http://en.wikipedia.org/wiki/Extended_display_identification_data, (see the -# EDID Detailed Timing Descriptor section). -# -# The below dictionary describes how different DTD parameters are laid out in -# the array. Note that many parameters span multiple bit fields in the DTD. -# -# The keys in the dictionary are stings (field names), the values are tuples -# of either numbers or tri-tuples. If the element of the tuple is a number, it -# is the offset in DTD, and the entire byte is used in this field. If the -# element is a tri-tuple, its components are (DTD offset, bit shift, field -# width). -# -# The partial values are extracted from the DTD fields and concatenated -# together to form actual parameter value. -# - -dtd_descriptor = { - 'dclck' : (1, 0), - 'hor_active' : ((4, 4, 4), 2), - 'hor_blank' : ((4, 0, 4), 3), - 'vert_act' : ((7, 4, 4), 5), - 'vert_blank' : ((7, 0, 4), 6), - 'hsync_offset' : ((11, 6, 2), 8), - 'hsync_pulse_width' : ((11, 4, 2), 9), - 'vsync_offset' : ((11, 2, 2), (10, 4, 4)), - 'vsync_pulse_width' : ((11, 0, 2), (10, 0, 4)), - 'hor_image_size' : ((14, 4, 4), 12), - 'vert_image_size' : ((14, 0, 4), 13), - 'hor_border' : (15,), - 'vert_border' : (16,), - 'interlaced' : ((17, 7, 1),), - 'reserved' : ((17, 5, 2), (17, 0, 1)), - 'digital_separate' : ((17, 3, 2),), - 'vert_polarity' : ((17, 2, 1),), - 'hor_polarity' : ((17, 1, 1),), - } - -PREFIX = 'attr_' - -class DTD(object): - '''An object containing all DTD information. - - The attributes are created dynamically when the input DTD string is - parsed. For each element of the above dictionary two attributes are added: - - 'attr_<param>' to hold the actual parameter value - 'max_attr_<param>' to hold the maximum allowed value for this parameter. - ''' - - def __init__(self): - for name in dtd_descriptor: - setattr(self, PREFIX + name, 0) - - def init(self, sarray): - '''Initialize the object with values from a DTD array. - - Inputs: - - sarray: a string, an array of ASCII hex representations of the 18 DTD - bytes. - - Raises: implicitly raises ValueError or IndexError exceptions in case - the input string has less than 18 elements, or some of the - elements can not be converted to integer. - ''' - - harray = [int(x, 16) for x in sarray] - for name, desc in dtd_descriptor.iteritems(): - attr_value = 0 - total_width = 0 - for tup in desc: - if isinstance(tup, tuple): - offset, shift, width = tup - else: - offset, shift, width = tup, 0, 8 - - mask = (1 << width) - 1 - attr_value = (attr_value << width) + ( - (harray[offset] >> shift) & mask) - total_width += width - setattr(self, PREFIX + name, attr_value) - setattr(self, 'max_' + PREFIX + name, (1 << total_width) - 1) - - def __str__(self): - text = [] - for name in sorted(dtd_descriptor.keys()): - text.append('%20s: %d' % (name, getattr(self, PREFIX + name))) - return '\n'.join(text) - - def inhex(self): - '''Generate contents of the DTD as a 18 byte ASCII hex array.''' - - result = [0] * 18 - for name, desc in dtd_descriptor.iteritems(): - attr_value = getattr(self, PREFIX + name) - rdesc = list(desc) - rdesc.reverse() - for tup in rdesc: - if isinstance(tup, tuple): - offset, shift, width = tup - else: - offset, shift, width = tup, 0, 8 - - mask = (1 << width) - 1 - value = attr_value & mask - attr_value = attr_value >> width - result[offset] = (result[offset] & ~( - mask << shift)) | (value << shift) - - return ' '.join('%2.2x' % x for x in result) - - def handle_input(self, name): - '''Get user input and set a new parameter value if required. - - Display the parameter name, its current value, and prompt user for a - new value. - - If the user enters a dot, stop processing (return True). - - Empty user input means that this parameter does not have to change, - but the next parameter should be prompted. - - If input is non-empty, it is interpreted as a hex number, checked if - it fits the parameter and the new parameter value is set if checks - pass. - - Inputs: - - name - a string, parameter name, a key in dtd_descriptor - - Returns: - - Boolean, True meaning no more field are required to be modified, False - meaning that more field mods need to be prompted.. - ''' - - param = PREFIX + name - vmax = getattr(self, 'max_' + param) - new_value = raw_input('%s : %d ' % (name, getattr(self, param))) - if new_value == '': - return False - if new_value == '.': - return True - new_int = int(new_value) - if new_int > vmax: - print '%s exceeds maximum for %s (%d)' % (new_value, name, vmax) - else: - setattr(self, param, new_int) - return False - -def main(args): - if args[0] == '-m': - modify = True - base = 1 - else: - modify = False - base = 0 - - d = DTD() - d.init(args[base:]) - if modify: - for line in str(d).splitlines(): - if d.handle_input(line.split(':')[0].strip()): - break - print d - if modify: - print d.inhex() - - -if __name__ == '__main__': - try: - main(sys.argv[1:]) - except (ValueError, IndexError): - print """ -A string of 18 byte values in hex is required. -'-m' preceding the string will allow setting new parameter values. -""" - sys.exit(1) diff --git a/util/exynos/fixed_cksum.py b/util/exynos/fixed_cksum.py deleted file mode 100755 index 66da060..0000000 --- a/util/exynos/fixed_cksum.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2013 Google Inc. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. - -""" -This utility computes and fills Exynos ROM checksum (for BL1 or BL2). -(Algorithm from U-Boot: tools/mkexynosspl.c) - -Input: IN OUT DATA_SIZE - -Output: - - IN padded out to DATA_SIZE, checksum at the end, written to OUT. -""" - -import struct -import sys - -def main(argv): - if len(argv) != 4: - exit('usage: %s IN OUT DATA_SIZE' % argv[0]) - - in_name, out_name = argv[1:3] - size = int(argv[3], 0) - checksum_format = "<I" - with open(in_name, "rb") as in_file, open(out_name, "wb") as out_file: - data = in_file.read() - checksum_size = struct.calcsize(checksum_format) - data_size = size - checksum_size - assert len(data) <= data_size - checksum = struct.pack(checksum_format, sum(map(ord, data))) - out_file.write(data + bytearray(data_size - len(data)) + checksum) - - -if __name__ == '__main__': - main(sys.argv) diff --git a/util/exynos/variable_cksum.py b/util/exynos/variable_cksum.py deleted file mode 100755 index 75cdc74..0000000 --- a/util/exynos/variable_cksum.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2013 Google Inc. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. - -""" -This utility computes and fills Exynos ROM checksum (for BL1 or BL2). -(Algorithm from U-Boot: tools/mkexynosspl.c) - -Input: IN OUT - -Output: - - Checksum header added to IN and written to OUT. - Header: uint32_t size, checksum, reserved[2]. -""" - -import struct -import sys - -def main(argv): - if len(argv) != 3: - exit('usage: %s IN OUT' % argv[0]) - - in_name, out_name = argv[1:3] - header_format = "<IIII" - with open(in_name, "rb") as in_file, open(out_name, "wb") as out_file: - data = in_file.read() - header = struct.pack(header_format, - struct.calcsize(header_format) + len(data), - sum(map(ord, data)), - 0, 0) - out_file.write(header + data) - - -if __name__ == '__main__': - main(sys.argv) diff --git a/util/find_usbdebug/find_usbdebug.sh b/util/find_usbdebug/find_usbdebug.sh deleted file mode 100755 index 2f82219..0000000 --- a/util/find_usbdebug/find_usbdebug.sh +++ /dev/null @@ -1,149 +0,0 @@ -#!/bin/sh - -# Copyright 2008 Carl-Daniel Hailfinger -# Copyright 2015 Stefan Tauner -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# 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. - -LANG=C -# Some tools emmit errors that don't matter (bugs in lspci/PCI firmware and lsusb). -# To shown them anyway (e.g. for debugging) comment next line. -exec 2>/dev/null - -if [ "$1" = "-h" ]; then - printf "Usage: $0 [-h | path to dmesg log] - -This script tries to find USB ports compatible with USB2/EHCI debug devices and -helps you to find their physical locations. To that end, attach at least one -uniquely identifiable device to a USB port and run this script. The device needs -to be visible in the output of "lsusb -t" (debug devices are often *not*!). - -After determining compatibility of the USB controllers the script will print the -devices attached to the debug port as shown by lsusb. If nothing shows up simply -switch ports and repeat the process. - -Note: usually only one port is supported for debugging.\n" - exit 0 -fi -uid=`id -u` -if [ "$uid" -ne 0 ]; then - echo "Must be run as root. Exiting." - exit 1 -fi -dmesgfile=$1 - -find_devs_in_tree () { - bus=$1 - port=$2 - busstr=`printf "Bus %02d" "$bus"` - portstr="Port $port" - - found= - # Iterate over the output of lsusb -t because it contains the physical port names - while IFS='' read -r line; do - # We need to keep track of the current bus "branch" - # Look out for lines starting with /: (that indicate a bus) - if [ "${line#*/:}" != "$line" ]; then - if [ "${line#*$busstr}" != "$line" ]; then - cur_bus=$busstr - else - cur_bus= - fi - continue - fi - - # Skip all lines not belonging to the wanted bus number - if [ "$cur_bus" != "$busstr" ]; then - continue - fi - - # check for matching physical USB port, and take only IF 0 into account - if [ "${line#*$portstr}" != "$line" -a "${line#*If 0}" != "$line" ]; then - dev=`echo ${line#*Dev } | cut -d ',' -f 1` - lsusb -s "$bus":"$dev" - found="yes" - fi - done<< EOF -$(lsusb -t) -EOF - if [ -z "$found" ]; then - echo "none" - fi -} - -debug_lspci_devs=`lspci -nvvD | - grep -i "^[0-9a-f]|debug port" | - grep -iB1 --no-group-separator "debug port" | - grep -vi "debug port" | - cut -f 1 -d" " | - sort | - xargs echo` - -if [ -z "$debug_lspci_devs" ]; then - printf "No USB controller with debug capability found by lspci.\n -Possible reasons: lspci too old, USB controller does not support a debug device, ... Exiting.\n" - exit 1 -fi -printf "The following PCI devices support a USB debug port (says lspci): $debug_lspci_devs\n" - -debug_dmesg_devs_with_port=`( test -z "$dmesgfile" && - dmesg || - cat "$dmesgfile") | - grep -i "ehci.*debug port" | - sed "s/.* ([0-9a-f]*:*[0-9a-f]{2}:[0-9a-f]{2}.[0-9a-f]).*ebug port /\1 /" | - sort` - -debug_dmesg_devs=`echo "$debug_dmesg_devs_with_port" | - cut -f 1 -d" " | - xargs echo` - -if [ -z "$debug_dmesg_devs" ]; then - printf "dmesg does not show any supported ports.\n -Possible reasons: dmesg scrolled off, kernel too old, USB controller does not support a debug device, ... Exiting.\n -Note: You can specify a file containing kernel messages as an argument to this program (e.g. /var/log/dmesg)." - exit 1 -fi - -if [ "$debug_lspci_devs" != "$debug_dmesg_devs" ]; then - echo "lspci and the kernel do not agree on USB debug device support. Exiting." - exit 1 -fi - -printf "and the kernel agrees, good.\n\n" - -while true; do - for dev in $debug_dmesg_devs; do - bus=`lsusb -v | - grep "^Bus|iSerial.*" | - grep -B1 --no-group-separator "iSerial.*$dev" | - grep "^Bus" | - sed "s/Bus *0*([0-9a-f]*).*/\1/"` - port=`echo "$debug_dmesg_devs_with_port" | - grep "^$dev" | - cut -f 2 -d" "` - - echo "Device(s) currently connected to the debug-capable port $port on PCI device $dev, USB bus $bus:" - - find_devs_in_tree $bus $port - echo - done - - echo "Enter 'q' to abort or anything else to repeat" - read r - if [ $? -ne 0 -o "$r" = "q" ]; then - break; - fi -done - -return 0 diff --git a/util/genbuild_h/genbuild_h.sh b/util/genbuild_h/genbuild_h.sh deleted file mode 100755 index 55a3b85..0000000 --- a/util/genbuild_h/genbuild_h.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/sh - -# This file is part of the coreboot project. -# -# Copyright (C) 2014 Sage Electronic Engineering, LLC. -# -# 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; version 2 of the License. -# -# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -DATE="" -GITREV="" -TIMESOURCE="" -if [ -d "${top}/.git" ] && [ -f "$(command -v git)" ]; then - GITREV=$(LANG= git log remotes/origin/master -1 --format=format:%h) - TIMESOURCE=git - DATE=$(git log --pretty=format:%ct -1) -else - GITREV=Unknown - TIMESOURCE="LANG= TZ=UTC date" - DATE=$(date +%s) -fi - -our_date() { -case $(uname) in -NetBSD|OpenBSD|DragonFly|FreeBSD) - TZ=UTC date -r $1 $2 - ;; -*) - TZ=UTC date -d @$1 $2 -esac -} - -#Print out the information that goes into build.h -printf "/* build system definitions (autogenerated) */\n" -printf "#ifndef __BUILD_H\n" -printf "#define __BUILD_H\n\n" -printf "#define COREBOOT_VERSION %s\n" ""$KERNELVERSION"" - -#See if the build is running in a git repo and the git command is available -printf "/* timesource: $TIMESOURCE */\n" -printf "#define COREBOOT_VERSION_TIMESTAMP $DATE\n" -printf "#define COREBOOT_ORIGIN_GIT_REVISION "$GITREV"\n" - -printf "#define COREBOOT_EXTRA_VERSION "%s"\n" "$COREBOOT_EXTRA_VERSION" -printf "#define COREBOOT_BUILD "$(LANG= our_date "$DATE")"\n" -printf "#define COREBOOT_BUILD_YEAR_BCD 0x$(our_date "$DATE" +%y)\n" -printf "#define COREBOOT_BUILD_MONTH_BCD 0x$(our_date "$DATE" +%m)\n" -printf "#define COREBOOT_BUILD_DAY_BCD 0x$(our_date "$DATE" +%d)\n" -printf "#define COREBOOT_BUILD_WEEKDAY_BCD 0x$(our_date "$DATE" +%w)\n" -printf "#define COREBOOT_DMI_DATE "$(our_date "$DATE" +%m/%d/%Y)"\n" -printf "\n" -printf "#define COREBOOT_COMPILE_TIME "$(our_date "$DATE" +%T)"\n" -printf "#endif\n" diff --git a/util/ipqheader/ipqheader.py b/util/ipqheader/ipqheader.py deleted file mode 100755 index eb1a316..0000000 --- a/util/ipqheader/ipqheader.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2013 The Linux Foundation. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from this -# software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import os -import struct -import sys - -PROG_NAME = os.path.basename(sys.argv[0]) - -def create_header(base, size): - """Returns a packed MBN header image with the specified base and size. - - @arg base: integer, specifies the image load address in RAM - @arg size: integer, specifies the size of the image - @returns: string, the MBN header - """ - - # SBLs require size to be 4 bytes aligned. - size = (size + 3) & 0xfffffffc - - # We currently do not support appending certificates. Signing GPL - # code might violate the GPL. So U-Boot will never be signed. So - # this is not required for U-Boot. - - header = [ - 0x5, # Type: APPSBL - 0x3, # Version: 3 - 0x0, # Image source pointer - base, # Image destination pointer - size, # Code Size + Cert Size + Signature Size - size, # Code Size - base + size, # Destination + Code Size - 0x0, # Signature Size - base + size, # Destination + Code Size + Signature Size - 0x0, # Cert Size - ] - - header_packed = struct.pack('<10I', *header) - return header_packed - -def mkheader(base_addr, infname, outfname): - """Prepends the image with the MBN header. - - @arg base_addr: integer, specifies the image load address in RAM - @arg infname: string, image filename - @arg outfname: string, output image with header prepended - @raises IOError: if reading/writing input/output file fails - """ - with open(infname, "rb") as infp: - image = infp.read() - insize = len(image) - - if base_addr > 0xFFFFFFFF: - raise ValueError("invalid base address") - - if base_addr + insize > 0xFFFFFFFF: - raise ValueError("invalid destination range") - - header = create_header(base_addr, insize) - with open(outfname, "wb") as outfp: - outfp.write(header) - outfp.write(image) - -def usage(msg=None): - """Print command usage. - - @arg msg: string, error message if any (default: None) - """ - if msg != None: - sys.stderr.write("%s: %s\n" % (PROG_NAME, msg)) - - print "Usage: %s <base-addr> <input-file> <output-file>" % PROG_NAME - - if msg != None: - exit(1) - -def main(): - """Main entry function""" - - if len(sys.argv) != 4: - usage("incorrect number of arguments") - - try: - base_addr = int(sys.argv[1], 0) - infname = sys.argv[2] - outfname = sys.argv[3] - except ValueError as e: - sys.stderr.write("mkheader: invalid base address '%s'\n" % sys.argv[1]) - exit(1) - - try: - mkheader(base_addr, infname, outfname) - except IOError as e: - sys.stderr.write("%s: %s\n" % (PROG_NAME, e)) - exit(1) - except ValueError as e: - sys.stderr.write("%s: %s\n" % (PROG_NAME, e)) - exit(1) - -if __name__ == "__main__": - main() - diff --git a/util/rockchip/LICENSE b/util/rockchip/LICENSE deleted file mode 100644 index cb4d35b..0000000 --- a/util/rockchip/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/util/rockchip/make_idb.py b/util/rockchip/make_idb.py deleted file mode 100755 index e95f5c2..0000000 --- a/util/rockchip/make_idb.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2014 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import struct -import sys -from io import SEEK_SET, SEEK_END - -class IDBTool: - def __init__(self): - print "Initialize IDBTool" - - def p_rc4(self, buf, length): - key = (124,78,3,4,85,5,9,7,45,44,123,56,23,13,23,17) - K = key * 16 - S = [i for i in range(256)] - - j = 0 - for i in range(256): - j = (j + S[i] + K[i]) % 256 - temp = S[i]; S[i] = S[j]; S[j] = temp; - - i = j = k = 0 - for x in range(length): - i = (i+1) % 256 - j = (j + S[i]) % 256 - temp = S[i]; S[i] = S[j]; S[j] = temp - k = (S[i] + S[j]) % 256 - buf[x] = struct.pack('B', ord(buf[x]) ^ S[k]) - - def makeIDB(self, from_file, to_file, rc4_flag = False, align_flag = False): - try: - fin = open(from_file, 'rb') - except: - sys.exit("Failed to open file : " + from_file) - - try: - fin.seek(0, SEEK_END) - if (fin.tell() > 4 * 1024 * 1024): - sys.exit("Input file is more than 4MB") - fin.seek(0) - data = fin.read() - finally: - fin.close() - - data_len = len(data) - SECTOR_SIZE = 512 - PAGE_ALIGN = 4 - sectors = (data_len + 4 - 1) / SECTOR_SIZE + 1 - pages = (sectors - 1) / PAGE_ALIGN + 1 - sectors = pages * PAGE_ALIGN; - - buf = [B'\0'] * sectors * SECTOR_SIZE - buf[:4] = "RK32" - buf[4 : 4+data_len] = data - - idblock = [B'\0'] * 4 * SECTOR_SIZE - blank = [B'\0'] * 4 * SECTOR_SIZE - idblock[:4] = ['\x55', '\xAA', '\xF0', '\x0F'] - - if (not rc4_flag): - idblock[8:12] = struct.pack("<I", 1) - else: - for i in range(sectors): - list_tmp = buf[SECTOR_SIZE*i : SECTOR_SIZE*(i+1)] - self.p_rc4(list_tmp, SECTOR_SIZE) - buf[SECTOR_SIZE*i : SECTOR_SIZE*(i+1)] = list_tmp - - idblock[12:16] = struct.pack("<HH", 4, 4); - idblock[506:510] = struct.pack("<HH", sectors, sectors); - self.p_rc4(idblock, SECTOR_SIZE) - - try: - fout = open(to_file, "wb+") - except: - sys.exit("Failed to open output file : " + to_file) - - try: - if (align_flag): - fout.write(''.join(idblock)) - fout.write(''.join(blank)) - - for s in xrange(0, sectors * SECTOR_SIZE, PAGE_ALIGN * SECTOR_SIZE): - fout.write(''.join(buf[s : s + PAGE_ALIGN * SECTOR_SIZE])) - fout.write(''.join(blank)) - else: - fout.write(''.join(idblock)) - fout.write(''.join(buf)) - fout.flush() - except: - sys.exit("Failed to write data to : " + to_file) - finally: - fout.close() - print "DONE" - -def usage(): - print "Usage: make_idb.py [--enable-rc4] [--enable-align] [--to=out] --from=in" - -if __name__ == '__main__': - rc4_flag = align_flag = False - to_file = "IDBlock.bin" - - for para in sys.argv[1:]: - if (para == "--enable-rc4"): - rc4_flag = True - elif (para == "--enable-align"): - align_flag = True - elif (para.startswith("--to=")): - to_file = para.split('=')[1] - elif (para.startswith("--from=")): - from_file = para.split('=')[1] - elif (para == "--help" or para == "-h"): - usage() - sys.exit() - else: - usage() - sys.exit() - if ('from_file' not in vars() or to_file == ''): - usage() - sys.exit() - - idbtool = IDBTool() - idbtool.makeIDB(from_file, to_file, rc4_flag, align_flag) diff --git a/util/scripts/acpidump-all b/util/scripts/acpidump-all new file mode 100755 index 0000000..aa73a15 --- /dev/null +++ b/util/scripts/acpidump-all @@ -0,0 +1,50 @@ +#!/bin/bash +# +# Copyright (C) 2007-2010 by coresystems GmbH +# +# 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; version 2 of the License. +# +# 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 +# + +rm -rf out +mkdir out + +# walk through all ACPI tables with their addresses +# example: +# RSDT @ 0xcf6794ba +# we can not just dump the tables by their names because some +# machines have double ACPI tables + +acpidump | grep "@ 0x" | while read line +do + NAME=$( echo `echo $line|cut -f1 -d@` ) + FNAME=$( echo $NAME | sed s/\ /_/g |sed s/!/b/g ) + ADDR=$( echo `echo $line|cut -f2 -d@` ) + if [ "${!FNAME}" == "" ]; then + eval $FNAME=0 + else + eval $FNAME=$(( ${!FNAME} + 1 )) + fi + printf "Processing table "$NAME" at $ADDR ... " + printf "${!FNAME} tables of that kind found before.\n" + + # acpidump -s ${!FNAME} --table "$NAME" > out/$FNAME-$ADDR-${!FNAME}.txt + acpidump -b -s ${!FNAME} --table "$NAME" > out/$FNAME-$ADDR-${!FNAME}.bin + if [ "`file -b out/$FNAME-$ADDR-${!FNAME}.bin`" != "ASCII text" ]; then + iasl -d out/$FNAME-$ADDR-${!FNAME}.bin &>/dev/null + else + printf "Skipping $NAME because it was not dumped correctly.\n\n" + fi + +done + diff --git a/util/scripts/dtd_parser.py b/util/scripts/dtd_parser.py new file mode 100755 index 0000000..23cc7e7 --- /dev/null +++ b/util/scripts/dtd_parser.py @@ -0,0 +1,213 @@ +#!/usr/bin/python +# dtd_parser.py - DTD structure parser +# +# Copyright (C) 2012 The ChromiumOS Authors. All rights reserved. +# +# 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; version 2 of the License +# +# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +''' +DTD string parser/generator. + +Detailed timing descriptor (DTD) is an 18 byte array describing video mode +(screen resolution, display properties, etc.) in EDID and used by Intel Option +ROM. Option ROM can support multiple video modes, specific mode is picked by +the BIOS through the appropriate Option ROM callback function. + +This program allows to interpret the 18 byte hex DTD dump, and/or modify +certain values and generate a new DTD. +''' + +import sys + +# +# The DTD array format description can be found in +# http://en.wikipedia.org/wiki/Extended_display_identification_data, (see the +# EDID Detailed Timing Descriptor section). +# +# The below dictionary describes how different DTD parameters are laid out in +# the array. Note that many parameters span multiple bit fields in the DTD. +# +# The keys in the dictionary are stings (field names), the values are tuples +# of either numbers or tri-tuples. If the element of the tuple is a number, it +# is the offset in DTD, and the entire byte is used in this field. If the +# element is a tri-tuple, its components are (DTD offset, bit shift, field +# width). +# +# The partial values are extracted from the DTD fields and concatenated +# together to form actual parameter value. +# + +dtd_descriptor = { + 'dclck' : (1, 0), + 'hor_active' : ((4, 4, 4), 2), + 'hor_blank' : ((4, 0, 4), 3), + 'vert_act' : ((7, 4, 4), 5), + 'vert_blank' : ((7, 0, 4), 6), + 'hsync_offset' : ((11, 6, 2), 8), + 'hsync_pulse_width' : ((11, 4, 2), 9), + 'vsync_offset' : ((11, 2, 2), (10, 4, 4)), + 'vsync_pulse_width' : ((11, 0, 2), (10, 0, 4)), + 'hor_image_size' : ((14, 4, 4), 12), + 'vert_image_size' : ((14, 0, 4), 13), + 'hor_border' : (15,), + 'vert_border' : (16,), + 'interlaced' : ((17, 7, 1),), + 'reserved' : ((17, 5, 2), (17, 0, 1)), + 'digital_separate' : ((17, 3, 2),), + 'vert_polarity' : ((17, 2, 1),), + 'hor_polarity' : ((17, 1, 1),), + } + +PREFIX = 'attr_' + +class DTD(object): + '''An object containing all DTD information. + + The attributes are created dynamically when the input DTD string is + parsed. For each element of the above dictionary two attributes are added: + + 'attr_<param>' to hold the actual parameter value + 'max_attr_<param>' to hold the maximum allowed value for this parameter. + ''' + + def __init__(self): + for name in dtd_descriptor: + setattr(self, PREFIX + name, 0) + + def init(self, sarray): + '''Initialize the object with values from a DTD array. + + Inputs: + + sarray: a string, an array of ASCII hex representations of the 18 DTD + bytes. + + Raises: implicitly raises ValueError or IndexError exceptions in case + the input string has less than 18 elements, or some of the + elements can not be converted to integer. + ''' + + harray = [int(x, 16) for x in sarray] + for name, desc in dtd_descriptor.iteritems(): + attr_value = 0 + total_width = 0 + for tup in desc: + if isinstance(tup, tuple): + offset, shift, width = tup + else: + offset, shift, width = tup, 0, 8 + + mask = (1 << width) - 1 + attr_value = (attr_value << width) + ( + (harray[offset] >> shift) & mask) + total_width += width + setattr(self, PREFIX + name, attr_value) + setattr(self, 'max_' + PREFIX + name, (1 << total_width) - 1) + + def __str__(self): + text = [] + for name in sorted(dtd_descriptor.keys()): + text.append('%20s: %d' % (name, getattr(self, PREFIX + name))) + return '\n'.join(text) + + def inhex(self): + '''Generate contents of the DTD as a 18 byte ASCII hex array.''' + + result = [0] * 18 + for name, desc in dtd_descriptor.iteritems(): + attr_value = getattr(self, PREFIX + name) + rdesc = list(desc) + rdesc.reverse() + for tup in rdesc: + if isinstance(tup, tuple): + offset, shift, width = tup + else: + offset, shift, width = tup, 0, 8 + + mask = (1 << width) - 1 + value = attr_value & mask + attr_value = attr_value >> width + result[offset] = (result[offset] & ~( + mask << shift)) | (value << shift) + + return ' '.join('%2.2x' % x for x in result) + + def handle_input(self, name): + '''Get user input and set a new parameter value if required. + + Display the parameter name, its current value, and prompt user for a + new value. + + If the user enters a dot, stop processing (return True). + + Empty user input means that this parameter does not have to change, + but the next parameter should be prompted. + + If input is non-empty, it is interpreted as a hex number, checked if + it fits the parameter and the new parameter value is set if checks + pass. + + Inputs: + + name - a string, parameter name, a key in dtd_descriptor + + Returns: + + Boolean, True meaning no more field are required to be modified, False + meaning that more field mods need to be prompted.. + ''' + + param = PREFIX + name + vmax = getattr(self, 'max_' + param) + new_value = raw_input('%s : %d ' % (name, getattr(self, param))) + if new_value == '': + return False + if new_value == '.': + return True + new_int = int(new_value) + if new_int > vmax: + print '%s exceeds maximum for %s (%d)' % (new_value, name, vmax) + else: + setattr(self, param, new_int) + return False + +def main(args): + if args[0] == '-m': + modify = True + base = 1 + else: + modify = False + base = 0 + + d = DTD() + d.init(args[base:]) + if modify: + for line in str(d).splitlines(): + if d.handle_input(line.split(':')[0].strip()): + break + print d + if modify: + print d.inhex() + + +if __name__ == '__main__': + try: + main(sys.argv[1:]) + except (ValueError, IndexError): + print """ +A string of 18 byte values in hex is required. +'-m' preceding the string will allow setting new parameter values. +""" + sys.exit(1) diff --git a/util/scripts/exynos_fixed_cksum.py b/util/scripts/exynos_fixed_cksum.py new file mode 100755 index 0000000..66da060 --- /dev/null +++ b/util/scripts/exynos_fixed_cksum.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# Copyright (C) 2013 Google Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +""" +This utility computes and fills Exynos ROM checksum (for BL1 or BL2). +(Algorithm from U-Boot: tools/mkexynosspl.c) + +Input: IN OUT DATA_SIZE + +Output: + + IN padded out to DATA_SIZE, checksum at the end, written to OUT. +""" + +import struct +import sys + +def main(argv): + if len(argv) != 4: + exit('usage: %s IN OUT DATA_SIZE' % argv[0]) + + in_name, out_name = argv[1:3] + size = int(argv[3], 0) + checksum_format = "<I" + with open(in_name, "rb") as in_file, open(out_name, "wb") as out_file: + data = in_file.read() + checksum_size = struct.calcsize(checksum_format) + data_size = size - checksum_size + assert len(data) <= data_size + checksum = struct.pack(checksum_format, sum(map(ord, data))) + out_file.write(data + bytearray(data_size - len(data)) + checksum) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/util/scripts/exynos_variable_cksum.py b/util/scripts/exynos_variable_cksum.py new file mode 100755 index 0000000..75cdc74 --- /dev/null +++ b/util/scripts/exynos_variable_cksum.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# Copyright (C) 2013 Google Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +""" +This utility computes and fills Exynos ROM checksum (for BL1 or BL2). +(Algorithm from U-Boot: tools/mkexynosspl.c) + +Input: IN OUT + +Output: + + Checksum header added to IN and written to OUT. + Header: uint32_t size, checksum, reserved[2]. +""" + +import struct +import sys + +def main(argv): + if len(argv) != 3: + exit('usage: %s IN OUT' % argv[0]) + + in_name, out_name = argv[1:3] + header_format = "<IIII" + with open(in_name, "rb") as in_file, open(out_name, "wb") as out_file: + data = in_file.read() + header = struct.pack(header_format, + struct.calcsize(header_format) + len(data), + sum(map(ord, data)), + 0, 0) + out_file.write(header + data) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/util/scripts/find_usbdebug.sh b/util/scripts/find_usbdebug.sh new file mode 100755 index 0000000..2f82219 --- /dev/null +++ b/util/scripts/find_usbdebug.sh @@ -0,0 +1,149 @@ +#!/bin/sh + +# Copyright 2008 Carl-Daniel Hailfinger +# Copyright 2015 Stefan Tauner +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# 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. + +LANG=C +# Some tools emmit errors that don't matter (bugs in lspci/PCI firmware and lsusb). +# To shown them anyway (e.g. for debugging) comment next line. +exec 2>/dev/null + +if [ "$1" = "-h" ]; then + printf "Usage: $0 [-h | path to dmesg log] + +This script tries to find USB ports compatible with USB2/EHCI debug devices and +helps you to find their physical locations. To that end, attach at least one +uniquely identifiable device to a USB port and run this script. The device needs +to be visible in the output of "lsusb -t" (debug devices are often *not*!). + +After determining compatibility of the USB controllers the script will print the +devices attached to the debug port as shown by lsusb. If nothing shows up simply +switch ports and repeat the process. + +Note: usually only one port is supported for debugging.\n" + exit 0 +fi +uid=`id -u` +if [ "$uid" -ne 0 ]; then + echo "Must be run as root. Exiting." + exit 1 +fi +dmesgfile=$1 + +find_devs_in_tree () { + bus=$1 + port=$2 + busstr=`printf "Bus %02d" "$bus"` + portstr="Port $port" + + found= + # Iterate over the output of lsusb -t because it contains the physical port names + while IFS='' read -r line; do + # We need to keep track of the current bus "branch" + # Look out for lines starting with /: (that indicate a bus) + if [ "${line#*/:}" != "$line" ]; then + if [ "${line#*$busstr}" != "$line" ]; then + cur_bus=$busstr + else + cur_bus= + fi + continue + fi + + # Skip all lines not belonging to the wanted bus number + if [ "$cur_bus" != "$busstr" ]; then + continue + fi + + # check for matching physical USB port, and take only IF 0 into account + if [ "${line#*$portstr}" != "$line" -a "${line#*If 0}" != "$line" ]; then + dev=`echo ${line#*Dev } | cut -d ',' -f 1` + lsusb -s "$bus":"$dev" + found="yes" + fi + done<< EOF +$(lsusb -t) +EOF + if [ -z "$found" ]; then + echo "none" + fi +} + +debug_lspci_devs=`lspci -nvvD | + grep -i "^[0-9a-f]|debug port" | + grep -iB1 --no-group-separator "debug port" | + grep -vi "debug port" | + cut -f 1 -d" " | + sort | + xargs echo` + +if [ -z "$debug_lspci_devs" ]; then + printf "No USB controller with debug capability found by lspci.\n +Possible reasons: lspci too old, USB controller does not support a debug device, ... Exiting.\n" + exit 1 +fi +printf "The following PCI devices support a USB debug port (says lspci): $debug_lspci_devs\n" + +debug_dmesg_devs_with_port=`( test -z "$dmesgfile" && + dmesg || + cat "$dmesgfile") | + grep -i "ehci.*debug port" | + sed "s/.* ([0-9a-f]*:*[0-9a-f]{2}:[0-9a-f]{2}.[0-9a-f]).*ebug port /\1 /" | + sort` + +debug_dmesg_devs=`echo "$debug_dmesg_devs_with_port" | + cut -f 1 -d" " | + xargs echo` + +if [ -z "$debug_dmesg_devs" ]; then + printf "dmesg does not show any supported ports.\n +Possible reasons: dmesg scrolled off, kernel too old, USB controller does not support a debug device, ... Exiting.\n +Note: You can specify a file containing kernel messages as an argument to this program (e.g. /var/log/dmesg)." + exit 1 +fi + +if [ "$debug_lspci_devs" != "$debug_dmesg_devs" ]; then + echo "lspci and the kernel do not agree on USB debug device support. Exiting." + exit 1 +fi + +printf "and the kernel agrees, good.\n\n" + +while true; do + for dev in $debug_dmesg_devs; do + bus=`lsusb -v | + grep "^Bus|iSerial.*" | + grep -B1 --no-group-separator "iSerial.*$dev" | + grep "^Bus" | + sed "s/Bus *0*([0-9a-f]*).*/\1/"` + port=`echo "$debug_dmesg_devs_with_port" | + grep "^$dev" | + cut -f 2 -d" "` + + echo "Device(s) currently connected to the debug-capable port $port on PCI device $dev, USB bus $bus:" + + find_devs_in_tree $bus $port + echo + done + + echo "Enter 'q' to abort or anything else to repeat" + read r + if [ $? -ne 0 -o "$r" = "q" ]; then + break; + fi +done + +return 0 diff --git a/util/scripts/genbuild_h.sh b/util/scripts/genbuild_h.sh new file mode 100755 index 0000000..55a3b85 --- /dev/null +++ b/util/scripts/genbuild_h.sh @@ -0,0 +1,64 @@ +#!/bin/sh + +# This file is part of the coreboot project. +# +# Copyright (C) 2014 Sage Electronic Engineering, LLC. +# +# 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; version 2 of the License. +# +# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +DATE="" +GITREV="" +TIMESOURCE="" +if [ -d "${top}/.git" ] && [ -f "$(command -v git)" ]; then + GITREV=$(LANG= git log remotes/origin/master -1 --format=format:%h) + TIMESOURCE=git + DATE=$(git log --pretty=format:%ct -1) +else + GITREV=Unknown + TIMESOURCE="LANG= TZ=UTC date" + DATE=$(date +%s) +fi + +our_date() { +case $(uname) in +NetBSD|OpenBSD|DragonFly|FreeBSD) + TZ=UTC date -r $1 $2 + ;; +*) + TZ=UTC date -d @$1 $2 +esac +} + +#Print out the information that goes into build.h +printf "/* build system definitions (autogenerated) */\n" +printf "#ifndef __BUILD_H\n" +printf "#define __BUILD_H\n\n" +printf "#define COREBOOT_VERSION %s\n" ""$KERNELVERSION"" + +#See if the build is running in a git repo and the git command is available +printf "/* timesource: $TIMESOURCE */\n" +printf "#define COREBOOT_VERSION_TIMESTAMP $DATE\n" +printf "#define COREBOOT_ORIGIN_GIT_REVISION "$GITREV"\n" + +printf "#define COREBOOT_EXTRA_VERSION "%s"\n" "$COREBOOT_EXTRA_VERSION" +printf "#define COREBOOT_BUILD "$(LANG= our_date "$DATE")"\n" +printf "#define COREBOOT_BUILD_YEAR_BCD 0x$(our_date "$DATE" +%y)\n" +printf "#define COREBOOT_BUILD_MONTH_BCD 0x$(our_date "$DATE" +%m)\n" +printf "#define COREBOOT_BUILD_DAY_BCD 0x$(our_date "$DATE" +%d)\n" +printf "#define COREBOOT_BUILD_WEEKDAY_BCD 0x$(our_date "$DATE" +%w)\n" +printf "#define COREBOOT_DMI_DATE "$(our_date "$DATE" +%m/%d/%Y)"\n" +printf "\n" +printf "#define COREBOOT_COMPILE_TIME "$(our_date "$DATE" +%T)"\n" +printf "#endif\n" diff --git a/util/scripts/ipqheader.py b/util/scripts/ipqheader.py new file mode 100755 index 0000000..eb1a316 --- /dev/null +++ b/util/scripts/ipqheader.py @@ -0,0 +1,130 @@ +#!/usr/bin/python +# +# Copyright (c) 2013 The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import os +import struct +import sys + +PROG_NAME = os.path.basename(sys.argv[0]) + +def create_header(base, size): + """Returns a packed MBN header image with the specified base and size. + + @arg base: integer, specifies the image load address in RAM + @arg size: integer, specifies the size of the image + @returns: string, the MBN header + """ + + # SBLs require size to be 4 bytes aligned. + size = (size + 3) & 0xfffffffc + + # We currently do not support appending certificates. Signing GPL + # code might violate the GPL. So U-Boot will never be signed. So + # this is not required for U-Boot. + + header = [ + 0x5, # Type: APPSBL + 0x3, # Version: 3 + 0x0, # Image source pointer + base, # Image destination pointer + size, # Code Size + Cert Size + Signature Size + size, # Code Size + base + size, # Destination + Code Size + 0x0, # Signature Size + base + size, # Destination + Code Size + Signature Size + 0x0, # Cert Size + ] + + header_packed = struct.pack('<10I', *header) + return header_packed + +def mkheader(base_addr, infname, outfname): + """Prepends the image with the MBN header. + + @arg base_addr: integer, specifies the image load address in RAM + @arg infname: string, image filename + @arg outfname: string, output image with header prepended + @raises IOError: if reading/writing input/output file fails + """ + with open(infname, "rb") as infp: + image = infp.read() + insize = len(image) + + if base_addr > 0xFFFFFFFF: + raise ValueError("invalid base address") + + if base_addr + insize > 0xFFFFFFFF: + raise ValueError("invalid destination range") + + header = create_header(base_addr, insize) + with open(outfname, "wb") as outfp: + outfp.write(header) + outfp.write(image) + +def usage(msg=None): + """Print command usage. + + @arg msg: string, error message if any (default: None) + """ + if msg != None: + sys.stderr.write("%s: %s\n" % (PROG_NAME, msg)) + + print "Usage: %s <base-addr> <input-file> <output-file>" % PROG_NAME + + if msg != None: + exit(1) + +def main(): + """Main entry function""" + + if len(sys.argv) != 4: + usage("incorrect number of arguments") + + try: + base_addr = int(sys.argv[1], 0) + infname = sys.argv[2] + outfname = sys.argv[3] + except ValueError as e: + sys.stderr.write("mkheader: invalid base address '%s'\n" % sys.argv[1]) + exit(1) + + try: + mkheader(base_addr, infname, outfname) + except IOError as e: + sys.stderr.write("%s: %s\n" % (PROG_NAME, e)) + exit(1) + except ValueError as e: + sys.stderr.write("%s: %s\n" % (PROG_NAME, e)) + exit(1) + +if __name__ == "__main__": + main() + diff --git a/util/scripts/rk_make_idb.py b/util/scripts/rk_make_idb.py new file mode 100755 index 0000000..26e26b8 --- /dev/null +++ b/util/scripts/rk_make_idb.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python +# +# Copyright (c) 2014 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +""" +Creates a Rockchip ID Block (IDB), optionally RC4 encrypted and aligned +""" + +import struct +import sys +from io import SEEK_SET, SEEK_END + +class IDBTool: + def __init__(self): + print "Initialize IDBTool" + + def p_rc4(self, buf, length): + key = (124,78,3,4,85,5,9,7,45,44,123,56,23,13,23,17) + K = key * 16 + S = [i for i in range(256)] + + j = 0 + for i in range(256): + j = (j + S[i] + K[i]) % 256 + temp = S[i]; S[i] = S[j]; S[j] = temp; + + i = j = k = 0 + for x in range(length): + i = (i+1) % 256 + j = (j + S[i]) % 256 + temp = S[i]; S[i] = S[j]; S[j] = temp + k = (S[i] + S[j]) % 256 + buf[x] = struct.pack('B', ord(buf[x]) ^ S[k]) + + def makeIDB(self, from_file, to_file, rc4_flag = False, align_flag = False): + try: + fin = open(from_file, 'rb') + except: + sys.exit("Failed to open file : " + from_file) + + try: + fin.seek(0, SEEK_END) + if (fin.tell() > 4 * 1024 * 1024): + sys.exit("Input file is more than 4MB") + fin.seek(0) + data = fin.read() + finally: + fin.close() + + data_len = len(data) + SECTOR_SIZE = 512 + PAGE_ALIGN = 4 + sectors = (data_len + 4 - 1) / SECTOR_SIZE + 1 + pages = (sectors - 1) / PAGE_ALIGN + 1 + sectors = pages * PAGE_ALIGN; + + buf = [B'\0'] * sectors * SECTOR_SIZE + buf[:4] = "RK32" + buf[4 : 4+data_len] = data + + idblock = [B'\0'] * 4 * SECTOR_SIZE + blank = [B'\0'] * 4 * SECTOR_SIZE + idblock[:4] = ['\x55', '\xAA', '\xF0', '\x0F'] + + if (not rc4_flag): + idblock[8:12] = struct.pack("<I", 1) + else: + for i in range(sectors): + list_tmp = buf[SECTOR_SIZE*i : SECTOR_SIZE*(i+1)] + self.p_rc4(list_tmp, SECTOR_SIZE) + buf[SECTOR_SIZE*i : SECTOR_SIZE*(i+1)] = list_tmp + + idblock[12:16] = struct.pack("<HH", 4, 4); + idblock[506:510] = struct.pack("<HH", sectors, sectors); + self.p_rc4(idblock, SECTOR_SIZE) + + try: + fout = open(to_file, "wb+") + except: + sys.exit("Failed to open output file : " + to_file) + + try: + if (align_flag): + fout.write(''.join(idblock)) + fout.write(''.join(blank)) + + for s in xrange(0, sectors * SECTOR_SIZE, PAGE_ALIGN * SECTOR_SIZE): + fout.write(''.join(buf[s : s + PAGE_ALIGN * SECTOR_SIZE])) + fout.write(''.join(blank)) + else: + fout.write(''.join(idblock)) + fout.write(''.join(buf)) + fout.flush() + except: + sys.exit("Failed to write data to : " + to_file) + finally: + fout.close() + print "DONE" + +def usage(): + print "Usage: make_idb.py [--enable-rc4] [--enable-align] [--to=out] --from=in" + +if __name__ == '__main__': + rc4_flag = align_flag = False + to_file = "IDBlock.bin" + + for para in sys.argv[1:]: + if (para == "--enable-rc4"): + rc4_flag = True + elif (para == "--enable-align"): + align_flag = True + elif (para.startswith("--to=")): + to_file = para.split('=')[1] + elif (para.startswith("--from=")): + from_file = para.split('=')[1] + elif (para == "--help" or para == "-h"): + usage() + sys.exit() + else: + usage() + sys.exit() + if ('from_file' not in vars() or to_file == ''): + usage() + sys.exit() + + idbtool = IDBTool() + idbtool.makeIDB(from_file, to_file, rc4_flag, align_flag) diff --git a/util/scripts/xcompile b/util/scripts/xcompile new file mode 100755 index 0000000..5809ec0 --- /dev/null +++ b/util/scripts/xcompile @@ -0,0 +1,269 @@ +#!/bin/bash +# +# This file is part of the coreboot project. +# +# Copyright (C) 2007-2010 coresystems GmbH +# Copyright (C) 2012 Google 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; version 2 of the License. +# +# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +TMPFILE="" +XGCCPATH=${1:-"`pwd`/util/crossgcc/xgcc/bin/"} + +die() { + echo "ERROR: $*" >&2 + exit 1 +} + +clean_up() { + if [ -n "$TMPFILE" ]; then + rm -f "$TMPFILE" "$TMPFILE.c" "$TMPFILE.o" + fi +} + +# Create temporary file(s). +TMPFILE="$(mktemp /tmp/temp.XXXX 2>/dev/null || echo /tmp/temp.78gOIUGz)" +touch "$TMPFILE" +trap clean_up EXIT + + +program_exists() { + type "$1" >/dev/null 2>&1 +} + + +if [ "$(${XGCCPATH}/iasl 2>/dev/null | grep -c ACPI)" -gt 0 ]; then + IASL=${XGCCPATH}iasl +elif [ "$(iasl 2>/dev/null | grep -c ACPI)" -gt 0 ]; then + IASL=iasl +else + die "no iasl found" +fi + +if program_exists gcc; then + HOSTCC=gcc +elif program_exists cc; then + HOSTCC=cc +else + die "no host compiler found" +fi + +cat <<EOF +# platform agnostic and host tools +IASL:=${IASL} +HOSTCC:=${HOSTCC} + +EOF + +testcc() { + local tmp_c="$TMPFILE.c" + local tmp_o="$TMPFILE.o" + rm -f "$tmp_c" "$tmp_o" + echo "void _start(void) {}" >"$tmp_c" + "$1" -nostdlib -Werror $2 "$tmp_c" -o "$tmp_o" >/dev/null 2>&1 +} + +testas() { + local gccprefixes="$1" + local twidth="$2" + local arch="$3" + local use_dash_twidth="$4" + local obj_file="$TMPFILE.o" + local full_arch="elf$twidth-$arch" + + rm -f "$obj_file" + [ -n "$use_dash_twidth" ] && use_dash_twidth="--$twidth" + ${gccprefixes}as $use_dash_twidth -o "$obj_file" $TMPFILE 2>/dev/null || + return 1 + + # Check output content type. + local obj_type="$(${gccprefixes}objdump -p $obj_file)" + local obj_arch="$(expr "$obj_type" : '.*format (.[a-z0-9-]*)')" + [ "$obj_arch" = "$full_arch" ] || return 1 + + # Architecture matched. + GCCPREFIX="$gccprefixes" + + if [ -z "$use_dash_twidth" ]; then + ASFLAGS="" + CFLAGS="" + LDFLAGS="" + else + ASFLAGS="--$twidth" + CFLAGS="-m$twidth" + LDFLAGS="-b $full_arch" + + fi + + # Special parameters only available in dash_twidth mode. + [ -n "$use_dash_twidth" ] && case "$full_arch" in + "elf32-i386" ) + LDFLAGS="$LDFLAGS -melf_i386" + CFLAGS="$CFLAGS -Wl,-b,elf32-i386 -Wl,-melf_i386" + ;; + esac + + return 0 +} + +detect_special_flags() { + local architecture="$1" + # GCC 4.6 is much more picky about unused variables. + # Turn off it's warnings for now: + testcc "$CC" "$CFLAGS -Wno-unused-but-set-variable " && + CFLAGS="$CFLAGS -Wno-unused-but-set-variable " + + # Use bfd linker instead of gold if available: + testcc "$CC" "$CFLAGS -fuse-ld=bfd" && + CFLAGS="$CFLAGS -fuse-ld=bfd" && LINKER_SUFFIX='.bfd' + + testcc "$CC" "$CFLAGS -fno-stack-protector"&& + CFLAGS="$CFLAGS -fno-stack-protector" + testcc "$CC" "$CFLAGS -Wl,--build-id=none" && + CFLAGS="$CFLAGS -Wl,--build-id=none" + + case "$architecture" in + x86) + testcc "$CC" "$CFLAGS -Wa,--divide" && + CFLAGS="$CFLAGS -Wa,--divide" + # Always build for i686 -- no sse/mmx instructions since SMM + # modules are compiled using these flags. Note that this + # doesn't prevent a project using xcompile to explicitly + # specify -mmsse, etc flags. + CFLAGS="$CFLAGS -march=i686" + ;; + mipsel) + testcc "$CC" "$CFLAGS -mno-abicalls -fno-pic" && \ + CFLAGS+=" -mno-abicalls -fno-pic" + ;; + esac +} + +report_arch_toolchain() { + cat <<EOF +# elf${TWIDTH}-${TBFDARCH} toolchain (${GCCPREFIX}gcc) +ARCH_SUPPORTED+=${TARCH} +SUBARCH_SUPPORTED+=${TSUPP-${TARCH}} +CC_${TARCH}:=${GCCPREFIX}gcc +CFLAGS_${TARCH}:=${CFLAGS} +CPP_${TARCH}:=${GCCPREFIX}cpp +AS_${TARCH}:=${GCCPREFIX}as ${ASFLAGS} +LD_${TARCH}:=${GCCPREFIX}ld${LINKER_SUFFIX} ${LDFLAGS} +NM_${TARCH}:=${GCCPREFIX}nm +OBJCOPY_${TARCH}:=${GCCPREFIX}objcopy +OBJDUMP_${TARCH}:=${GCCPREFIX}objdump +READELF_${TARCH}:=${GCCPREFIX}readelf +STRIP_${TARCH}:=${GCCPREFIX}strip +AR_${TARCH}:=${GCCPREFIX}ar + +EOF +} + +# Architecture definition +SUPPORTED_ARCHITECTURE="x86 arm arm64 riscv mipsel" + +arch_config_arm() { + TARCH="arm" + TBFDARCHS="littlearm" + TCLIST="armv7a armv7-a" + TWIDTH="32" + TSUPP="arm armv4 armv7" + TABI="eabi" +} + +arch_config_arm64() { + TARCH="arm64" + TBFDARCHS="littleaarch64" + TCLIST="aarch64" + TWIDTH="64" + TSUPP="arm64 armv8_64" + TABI="elf" +} + +arch_config_riscv() { + TARCH="riscv" + TBFDARCHS="littleriscv" + TCLIST="riscv" + TWIDTH="64" + TABI="elf" +} + +arch_config_x86() { + TARCH="x86_32" + TBFDARCHS="i386" + TCLIST="i386 x86_64" + TWIDTH="32" + TABI="elf" +} + +arch_config_mipsel() { + TARCH="mips" + TBFDARCHS="tradlittlemips littlemips" + TCLIST="mipsel" + TWIDTH="32" + TSUPP="mips mipsel" + TABI="elf" +} + +test_architecture() { + architecture=$1 + + GCCPREFIX="invalid" + unset TARCH TBFDARCH TCLIST TWIDTH TSUPP TABI + if type arch_config_$architecture > /dev/null; then + arch_config_$architecture + else + die "no architecture definition for $architecture" + fi + + # To override toolchain, define CROSS_COMPILE_$arch or CROSS_COMPILE as + # environment variable. + # Ex: CROSS_COMPILE_arm="armv7a-cros-linux-gnueabi-" + # CROSS_COMPILE_x86="i686-pc-linux-gnu-" + search="$(eval echo $CROSS_COMPILE_$architecture 2>/dev/null)" + search="$search $CROSS_COMPILE" + for toolchain in $TCLIST; do + search="$search $XGCCPATH$toolchain-$TABI-" + search="$search $toolchain-$TABI-" + search="$search $toolchain-linux-gnu-" + search="$search $toolchain-" + done + echo "# $architecture TARCH_SEARCH=$search" + + # Search toolchain by checking assembler capability. + for TBFDARCH in $TBFDARCHS; do + for gccprefixes in $search ""; do + program_exists "${gccprefixes}as" || continue + testas "$gccprefixes" "$TWIDTH" "$TBFDARCH" "" && break + testas "$gccprefixes" "$TWIDTH" "$TBFDARCH" "TRUE" && break + done + [ "$GCCPREFIX" = "invalid" ] || break + done + + if [ "$GCCPREFIX" = "invalid" ]; then + echo "Warning: no suitable GCC for $architecture." >&2 + continue + fi + CC="${GCCPREFIX}"gcc + + detect_special_flags "$architecture" + report_arch_toolchain +} + +# This loops over all supported architectures. +for architecture in $SUPPORTED_ARCHITECTURE; do + test_architecture $architecture +done + diff --git a/util/xcompile/xcompile b/util/xcompile/xcompile deleted file mode 100755 index 5809ec0..0000000 --- a/util/xcompile/xcompile +++ /dev/null @@ -1,269 +0,0 @@ -#!/bin/bash -# -# This file is part of the coreboot project. -# -# Copyright (C) 2007-2010 coresystems GmbH -# Copyright (C) 2012 Google 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; version 2 of the License. -# -# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -TMPFILE="" -XGCCPATH=${1:-"`pwd`/util/crossgcc/xgcc/bin/"} - -die() { - echo "ERROR: $*" >&2 - exit 1 -} - -clean_up() { - if [ -n "$TMPFILE" ]; then - rm -f "$TMPFILE" "$TMPFILE.c" "$TMPFILE.o" - fi -} - -# Create temporary file(s). -TMPFILE="$(mktemp /tmp/temp.XXXX 2>/dev/null || echo /tmp/temp.78gOIUGz)" -touch "$TMPFILE" -trap clean_up EXIT - - -program_exists() { - type "$1" >/dev/null 2>&1 -} - - -if [ "$(${XGCCPATH}/iasl 2>/dev/null | grep -c ACPI)" -gt 0 ]; then - IASL=${XGCCPATH}iasl -elif [ "$(iasl 2>/dev/null | grep -c ACPI)" -gt 0 ]; then - IASL=iasl -else - die "no iasl found" -fi - -if program_exists gcc; then - HOSTCC=gcc -elif program_exists cc; then - HOSTCC=cc -else - die "no host compiler found" -fi - -cat <<EOF -# platform agnostic and host tools -IASL:=${IASL} -HOSTCC:=${HOSTCC} - -EOF - -testcc() { - local tmp_c="$TMPFILE.c" - local tmp_o="$TMPFILE.o" - rm -f "$tmp_c" "$tmp_o" - echo "void _start(void) {}" >"$tmp_c" - "$1" -nostdlib -Werror $2 "$tmp_c" -o "$tmp_o" >/dev/null 2>&1 -} - -testas() { - local gccprefixes="$1" - local twidth="$2" - local arch="$3" - local use_dash_twidth="$4" - local obj_file="$TMPFILE.o" - local full_arch="elf$twidth-$arch" - - rm -f "$obj_file" - [ -n "$use_dash_twidth" ] && use_dash_twidth="--$twidth" - ${gccprefixes}as $use_dash_twidth -o "$obj_file" $TMPFILE 2>/dev/null || - return 1 - - # Check output content type. - local obj_type="$(${gccprefixes}objdump -p $obj_file)" - local obj_arch="$(expr "$obj_type" : '.*format (.[a-z0-9-]*)')" - [ "$obj_arch" = "$full_arch" ] || return 1 - - # Architecture matched. - GCCPREFIX="$gccprefixes" - - if [ -z "$use_dash_twidth" ]; then - ASFLAGS="" - CFLAGS="" - LDFLAGS="" - else - ASFLAGS="--$twidth" - CFLAGS="-m$twidth" - LDFLAGS="-b $full_arch" - - fi - - # Special parameters only available in dash_twidth mode. - [ -n "$use_dash_twidth" ] && case "$full_arch" in - "elf32-i386" ) - LDFLAGS="$LDFLAGS -melf_i386" - CFLAGS="$CFLAGS -Wl,-b,elf32-i386 -Wl,-melf_i386" - ;; - esac - - return 0 -} - -detect_special_flags() { - local architecture="$1" - # GCC 4.6 is much more picky about unused variables. - # Turn off it's warnings for now: - testcc "$CC" "$CFLAGS -Wno-unused-but-set-variable " && - CFLAGS="$CFLAGS -Wno-unused-but-set-variable " - - # Use bfd linker instead of gold if available: - testcc "$CC" "$CFLAGS -fuse-ld=bfd" && - CFLAGS="$CFLAGS -fuse-ld=bfd" && LINKER_SUFFIX='.bfd' - - testcc "$CC" "$CFLAGS -fno-stack-protector"&& - CFLAGS="$CFLAGS -fno-stack-protector" - testcc "$CC" "$CFLAGS -Wl,--build-id=none" && - CFLAGS="$CFLAGS -Wl,--build-id=none" - - case "$architecture" in - x86) - testcc "$CC" "$CFLAGS -Wa,--divide" && - CFLAGS="$CFLAGS -Wa,--divide" - # Always build for i686 -- no sse/mmx instructions since SMM - # modules are compiled using these flags. Note that this - # doesn't prevent a project using xcompile to explicitly - # specify -mmsse, etc flags. - CFLAGS="$CFLAGS -march=i686" - ;; - mipsel) - testcc "$CC" "$CFLAGS -mno-abicalls -fno-pic" && \ - CFLAGS+=" -mno-abicalls -fno-pic" - ;; - esac -} - -report_arch_toolchain() { - cat <<EOF -# elf${TWIDTH}-${TBFDARCH} toolchain (${GCCPREFIX}gcc) -ARCH_SUPPORTED+=${TARCH} -SUBARCH_SUPPORTED+=${TSUPP-${TARCH}} -CC_${TARCH}:=${GCCPREFIX}gcc -CFLAGS_${TARCH}:=${CFLAGS} -CPP_${TARCH}:=${GCCPREFIX}cpp -AS_${TARCH}:=${GCCPREFIX}as ${ASFLAGS} -LD_${TARCH}:=${GCCPREFIX}ld${LINKER_SUFFIX} ${LDFLAGS} -NM_${TARCH}:=${GCCPREFIX}nm -OBJCOPY_${TARCH}:=${GCCPREFIX}objcopy -OBJDUMP_${TARCH}:=${GCCPREFIX}objdump -READELF_${TARCH}:=${GCCPREFIX}readelf -STRIP_${TARCH}:=${GCCPREFIX}strip -AR_${TARCH}:=${GCCPREFIX}ar - -EOF -} - -# Architecture definition -SUPPORTED_ARCHITECTURE="x86 arm arm64 riscv mipsel" - -arch_config_arm() { - TARCH="arm" - TBFDARCHS="littlearm" - TCLIST="armv7a armv7-a" - TWIDTH="32" - TSUPP="arm armv4 armv7" - TABI="eabi" -} - -arch_config_arm64() { - TARCH="arm64" - TBFDARCHS="littleaarch64" - TCLIST="aarch64" - TWIDTH="64" - TSUPP="arm64 armv8_64" - TABI="elf" -} - -arch_config_riscv() { - TARCH="riscv" - TBFDARCHS="littleriscv" - TCLIST="riscv" - TWIDTH="64" - TABI="elf" -} - -arch_config_x86() { - TARCH="x86_32" - TBFDARCHS="i386" - TCLIST="i386 x86_64" - TWIDTH="32" - TABI="elf" -} - -arch_config_mipsel() { - TARCH="mips" - TBFDARCHS="tradlittlemips littlemips" - TCLIST="mipsel" - TWIDTH="32" - TSUPP="mips mipsel" - TABI="elf" -} - -test_architecture() { - architecture=$1 - - GCCPREFIX="invalid" - unset TARCH TBFDARCH TCLIST TWIDTH TSUPP TABI - if type arch_config_$architecture > /dev/null; then - arch_config_$architecture - else - die "no architecture definition for $architecture" - fi - - # To override toolchain, define CROSS_COMPILE_$arch or CROSS_COMPILE as - # environment variable. - # Ex: CROSS_COMPILE_arm="armv7a-cros-linux-gnueabi-" - # CROSS_COMPILE_x86="i686-pc-linux-gnu-" - search="$(eval echo $CROSS_COMPILE_$architecture 2>/dev/null)" - search="$search $CROSS_COMPILE" - for toolchain in $TCLIST; do - search="$search $XGCCPATH$toolchain-$TABI-" - search="$search $toolchain-$TABI-" - search="$search $toolchain-linux-gnu-" - search="$search $toolchain-" - done - echo "# $architecture TARCH_SEARCH=$search" - - # Search toolchain by checking assembler capability. - for TBFDARCH in $TBFDARCHS; do - for gccprefixes in $search ""; do - program_exists "${gccprefixes}as" || continue - testas "$gccprefixes" "$TWIDTH" "$TBFDARCH" "" && break - testas "$gccprefixes" "$TWIDTH" "$TBFDARCH" "TRUE" && break - done - [ "$GCCPREFIX" = "invalid" ] || break - done - - if [ "$GCCPREFIX" = "invalid" ]; then - echo "Warning: no suitable GCC for $architecture." >&2 - continue - fi - CC="${GCCPREFIX}"gcc - - detect_special_flags "$architecture" - report_arch_toolchain -} - -# This loops over all supported architectures. -for architecture in $SUPPORTED_ARCHITECTURE; do - test_architecture $architecture -done -