/* arch.h
 * Copyright 2014 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * MINIJAIL_ARCH_NR #define's.
 */

#ifndef ARCH_H
#define ARCH_H

#include <linux/audit.h>
#include <stdint.h>

/* clang-format off */
#if defined(__i386__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_I386
#  define MINIJAIL_ARCH_NAME "x86"
#elif defined(__x86_64__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_X86_64
#  define MINIJAIL_ARCH_NAME "x86_64"
#elif defined(__arm__)
/*
 * <linux/audit.h> includes <linux/elf-em.h>, which does not define EM_ARM.
 * <linux/elf.h> only includes <asm/elf.h> if we're in the kernel.
 */
#  ifndef EM_ARM
#    define EM_ARM 40
#  endif
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_ARM
#  define MINIJAIL_ARCH_NAME "arm"
#elif defined(__aarch64__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_AARCH64
#  define MINIJAIL_ARCH_NAME "arm64"
#elif defined(__hppa__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_PARISC
#  define MINIJAIL_ARCH_NAME "parisc"
#elif defined(__ia64__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_IA64
#  define MINIJAIL_ARCH_NAME "ia64"
#elif defined(__loongarch64)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_LOONGARCH64
#  define MINIJAIL_ARCH_NAME "loong64"
#elif defined(__mips__)
#  if defined(__mips64)
#    if defined(__MIPSEB__)
#      define MINIJAIL_ARCH_NR AUDIT_ARCH_MIPS64
#      define MINIJAIL_ARCH_NAME "mips64"
#    else
#      define MINIJAIL_ARCH_NR AUDIT_ARCH_MIPSEL64
#      define MINIJAIL_ARCH_NAME "mipsel64"
#    endif
#  else
#    if defined(__MIPSEB__)
#      define MINIJAIL_ARCH_NR AUDIT_ARCH_MIPS
#      define MINIJAIL_ARCH_NAME "mips"
#    else
#      define MINIJAIL_ARCH_NR AUDIT_ARCH_MIPSEL
#      define MINIJAIL_ARCH_NAME "mipsel"
#    endif
#  endif
#elif defined(__powerpc64__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_PPC64
#  define MINIJAIL_ARCH_NAME "ppc64"
#elif defined(__powerpc__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_PPC
#  define MINIJAIL_ARCH_NAME "ppc"
#elif defined(__riscv)
#  if defined(__riscv_xlen)
#    if (__riscv_xlen == 64)
#      define MINIJAIL_ARCH_NR AUDIT_ARCH_RISCV64
#      define MINIJAIL_ARCH_NAME "riscv64"
#    else
#      error "Only 64bit riscv is supported"
#    endif
#  else
#    error "AUDIT_ARCH value unavailable"
#  endif
#elif defined(__s390x__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_S390X
#  define MINIJAIL_ARCH_NAME "s390x"
#elif defined(__s390__)
#  define MINIJAIL_ARCH_NR AUDIT_ARCH_S390
#  define MINIJAIL_ARCH_NAME "s390"
#elif defined(__sparc__)
#  if defined(__arch64__)
#    define AUDIT_ARCH_SPARC64
#    define MINIJAIL_ARCH_NAME "sparc64"
#  else
#    define AUDIT_ARCH_SPARC
#    define MINIJAIL_ARCH_NAME "sparc"
#  endif
#else
#  error "AUDIT_ARCH value unavailable"
#endif
/* clang-format on */

#define MINIJAIL_ARCH_BITS sizeof(uintptr_t) * 8

#endif /* ARCH_H */
