X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0a7de7458d150b5d4dffc935ba399be265ef0a1a..refs/heads/master:/osfmk/arm/thread.h diff --git a/osfmk/arm/thread.h b/osfmk/arm/thread.h index 46a603dcc..ad331774b 100644 --- a/osfmk/arm/thread.h +++ b/osfmk/arm/thread.h @@ -64,29 +64,14 @@ #include #include -#ifdef MACH_KERNEL_PRIVATE +#ifdef MACH_KERNEL_PRIVATE #include #include -#endif - -#if __ARM_VFP__ - -#define VFPSAVE_ALIGN 16 -#define VFPSAVE_ATTRIB __attribute__ ((aligned (VFPSAVE_ALIGN))) -#define THREAD_ALIGN VFPSAVE_ALIGN - -/* - * vector floating point saved state - */ -struct arm_vfpsaved_state { - uint32_t r[64]; - uint32_t fpscr; - uint32_t fpexc; -}; +#include #endif struct perfcontrol_state { - uint64_t opaque[8] __attribute__((aligned(8))); + uint64_t opaque[8] __attribute__((aligned(8))); }; /* @@ -94,114 +79,121 @@ struct perfcontrol_state { */ extern unsigned int _MachineStateCount[]; -#ifdef MACH_KERNEL_PRIVATE +#ifdef MACH_KERNEL_PRIVATE #if __arm64__ -typedef arm_context_t machine_thread_kernel_state; +typedef arm_kernel_context_t machine_thread_kernel_state; #else typedef struct arm_saved_state machine_thread_kernel_state; #endif #include struct machine_thread { +#if __ARM_USER_PROTECT__ + unsigned int uptw_ttb; + unsigned int kptw_ttb; + unsigned int asid; +#else + unsigned int reserved0; + unsigned int reserved1; + unsigned int reserved2; +#endif + #if __arm64__ - arm_context_t *contextData; /* allocated user context */ - arm_saved_state_t *upcb; /* pointer to user GPR state */ - arm_neon_saved_state_t *uNeon; /* pointer to user VFP state */ + arm_context_t * contextData; /* allocated user context */ + arm_saved_state_t * XNU_PTRAUTH_SIGNED_PTR("machine_thread.upcb") upcb; /* pointer to user GPR state */ + arm_neon_saved_state_t * uNeon; /* pointer to user VFP state */ + arm_saved_state_t * kpcb; /* pointer to kernel GPR state */ + void * reserved3; + long reserved4; + uint64_t recover_far; #elif __arm__ - struct arm_saved_state PcbData; -#if __ARM_VFP__ - struct arm_vfpsaved_state uVFPdata VFPSAVE_ATTRIB; - struct arm_vfpsaved_state kVFPdata VFPSAVE_ATTRIB; -#endif /* __ARM_VFP__ */ - + struct arm_saved_state PcbData; #else #error Unknown arch #endif -#if __ARM_USER_PROTECT__ - unsigned int uptw_ttc; - unsigned int uptw_ttb; - unsigned int kptw_ttb; - unsigned int asid; + +#if defined(__arm__) && defined(__ARM_VFP__) + // for packing reasons chtread_self and DebugData + // are inside the the PcbData when __ARM_VFP__ is set +#define DebugData PcbData.VFPpadding_DebugData +#define cthread_self PcbData.VFPpadding_cthread_self +#else + arm_debug_state_t *DebugData; + vm_address_t cthread_self; /* for use of cthread package */ #endif - vm_offset_t kstackptr; /* top of kernel stack */ - struct cpu_data *CpuDatap; /* current per cpu data */ - unsigned int preemption_count; /* preemption count */ +#if __arm64__ + uint32_t recover_esr; +#endif /* __arm64__ */ -#if __ARM_SMP__ -#define MACHINE_THREAD_FLAGS_ON_CPU (0x1) + vm_offset_t kstackptr; /* top of kernel stack */ + struct perfcontrol_state perfctrl_state; +#if __arm64__ + uint64_t energy_estimate_nj; +#endif + uint64_t reserved5; - uint8_t machine_thread_flags; -#endif /* __ARM_SMP__ */ +#if INTERRUPT_MASKED_DEBUG + uint64_t intmask_timestamp; /* timestamp of when interrupts were manually masked */ + uint64_t inthandler_timestamp; /* timestamp of when interrupt handler started */ + unsigned int int_type; /* interrupt type of the interrupt that was processed */ + uintptr_t int_handler_addr; /* slid, ptrauth-stripped virtual address of the interrupt handler */ + uintptr_t int_vector; /* IOInterruptVector */ +#endif - arm_debug_state_t *DebugData; - mach_vm_address_t cthread_self; /* for use of cthread package */ - mach_vm_address_t cthread_data; /* for use of cthread package */ +#if __arm64__ && defined(CONFIG_XNUPOST) + volatile expected_fault_handler_t expected_fault_handler; + volatile uintptr_t expected_fault_addr; +#endif - struct perfcontrol_state perfctrl_state; + uint64_t reserved6; + vm_offset_t pcpu_data_base; + struct cpu_data * CpuDatap; /* current per cpu data */ + unsigned int preemption_count; /* preemption count */ #if __arm64__ - uint64_t energy_estimate_nj; + uint16_t exception_trace_code; #endif - -#if INTERRUPT_MASKED_DEBUG - uint64_t intmask_timestamp; /* timestamp of when interrupts were masked */ + uint8_t reserved7; +#if defined(HAS_APPLE_PAC) + uint8_t disable_user_jop; + uint64_t rop_pid; + uint64_t jop_pid; +#else + uint8_t reserved8; + uint64_t reserved9; + uint64_t reserved10; #endif }; #endif -extern struct arm_saved_state *get_user_regs(thread_t); -extern struct arm_saved_state *find_user_regs(thread_t); -extern struct arm_saved_state *find_kern_regs(thread_t); -extern struct arm_vfpsaved_state *find_user_vfp(thread_t); +extern struct arm_saved_state * get_user_regs(thread_t); +extern struct arm_saved_state * find_user_regs(thread_t); +extern struct arm_saved_state * find_kern_regs(thread_t); +extern struct arm_vfpsaved_state * find_user_vfp(thread_t); #if defined(__arm__) -extern arm_debug_state_t *find_debug_state(thread_t); +extern arm_debug_state_t * find_debug_state(thread_t); #elif defined(__arm64__) -extern arm_debug_state32_t *find_debug_state32(thread_t); -extern arm_debug_state64_t *find_debug_state64(thread_t); -extern arm_neon_saved_state_t *get_user_neon_regs(thread_t); +extern arm_debug_state32_t * find_debug_state32(thread_t); +extern arm_debug_state32_t * find_or_allocate_debug_state32(thread_t); +extern arm_debug_state64_t * find_debug_state64(thread_t); +extern arm_debug_state64_t * find_or_allocate_debug_state64(thread_t); +extern arm_neon_saved_state_t * get_user_neon_regs(thread_t); #else #error unknown arch #endif #define FIND_PERFCONTROL_STATE(th) (&th->machine.perfctrl_state) -#ifdef MACH_KERNEL_PRIVATE +#ifdef MACH_KERNEL_PRIVATE #if __ARM_VFP__ -extern void vfp_state_initialize(struct arm_vfpsaved_state *vfp_state); -extern void vfp_save(struct arm_vfpsaved_state *vfp_ss); -extern void vfp_load(struct arm_vfpsaved_state *vfp_ss); -extern void toss_live_vfp(void *vfp_fc); +extern void vfp_state_initialize(struct arm_vfpsaved_state *vfp_state); +extern void vfp_save(struct arm_vfpsaved_state *vfp_ss); +extern void vfp_load(struct arm_vfpsaved_state *vfp_ss); #endif /* __ARM_VFP__ */ -extern void arm_debug_set(arm_debug_state_t *debug_state); +extern void arm_debug_set(arm_debug_state_t *debug_state); #if defined(__arm64__) -extern void arm_debug_set32(arm_debug_state_t *debug_state); -extern void arm_debug_set64(arm_debug_state_t *debug_state); - -kern_return_t handle_get_arm_thread_state( - thread_state_t tstate, - mach_msg_type_number_t * count, - const arm_saved_state_t *saved_state); -kern_return_t handle_get_arm32_thread_state( - thread_state_t tstate, - mach_msg_type_number_t * count, - const arm_saved_state_t *saved_state); -kern_return_t handle_get_arm64_thread_state( - thread_state_t tstate, - mach_msg_type_number_t * count, - const arm_saved_state_t *saved_state); - -kern_return_t handle_set_arm_thread_state( - const thread_state_t tstate, - mach_msg_type_number_t count, - arm_saved_state_t *saved_state); -kern_return_t handle_set_arm32_thread_state( - const thread_state_t tstate, - mach_msg_type_number_t count, - arm_saved_state_t *saved_state); -kern_return_t handle_set_arm64_thread_state( - const thread_state_t tstate, - mach_msg_type_number_t count, - arm_saved_state_t *saved_state); +extern void arm_debug_set32(arm_debug_state_t *debug_state); +extern void arm_debug_set64(arm_debug_state_t *debug_state); #endif #endif /* MACH_KERNEL_PRIVATE */ @@ -209,17 +201,11 @@ extern void *act_thread_csave(void); extern void act_thread_catt(void *ctx); extern void act_thread_cfree(void *ctx); -/* - * Return address of the function that called current function, given - * address of the first parameter of current function. - */ -#define GET_RETURN_PC(addr) (((vm_offset_t *)0)) /* - * Defining this indicates that MD code will supply an exception() - * routine, conformant with kern/exception.c (dependency alert!) - * but which does wonderfully fast, machine-dependent magic. + * Return address of the function that called current function, given + * address of the first parameter of current function. */ -#define MACHINE_FAST_EXCEPTION 1 +#define GET_RETURN_PC(addr) (__builtin_return_address(0)) -#endif /* _ARM_THREAD_H_ */ +#endif /* _ARM_THREAD_H_ */