1168404Spjd/* 2168404Spjd * Copyright (c) 2007 Apple Inc. All rights reserved. 3168404Spjd */ 4168404Spjd/* 5168404Spjd * FILE_ID: thread_status.h 6168404Spjd */ 7168404Spjd 8168404Spjd 9168404Spjd#ifndef _ARM_THREAD_STATUS_H_ 10168404Spjd#define _ARM_THREAD_STATUS_H_ 11168404Spjd 12168404Spjd#include <mach/arm/_structs.h> 13168404Spjd#include <mach/message.h> 14168404Spjd#include <mach/arm/thread_state.h> 15168404Spjd 16168404Spjd/* 17168404Spjd * Support for determining the state of a thread 18168404Spjd */ 19168404Spjd 20168404Spjd 21168404Spjd/* 22168404Spjd * Flavors 23168404Spjd */ 24168404Spjd 25168404Spjd#define ARM_THREAD_STATE 1 26168404Spjd#define ARM_UNIFIED_THREAD_STATE ARM_THREAD_STATE 27168404Spjd#define ARM_VFP_STATE 2 28168404Spjd#define ARM_EXCEPTION_STATE 3 29168404Spjd#define ARM_DEBUG_STATE 4 /* pre-armv8 */ 30168404Spjd#define THREAD_STATE_NONE 5 31168404Spjd#define ARM_THREAD_STATE64 6 32168404Spjd#define ARM_EXCEPTION_STATE64 7 33168404Spjd// ARM_THREAD_STATE_LAST (legacy) 8 34168404Spjd#define ARM_THREAD_STATE32 9 35168404Spjd 36168404Spjd/* API */ 37168404Spjd#define ARM_DEBUG_STATE32 14 38168404Spjd#define ARM_DEBUG_STATE64 15 39168404Spjd#define ARM_NEON_STATE 16 40168404Spjd#define ARM_NEON_STATE64 17 41168404Spjd 42168404Spjd 43168404Spjd#define VALID_THREAD_STATE_FLAVOR(x)\ 44168404Spjd((x == ARM_THREAD_STATE) || \ 45168404Spjd (x == ARM_VFP_STATE) || \ 46168404Spjd (x == ARM_EXCEPTION_STATE) || \ 47168404Spjd (x == ARM_DEBUG_STATE) || \ 48185029Spjd (x == THREAD_STATE_NONE) || \ 49168404Spjd (x == ARM_THREAD_STATE32) || \ 50168404Spjd (x == ARM_THREAD_STATE64) || \ 51168404Spjd (x == ARM_EXCEPTION_STATE64) || \ 52168404Spjd (x == ARM_NEON_STATE) || \ 53168404Spjd (x == ARM_NEON_STATE64) || \ 54168404Spjd (x == ARM_DEBUG_STATE32) || \ 55168404Spjd (x == ARM_DEBUG_STATE64)) 56168404Spjd 57168404Spjdstruct arm_state_hdr { 58168404Spjd uint32_t flavor; 59168404Spjd uint32_t count; 60168404Spjd}; 61168404Spjdtypedef struct arm_state_hdr arm_state_hdr_t; 62168404Spjd 63168404Spjdtypedef _STRUCT_ARM_THREAD_STATE arm_thread_state_t; 64168404Spjdtypedef _STRUCT_ARM_THREAD_STATE arm_thread_state32_t; 65168404Spjdtypedef _STRUCT_ARM_THREAD_STATE64 arm_thread_state64_t; 66168404Spjd 67168404Spjdstruct arm_unified_thread_state { 68185029Spjd arm_state_hdr_t ash; 69185029Spjd union { 70168404Spjd arm_thread_state32_t ts_32; 71168404Spjd arm_thread_state64_t ts_64; 72168404Spjd } uts; 73168404Spjd}; 74168404Spjd#define ts_32 uts.ts_32 75168404Spjd#define ts_64 uts.ts_64 76168404Spjdtypedef struct arm_unified_thread_state arm_unified_thread_state_t; 77168404Spjd 78168404Spjd#define ARM_THREAD_STATE_COUNT ((mach_msg_type_number_t) \ 79168404Spjd (sizeof (arm_thread_state_t)/sizeof(uint32_t))) 80168404Spjd#define ARM_THREAD_STATE32_COUNT ((mach_msg_type_number_t) \ 81168404Spjd (sizeof (arm_thread_state32_t)/sizeof(uint32_t))) 82168404Spjd#define ARM_THREAD_STATE64_COUNT ((mach_msg_type_number_t) \ 83168404Spjd (sizeof (arm_thread_state64_t)/sizeof(uint32_t))) 84168404Spjd#define ARM_UNIFIED_THREAD_STATE_COUNT ((mach_msg_type_number_t) \ 85168404Spjd (sizeof (arm_unified_thread_state_t)/sizeof(uint32_t))) 86168404Spjd 87168404Spjd 88168404Spjdtypedef _STRUCT_ARM_VFP_STATE arm_vfp_state_t; 89168404Spjdtypedef _STRUCT_ARM_NEON_STATE arm_neon_state_t; 90168404Spjdtypedef _STRUCT_ARM_NEON_STATE arm_neon_state32_t; 91168404Spjdtypedef _STRUCT_ARM_NEON_STATE64 arm_neon_state64_t; 92168404Spjd 93168404Spjdtypedef _STRUCT_ARM_EXCEPTION_STATE arm_exception_state_t; 94168404Spjdtypedef _STRUCT_ARM_EXCEPTION_STATE arm_exception_state32_t; 95168404Spjdtypedef _STRUCT_ARM_EXCEPTION_STATE64 arm_exception_state64_t; 96168404Spjd 97168404Spjdtypedef arm_thread_state_t arm_saved_state_t; 98168404Spjd 99168404Spjdtypedef _STRUCT_ARM_DEBUG_STATE32 arm_debug_state32_t; 100168404Spjdtypedef _STRUCT_ARM_DEBUG_STATE64 arm_debug_state64_t; 101168404Spjd 102168404Spjd/* 103168404Spjd * Otherwise not ARM64 kernel and we must preserve legacy ARM definitions of 104168404Spjd * arm_debug_state for binary compatability of userland consumers of this file. 105168404Spjd */ 106168404Spjd#if defined(__arm__) 107168404Spjdtypedef _STRUCT_ARM_DEBUG_STATE arm_debug_state_t; 108168404Spjd#elif defined(__arm64__) 109168404Spjdtypedef _STRUCT_ARM_LEGACY_DEBUG_STATE arm_debug_state_t; 110168404Spjd#else 111168404Spjd#error Undefined architecture 112168404Spjd#endif 113197201Spjd 114197201Spjd#define ARM_VFP_STATE_COUNT ((mach_msg_type_number_t) \ 115168404Spjd (sizeof (arm_vfp_state_t)/sizeof(uint32_t))) 116185029Spjd 117185029Spjd#define ARM_EXCEPTION_STATE_COUNT ((mach_msg_type_number_t) \ 118185029Spjd (sizeof (arm_exception_state_t)/sizeof(uint32_t))) 119185029Spjd 120185029Spjd#define ARM_EXCEPTION_STATE64_COUNT ((mach_msg_type_number_t) \ 121185029Spjd (sizeof (arm_exception_state64_t)/sizeof(uint32_t))) 122185029Spjd 123185029Spjd#define ARM_DEBUG_STATE_COUNT ((mach_msg_type_number_t) \ 124219089Spjd (sizeof (arm_debug_state_t)/sizeof(uint32_t))) 125219089Spjd 126219089Spjd#define ARM_DEBUG_STATE32_COUNT ((mach_msg_type_number_t) \ 127219089Spjd (sizeof (arm_debug_state32_t)/sizeof(uint32_t))) 128219089Spjd 129185029Spjd#define ARM_DEBUG_STATE64_COUNT ((mach_msg_type_number_t) \ 130219089Spjd (sizeof (arm_debug_state64_t)/sizeof(uint32_t))) 131219089Spjd 132219089Spjd#define ARM_NEON_STATE_COUNT ((mach_msg_type_number_t) \ 133185029Spjd (sizeof (arm_neon_state_t)/sizeof(uint32_t))) 134168404Spjd 135168404Spjd#define ARM_NEON_STATE64_COUNT ((mach_msg_type_number_t) \ 136168404Spjd (sizeof (arm_neon_state64_t)/sizeof(uint32_t))) 137 138#define MACHINE_THREAD_STATE ARM_THREAD_STATE 139#define MACHINE_THREAD_STATE_COUNT ARM_UNIFIED_THREAD_STATE_COUNT 140 141/* 142 * Largest state on this machine: 143 */ 144#define THREAD_MACHINE_STATE_MAX THREAD_STATE_MAX 145 146static inline void *saved_state64(void *iss) 147{ 148 return iss; 149} 150 151#endif /* _ARM_THREAD_STATUS_H_ */ 152