summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/tools
diff options
context:
space:
mode:
authorYang Zhang <yang.z.zhang@intel.com>2015-08-28 09:58:54 +0800
committerYang Zhang <yang.z.zhang@intel.com>2015-09-01 12:44:00 +0800
commite44e3482bdb4d0ebde2d8b41830ac2cdb07948fb (patch)
tree66b09f592c55df2878107a468a91d21506104d3f /qemu/roms/SLOF/tools
parent9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00 (diff)
Add qemu 2.4.0
Change-Id: Ic99cbad4b61f8b127b7dc74d04576c0bcbaaf4f5 Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
Diffstat (limited to 'qemu/roms/SLOF/tools')
-rw-r--r--qemu/roms/SLOF/tools/.gitignore1
-rw-r--r--qemu/roms/SLOF/tools/Makefile33
-rwxr-xr-xqemu/roms/SLOF/tools/create_reloc_table.sh60
-rw-r--r--qemu/roms/SLOF/tools/gen_reloc_table.c95
4 files changed, 189 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/tools/.gitignore b/qemu/roms/SLOF/tools/.gitignore
new file mode 100644
index 000000000..e45841399
--- /dev/null
+++ b/qemu/roms/SLOF/tools/.gitignore
@@ -0,0 +1 @@
+gen_reloc_table
diff --git a/qemu/roms/SLOF/tools/Makefile b/qemu/roms/SLOF/tools/Makefile
new file mode 100644
index 000000000..6de8fe645
--- /dev/null
+++ b/qemu/roms/SLOF/tools/Makefile
@@ -0,0 +1,33 @@
+# *****************************************************************************
+# * Copyright (c) 2004, 2008 IBM Corporation
+# * All rights reserved.
+# * This program and the accompanying materials
+# * are made available under the terms of the BSD License
+# * which accompanies this distribution, and is available at
+# * http://www.opensource.org/licenses/bsd-license.php
+# *
+# * Contributors:
+# * IBM Corporation - initial implementation
+# ****************************************************************************/
+
+include ../make.rules
+
+all: gen_reloc_table
+
+%.o: %.c
+ $(HOSTCC) -W $(HOSTCFLAGS) -c $^
+
+elf2tst: elf2tst.o
+ $(HOSTCC) $(HOSTCFLAGS) -o $@ $^
+
+gen_reloc_table: gen_reloc_table.o
+ $(HOSTCC) $(HOSTCFLAGS) -o $@ $^
+
+clean_here:
+ rm -f elf2tst *.o gen_reloc_table
+
+clean: clean_here
+
+
+distclean: clean_here
+
diff --git a/qemu/roms/SLOF/tools/create_reloc_table.sh b/qemu/roms/SLOF/tools/create_reloc_table.sh
new file mode 100755
index 000000000..8cacb742a
--- /dev/null
+++ b/qemu/roms/SLOF/tools/create_reloc_table.sh
@@ -0,0 +1,60 @@
+# *****************************************************************************
+# * Copyright (c) 2004, 2008 IBM Corporation
+# * All rights reserved.
+# * This program and the accompanying materials
+# * are made available under the terms of the BSD License
+# * which accompanies this distribution, and is available at
+# * http://www.opensource.org/licenses/bsd-license.php
+# *
+# * Contributors:
+# * IBM Corporation - initial implementation
+# ****************************************************************************/
+#!/bin/sh
+
+
+CROSSTMP=`grep ^CROSS $(dirname $0)/../make.rules | cut -d\ -f2`
+
+CROSS=${CROSS-$CROSSTMP}
+
+# Set defaults:
+LD="${CROSS}ld"
+LDFLAGS="-nostdlib"
+LDSFILE=""
+OBJCOPY="${CROSS}objcopy"
+
+DIRNAME=`dirname $0`
+
+# Parse parameters:
+while [ $# -gt 0 ] ; do
+ case "$1" in
+ --ld) LD=$2 ; shift 2 ;;
+ --ldflags) LDFLAGS=$2 ; shift 2 ;;
+ --lds) LDSFILE=$2 ; shift 2 ;;
+ --objcopy) OBJCOPY=$2 ; shift 2 ;;
+ *.o|*.a|-l*|-L*) OBJFILES="$OBJFILES $1" ; shift ;;
+ *) echo "$0:" ; echo " Unsupported argument: $1"; exit -1 ;;
+ esac
+done
+
+if [ -z $LDSFILE ]; then
+ echo "Please specifiy an lds file with the --lds option"
+ exit 42
+fi
+
+TMP1=`mktemp`
+TMP2=`mktemp`
+
+# Now create the two object files:
+$LD $LDFLAGS -T $LDSFILE -o $TMP1.o $OBJFILES || exit -1
+$LD $LDFLAGS -T $LDSFILE -o $TMP2.o $OBJFILES --section-start .text=0x4000000000000000 || exit -1
+
+$OBJCOPY -O binary $TMP1.o $TMP1.bin || exit -1
+$OBJCOPY -O binary $TMP2.o $TMP2.bin || exit -1
+
+# Create the relocation table with gen_reloc_table:
+$DIRNAME/gen_reloc_table $TMP1.bin $TMP2.bin reloc_table.bin
+
+$LD -o reloc_table.o -bbinary reloc_table.bin -e0 || exit -1
+$OBJCOPY --rename-section .data=.reloc reloc_table.o reloc_table.o || exit -1
+
+rm -f $TMP1.o $TMP2.o $TMP1.bin $TMP2.bin reloc_table.bin
diff --git a/qemu/roms/SLOF/tools/gen_reloc_table.c b/qemu/roms/SLOF/tools/gen_reloc_table.c
new file mode 100644
index 000000000..b15ce9d00
--- /dev/null
+++ b/qemu/roms/SLOF/tools/gen_reloc_table.c
@@ -0,0 +1,95 @@
+/******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation
+ * All rights reserved.
+ * This program and the accompanying materials
+ * are made available under the terms of the BSD License
+ * which accompanies this distribution, and is available at
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ * IBM Corporation - initial implementation
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+static int reloc_64_cnt;
+
+static int reloc_64[4096];
+
+static void
+output_int(FILE *output_file, int i)
+{
+ fputc((i>>24) & 0xff, output_file);
+ fputc((i>>16) & 0xff, output_file);
+ fputc((i>>8) & 0xff, output_file);
+ fputc(i & 0xff, output_file);
+}
+
+static void
+output_reloc_table(FILE * output_file, int reloc_cnt, int reloc[])
+{
+ int i;
+ for (i=0; i < reloc_cnt; i++)
+ {
+#ifdef DEBUG
+ printf ("reloc %x\n", reloc[i]);
+#endif
+ output_int (output_file, reloc[i]);
+ }
+ if ((reloc_cnt & 1) == 0)
+ output_int (output_file, 0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ int cnt_a, cnt_b, offset = -1;
+ unsigned char a, b;
+ FILE *orig, *other, *output_file;
+
+ if (argc != 4)
+ {
+ fprintf (stderr, "reloc_diff orig_file other_file output_file\n");
+ exit(-1);
+ }
+
+ orig = fopen(argv[1], "rb");
+ other = fopen(argv[2], "rb");
+ output_file = fopen(argv[3], "wb");
+ if(orig == NULL || other == NULL || output_file == NULL) {
+ printf("Could not open file.\n");
+ return -1;
+ }
+
+ while (1)
+ {
+ cnt_a = fread(&a, 1, 1, orig);
+ cnt_b = fread(&b, 1, 1, other);
+ offset ++;
+ if (cnt_a != cnt_b)
+ {
+ fprintf (stderr, "Files >%s< and >%s< have not the same length\n",argv[1],argv[2]);
+ exit(-1);
+ }
+
+ if (cnt_a == 0)
+ break;
+
+ if (a == b) continue;
+
+ if (a + 0x40 == b)
+ {
+ reloc_64[reloc_64_cnt++] = offset;
+ }
+ else
+ {
+ fprintf(stderr, "Unknown relocation");
+ fprintf(stderr, "Offset %x: %02x %02x\n", offset, a, b);
+ break;
+ }
+ }
+
+ output_reloc_table(output_file, reloc_64_cnt, reloc_64);
+ return 0;
+}