pthread_md.h revision 1.3
11.3Schristos/*	$NetBSD: pthread_md.h,v 1.3 2003/01/18 18:40:08 christos Exp $	*/
21.2Sthorpej
31.2Sthorpej/*
41.2Sthorpej * Copyright (c) 2001 Wasabi Systems, Inc.
51.2Sthorpej * All rights reserved.
61.2Sthorpej *
71.2Sthorpej * Written by Jason R. Thorpe for Wasabi Systems, Inc.
81.2Sthorpej *
91.2Sthorpej * Redistribution and use in source and binary forms, with or without
101.2Sthorpej * modification, are permitted provided that the following conditions
111.2Sthorpej * are met:
121.2Sthorpej * 1. Redistributions of source code must retain the above copyright
131.2Sthorpej *    notice, this list of conditions and the following disclaimer.
141.2Sthorpej * 2. Redistributions in binary form must reproduce the above copyright
151.2Sthorpej *    notice, this list of conditions and the following disclaimer in the
161.2Sthorpej *    documentation and/or other materials provided with the distribution.
171.2Sthorpej * 3. All advertising materials mentioning features or use of this software
181.2Sthorpej *    must display the following acknowledgement:
191.2Sthorpej *	This product includes software developed for the NetBSD Project by
201.2Sthorpej *	Wasabi Systems, Inc.
211.2Sthorpej * 4. The name of Wasabi Systems, Inc. may not be used to endorse
221.2Sthorpej *    or promote products derived from this software without specific prior
231.2Sthorpej *    written permission.
241.2Sthorpej *
251.2Sthorpej * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
261.2Sthorpej * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
271.2Sthorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
281.2Sthorpej * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
291.2Sthorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
301.2Sthorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
311.2Sthorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
321.2Sthorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
331.2Sthorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
341.2Sthorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
351.2Sthorpej * POSSIBILITY OF SUCH DAMAGE.
361.2Sthorpej */
371.2Sthorpej
381.2Sthorpej#ifndef _LIB_PTHREAD_ARM_MD_H
391.2Sthorpej#define	_LIB_PTHREAD_ARM_MD_H
401.2Sthorpej
411.2Sthorpejstatic __inline long
421.2Sthorpejpthread__sp(void)
431.2Sthorpej{
441.2Sthorpej	long ret;
451.2Sthorpej
461.2Sthorpej	__asm __volatile("mov %0, sp"
471.2Sthorpej		: "=r" (ret));
481.2Sthorpej
491.2Sthorpej	return (ret);
501.2Sthorpej}
511.2Sthorpej
521.2Sthorpej#define	pthread__uc_sp(ucp)	((ucp)->uc_mcontext.__gregs[_REG_SP])
531.2Sthorpej#define	pthread__uc_pc(ucp)	((ucp)->uc_mcontext.__gregs[_REG_PC])
541.2Sthorpej
551.2Sthorpej/*
561.2Sthorpej * Set initial, sane values for registers whose values aren't just
571.2Sthorpej * "don't care".
581.2Sthorpej */
591.2Sthorpej#ifdef __APCS_26__
601.2Sthorpej#define _INITCONTEXT_U_MD(ucp)						\
611.3Schristos/* Set R15_MODE_USR in the PC */					\
621.2Sthorpej	(ucp)->uc_mcontext.__gregs[_REG_PC] =				\
631.2Sthorpej	 ((ucp)->uc_mcontext.__gregs[_REG_PC] & 0x3fffffc) | 0x0;
641.2Sthorpej#else
651.2Sthorpej/* Set CPSR to PSR_USE32_MODE (0x10) from arm/armreg.h */
661.2Sthorpej#define _INITCONTEXT_U_MD(ucp)						\
671.2Sthorpej	(ucp)->uc_mcontext.__gregs[_REG_CPSR] = 0x10;
681.2Sthorpej#endif
691.2Sthorpej
701.2Sthorpej/*
711.2Sthorpej * Usable stack space below the ucontext_t.
721.2Sthorpej *    For a good time, see comments in pthread_switch.S and
731.2Sthorpej *    ../i386/pthread_switch.S about STACK_SWITCH.
741.2Sthorpej */
751.2Sthorpej#define	STACKSPACE		(6 * sizeof(long))
761.2Sthorpej
771.2Sthorpej/*
781.2Sthorpej * Conversions between struct reg and struct mcontext.  Used by
791.2Sthorpej * libpthread_dbg.
801.2Sthorpej */
811.2Sthorpej
821.2Sthorpej#define	PTHREAD_ARM_UCONTEXT_TO_REG(reg, uc)				\
831.2Sthorpejdo {									\
841.2Sthorpej	int _reg_;							\
851.2Sthorpej									\
861.2Sthorpej	for (_reg_ = 0; _reg_ <= 12; _reg_++)				\
871.2Sthorpej		(reg)->r[_reg_] =					\
881.2Sthorpej		    (uc)->uc_mcontext.__gregs[_REG_R0 + _reg_];		\
891.2Sthorpej	(reg)->r_sp = (uc)->uc_mcontext.__gregs[_REG_SP];		\
901.2Sthorpej	(reg)->r_lr = (uc)->uc_mcontext.__gregs[_REG_LR];		\
911.2Sthorpej	(reg)->r_pc = (uc)->uc_mcontext.__gregs[_REG_PC];		\
921.2Sthorpej	(reg)->r_cpsr = (uc)->uc_mcontext.__gregs[_REG_CPSR];		\
931.2Sthorpej} while (/*CONSTCOND*/0)
941.2Sthorpej
951.2Sthorpej#ifdef __APCS_26__
961.2Sthorpej#define PTHREAD_UCONTEXT_TO_REG(reg, uc) PTHREAD_ARM_UCONTEXT_TO_REG((reg), (uc))
971.2Sthorpej#else
981.2Sthorpej/* Need to signal in the CPSR that this is 32-bit ARM */
991.2Sthorpej#define PTHREAD_UCONTEXT_TO_REG(reg, uc)				\
1001.2Sthorpejdo {									\
1011.2Sthorpej	PTHREAD_ARM_UCONTEXT_TO_REG((reg), (uc));			\
1021.2Sthorpej	if ((uc)->uc_flags & _UC_USER)					\
1031.2Sthorpej		(reg)->r_cpsr = 0x10;					\
1041.2Sthorpej} while (/*CONSTCOND*/0)
1051.2Sthorpej#endif
1061.2Sthorpej
1071.2Sthorpej
1081.2Sthorpej#define	PTHREAD_REG_TO_UCONTEXT(uc, reg)				\
1091.2Sthorpejdo {									\
1101.2Sthorpej	int _reg_;							\
1111.2Sthorpej									\
1121.2Sthorpej	for (_reg_ = 0; _reg_ <= 12; _reg_++)				\
1131.2Sthorpej		(uc)->uc_mcontext.__gregs[_REG_R0 + _reg_] =		\
1141.2Sthorpej		    (reg)->r[_reg_];					\
1151.2Sthorpej	(uc)->uc_mcontext.__gregs[_REG_SP] = (reg)->r_sp;		\
1161.2Sthorpej	(uc)->uc_mcontext.__gregs[_REG_LR] = (reg)->r_lr;		\
1171.2Sthorpej	(uc)->uc_mcontext.__gregs[_REG_PC] = (reg)->r_pc;		\
1181.2Sthorpej	(uc)->uc_mcontext.__gregs[_REG_CPSR] = (reg)->r_cpsr;		\
1191.2Sthorpej} while (/*CONSTCOND*/0)
1201.2Sthorpej
1211.2Sthorpej/*
1221.2Sthorpej * XXX Need to deal with VFP.
1231.2Sthorpej */
1241.2Sthorpej#define	PTHREAD_UCONTEXT_TO_FPREG(freg, uc)				\
1251.2Sthorpejdo {									\
1261.2Sthorpej	(freg)->fpr_fpsr = (uc)->uc_mcontext.__fpu.__fpregs.__fp_fpsr;	\
1271.2Sthorpej	memcpy((freg)->fpr, (uc)->uc_mcontext.__fpu.__fpregs.__fp_fr,	\
1281.2Sthorpej	    sizeof((freg)->fpr));					\
1291.2Sthorpej} while (/*CONSTCOND*/0)
1301.2Sthorpej
1311.2Sthorpej#define	PTHREAD_FPREG_TO_UCONTEXT(uc, freg)				\
1321.2Sthorpejdo {									\
1331.2Sthorpej	(uc)->uc_mcontext.__fpu.__fpregs.__fp_fpsr = (freg)->fpr_fpsr;	\
1341.2Sthorpej	memcpy((uc)->uc_mcontext.__fpu.__fpregs.__fp_fr, (freg)->fpr,	\
1351.2Sthorpej	    sizeof((uc)->uc_mcontext.__fpu.__fpregs.__fp_fr));		\
1361.2Sthorpej} while (/*CONSTCOND*/0)
1371.2Sthorpej
1381.2Sthorpej#endif /* _LIB_PTHREAD_ARM_MD_H */
139