]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/i386/thread.h
xnu-792.6.56.tar.gz
[apple/xnu.git] / osfmk / i386 / thread.h
index 99bcca4a09349d63cf404933eda3deec361ebd1c..926bd0a13a4c47f982661cc06e5cf9b56dccb946 100644 (file)
@@ -1,10 +1,8 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
- * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
@@ -66,6 +64,7 @@
 #include <mach/boolean.h>
 #include <mach/i386/vm_types.h>
 #include <mach/i386/fp_reg.h>
+#include <mach/thread_status.h>
 
 #include <kern/lock.h>
 
 #include <i386/seg.h>
 #include <i386/tss.h>
 #include <i386/eflags.h>
-#include <i386/thread_act.h>
+
+/*
+ *     i386_saved_state:
+ *
+ *     Has been exported to servers.  See: mach/i386/thread_status.h
+ *
+ *     This structure corresponds to the state of user registers
+ *     as saved upon kernel entry.  It lives in the pcb.
+ *     It is also pushed onto the stack for exceptions in the kernel.
+ *     For performance, it is also used directly in syscall exceptions
+ *     if the server has requested i386_THREAD_STATE flavor for the exception
+ *     port.
+ *
+ *     We define the following as an alias for the "esp" field of the
+ *     structure, because we actually save cr2 here, not the kernel esp.
+ */
+#define cr2    esp
+
+/*
+ *     Save area for user floating-point state.
+ *     Allocated only when necessary.
+ */
+
+struct i386_fpsave_state {
+       boolean_t               fp_valid;
+       struct i386_fp_save     fp_save_state;
+       struct i386_fp_regs     fp_regs;
+        struct i386_fx_save    fx_save_state __attribute__ ((aligned (16)));
+       int                     fp_save_flavor;
+};
+
+/*
+ *     v86_assist_state:
+ *
+ *     This structure provides data to simulate 8086 mode
+ *     interrupts.  It lives in the pcb.
+ */
+
+struct v86_assist_state {
+       vm_offset_t             int_table;
+       unsigned short          int_count;
+       unsigned short          flags;  /* 8086 flag bits */
+};
+#define        V86_IF_PENDING          0x8000  /* unused bit */
+
+/*
+ *     i386_interrupt_state:
+ *
+ *     This structure describes the set of registers that must
+ *     be pushed on the current ring-0 stack by an interrupt before
+ *     we can switch to the interrupt stack.
+ */
+
+struct i386_interrupt_state {
+        int     gs;
+        int     fs;
+       int     es;
+       int     ds;
+       int     edx;
+       int     ecx;
+       int     eax;
+       int     eip;
+       int     cs;
+       int     efl;
+};
+
+/*
+ *     i386_kernel_state:
+ *
+ *     This structure corresponds to the state of kernel registers
+ *     as saved in a context-switch.  It lives at the base of the stack.
+ */
+
+struct i386_kernel_state {
+       int                     k_ebx;  /* kernel context */
+       int                     k_esp;
+       int                     k_ebp;
+       int                     k_edi;
+       int                     k_esi;
+       int                     k_eip;
+};
+
+/*
+ *     i386_machine_state:
+ *
+ *     This structure corresponds to special machine state.
+ *     It lives in the pcb.  It is not saved by default.
+ */
+
+struct i386_machine_state {
+       iopb_tss_t              io_tss;
+       struct user_ldt *       ldt;
+       struct i386_fpsave_state *ifps;
+       struct v86_assist_state v86s;
+};
+
+typedef struct pcb {
+       struct i386_interrupt_state iis[2];     /* interrupt and NMI */
+       struct i386_saved_state iss;
+       struct i386_machine_state ims;
+#ifdef MACH_BSD
+       unsigned long   cthread_self;           /* for use of cthread package */
+        struct real_descriptor cthread_desc;
+       unsigned long  uldt_selector;          /* user ldt selector to set */
+       struct real_descriptor uldt_desc;      /* the actual user setable ldt data */
+#endif
+       decl_simple_lock_data(,lock)
+} *pcb_t;
+
+/*
+ * Maps state flavor to number of words in the state:
+ */
+__private_extern__ unsigned int _MachineStateCount[];
+
+#define USER_REGS(ThrAct)      (&(ThrAct)->machine.pcb->iss)
+
+#define act_machine_state_ptr(ThrAct)  (thread_state_t)USER_REGS(ThrAct)
+
+
+#define        is_user_thread(ThrAct)  \
+       ((USER_REGS(ThrAct)->efl & EFL_VM) \
+        || ((USER_REGS(ThrAct)->cs & 0x03) != 0))
+
+#define        user_pc(ThrAct)         (USER_REGS(ThrAct)->eip)
+#define        user_sp(ThrAct)         (USER_REGS(ThrAct)->uesp)
+
+struct machine_thread {
+       /*
+        * pointer to process control block
+        *      (actual storage may as well be here, too)
+        */
+       struct pcb xxx_pcb;
+       pcb_t pcb;
+
+};
+
+extern struct i386_saved_state *get_user_regs(thread_t);
+
+extern void *act_thread_csave(void);
+extern void act_thread_catt(void *ctx);
+extern void act_thread_cfree(void *ctx);
 
 /*
  *     i386_exception_link:
@@ -99,34 +238,6 @@ struct i386_exception_link {
 #define STACK_IEL(stack)       \
        ((struct i386_exception_link *)STACK_IKS(stack) - 1)
 
-#if    NCPUS > 1
-#include <i386/mp_desc.h>
-#endif
-
-/*
- * Boot-time data for master (or only) CPU
- */
-extern struct fake_descriptor  idt[IDTSZ];
-extern struct fake_descriptor  gdt[GDTSZ];
-extern struct fake_descriptor  ldt[LDTSZ];
-extern struct i386_tss         ktss;
-#if    MACH_KDB
-extern char                    db_stack_store[];
-extern char                    db_task_stack_store[];
-extern struct i386_tss         dbtss;
-extern void                    db_task_start(void);
-#endif /* MACH_KDB */
-#if    NCPUS > 1
-#define        curr_gdt(mycpu)         (mp_gdt[mycpu])
-#define        curr_ktss(mycpu)        (mp_ktss[mycpu])
-#else
-#define        curr_gdt(mycpu)         (gdt)
-#define        curr_ktss(mycpu)        (&ktss)
-#endif
-
-#define        gdt_desc_p(mycpu,sel) \
-       ((struct real_descriptor *)&curr_gdt(mycpu)[sel_idx(sel)])
-
 /*
  * Return address of the function that called current function, given
  *     address of the first parameter of current function.
@@ -140,18 +251,4 @@ extern void                        db_task_start(void);
  */
 #define MACHINE_FAST_EXCEPTION 1
 
-/*
- * MD Macro to fill up global stack state,
- * keeping the MD structure sizes + games private
- */
-#define MACHINE_STACK_STASH(stack)                                      \
-MACRO_BEGIN                                                            \
-       mp_disable_preemption();                                        \
-       kernel_stack[cpu_number()] = (stack) +                          \
-           (KERNEL_STACK_SIZE - sizeof (struct i386_exception_link)    \
-                               - sizeof (struct i386_kernel_state)),   \
-               active_stacks[cpu_number()] = (stack);                  \
-       mp_enable_preemption();                                         \
-MACRO_END
-
 #endif /* _I386_THREAD_H_ */