1/* 2 * Copyright (c) 2000-2012 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 * @OSF_COPYRIGHT@ 30 */ 31/* 32 * Mach Operating System 33 * Copyright (c) 1991,1990,1989 Carnegie Mellon University 34 * All Rights Reserved. 35 * 36 * Permission to use, copy, modify and distribute this software and its 37 * documentation is hereby granted, provided that both the copyright 38 * notice and this permission notice appear in all copies of the 39 * software, derivative works or modified versions, and any portions 40 * thereof, and that both notices appear in supporting documentation. 41 * 42 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 43 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 44 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 45 * 46 * Carnegie Mellon requests users of this software to return to 47 * 48 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 49 * School of Computer Science 50 * Carnegie Mellon University 51 * Pittsburgh PA 15213-3890 52 * 53 * any improvements or extensions that they make and grant Carnegie Mellon 54 * the rights to redistribute these changes. 55 */ 56/* 57 */ 58 59/* 60 * File: machine/thread.h 61 * 62 * This file contains the structure definitions for the thread 63 * state as applied to I386 processors. 64 */ 65 66#ifndef _I386_THREAD_H_ 67#define _I386_THREAD_H_ 68 69#include <mach/boolean.h> 70#include <mach/i386/vm_types.h> 71#include <mach/i386/fp_reg.h> 72#include <mach/thread_status.h> 73 74#include <kern/simple_lock.h> 75 76#include <i386/iopb.h> 77#include <i386/seg.h> 78#include <i386/tss.h> 79#include <i386/eflags.h> 80 81#include <i386/cpu_data.h> 82 83#include <machine/pal_routines.h> 84 85/* 86 * x86_kernel_state: 87 * 88 * This structure corresponds to the state of kernel registers 89 * as saved in a context-switch. It lives at the base of the stack. 90 */ 91 92struct x86_kernel_state { 93 uint64_t k_rbx; /* kernel context */ 94 uint64_t k_rsp; 95 uint64_t k_rbp; 96 uint64_t k_r12; 97 uint64_t k_r13; 98 uint64_t k_r14; 99 uint64_t k_r15; 100 uint64_t k_rip; 101}; 102 103/* 104 * Maps state flavor to number of words in the state: 105 */ 106extern unsigned int _MachineStateCount[]; 107 108/* 109 * The machine-dependent thread state - registers and all platform-dependent 110 * state - is saved in the machine thread structure which is embedded in 111 * the thread data structure. For historical reasons this is also referred to 112 * as the PCB. 113 */ 114struct machine_thread { 115 x86_saved_state_t *iss; 116 void *ifps; 117 void *ids; 118 decl_simple_lock_data(,lock); /* protects ifps and ids */ 119 uint64_t iss_pte0; 120 uint64_t iss_pte1; 121 122#ifdef MACH_BSD 123 uint64_t cthread_self; /* for use of cthread package */ 124 struct real_descriptor cthread_desc; 125 unsigned long uldt_selector; /* user ldt selector to set */ 126 struct real_descriptor uldt_desc; /* actual user setable ldt */ 127#endif 128 129 struct pal_pcb pal_pcb; 130 uint32_t specFlags; 131#define OnProc 0x1 132#define CopyIOActive 0x2 /* Checked to ensure DTrace actions do not re-enter copyio(). */ 133 uint64_t thread_gpu_ns; 134#if NCOPY_WINDOWS > 0 135 struct { 136 user_addr_t user_base; 137 } copy_window[NCOPY_WINDOWS]; 138 int nxt_window; 139 int copyio_state; 140#define WINDOWS_DIRTY 0 141#define WINDOWS_CLEAN 1 142#define WINDOWS_CLOSED 2 143#define WINDOWS_OPENED 3 144 uint64_t physwindow_pte; 145 int physwindow_busy; 146#endif 147}; 148typedef struct machine_thread *pcb_t; 149 150#define THREAD_TO_PCB(Thr) (&(Thr)->machine) 151 152#define USER_STATE(Thr) ((Thr)->machine.iss) 153#define USER_REGS32(Thr) (saved_state32(USER_STATE(Thr))) 154#define USER_REGS64(Thr) (saved_state64(USER_STATE(Thr))) 155 156#define user_pc(Thr) (is_saved_state32(USER_STATE(Thr)) ? \ 157 USER_REGS32(Thr)->eip : \ 158 USER_REGS64(Thr)->isf.rip ) 159 160extern void *get_user_regs(thread_t); 161 162extern void *act_thread_csave(void); 163extern void act_thread_catt(void *ctx); 164extern void act_thread_cfree(void *ctx); 165 166 167/* 168 * On the kernel stack is: 169 * stack: ... 170 * struct x86_kernel_state 171 * stack+kernel_stack_size 172 */ 173 174#define STACK_IKS(stack) \ 175 ((struct x86_kernel_state *)((stack) + kernel_stack_size) - 1) 176 177/* 178 * Return the current stack depth including x86_kernel_state 179 */ 180static inline vm_offset_t 181current_stack_depth(void) 182{ 183 vm_offset_t stack_ptr; 184 185 assert(get_preemption_level() > 0 || !ml_get_interrupts_enabled()); 186 187#if defined(__x86_64__) 188 __asm__ volatile("mov %%rsp, %0" : "=m" (stack_ptr)); 189#else 190 __asm__ volatile("mov %%esp, %0" : "=m" (stack_ptr)); 191#endif 192 return (current_cpu_datap()->cpu_kernel_stack 193 + sizeof(struct x86_kernel_state) 194 - stack_ptr); 195} 196 197/* 198 * Return address of the function that called current function, given 199 * address of the first parameter of current function. 200 */ 201#define GET_RETURN_PC(addr) (__builtin_return_address(0)) 202 203#endif /* _I386_THREAD_H_ */ 204