From 11cc9ec9baf1965b52a627cc3f222798ad171119 Mon Sep 17 00:00:00 2001 From: Jonathon Reinhart Date: Sun, 23 Aug 2015 21:10:47 -0400 Subject: [PATCH] clean-up uc_support() API - rename to more obviously-named uc_arch_supported() - remove UC_ARCH_ALL and associated test -- There's no point in having this API, and it was improperly implemented anyway. - remove now unneeded archs_enable() and all_arch - add UNICORN_HAS_PPC test -- This seems to be only partially implemented --- include/unicorn/unicorn.h | 9 ++--- uc.c | 74 ++++++++++++++------------------------- 2 files changed, 29 insertions(+), 54 deletions(-) diff --git a/include/unicorn/unicorn.h b/include/unicorn/unicorn.h index 474c6afe..b4df71e7 100644 --- a/include/unicorn/unicorn.h +++ b/include/unicorn/unicorn.h @@ -78,7 +78,6 @@ typedef enum uc_arch { UC_ARCH_SPARC, // Sparc architecture UC_ARCH_M68K, // M68K architecture UC_ARCH_MAX, - UC_ARCH_ALL = 0xFFFF, // All architectures - for uc_support() } uc_arch; // Mode type @@ -203,16 +202,14 @@ unsigned int uc_version(unsigned int *major, unsigned int *minor); /* - This API can be used to either ask for archs supported by this library. + Determine if the given architecture is supported by this library. - To check if a particular arch is supported by this library, set @query to - arch mode (UC_ARCH_* value). - To verify if this library supports all the archs, use UC_ARCH_ALL. + @arch: architecture type (UC_ARCH_*) @return True if this library supports the given arch. */ UNICORN_EXPORT -bool uc_support(int query); +bool uc_arch_supported(uc_arch arch); /* diff --git a/uc.c b/uc.c index 3c59f0c8..cfcfe7a6 100644 --- a/uc.c +++ b/uc.c @@ -36,43 +36,9 @@ static uint64_t map_begin[32], map_end[32]; static int map_count = 0; -static unsigned int all_arch = 0; - -static void archs_enable(void) -{ - static bool initialized = false; - - if (initialized) - return; - -#ifdef UNICORN_HAS_ARM - all_arch = all_arch + (1 << UC_ARCH_ARM); -#endif -#ifdef UNICORN_HAS_ARM64 - all_arch = all_arch + (1 << UC_ARCH_ARM64); -#endif -#ifdef UNICORN_HAS_MIPS - all_arch = all_arch + (1 << UC_ARCH_MIPS); -#endif -#ifdef UNICORN_HAS_SPARC - all_arch = all_arch + (1 << UC_ARCH_SPARC); -#endif -#ifdef UNICORN_HAS_M68K - all_arch = all_arch + (1 << UC_ARCH_M68K); -#endif -#ifdef UNICORN_HAS_X86 - all_arch = all_arch + (1 << UC_ARCH_X86); -#endif - - initialized = true; -} - - UNICORN_EXPORT unsigned int uc_version(unsigned int *major, unsigned int *minor) { - archs_enable(); - if (major != NULL && minor != NULL) { *major = UC_API_MAJOR; *minor = UC_API_MINOR; @@ -131,20 +97,34 @@ const char *uc_strerror(uc_err code) UNICORN_EXPORT -bool uc_support(int query) +bool uc_arch_supported(uc_arch arch) { - archs_enable(); + switch (arch) { +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: return true; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: return true; +#endif +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: return true; +#endif +#ifdef UNICORN_HAS_MIPS + case UC_ARCH_MIPS: return true; +#endif +#ifdef UNICORN_HAS_PPC + case UC_ARCH_PPC: return true; +#endif +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: return true; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: return true; +#endif - if (query == UC_ARCH_ALL) - return all_arch == ((1 << UC_ARCH_ARM) | (1 << UC_ARCH_ARM64) | - (1 << UC_ARCH_MIPS) | (1 << UC_ARCH_X86) | - (1 << UC_ARCH_M68K) | (1 << UC_ARCH_SPARC)); - - if ((unsigned int)query < UC_ARCH_MAX) - return ((all_arch & (1 << query)) != 0); - - // unsupported query - return false; + /* Invalid or disabled arch */ + default: return false; + } } @@ -153,8 +133,6 @@ uc_err uc_open(uc_arch arch, uc_mode mode, uch *handle) { struct uc_struct *uc; - archs_enable(); - if (arch < UC_ARCH_MAX) { uc = calloc(1, sizeof(*uc)); if (!uc) {