Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / tools / gen_reloc_table.c
diff --git a/qemu/roms/SLOF/tools/gen_reloc_table.c b/qemu/roms/SLOF/tools/gen_reloc_table.c
new file mode 100644 (file)
index 0000000..b15ce9d
--- /dev/null
@@ -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;
+}