/* Generated by ./xlat/gen.sh from ./xlat/kexec_arch_values.in; do not edit. */

#include "gcc_compat.h"
#include "static_assert.h"

#if defined(KEXEC_ARCH_DEFAULT) || (defined(HAVE_DECL_KEXEC_ARCH_DEFAULT) && HAVE_DECL_KEXEC_ARCH_DEFAULT)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_DEFAULT) == (( 0 << 16)), "KEXEC_ARCH_DEFAULT != ( 0 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_DEFAULT ( 0 << 16)
#endif
#if defined(KEXEC_ARCH_386) || (defined(HAVE_DECL_KEXEC_ARCH_386) && HAVE_DECL_KEXEC_ARCH_386)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_386) == (( 3 << 16)), "KEXEC_ARCH_386 != ( 3 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_386 ( 3 << 16)
#endif
#if defined(KEXEC_ARCH_68K) || (defined(HAVE_DECL_KEXEC_ARCH_68K) && HAVE_DECL_KEXEC_ARCH_68K)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_68K) == (( 4 << 16)), "KEXEC_ARCH_68K != ( 4 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_68K ( 4 << 16)
#endif
#if defined(KEXEC_ARCH_X86_64) || (defined(HAVE_DECL_KEXEC_ARCH_X86_64) && HAVE_DECL_KEXEC_ARCH_X86_64)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_X86_64) == ((62 << 16)), "KEXEC_ARCH_X86_64 != (62 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_X86_64 (62 << 16)
#endif
#if defined(KEXEC_ARCH_PPC) || (defined(HAVE_DECL_KEXEC_ARCH_PPC) && HAVE_DECL_KEXEC_ARCH_PPC)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_PPC) == ((20 << 16)), "KEXEC_ARCH_PPC != (20 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_PPC (20 << 16)
#endif
#if defined(KEXEC_ARCH_PPC64) || (defined(HAVE_DECL_KEXEC_ARCH_PPC64) && HAVE_DECL_KEXEC_ARCH_PPC64)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_PPC64) == ((21 << 16)), "KEXEC_ARCH_PPC64 != (21 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_PPC64 (21 << 16)
#endif
#if defined(KEXEC_ARCH_IA_64) || (defined(HAVE_DECL_KEXEC_ARCH_IA_64) && HAVE_DECL_KEXEC_ARCH_IA_64)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_IA_64) == ((50 << 16)), "KEXEC_ARCH_IA_64 != (50 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_IA_64 (50 << 16)
#endif
#if defined(KEXEC_ARCH_ARM) || (defined(HAVE_DECL_KEXEC_ARCH_ARM) && HAVE_DECL_KEXEC_ARCH_ARM)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_ARM) == ((40 << 16)), "KEXEC_ARCH_ARM != (40 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_ARM (40 << 16)
#endif
#if defined(KEXEC_ARCH_S390) || (defined(HAVE_DECL_KEXEC_ARCH_S390) && HAVE_DECL_KEXEC_ARCH_S390)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_S390) == ((22 << 16)), "KEXEC_ARCH_S390 != (22 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_S390 (22 << 16)
#endif
#if defined(KEXEC_ARCH_SH) || (defined(HAVE_DECL_KEXEC_ARCH_SH) && HAVE_DECL_KEXEC_ARCH_SH)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_SH) == ((42 << 16)), "KEXEC_ARCH_SH != (42 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_SH (42 << 16)
#endif
#if defined(KEXEC_ARCH_MIPS_LE) || (defined(HAVE_DECL_KEXEC_ARCH_MIPS_LE) && HAVE_DECL_KEXEC_ARCH_MIPS_LE)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_MIPS_LE) == ((10 << 16)), "KEXEC_ARCH_MIPS_LE != (10 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_MIPS_LE (10 << 16)
#endif
#if defined(KEXEC_ARCH_MIPS) || (defined(HAVE_DECL_KEXEC_ARCH_MIPS) && HAVE_DECL_KEXEC_ARCH_MIPS)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_MIPS) == (( 8 << 16)), "KEXEC_ARCH_MIPS != ( 8 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_MIPS ( 8 << 16)
#endif
#if defined(KEXEC_ARCH_AARCH64) || (defined(HAVE_DECL_KEXEC_ARCH_AARCH64) && HAVE_DECL_KEXEC_ARCH_AARCH64)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
static_assert((KEXEC_ARCH_AARCH64) == ((183 << 16)), "KEXEC_ARCH_AARCH64 != (183 << 16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
# define KEXEC_ARCH_AARCH64 (183 << 16)
#endif

#ifndef XLAT_MACROS_ONLY

# ifdef IN_MPERS

#  error static const struct xlat kexec_arch_values in mpers mode

# else

static
const struct xlat kexec_arch_values[] = {
 XLAT(KEXEC_ARCH_DEFAULT),
 XLAT(KEXEC_ARCH_386),
 XLAT(KEXEC_ARCH_68K),
 XLAT(KEXEC_ARCH_X86_64),
 XLAT(KEXEC_ARCH_PPC),
 XLAT(KEXEC_ARCH_PPC64),
 XLAT(KEXEC_ARCH_IA_64),
 XLAT(KEXEC_ARCH_ARM),
 XLAT(KEXEC_ARCH_S390),
 XLAT(KEXEC_ARCH_SH),
 XLAT(KEXEC_ARCH_MIPS_LE),
 XLAT(KEXEC_ARCH_MIPS),
 XLAT(KEXEC_ARCH_AARCH64),
 XLAT_END
};

# endif /* !IN_MPERS */

#endif /* !XLAT_MACROS_ONLY */
