]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/arm/thread.h
xnu-7195.101.1.tar.gz
[apple/xnu.git] / osfmk / arm / thread.h
index 46a603dcce9d51837aea671f5b368f95a3369544..ad331774b6cb64470fd4060fd9cb7c4d3c32572b 100644 (file)
 #include <mach/arm/vm_types.h>
 #include <mach/thread_status.h>
 
 #include <mach/arm/vm_types.h>
 #include <mach/thread_status.h>
 
-#ifdef  MACH_KERNEL_PRIVATE
+#ifdef MACH_KERNEL_PRIVATE
 #include <arm/cpu_data.h>
 #include <arm/proc_reg.h>
 #include <arm/cpu_data.h>
 #include <arm/proc_reg.h>
-#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 <os/base.h>
 #endif
 
 struct perfcontrol_state {
 #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[];
 
  */
 extern unsigned int _MachineStateCount[];
 
-#ifdef  MACH_KERNEL_PRIVATE
+#ifdef MACH_KERNEL_PRIVATE
 #if __arm64__
 #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 <kern/thread_kernel_state.h>
 
 struct machine_thread {
 #else
 typedef struct arm_saved_state machine_thread_kernel_state;
 #endif
 #include <kern/thread_kernel_state.h>
 
 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__
 #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__
 #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
 #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
 
 #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__
 #if __arm64__
-       uint64_t                                energy_estimate_nj;
+       uint16_t                  exception_trace_code;
 #endif
 #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
 
 #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__)
 #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__)
 #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)
 
 #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__
 #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__ */
 #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__)
 #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 */
 
 #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);
 
 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_ */