|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Copyright (c) 1992 NeXT Computer, Inc. ! 27: * ! 28: * Intel386 Family: Machine dependent thread state. ! 29: * ! 30: * HISTORY ! 31: * ! 32: * 30 September 1992 ? at NeXT ! 33: * Moved tss out of pcb. ! 34: * ! 35: * 6 April 1992 ? at NeXT ! 36: * Created. ! 37: */ ! 38: ! 39: #ifndef _MACHDEP_I386_PCB_H_ ! 40: #define _MACHDEP_I386_PCB_H_ ! 41: ! 42: #import <kern/kernel_stack.h> ! 43: ! 44: #import <architecture/i386/frame.h> ! 45: #import <architecture/i386/fpu.h> ! 46: ! 47: #import <machdep/i386/seg.h> ! 48: #import <machdep/i386/regs.h> ! 49: ! 50: /* ! 51: * Context information which is common ! 52: * to all threads in a task. Each ! 53: * thread has its own copy of this ! 54: * information. ! 55: */ ! 56: typedef struct pcb_common { ! 57: vm_offset_t ldt; /* a LINEAR address */ ! 58: vm_size_t ldt_size; ! 59: struct { ! 60: vm_offset_t base; ! 61: vm_size_t length; ! 62: } io_bmap; ! 63: lock_data_t lock; ! 64: } pcb_common_t; ! 65: ! 66: /* ! 67: * Storage definition for a threads ! 68: * hardware task state segment. ! 69: * Threads which need an IO space ! 70: * bitmap for access to device ! 71: * registers from user mode need ! 72: * an externally allocated TSS. ! 73: */ ! 74: typedef union { ! 75: tss_t internal; ! 76: struct tss_alloc { ! 77: vm_offset_t base; ! 78: vm_size_t length; ! 79: } external; ! 80: } pcb_tss_t; ! 81: ! 82: /* ! 83: * Thread state is saved in ! 84: * this format whenever an ! 85: * interrupt/trap/system call ! 86: * occurs. ! 87: */ ! 88: typedef struct thread_saved_state { ! 89: regs_t regs; ! 90: unsigned int trapno; ! 91: except_frame_t frame; ! 92: } thread_saved_state_t; ! 93: ! 94: /* ! 95: * A thread uses a private save ! 96: * area as its kernel stack while ! 97: * executing in user mode. After ! 98: * the user state is saved, it ! 99: * switches to the active kernel ! 100: * stack. The save area must be ! 101: * large enough to hold the entire ! 102: * user state, plus enough for a ! 103: * kernel mode interrupt in case ! 104: * one occurs before the stack is ! 105: * switched. In addition, if a ! 106: * call gate gets invoked with ! 107: * the TF (single step) flag set, ! 108: * the debug trap gets taken from ! 109: * kernel mode after the call ! 110: * frame gets saved but before the ! 111: * first instruction of the call ! 112: * gate handler gets executed. Thus, ! 113: * an extra exception frame is needed ! 114: * for the worst case. ! 115: */ ! 116: typedef struct thread_save_area { ! 117: except_frame_t sa_x; ! 118: thread_saved_state_t sa_k; ! 119: thread_saved_state_t sa_u; ! 120: } thread_save_area_t; ! 121: ! 122: /* ! 123: * Per-thread machine dependent ! 124: * context information. ! 125: */ ! 126: typedef struct pcb { ! 127: /* ! 128: * i386 Hardware Task State. ! 129: */ ! 130: tss_t * tss; ! 131: vm_size_t tss_size; ! 132: pcb_tss_t tss_store; ! 133: ! 134: /* ! 135: * The private area for saved user ! 136: * state is external to the pcb, ! 137: * and is created lazily. This ! 138: * avoids wasting the space for ! 139: * kernel mode-only threads. ! 140: */ ! 141: thread_save_area_t *save_area; ! 142: ! 143: /* ! 144: * Most threads use a common, static ! 145: * LDT. Some threads have their own, ! 146: * which resides in the task virtual ! 147: * address space. ! 148: */ ! 149: vm_offset_t ldt; /* a LINEAR address */ ! 150: vm_size_t ldt_size; ! 151: ! 152: /* ! 153: * Floating point state is ! 154: * identical to the format ! 155: * written by the FSAVE instruction. ! 156: */ ! 157: fp_state_t fpstate; ! 158: ! 159: /* ! 160: * cthreads 'self' id ! 161: */ ! 162: unsigned int cthread_self; ! 163: ! 164: /* ! 165: * Private data structure for ! 166: * PC support. ! 167: */ ! 168: struct PCprivate *PCpriv; ! 169: ! 170: /* ! 171: * Boolean flags. ! 172: */ ! 173: unsigned int ! 174: /* boolean_t */ trace :1, ! 175: fpvalid :1, ! 176: extern_tss :1, ! 177: :0; ! 178: } *pcb_t; ! 179: ! 180: #define current_stack_pointer() (stack_pointers[cpu_number()]) ! 181: ! 182: #define USER_REGS(thread) \ ! 183: ((thread)->pcb->save_area ? \ ! 184: (&(thread)->pcb->save_area->sa_u) : \ ! 185: (void *)(thread_user_state(thread))) ! 186: ! 187: #endif /* _MACHDEP_I386_PCB_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.