This is currently provided by cpu-defs and is a target specific definition. However, to prepare for multi-arch only the bare minimum content from cpu-defs.h should be exported to core code. And this is all we need. So split it to a new header that the target_multi cpu.h can include to save on having to include the ill-defined cpu-defs.h.
Allow multiple inclusion for multi-arch where multiple cpu.h's need to be included and target_long will vary for each. This means that target_[u]long needs to be changed from a typedef to a #define to allow for redefinition. Signed-off-by: Peter Crosthwaite <crosthwaite.pe...@gmail.com> --- Changed since RFC v2: Convert target_[u]long to #define --- include/exec/cpu-defs.h | 23 +------------------- include/exec/target-long.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 22 deletions(-) create mode 100644 include/exec/target-long.h diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h index c6828cc..3889eb7 100644 --- a/include/exec/cpu-defs.h +++ b/include/exec/cpu-defs.h @@ -33,28 +33,7 @@ #endif #include "exec/memattrs.h" -#ifndef TARGET_LONG_BITS -#error TARGET_LONG_BITS must be defined before including this header -#endif - -#define TARGET_LONG_SIZE (TARGET_LONG_BITS / 8) - -/* target_ulong is the type of a virtual address */ -#if TARGET_LONG_SIZE == 4 -typedef int32_t target_long; -typedef uint32_t target_ulong; -#define TARGET_FMT_lx "%08x" -#define TARGET_FMT_ld "%d" -#define TARGET_FMT_lu "%u" -#elif TARGET_LONG_SIZE == 8 -typedef int64_t target_long; -typedef uint64_t target_ulong; -#define TARGET_FMT_lx "%016" PRIx64 -#define TARGET_FMT_ld "%" PRId64 -#define TARGET_FMT_lu "%" PRIu64 -#else -#error TARGET_LONG_SIZE undefined -#endif +#include "exec/target-long.h" #if !defined(CONFIG_USER_ONLY) /* use a fully associative victim tlb of 8 entries */ diff --git a/include/exec/target-long.h b/include/exec/target-long.h new file mode 100644 index 0000000..a10830c --- /dev/null +++ b/include/exec/target-long.h @@ -0,0 +1,54 @@ +/* + * definition for the target_long type and friends. + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +/* No multiple included guard intended. Multi-arch setups may require multiple + * cpu.h's included which means this can be and should be reached twice. + */ + +#include <stdint.h> + +#ifndef TARGET_LONG_BITS +#error TARGET_LONG_BITS must be defined before including this header +#endif + +#undef TARGET_LONG_SIZE +#define TARGET_LONG_SIZE (TARGET_LONG_BITS / 8) + +#undef target_long +#undef target_ulong +#undef TARGET_FMT_lx +#undef TARGET_FMT_ld +#undef TARGET_FMT_lu + +/* target_ulong is the type of a virtual address */ +#if TARGET_LONG_SIZE == 4 +#define target_long int32_t +#define target_ulong uint32_t +#define TARGET_FMT_lx "%08x" +#define TARGET_FMT_ld "%d" +#define TARGET_FMT_lu "%u" +#elif TARGET_LONG_SIZE == 8 +#define target_long int64_t +#define target_ulong uint64_t +#define TARGET_FMT_lx "%016" PRIx64 +#define TARGET_FMT_ld "%" PRId64 +#define TARGET_FMT_lu "%" PRIu64 +#else +#error TARGET_LONG_SIZE undefined +#endif -- 1.9.1