OSAtomic_resolvers.c [plain text]
#include <arm/arch.h>
#if defined(_ARM_ARCH_7)
#include <stdlib.h>
#include <machine/cpu_capabilities.h>
#include <mach/machine.h>
#if defined(VARIANT_DYLD)
#define _STRDEF(x) __STRING(x)
#define makeResolver_up_mp(name) \
void* name ## $VARIANT$up(void); \
void* name ## $VARIANT$mp(void); \
void* name ## Resolver(void) __asm__( "_" #name ); \
void* name ## Resolver(void) { \
__asm__ __volatile__ ( \
"ldr ip, L" #name "$commpage ;" \
"ldr ip, [ip] ;" \
"tst ip, $(" _STRDEF(kUP) ") ;" \
"bne 1f ; " \
"b _" __STRING(name) "$VARIANT$mp ;" \
"1: b _" __STRING(name) "$VARIANT$up ;" \
"L" #name "$commpage: .long " _STRDEF(_COMM_PAGE_CPU_CAPABILITIES) " ;" \
: : : ); \
}
#define makeResolver_up_mp_wfe(name) makeResolver_up_mp(name)
#else
#define makeResolver_up_mp(name) \
void name ## $VARIANT$up(void); \
void name ## $VARIANT$mp(void); \
void* name ## Resolver(void) __asm__( "_" #name ) ; \
void* name ## Resolver(void) { \
__asm__(".symbol_resolver _" #name); \
\
if ((*(uint32_t*)(uintptr_t)_COMM_PAGE_CPU_CAPABILITIES & kUP) == 0) { \
return name ## $VARIANT$mp; \
} \
return name ## $VARIANT$up; \
}
#define makeResolver_up_mp_wfe(name) \
void name ## $VARIANT$up(void); \
void name ## $VARIANT$mp(void); \
void name ## $VARIANT$wfe(void); \
void* name ## Resolver(void) __asm__( "_" #name ) ; \
void* name ## Resolver(void) { \
__asm__(".symbol_resolver _" #name); \
uint32_t caps = *(uint32_t*)(uintptr_t)_COMM_PAGE_CPU_CAPABILITIES; \
\
if ((caps & (kHasEvent | kUP)) == kHasEvent) { \
return name ## $VARIANT$wfe; \
} \
\
else if ((caps & kUP) == 0) { \
return name ## $VARIANT$mp; \
} \
return name ## $VARIANT$up; \
}
#endif // defined VARIANT_DYLD
#include "OSAtomic_resolvers.h"
#else // defined _ARM_ARCH_7
typedef int emptyFilesArentCFiles;
#endif // defined _ARM_ARCH_7 && !defined VARIANT_DYLD