pthread_md.h revision 118277
1/*- 2 * Copyright (c) 2002 Daniel Eischen <deischen@freebsd.org>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: head/lib/libkse/arch/i386/include/pthread_md.h 118277 2003-07-31 21:09:11Z deischen $ 27 */ 28/* 29 * Machine-dependent thread prototypes/definitions for the thread kernel. 30 */ 31#ifndef _PTHREAD_MD_H_ 32#define _PTHREAD_MD_H_ 33 34#include <sys/kse.h> 35#include <ucontext.h> 36 37extern int _thr_setcontext(mcontext_t *, intptr_t, intptr_t *); 38extern int _thr_getcontext(mcontext_t *); 39 40#define THR_GETCONTEXT(ucp) _thr_getcontext(&(ucp)->uc_mcontext); 41#define THR_SETCONTEXT(ucp) _thr_setcontext(&(ucp)->uc_mcontext, NULL, NULL); 42 43#define THR_ALIGNBYTES 15 44#define THR_ALIGN(td) (((unsigned)(td) + THR_ALIGNBYTES) & ~THR_ALIGNBYTES) 45 46/* 47 * KSE Specific Data. 48 */ 49struct ksd { 50 int ldt; 51#define KSDF_INITIALIZED 0x01 52 long flags; 53 void *base; 54 long size; 55}; 56 57extern void _i386_enter_uts(struct kse_mailbox *, kse_func_t, void *, long); 58 59static __inline int 60_thread_enter_uts(struct kse_thr_mailbox *tmbx, struct kse_mailbox *kmbx) 61{ 62 int ret; 63 64 ret = _thr_getcontext(&tmbx->tm_context.uc_mcontext); 65 if (ret == 0) { 66 _i386_enter_uts(kmbx, kmbx->km_func, 67 kmbx->km_stack.ss_sp, kmbx->km_stack.ss_size); 68 /* We should not reach here. */ 69 return (-1); 70 } 71 else if (ret < 0) 72 return (-1); 73 return (0); 74} 75 76static __inline int 77_thread_switch(struct kse_thr_mailbox *tmbx, struct kse_thr_mailbox **loc) 78{ 79 _thr_setcontext(&tmbx->tm_context.uc_mcontext, 80 (intptr_t)tmbx, (intptr_t *)loc); 81 /* We should not reach here. */ 82 return (-1); 83} 84 85#endif 86