|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1993,1994 The University of Utah and ! 3: * the Computer Systems Laboratory (CSL). All rights reserved. ! 4: * ! 5: * Permission to use, copy, modify and distribute this software and its ! 6: * documentation is hereby granted, provided that both the copyright ! 7: * notice and this permission notice appear in all copies of the ! 8: * software, derivative works or modified versions, and any portions ! 9: * thereof, and that both notices appear in supporting documentation. ! 10: * ! 11: * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS ! 12: * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF ! 13: * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 14: * ! 15: * CSL requests users of this software to return to [email protected] any ! 16: * improvements that they make and grant CSL redistribution rights. ! 17: * ! 18: * Author: Bryan Ford, University of Utah CSL ! 19: */ ! 20: /* ! 21: * File: act.h ! 22: * ! 23: * This defines the Act structure, ! 24: * which is the kernel representation of a user-space activation. ! 25: * ! 26: */ ! 27: ! 28: #ifndef _KERN_ACT_H_ ! 29: #define _KERN_ACT_H_ ! 30: ! 31: #ifdef MIGRATING_THREADS ! 32: ! 33: #ifndef __dead /* XXX */ ! 34: #define __dead ! 35: #endif ! 36: ! 37: #include <mach_ipc_compat.h> ! 38: #include <mach/vm_param.h> ! 39: #include <mach/port.h> ! 40: #include <kern/lock.h> ! 41: #include <kern/refcount.h> ! 42: #include <kern/queue.h> ! 43: ! 44: #include "act.h"/*XXX*/ ! 45: ! 46: struct task; ! 47: struct thread; ! 48: struct Act; ! 49: ! 50: ! 51: struct ReturnHandler { ! 52: struct ReturnHandler *next; ! 53: void (*handler)(struct ReturnHandler *rh, struct Act *act); ! 54: }; ! 55: typedef struct ReturnHandler ReturnHandler; ! 56: ! 57: ! 58: ! 59: struct Act { ! 60: ! 61: /*** Task linkage ***/ ! 62: ! 63: /* Links for task's circular list of activations. ! 64: The activation is only on the task's activation list while active. ! 65: Must be first. */ ! 66: queue_chain_t task_links; ! 67: ! 68: /* Reference to the task this activation is in. ! 69: This is constant as long as the activation is allocated. */ ! 70: struct task *task; ! 71: ! 72: ! 73: ! 74: /*** Machine-dependent state ***/ ! 75: /* XXX should be first to allow maximum flexibility to MD code */ ! 76: MachineAct mact; ! 77: ! 78: ! 79: ! 80: /*** Consistency ***/ ! 81: RefCount ref_count; ! 82: decl_simple_lock_data(,lock) ! 83: ! 84: ! 85: ! 86: /*** ipc_target-related stuff ***/ ! 87: ! 88: /* ActPool this activation normally lives on, zero if none. ! 89: The activation and actpool hold references to each other as long as this is nonzero ! 90: (even when the activation isn't actually on the actpool's list). */ ! 91: struct ipc_target *ipt; ! 92: ! 93: /* Link on the ipt's list of activations. ! 94: The activation is only actually on the ipt's list (and hence this is valid) ! 95: when we're not in use (thread == 0) and not suspended (suspend_count == 0). */ ! 96: struct Act *ipt_next; ! 97: ! 98: ! 99: ! 100: /*** Thread linkage ***/ ! 101: ! 102: /* Thread this activation is in, zero if not in use. ! 103: The thread holds a reference on the activation while this is nonzero. */ ! 104: struct thread *thread; ! 105: ! 106: /* The rest in this section is only valid when thread is nonzero. */ ! 107: ! 108: /* Next higher and next lower activation on the thread's activation stack. ! 109: For a topmost activation or the null_act, higher is undefined. ! 110: The bottommost activation is always the null_act. */ ! 111: struct Act *higher, *lower; ! 112: ! 113: /* Alert bits pending at this activation; ! 114: some of them may have propagated from lower activations. */ ! 115: unsigned alerts; ! 116: ! 117: /* Mask of alert bits to be allowed to pass through from lower levels. */ ! 118: unsigned alert_mask; ! 119: ! 120: ! 121: ! 122: /*** Control information ***/ ! 123: ! 124: /* Number of outstanding suspensions on this activation. */ ! 125: int suspend_count; ! 126: ! 127: /* This is normally true, but is set to false when the activation is terminated. */ ! 128: int active; ! 129: ! 130: /* Chain of return handlers to be called ! 131: before the thread is allowed to return to this invocation */ ! 132: ReturnHandler *handlers; ! 133: ! 134: /* A special ReturnHandler attached to the above chain to handle suspension and such */ ! 135: ReturnHandler special_handler; ! 136: ! 137: ! 138: ! 139: /* Special ports attached to this activation */ ! 140: struct ipc_port *self; /* not a right, doesn't hold ref */ ! 141: struct ipc_port *self_port; /* a send right */ ! 142: struct ipc_port *exception_port; /* a send right */ ! 143: struct ipc_port *syscall_port; /* a send right */ ! 144: #if MACH_IPC_COMPAT ! 145: struct ipc_port *reply_port; /* a send right */ ! 146: struct task *reply_task; ! 147: #endif MACH_IPC_COMPAT ! 148: }; ! 149: typedef struct Act Act; ! 150: typedef struct Act *act_t; ! 151: typedef mach_port_t *act_array_t; ! 152: ! 153: #define ACT_NULL ((Act*)0) ! 154: ! 155: ! 156: /* Exported to world */ ! 157: kern_return_t act_create(struct task *task, vm_offset_t user_stack, vm_offset_t user_rbuf, vm_size_t user_rbuf_size, struct Act **new_act); ! 158: kern_return_t act_alert_mask(struct Act *act, unsigned alert_mask); ! 159: kern_return_t act_alert(struct Act *act, unsigned alerts); ! 160: kern_return_t act_abort(struct Act *act); ! 161: kern_return_t act_abort_safely(struct Act *act); ! 162: kern_return_t act_terminate(struct Act *act); ! 163: kern_return_t act_suspend(struct Act *act); ! 164: kern_return_t act_resume(struct Act *act); ! 165: kern_return_t act_get_state(struct Act *act, int flavor, ! 166: natural_t *state, natural_t *pcount); ! 167: kern_return_t act_set_state(struct Act *act, int flavor, ! 168: natural_t *state, natural_t count); ! 169: ! 170: #define act_lock(act) simple_lock(&(act)->lock) ! 171: #define act_unlock(act) simple_unlock(&(act)->lock) ! 172: ! 173: #define act_reference(act) refcount_take(&(act)->ref_count) ! 174: void act_deallocate(struct Act *act); ! 175: ! 176: /* Exported to startup.c */ ! 177: void act_init(void); ! 178: ! 179: /* Exported to task.c */ ! 180: kern_return_t act_terminate_task_locked(struct Act *act); ! 181: ! 182: /* Exported to thread.c */ ! 183: extern Act null_act; ! 184: kern_return_t act_create_kernel(Act **out_act); ! 185: ! 186: /* Exported to machine-dependent activation code */ ! 187: void act_execute_returnhandlers(void); ! 188: ! 189: ! 190: ! 191: /* System-dependent functions */ ! 192: kern_return_t act_machine_create(struct task *task, Act *inc, vm_offset_t user_stack, vm_offset_t user_rbuf, vm_size_t user_rbuf_size); ! 193: void act_machine_destroy(Act *inc); ! 194: kern_return_t act_machine_set_state(Act *inc, int flavor, int *tstate, unsigned count); ! 195: kern_return_t act_machine_get_state(Act *inc, int flavor, int *tstate, unsigned *count); ! 196: ! 197: ! 198: ! 199: #endif /* MIGRATING_THREADS */ ! 200: #endif _KERN_ACT_H_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.