diff options
Diffstat (limited to 'arch/ppc64/boot/piggyback.c')
-rw-r--r-- | arch/ppc64/boot/piggyback.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/arch/ppc64/boot/piggyback.c b/arch/ppc64/boot/piggyback.c new file mode 100644 index 000000000000..235c7a87269c --- /dev/null +++ b/arch/ppc64/boot/piggyback.c @@ -0,0 +1,83 @@ +/* + * Copyright 2001 IBM Corp + * + * 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 <stdio.h> +#include <unistd.h> +#include <string.h> + +extern long ce_exec_config[]; + +int main(int argc, char *argv[]) +{ + int i, cnt, pos, len; + unsigned int cksum, val; + unsigned char *lp; + unsigned char buf[8192]; + char *varname; + if (argc != 2) + { + fprintf(stderr, "usage: %s name <in-file >out-file\n", + argv[0]); + exit(1); + } + + varname = strrchr(argv[1], '/'); + if (varname) + varname++; + else + varname = argv[1]; + + fprintf(stdout, "#\n"); + fprintf(stdout, "# Miscellaneous data structures:\n"); + fprintf(stdout, "# WARNING - this file is automatically generated!\n"); + fprintf(stdout, "#\n"); + fprintf(stdout, "\n"); + fprintf(stdout, "\t.data\n"); + fprintf(stdout, "\t.globl %s_data\n", varname); + fprintf(stdout, "%s_data:\n", varname); + pos = 0; + cksum = 0; + while ((len = read(0, buf, sizeof(buf))) > 0) + { + cnt = 0; + lp = (unsigned char *)buf; + len = (len + 3) & ~3; /* Round up to longwords */ + for (i = 0; i < len; i += 4) + { + if (cnt == 0) + { + fprintf(stdout, "\t.long\t"); + } + fprintf(stdout, "0x%02X%02X%02X%02X", lp[0], lp[1], lp[2], lp[3]); + val = *(unsigned long *)lp; + cksum ^= val; + lp += 4; + if (++cnt == 4) + { + cnt = 0; + fprintf(stdout, " # %x \n", pos+i-12); + fflush(stdout); + } else + { + fprintf(stdout, ","); + } + } + if (cnt) + { + fprintf(stdout, "0\n"); + } + pos += len; + } + fprintf(stdout, "\t.globl %s_len\n", varname); + fprintf(stdout, "%s_len:\t.long\t0x%x\n", varname, pos); + fflush(stdout); + fclose(stdout); + fprintf(stderr, "cksum = %x\n", cksum); + exit(0); +} + |