plcrash_error_t plcrash_async_thread_state_init()

in Source/PLCrashAsyncThread.c [50:98]


plcrash_error_t plcrash_async_thread_state_init (plcrash_async_thread_state_t *thread_state, cpu_type_t cpu_type) {
    memset(thread_state, 0, sizeof(*thread_state));

    switch (cpu_type) {
#if PLCRASH_ASYNC_THREAD_X86_SUPPORT
        case CPU_TYPE_X86:
            thread_state->x86_state.thread.tsh.count = x86_THREAD_STATE32_COUNT;
            thread_state->x86_state.thread.tsh.flavor = x86_THREAD_STATE32;
            thread_state->x86_state.exception.esh.count = x86_EXCEPTION_STATE32_COUNT;
            thread_state->x86_state.exception.esh.flavor = x86_EXCEPTION_STATE32;
            
            thread_state->stack_direction = PLCRASH_ASYNC_THREAD_STACK_DIRECTION_DOWN;
            thread_state->greg_size = 4;
            break;

        case CPU_TYPE_X86_64:
            thread_state->x86_state.thread.tsh.count = x86_THREAD_STATE64_COUNT;
            thread_state->x86_state.thread.tsh.flavor = x86_THREAD_STATE64;            
            thread_state->x86_state.exception.esh.count = x86_EXCEPTION_STATE64_COUNT;
            thread_state->x86_state.exception.esh.flavor = x86_EXCEPTION_STATE64;
            
            thread_state->stack_direction = PLCRASH_ASYNC_THREAD_STACK_DIRECTION_DOWN;
            thread_state->greg_size = 8;
            break;
#endif /* PLCRASH_ASYNC_THREAD_X86_SUPPORT */

#if PLCRASH_ASYNC_THREAD_ARM_SUPPORT
        case CPU_TYPE_ARM:
            thread_state->arm_state.thread.ash.flavor = ARM_THREAD_STATE32;
            thread_state->arm_state.thread.ash.count = ARM_THREAD_STATE32_COUNT;
            thread_state->stack_direction = PLCRASH_ASYNC_THREAD_STACK_DIRECTION_DOWN;
            thread_state->greg_size = 4;
            break;

        case CPU_TYPE_ARM64:
            thread_state->arm_state.thread.ash.flavor = ARM_THREAD_STATE64;
            thread_state->arm_state.thread.ash.count = ARM_THREAD_STATE64_COUNT;
            thread_state->stack_direction = PLCRASH_ASYNC_THREAD_STACK_DIRECTION_DOWN;
            thread_state->greg_size = 8;
            break;
#endif /* PLCRASH_ASYNC_THREAD_ARM_SUPPORT */
            
        default:
            return PLCRASH_ENOTSUP;
    }

    plcrash_async_thread_state_clear_all_regs(thread_state);
    return PLCRASH_ESUCCESS;
}