162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <stdio.h>
362306a36Sopenharmony_ci#include <stdlib.h>
462306a36Sopenharmony_ci#include <string.h>
562306a36Sopenharmony_ci#include <elf.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciint
862306a36Sopenharmony_cimain(int argc, char **argv)
962306a36Sopenharmony_ci{
1062306a36Sopenharmony_ci	unsigned char ei[EI_NIDENT];
1162306a36Sopenharmony_ci	union { short s; char c[2]; } endian_test;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci	if (fread(ei, 1, EI_NIDENT, stdin) != EI_NIDENT) {
1462306a36Sopenharmony_ci		fprintf(stderr, "Error: input truncated\n");
1562306a36Sopenharmony_ci		return 1;
1662306a36Sopenharmony_ci	}
1762306a36Sopenharmony_ci	if (memcmp(ei, ELFMAG, SELFMAG) != 0) {
1862306a36Sopenharmony_ci		fprintf(stderr, "Error: not ELF\n");
1962306a36Sopenharmony_ci		return 1;
2062306a36Sopenharmony_ci	}
2162306a36Sopenharmony_ci	switch (ei[EI_CLASS]) {
2262306a36Sopenharmony_ci	case ELFCLASS32:
2362306a36Sopenharmony_ci		printf("#define KERNEL_ELFCLASS ELFCLASS32\n");
2462306a36Sopenharmony_ci		break;
2562306a36Sopenharmony_ci	case ELFCLASS64:
2662306a36Sopenharmony_ci		printf("#define KERNEL_ELFCLASS ELFCLASS64\n");
2762306a36Sopenharmony_ci		break;
2862306a36Sopenharmony_ci	default:
2962306a36Sopenharmony_ci		exit(1);
3062306a36Sopenharmony_ci	}
3162306a36Sopenharmony_ci	switch (ei[EI_DATA]) {
3262306a36Sopenharmony_ci	case ELFDATA2LSB:
3362306a36Sopenharmony_ci		printf("#define KERNEL_ELFDATA ELFDATA2LSB\n");
3462306a36Sopenharmony_ci		break;
3562306a36Sopenharmony_ci	case ELFDATA2MSB:
3662306a36Sopenharmony_ci		printf("#define KERNEL_ELFDATA ELFDATA2MSB\n");
3762306a36Sopenharmony_ci		break;
3862306a36Sopenharmony_ci	default:
3962306a36Sopenharmony_ci		exit(1);
4062306a36Sopenharmony_ci	}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	if (sizeof(unsigned long) == 4) {
4362306a36Sopenharmony_ci		printf("#define HOST_ELFCLASS ELFCLASS32\n");
4462306a36Sopenharmony_ci	} else if (sizeof(unsigned long) == 8) {
4562306a36Sopenharmony_ci		printf("#define HOST_ELFCLASS ELFCLASS64\n");
4662306a36Sopenharmony_ci	}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	endian_test.s = 0x0102;
4962306a36Sopenharmony_ci	if (memcmp(endian_test.c, "\x01\x02", 2) == 0)
5062306a36Sopenharmony_ci		printf("#define HOST_ELFDATA ELFDATA2MSB\n");
5162306a36Sopenharmony_ci	else if (memcmp(endian_test.c, "\x02\x01", 2) == 0)
5262306a36Sopenharmony_ci		printf("#define HOST_ELFDATA ELFDATA2LSB\n");
5362306a36Sopenharmony_ci	else
5462306a36Sopenharmony_ci		exit(1);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	return 0;
5762306a36Sopenharmony_ci}
58