X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/8e029c653e0567df7ce6933dde41f5830dbbbcda..7b00c0c43f52e9d27168e67a26aac19065cdb40c:/pthreads/thread_setup.c diff --git a/pthreads/thread_setup.c b/pthreads/thread_setup.c index dab0750..2f6c9d5 100644 --- a/pthreads/thread_setup.c +++ b/pthreads/thread_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2003, 2008 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -51,6 +51,8 @@ #if defined(__ppc__) || defined(__ppc64__) #include +#elif defined(__arm__) +#include #endif #include "pthread_internals.h" @@ -203,6 +205,48 @@ _pthread_setup(pthread_t thread, r); } +#elif defined(__arm__) + arm_thread_state_t state = {0}; + arm_thread_state_t *ts = &state; + thread_state_flavor_t flavor = ARM_THREAD_STATE; + count = ARM_THREAD_STATE_COUNT; + + if (suspended) { + PTHREAD_MACH_CALL(thread_get_state(thread->kernel_thread, + flavor, + (thread_state_t) &state, + &count), + r); + } + + ts->pc = (uintptr_t)routine; + + if (ts->pc & 1) { + ts->pc &= ~1; + ts->cpsr |= 0x20; /* PSR_THUMB */ + } + + ts->sp = (uintptr_t)vsp - C_ARGSAVE_LEN - C_RED_ZONE; + ts->r[0] = (uintptr_t)thread; + + /* Incase of needresume, suspend is always set */ + if (suspended) { + PTHREAD_MACH_CALL(thread_set_state(thread->kernel_thread, + flavor, + (thread_state_t) &state, + count), + r); + if (needresume) + PTHREAD_MACH_CALL(thread_resume(thread->kernel_thread), + r); + } else { + PTHREAD_MACH_CALL(thread_create_running(mach_task_self(), + flavor, + (thread_state_t) ts, + count, + &thread->kernel_thread), + r); + } #else #error _pthread_setup not defined for this architecture #endif