summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/tools/gen_reloc_table.c
blob: b15ce9d00d33654d1792f241ee9ef22b44a06cee (plain)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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;
}