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