itlibthread: simplify - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit 18571208068d5fe2f0bf7b4e980525a7f577c503 /src/plan9port/commit/18571208068d5fe2f0bf7b4e980525a7f577c503.gph mx1.adamsgaard.dk 70 1parent e68f07d46f5f168dc2076286627279540bf1f99e /src/plan9port/commit/e68f07d46f5f168dc2076286627279540bf1f99e.gph mx1.adamsgaard.dk 70 hAuthor: Russ Cox URL:mailto:rsc@swtch.com mx1.adamsgaard.dk 70 iDate: Wed, 30 Dec 2020 07:18:30 -0500 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 ilibthread: simplify Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iNow that everything uses pthreads and pthreadperthread, Err mx1.adamsgaard.dk 70 ican delete various conditionals, all the custom context code, Err mx1.adamsgaard.dk 70 iand so on. Also update documents. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iFixes #355. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M include/libc.h | 2 -- Err mx1.adamsgaard.dk 70 i M include/u.h | 7 +------ Err mx1.adamsgaard.dk 70 i D src/libthread/386-ucontext.c | 22 ---------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/386-ucontext.h | 119 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/COPYING.SPARC64-CONT… | 458 ------------------------------- Err mx1.adamsgaard.dk 70 i M src/libthread/COPYRIGHT | 9 --------- Err mx1.adamsgaard.dk 70 i D src/libthread/Linux-arm-asm.s | 41 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/Linux-sparc64-contex… | 135 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/OpenBSD-386-asm.s | 45 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/OpenBSD-power-asm.S | 73 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/OpenBSD-x86_64-asm.S | 44 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/arm-ucontext.c | 24 ------------------------ Err mx1.adamsgaard.dk 70 i M src/libthread/mkfile | 3 +-- Err mx1.adamsgaard.dk 70 i D src/libthread/power-ucontext.c | 26 -------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/power-ucontext.h | 36 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/sparc64-ucontext.c | 49 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/stkmalloc.c | 13 ------------- Err mx1.adamsgaard.dk 70 i D src/libthread/stkmmap.c | 25 ------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/sysofiles.sh | 27 --------------------------- Err mx1.adamsgaard.dk 70 i M src/libthread/thread.c | 217 ++----------------------------- Err mx1.adamsgaard.dk 70 i M src/libthread/threadimpl.h | 44 ------------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/x86_64-ucontext.c | 28 ---------------------------- Err mx1.adamsgaard.dk 70 i D src/libthread/x86_64-ucontext.h | 42 ------------------------------- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i23 files changed, 12 insertions(+), 1477 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/include/libc.h b/include/libc.h /src/plan9port/file/include/libc.h.gph mx1.adamsgaard.dk 70 it@@ -473,10 +473,8 @@ extern _Thread *(*threadnow)(void); Err mx1.adamsgaard.dk 70 i typedef struct Lock Lock; Err mx1.adamsgaard.dk 70 i struct Lock Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i-#ifdef PLAN9PORT_USING_PTHREADS Err mx1.adamsgaard.dk 70 i int init; Err mx1.adamsgaard.dk 70 i pthread_mutex_t mutex; Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i int held; Err mx1.adamsgaard.dk 70 i }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 1diff --git a/include/u.h b/include/u.h /src/plan9port/file/include/u.h.gph mx1.adamsgaard.dk 70 it@@ -67,7 +67,6 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)]; Err mx1.adamsgaard.dk 70 i #if defined(__linux__) Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i-# define PLAN9PORT_USING_PTHREADS 1 Err mx1.adamsgaard.dk 70 i # if defined(__USE_MISC) Err mx1.adamsgaard.dk 70 i # undef _NEEDUSHORT Err mx1.adamsgaard.dk 70 i # undef _NEEDUINT Err mx1.adamsgaard.dk 70 it@@ -76,7 +75,6 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)]; Err mx1.adamsgaard.dk 70 i #elif defined(__sun__) Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i-# define PLAN9PORT_USING_PTHREADS 1 Err mx1.adamsgaard.dk 70 i # undef _NEEDUSHORT Err mx1.adamsgaard.dk 70 i # undef _NEEDUINT Err mx1.adamsgaard.dk 70 i # undef _NEEDULONG Err mx1.adamsgaard.dk 70 it@@ -84,7 +82,6 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)]; Err mx1.adamsgaard.dk 70 i #elif defined(__FreeBSD__) Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i-# define PLAN9PORT_USING_PTHREADS 1 Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i # if !defined(_POSIX_SOURCE) Err mx1.adamsgaard.dk 70 i # undef _NEEDUSHORT Err mx1.adamsgaard.dk 70 it@@ -93,7 +90,6 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)]; Err mx1.adamsgaard.dk 70 i #elif defined(__APPLE__) Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i-# define PLAN9PORT_USING_PTHREADS 1 Err mx1.adamsgaard.dk 70 i # if __GNUC__ < 4 Err mx1.adamsgaard.dk 70 i # undef _NEEDUSHORT Err mx1.adamsgaard.dk 70 i # undef _NEEDUINT Err mx1.adamsgaard.dk 70 it@@ -108,20 +104,19 @@ typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)]; Err mx1.adamsgaard.dk 70 i #elif defined(__NetBSD__) Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i+# include Err mx1.adamsgaard.dk 70 i # undef _NEEDUSHORT Err mx1.adamsgaard.dk 70 i # undef _NEEDUINT Err mx1.adamsgaard.dk 70 i # undef _NEEDULONG Err mx1.adamsgaard.dk 70 i #elif defined(__OpenBSD__) Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i-# define PLAN9PORT_USING_PTHREADS 1 Err mx1.adamsgaard.dk 70 i # undef _NEEDUSHORT Err mx1.adamsgaard.dk 70 i # undef _NEEDUINT Err mx1.adamsgaard.dk 70 i # undef _NEEDULONG Err mx1.adamsgaard.dk 70 i #else Err mx1.adamsgaard.dk 70 i /* No idea what system this is -- try some defaults */ Err mx1.adamsgaard.dk 70 i # include Err mx1.adamsgaard.dk 70 i-# define PLAN9PORT_USING_PTHREADS 1 Err mx1.adamsgaard.dk 70 i #endif Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i #ifndef O_DIRECT Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/386-ucontext.c b/src/libthread/386-ucontext.c /src/plan9port/file/src/libthread/386-ucontext.c.gph mx1.adamsgaard.dk 70 it@@ -1,22 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#include "threadimpl.h" Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- int *sp; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- sp = USPALIGN(ucp, 4); Err mx1.adamsgaard.dk 70 i- sp -= argc; Err mx1.adamsgaard.dk 70 i- memmove(sp, &argc+1, argc*sizeof(int)); Err mx1.adamsgaard.dk 70 i- *--sp = 0; /* return address */ Err mx1.adamsgaard.dk 70 i- ucp->uc_mcontext.mc_eip = (long)func; Err mx1.adamsgaard.dk 70 i- ucp->uc_mcontext.mc_esp = (int)sp; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-int Err mx1.adamsgaard.dk 70 i-swapcontext(ucontext_t *oucp, ucontext_t *ucp) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- if(getcontext(oucp) == 0) Err mx1.adamsgaard.dk 70 i- setcontext(ucp); Err mx1.adamsgaard.dk 70 i- return 0; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/386-ucontext.h b/src/libthread/386-ucontext.h /src/plan9port/file/src/libthread/386-ucontext.h.gph mx1.adamsgaard.dk 70 it@@ -1,119 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#define setcontext(u) setmcontext(&(u)->uc_mcontext) Err mx1.adamsgaard.dk 70 i-#define getcontext(u) getmcontext(&(u)->uc_mcontext) Err mx1.adamsgaard.dk 70 i-typedef struct mcontext mcontext_t; Err mx1.adamsgaard.dk 70 i-typedef struct ucontext ucontext_t; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-extern int swapcontext(ucontext_t*, ucontext_t*); Err mx1.adamsgaard.dk 70 i-extern void makecontext(ucontext_t*, void(*)(), int, ...); Err mx1.adamsgaard.dk 70 i-extern int getmcontext(mcontext_t*); Err mx1.adamsgaard.dk 70 i-extern void setmcontext(mcontext_t*); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/*- Err mx1.adamsgaard.dk 70 i- * Copyright (c) 1999 Marcel Moolenaar Err mx1.adamsgaard.dk 70 i- * All rights reserved. Err mx1.adamsgaard.dk 70 i- * Err mx1.adamsgaard.dk 70 i- * Redistribution and use in source and binary forms, with or without Err mx1.adamsgaard.dk 70 i- * modification, are permitted provided that the following conditions Err mx1.adamsgaard.dk 70 i- * are met: Err mx1.adamsgaard.dk 70 i- * 1. Redistributions of source code must retain the above copyright Err mx1.adamsgaard.dk 70 i- * notice, this list of conditions and the following disclaimer Err mx1.adamsgaard.dk 70 i- * in this position and unchanged. Err mx1.adamsgaard.dk 70 i- * 2. Redistributions in binary form must reproduce the above copyright Err mx1.adamsgaard.dk 70 i- * notice, this list of conditions and the following disclaimer in the Err mx1.adamsgaard.dk 70 i- * documentation and/or other materials provided with the distribution. Err mx1.adamsgaard.dk 70 i- * 3. The name of the author may not be used to endorse or promote products Err mx1.adamsgaard.dk 70 i- * derived from this software without specific prior written permission. Err mx1.adamsgaard.dk 70 i- * Err mx1.adamsgaard.dk 70 i- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR Err mx1.adamsgaard.dk 70 i- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES Err mx1.adamsgaard.dk 70 i- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. Err mx1.adamsgaard.dk 70 i- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, Err mx1.adamsgaard.dk 70 i- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT Err mx1.adamsgaard.dk 70 i- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, Err mx1.adamsgaard.dk 70 i- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY Err mx1.adamsgaard.dk 70 i- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT Err mx1.adamsgaard.dk 70 i- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF Err mx1.adamsgaard.dk 70 i- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Err mx1.adamsgaard.dk 70 i- * Err mx1.adamsgaard.dk 70 i- * $FreeBSD: src/sys/sys/ucontext.h,v 1.4 1999/10/11 20:33:17 luoqi Exp $ Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* #include */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/*- Err mx1.adamsgaard.dk 70 i- * Copyright (c) 1999 Marcel Moolenaar Err mx1.adamsgaard.dk 70 i- * All rights reserved. Err mx1.adamsgaard.dk 70 i- * Err mx1.adamsgaard.dk 70 i- * Redistribution and use in source and binary forms, with or without Err mx1.adamsgaard.dk 70 i- * modification, are permitted provided that the following conditions Err mx1.adamsgaard.dk 70 i- * are met: Err mx1.adamsgaard.dk 70 i- * 1. Redistributions of source code must retain the above copyright Err mx1.adamsgaard.dk 70 i- * notice, this list of conditions and the following disclaimer Err mx1.adamsgaard.dk 70 i- * in this position and unchanged. Err mx1.adamsgaard.dk 70 i- * 2. Redistributions in binary form must reproduce the above copyright Err mx1.adamsgaard.dk 70 i- * notice, this list of conditions and the following disclaimer in the Err mx1.adamsgaard.dk 70 i- * documentation and/or other materials provided with the distribution. Err mx1.adamsgaard.dk 70 i- * 3. The name of the author may not be used to endorse or promote products Err mx1.adamsgaard.dk 70 i- * derived from this software without specific prior written permission. Err mx1.adamsgaard.dk 70 i- * Err mx1.adamsgaard.dk 70 i- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR Err mx1.adamsgaard.dk 70 i- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES Err mx1.adamsgaard.dk 70 i- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. Err mx1.adamsgaard.dk 70 i- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, Err mx1.adamsgaard.dk 70 i- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT Err mx1.adamsgaard.dk 70 i- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, Err mx1.adamsgaard.dk 70 i- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY Err mx1.adamsgaard.dk 70 i- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT Err mx1.adamsgaard.dk 70 i- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF Err mx1.adamsgaard.dk 70 i- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Err mx1.adamsgaard.dk 70 i- * Err mx1.adamsgaard.dk 70 i- * $FreeBSD: src/sys/i386/include/ucontext.h,v 1.4 1999/10/11 20:33:09 luoqi Exp $ Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-struct mcontext { Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * The first 20 fields must match the definition of Err mx1.adamsgaard.dk 70 i- * sigcontext. So that we can support sigcontext Err mx1.adamsgaard.dk 70 i- * and ucontext_t at the same time. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- int mc_onstack; /* XXX - sigcontext compat. */ Err mx1.adamsgaard.dk 70 i- int mc_gs; Err mx1.adamsgaard.dk 70 i- int mc_fs; Err mx1.adamsgaard.dk 70 i- int mc_es; Err mx1.adamsgaard.dk 70 i- int mc_ds; Err mx1.adamsgaard.dk 70 i- int mc_edi; Err mx1.adamsgaard.dk 70 i- int mc_esi; Err mx1.adamsgaard.dk 70 i- int mc_ebp; Err mx1.adamsgaard.dk 70 i- int mc_isp; Err mx1.adamsgaard.dk 70 i- int mc_ebx; Err mx1.adamsgaard.dk 70 i- int mc_edx; Err mx1.adamsgaard.dk 70 i- int mc_ecx; Err mx1.adamsgaard.dk 70 i- int mc_eax; Err mx1.adamsgaard.dk 70 i- int mc_trapno; Err mx1.adamsgaard.dk 70 i- int mc_err; Err mx1.adamsgaard.dk 70 i- int mc_eip; Err mx1.adamsgaard.dk 70 i- int mc_cs; Err mx1.adamsgaard.dk 70 i- int mc_eflags; Err mx1.adamsgaard.dk 70 i- int mc_esp; /* machine state */ Err mx1.adamsgaard.dk 70 i- int mc_ss; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- int mc_fpregs[28]; /* env87 + fpacc87 + u_long */ Err mx1.adamsgaard.dk 70 i- int __spare__[17]; Err mx1.adamsgaard.dk 70 i-}; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-struct ucontext { Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * Keep the order of the first two fields. Also, Err mx1.adamsgaard.dk 70 i- * keep them the first two fields in the structure. Err mx1.adamsgaard.dk 70 i- * This way we can have a union with struct Err mx1.adamsgaard.dk 70 i- * sigcontext and ucontext_t. This allows us to Err mx1.adamsgaard.dk 70 i- * support them both at the same time. Err mx1.adamsgaard.dk 70 i- * note: the union is not defined, though. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- sigset_t uc_sigmask; Err mx1.adamsgaard.dk 70 i- mcontext_t uc_mcontext; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- struct __ucontext *uc_link; Err mx1.adamsgaard.dk 70 i- stack_t uc_stack; Err mx1.adamsgaard.dk 70 i- int __spare__[8]; Err mx1.adamsgaard.dk 70 i-}; Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/COPYING.SPARC64-CONTEXT b/src/libthread/COPYING.SPARC64-CONTEXT /src/plan9port/file/src/libthread/COPYING.SPARC64-CONTEXT.gph mx1.adamsgaard.dk 70 it@@ -1,458 +0,0 @@ Err mx1.adamsgaard.dk 70 i- GNU LESSER GENERAL PUBLIC LICENSE Err mx1.adamsgaard.dk 70 i- Version 2.1, February 1999 Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Copyright (C) 1991, 1999 Free Software Foundation, Inc. Err mx1.adamsgaard.dk 70 i- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Err mx1.adamsgaard.dk 70 i- Everyone is permitted to copy and distribute verbatim copies Err mx1.adamsgaard.dk 70 i- of this license document, but changing it is not allowed. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-[This is the first released version of the Lesser GPL. It also counts Err mx1.adamsgaard.dk 70 i- as the successor of the GNU Library Public License, version 2, hence Err mx1.adamsgaard.dk 70 i- the version number 2.1.] Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Preamble Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The licenses for most software are designed to take away your Err mx1.adamsgaard.dk 70 i-freedom to share and change it. By contrast, the GNU General Public Err mx1.adamsgaard.dk 70 i-Licenses are intended to guarantee your freedom to share and change Err mx1.adamsgaard.dk 70 i-free software--to make sure the software is free for all its users. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- This license, the Lesser General Public License, applies to some Err mx1.adamsgaard.dk 70 i-specially designated software packages--typically libraries--of the Err mx1.adamsgaard.dk 70 i-Free Software Foundation and other authors who decide to use it. You Err mx1.adamsgaard.dk 70 i-can use it too, but we suggest you first think carefully about whether Err mx1.adamsgaard.dk 70 i-this license or the ordinary General Public License is the better Err mx1.adamsgaard.dk 70 i-strategy to use in any particular case, based on the explanations below. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- When we speak of free software, we are referring to freedom of use, Err mx1.adamsgaard.dk 70 i-not price. Our General Public Licenses are designed to make sure that Err mx1.adamsgaard.dk 70 i-you have the freedom to distribute copies of free software (and charge Err mx1.adamsgaard.dk 70 i-for this service if you wish); that you receive source code or can get Err mx1.adamsgaard.dk 70 i-it if you want it; that you can change the software and use pieces of Err mx1.adamsgaard.dk 70 i-it in new free programs; and that you are informed that you can do Err mx1.adamsgaard.dk 70 i-these things. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- To protect your rights, we need to make restrictions that forbid Err mx1.adamsgaard.dk 70 i-distributors to deny you these rights or to ask you to surrender these Err mx1.adamsgaard.dk 70 i-rights. These restrictions translate to certain responsibilities for Err mx1.adamsgaard.dk 70 i-you if you distribute copies of the library or if you modify it. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- For example, if you distribute copies of the library, whether gratis Err mx1.adamsgaard.dk 70 i-or for a fee, you must give the recipients all the rights that we gave Err mx1.adamsgaard.dk 70 i-you. You must make sure that they, too, receive or can get the source Err mx1.adamsgaard.dk 70 i-code. If you link other code with the library, you must provide Err mx1.adamsgaard.dk 70 i-complete object files to the recipients, so that they can relink them Err mx1.adamsgaard.dk 70 i-with the library after making changes to the library and recompiling Err mx1.adamsgaard.dk 70 i-it. And you must show them these terms so they know their rights. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- We protect your rights with a two-step method: (1) we copyright the Err mx1.adamsgaard.dk 70 i-library, and (2) we offer you this license, which gives you legal Err mx1.adamsgaard.dk 70 i-permission to copy, distribute and/or modify the library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- To protect each distributor, we want to make it very clear that Err mx1.adamsgaard.dk 70 i-there is no warranty for the free library. Also, if the library is Err mx1.adamsgaard.dk 70 i-modified by someone else and passed on, the recipients should know Err mx1.adamsgaard.dk 70 i-that what they have is not the original version, so that the original Err mx1.adamsgaard.dk 70 i-author's reputation will not be affected by problems that might be Err mx1.adamsgaard.dk 70 i-introduced by others. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Finally, software patents pose a constant threat to the existence of Err mx1.adamsgaard.dk 70 i-any free program. We wish to make sure that a company cannot Err mx1.adamsgaard.dk 70 i-effectively restrict the users of a free program by obtaining a Err mx1.adamsgaard.dk 70 i-restrictive license from a patent holder. Therefore, we insist that Err mx1.adamsgaard.dk 70 i-any patent license obtained for a version of the library must be Err mx1.adamsgaard.dk 70 i-consistent with the full freedom of use specified in this license. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Most GNU software, including some libraries, is covered by the Err mx1.adamsgaard.dk 70 i-ordinary GNU General Public License. This license, the GNU Lesser Err mx1.adamsgaard.dk 70 i-General Public License, applies to certain designated libraries, and Err mx1.adamsgaard.dk 70 i-is quite different from the ordinary General Public License. We use Err mx1.adamsgaard.dk 70 i-this license for certain libraries in order to permit linking those Err mx1.adamsgaard.dk 70 i-libraries into non-free programs. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- When a program is linked with a library, whether statically or using Err mx1.adamsgaard.dk 70 i-a shared library, the combination of the two is legally speaking a Err mx1.adamsgaard.dk 70 i-combined work, a derivative of the original library. The ordinary Err mx1.adamsgaard.dk 70 i-General Public License therefore permits such linking only if the Err mx1.adamsgaard.dk 70 i-entire combination fits its criteria of freedom. The Lesser General Err mx1.adamsgaard.dk 70 i-Public License permits more lax criteria for linking other code with Err mx1.adamsgaard.dk 70 i-the library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- We call this license the "Lesser" General Public License because it Err mx1.adamsgaard.dk 70 i-does Less to protect the user's freedom than the ordinary General Err mx1.adamsgaard.dk 70 i-Public License. It also provides other free software developers Less Err mx1.adamsgaard.dk 70 i-of an advantage over competing non-free programs. These disadvantages Err mx1.adamsgaard.dk 70 i-are the reason we use the ordinary General Public License for many Err mx1.adamsgaard.dk 70 i-libraries. However, the Lesser license provides advantages in certain Err mx1.adamsgaard.dk 70 i-special circumstances. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- For example, on rare occasions, there may be a special need to Err mx1.adamsgaard.dk 70 i-encourage the widest possible use of a certain library, so that it becomes Err mx1.adamsgaard.dk 70 i-a de-facto standard. To achieve this, non-free programs must be Err mx1.adamsgaard.dk 70 i-allowed to use the library. A more frequent case is that a free Err mx1.adamsgaard.dk 70 i-library does the same job as widely used non-free libraries. In this Err mx1.adamsgaard.dk 70 i-case, there is little to gain by limiting the free library to free Err mx1.adamsgaard.dk 70 i-software only, so we use the Lesser General Public License. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- In other cases, permission to use a particular library in non-free Err mx1.adamsgaard.dk 70 i-programs enables a greater number of people to use a large body of Err mx1.adamsgaard.dk 70 i-free software. For example, permission to use the GNU C Library in Err mx1.adamsgaard.dk 70 i-non-free programs enables many more people to use the whole GNU Err mx1.adamsgaard.dk 70 i-operating system, as well as its variant, the GNU/Linux operating Err mx1.adamsgaard.dk 70 i-system. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Although the Lesser General Public License is Less protective of the Err mx1.adamsgaard.dk 70 i-users' freedom, it does ensure that the user of a program that is Err mx1.adamsgaard.dk 70 i-linked with the Library has the freedom and the wherewithal to run Err mx1.adamsgaard.dk 70 i-that program using a modified version of the Library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The precise terms and conditions for copying, distribution and Err mx1.adamsgaard.dk 70 i-modification follow. Pay close attention to the difference between a Err mx1.adamsgaard.dk 70 i-"work based on the library" and a "work that uses the library". The Err mx1.adamsgaard.dk 70 i-former contains code derived from the library, whereas the latter must Err mx1.adamsgaard.dk 70 i-be combined with the library in order to run. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- GNU LESSER GENERAL PUBLIC LICENSE Err mx1.adamsgaard.dk 70 i- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 0. This License Agreement applies to any software library or other Err mx1.adamsgaard.dk 70 i-program which contains a notice placed by the copyright holder or Err mx1.adamsgaard.dk 70 i-other authorized party saying it may be distributed under the terms of Err mx1.adamsgaard.dk 70 i-this Lesser General Public License (also called "this License"). Err mx1.adamsgaard.dk 70 i-Each licensee is addressed as "you". Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- A "library" means a collection of software functions and/or data Err mx1.adamsgaard.dk 70 i-prepared so as to be conveniently linked with application programs Err mx1.adamsgaard.dk 70 i-(which use some of those functions and data) to form executables. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The "Library", below, refers to any such software library or work Err mx1.adamsgaard.dk 70 i-which has been distributed under these terms. A "work based on the Err mx1.adamsgaard.dk 70 i-Library" means either the Library or any derivative work under Err mx1.adamsgaard.dk 70 i-copyright law: that is to say, a work containing the Library or a Err mx1.adamsgaard.dk 70 i-portion of it, either verbatim or with modifications and/or translated Err mx1.adamsgaard.dk 70 i-straightforwardly into another language. (Hereinafter, translation is Err mx1.adamsgaard.dk 70 i-included without limitation in the term "modification".) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- "Source code" for a work means the preferred form of the work for Err mx1.adamsgaard.dk 70 i-making modifications to it. For a library, complete source code means Err mx1.adamsgaard.dk 70 i-all the source code for all modules it contains, plus any associated Err mx1.adamsgaard.dk 70 i-interface definition files, plus the scripts used to control compilation Err mx1.adamsgaard.dk 70 i-and installation of the library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Activities other than copying, distribution and modification are not Err mx1.adamsgaard.dk 70 i-covered by this License; they are outside its scope. The act of Err mx1.adamsgaard.dk 70 i-running a program using the Library is not restricted, and output from Err mx1.adamsgaard.dk 70 i-such a program is covered only if its contents constitute a work based Err mx1.adamsgaard.dk 70 i-on the Library (independent of the use of the Library in a tool for Err mx1.adamsgaard.dk 70 i-writing it). Whether that is true depends on what the Library does Err mx1.adamsgaard.dk 70 i-and what the program that uses the Library does. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 1. You may copy and distribute verbatim copies of the Library's Err mx1.adamsgaard.dk 70 i-complete source code as you receive it, in any medium, provided that Err mx1.adamsgaard.dk 70 i-you conspicuously and appropriately publish on each copy an Err mx1.adamsgaard.dk 70 i-appropriate copyright notice and disclaimer of warranty; keep intact Err mx1.adamsgaard.dk 70 i-all the notices that refer to this License and to the absence of any Err mx1.adamsgaard.dk 70 i-warranty; and distribute a copy of this License along with the Err mx1.adamsgaard.dk 70 i-Library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- You may charge a fee for the physical act of transferring a copy, Err mx1.adamsgaard.dk 70 i-and you may at your option offer warranty protection in exchange for a Err mx1.adamsgaard.dk 70 i-fee. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 2. You may modify your copy or copies of the Library or any portion Err mx1.adamsgaard.dk 70 i-of it, thus forming a work based on the Library, and copy and Err mx1.adamsgaard.dk 70 i-distribute such modifications or work under the terms of Section 1 Err mx1.adamsgaard.dk 70 i-above, provided that you also meet all of these conditions: Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- a) The modified work must itself be a software library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- b) You must cause the files modified to carry prominent notices Err mx1.adamsgaard.dk 70 i- stating that you changed the files and the date of any change. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- c) You must cause the whole of the work to be licensed at no Err mx1.adamsgaard.dk 70 i- charge to all third parties under the terms of this License. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- d) If a facility in the modified Library refers to a function or a Err mx1.adamsgaard.dk 70 i- table of data to be supplied by an application program that uses Err mx1.adamsgaard.dk 70 i- the facility, other than as an argument passed when the facility Err mx1.adamsgaard.dk 70 i- is invoked, then you must make a good faith effort to ensure that, Err mx1.adamsgaard.dk 70 i- in the event an application does not supply such function or Err mx1.adamsgaard.dk 70 i- table, the facility still operates, and performs whatever part of Err mx1.adamsgaard.dk 70 i- its purpose remains meaningful. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- (For example, a function in a library to compute square roots has Err mx1.adamsgaard.dk 70 i- a purpose that is entirely well-defined independent of the Err mx1.adamsgaard.dk 70 i- application. Therefore, Subsection 2d requires that any Err mx1.adamsgaard.dk 70 i- application-supplied function or table used by this function must Err mx1.adamsgaard.dk 70 i- be optional: if the application does not supply it, the square Err mx1.adamsgaard.dk 70 i- root function must still compute square roots.) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-These requirements apply to the modified work as a whole. If Err mx1.adamsgaard.dk 70 i-identifiable sections of that work are not derived from the Library, Err mx1.adamsgaard.dk 70 i-and can be reasonably considered independent and separate works in Err mx1.adamsgaard.dk 70 i-themselves, then this License, and its terms, do not apply to those Err mx1.adamsgaard.dk 70 i-sections when you distribute them as separate works. But when you Err mx1.adamsgaard.dk 70 i-distribute the same sections as part of a whole which is a work based Err mx1.adamsgaard.dk 70 i-on the Library, the distribution of the whole must be on the terms of Err mx1.adamsgaard.dk 70 i-this License, whose permissions for other licensees extend to the Err mx1.adamsgaard.dk 70 i-entire whole, and thus to each and every part regardless of who wrote Err mx1.adamsgaard.dk 70 i-it. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-Thus, it is not the intent of this section to claim rights or contest Err mx1.adamsgaard.dk 70 i-your rights to work written entirely by you; rather, the intent is to Err mx1.adamsgaard.dk 70 i-exercise the right to control the distribution of derivative or Err mx1.adamsgaard.dk 70 i-collective works based on the Library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-In addition, mere aggregation of another work not based on the Library Err mx1.adamsgaard.dk 70 i-with the Library (or with a work based on the Library) on a volume of Err mx1.adamsgaard.dk 70 i-a storage or distribution medium does not bring the other work under Err mx1.adamsgaard.dk 70 i-the scope of this License. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 3. You may opt to apply the terms of the ordinary GNU General Public Err mx1.adamsgaard.dk 70 i-License instead of this License to a given copy of the Library. To do Err mx1.adamsgaard.dk 70 i-this, you must alter all the notices that refer to this License, so Err mx1.adamsgaard.dk 70 i-that they refer to the ordinary GNU General Public License, version 2, Err mx1.adamsgaard.dk 70 i-instead of to this License. (If a newer version than version 2 of the Err mx1.adamsgaard.dk 70 i-ordinary GNU General Public License has appeared, then you can specify Err mx1.adamsgaard.dk 70 i-that version instead if you wish.) Do not make any other change in Err mx1.adamsgaard.dk 70 i-these notices. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Once this change is made in a given copy, it is irreversible for Err mx1.adamsgaard.dk 70 i-that copy, so the ordinary GNU General Public License applies to all Err mx1.adamsgaard.dk 70 i-subsequent copies and derivative works made from that copy. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- This option is useful when you wish to copy part of the code of Err mx1.adamsgaard.dk 70 i-the Library into a program that is not a library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 4. You may copy and distribute the Library (or a portion or Err mx1.adamsgaard.dk 70 i-derivative of it, under Section 2) in object code or executable form Err mx1.adamsgaard.dk 70 i-under the terms of Sections 1 and 2 above provided that you accompany Err mx1.adamsgaard.dk 70 i-it with the complete corresponding machine-readable source code, which Err mx1.adamsgaard.dk 70 i-must be distributed under the terms of Sections 1 and 2 above on a Err mx1.adamsgaard.dk 70 i-medium customarily used for software interchange. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- If distribution of object code is made by offering access to copy Err mx1.adamsgaard.dk 70 i-from a designated place, then offering equivalent access to copy the Err mx1.adamsgaard.dk 70 i-source code from the same place satisfies the requirement to Err mx1.adamsgaard.dk 70 i-distribute the source code, even though third parties are not Err mx1.adamsgaard.dk 70 i-compelled to copy the source along with the object code. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 5. A program that contains no derivative of any portion of the Err mx1.adamsgaard.dk 70 i-Library, but is designed to work with the Library by being compiled or Err mx1.adamsgaard.dk 70 i-linked with it, is called a "work that uses the Library". Such a Err mx1.adamsgaard.dk 70 i-work, in isolation, is not a derivative work of the Library, and Err mx1.adamsgaard.dk 70 i-therefore falls outside the scope of this License. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- However, linking a "work that uses the Library" with the Library Err mx1.adamsgaard.dk 70 i-creates an executable that is a derivative of the Library (because it Err mx1.adamsgaard.dk 70 i-contains portions of the Library), rather than a "work that uses the Err mx1.adamsgaard.dk 70 i-library". The executable is therefore covered by this License. Err mx1.adamsgaard.dk 70 i-Section 6 states terms for distribution of such executables. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- When a "work that uses the Library" uses material from a header file Err mx1.adamsgaard.dk 70 i-that is part of the Library, the object code for the work may be a Err mx1.adamsgaard.dk 70 i-derivative work of the Library even though the source code is not. Err mx1.adamsgaard.dk 70 i-Whether this is true is especially significant if the work can be Err mx1.adamsgaard.dk 70 i-linked without the Library, or if the work is itself a library. The Err mx1.adamsgaard.dk 70 i-threshold for this to be true is not precisely defined by law. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- If such an object file uses only numerical parameters, data Err mx1.adamsgaard.dk 70 i-structure layouts and accessors, and small macros and small inline Err mx1.adamsgaard.dk 70 i-functions (ten lines or less in length), then the use of the object Err mx1.adamsgaard.dk 70 i-file is unrestricted, regardless of whether it is legally a derivative Err mx1.adamsgaard.dk 70 i-work. (Executables containing this object code plus portions of the Err mx1.adamsgaard.dk 70 i-Library will still fall under Section 6.) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Otherwise, if the work is a derivative of the Library, you may Err mx1.adamsgaard.dk 70 i-distribute the object code for the work under the terms of Section 6. Err mx1.adamsgaard.dk 70 i-Any executables containing that work also fall under Section 6, Err mx1.adamsgaard.dk 70 i-whether or not they are linked directly with the Library itself. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 6. As an exception to the Sections above, you may also combine or Err mx1.adamsgaard.dk 70 i-link a "work that uses the Library" with the Library to produce a Err mx1.adamsgaard.dk 70 i-work containing portions of the Library, and distribute that work Err mx1.adamsgaard.dk 70 i-under terms of your choice, provided that the terms permit Err mx1.adamsgaard.dk 70 i-modification of the work for the customer's own use and reverse Err mx1.adamsgaard.dk 70 i-engineering for debugging such modifications. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- You must give prominent notice with each copy of the work that the Err mx1.adamsgaard.dk 70 i-Library is used in it and that the Library and its use are covered by Err mx1.adamsgaard.dk 70 i-this License. You must supply a copy of this License. If the work Err mx1.adamsgaard.dk 70 i-during execution displays copyright notices, you must include the Err mx1.adamsgaard.dk 70 i-copyright notice for the Library among them, as well as a reference Err mx1.adamsgaard.dk 70 i-directing the user to the copy of this License. Also, you must do one Err mx1.adamsgaard.dk 70 i-of these things: Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- a) Accompany the work with the complete corresponding Err mx1.adamsgaard.dk 70 i- machine-readable source code for the Library including whatever Err mx1.adamsgaard.dk 70 i- changes were used in the work (which must be distributed under Err mx1.adamsgaard.dk 70 i- Sections 1 and 2 above); and, if the work is an executable linked Err mx1.adamsgaard.dk 70 i- with the Library, with the complete machine-readable "work that Err mx1.adamsgaard.dk 70 i- uses the Library", as object code and/or source code, so that the Err mx1.adamsgaard.dk 70 i- user can modify the Library and then relink to produce a modified Err mx1.adamsgaard.dk 70 i- executable containing the modified Library. (It is understood Err mx1.adamsgaard.dk 70 i- that the user who changes the contents of definitions files in the Err mx1.adamsgaard.dk 70 i- Library will not necessarily be able to recompile the application Err mx1.adamsgaard.dk 70 i- to use the modified definitions.) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- b) Use a suitable shared library mechanism for linking with the Err mx1.adamsgaard.dk 70 i- Library. A suitable mechanism is one that (1) uses at run time a Err mx1.adamsgaard.dk 70 i- copy of the library already present on the user's computer system, Err mx1.adamsgaard.dk 70 i- rather than copying library functions into the executable, and (2) Err mx1.adamsgaard.dk 70 i- will operate properly with a modified version of the library, if Err mx1.adamsgaard.dk 70 i- the user installs one, as long as the modified version is Err mx1.adamsgaard.dk 70 i- interface-compatible with the version that the work was made with. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- c) Accompany the work with a written offer, valid for at Err mx1.adamsgaard.dk 70 i- least three years, to give the same user the materials Err mx1.adamsgaard.dk 70 i- specified in Subsection 6a, above, for a charge no more Err mx1.adamsgaard.dk 70 i- than the cost of performing this distribution. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- d) If distribution of the work is made by offering access to copy Err mx1.adamsgaard.dk 70 i- from a designated place, offer equivalent access to copy the above Err mx1.adamsgaard.dk 70 i- specified materials from the same place. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- e) Verify that the user has already received a copy of these Err mx1.adamsgaard.dk 70 i- materials or that you have already sent this user a copy. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- For an executable, the required form of the "work that uses the Err mx1.adamsgaard.dk 70 i-Library" must include any data and utility programs needed for Err mx1.adamsgaard.dk 70 i-reproducing the executable from it. However, as a special exception, Err mx1.adamsgaard.dk 70 i-the materials to be distributed need not include anything that is Err mx1.adamsgaard.dk 70 i-normally distributed (in either source or binary form) with the major Err mx1.adamsgaard.dk 70 i-components (compiler, kernel, and so on) of the operating system on Err mx1.adamsgaard.dk 70 i-which the executable runs, unless that component itself accompanies Err mx1.adamsgaard.dk 70 i-the executable. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- It may happen that this requirement contradicts the license Err mx1.adamsgaard.dk 70 i-restrictions of other proprietary libraries that do not normally Err mx1.adamsgaard.dk 70 i-accompany the operating system. Such a contradiction means you cannot Err mx1.adamsgaard.dk 70 i-use both them and the Library together in an executable that you Err mx1.adamsgaard.dk 70 i-distribute. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 7. You may place library facilities that are a work based on the Err mx1.adamsgaard.dk 70 i-Library side-by-side in a single library together with other library Err mx1.adamsgaard.dk 70 i-facilities not covered by this License, and distribute such a combined Err mx1.adamsgaard.dk 70 i-library, provided that the separate distribution of the work based on Err mx1.adamsgaard.dk 70 i-the Library and of the other library facilities is otherwise Err mx1.adamsgaard.dk 70 i-permitted, and provided that you do these two things: Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- a) Accompany the combined library with a copy of the same work Err mx1.adamsgaard.dk 70 i- based on the Library, uncombined with any other library Err mx1.adamsgaard.dk 70 i- facilities. This must be distributed under the terms of the Err mx1.adamsgaard.dk 70 i- Sections above. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- b) Give prominent notice with the combined library of the fact Err mx1.adamsgaard.dk 70 i- that part of it is a work based on the Library, and explaining Err mx1.adamsgaard.dk 70 i- where to find the accompanying uncombined form of the same work. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 8. You may not copy, modify, sublicense, link with, or distribute Err mx1.adamsgaard.dk 70 i-the Library except as expressly provided under this License. Any Err mx1.adamsgaard.dk 70 i-attempt otherwise to copy, modify, sublicense, link with, or Err mx1.adamsgaard.dk 70 i-distribute the Library is void, and will automatically terminate your Err mx1.adamsgaard.dk 70 i-rights under this License. However, parties who have received copies, Err mx1.adamsgaard.dk 70 i-or rights, from you under this License will not have their licenses Err mx1.adamsgaard.dk 70 i-terminated so long as such parties remain in full compliance. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 9. You are not required to accept this License, since you have not Err mx1.adamsgaard.dk 70 i-signed it. However, nothing else grants you permission to modify or Err mx1.adamsgaard.dk 70 i-distribute the Library or its derivative works. These actions are Err mx1.adamsgaard.dk 70 i-prohibited by law if you do not accept this License. Therefore, by Err mx1.adamsgaard.dk 70 i-modifying or distributing the Library (or any work based on the Err mx1.adamsgaard.dk 70 i-Library), you indicate your acceptance of this License to do so, and Err mx1.adamsgaard.dk 70 i-all its terms and conditions for copying, distributing or modifying Err mx1.adamsgaard.dk 70 i-the Library or works based on it. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 10. Each time you redistribute the Library (or any work based on the Err mx1.adamsgaard.dk 70 i-Library), the recipient automatically receives a license from the Err mx1.adamsgaard.dk 70 i-original licensor to copy, distribute, link with or modify the Library Err mx1.adamsgaard.dk 70 i-subject to these terms and conditions. You may not impose any further Err mx1.adamsgaard.dk 70 i-restrictions on the recipients' exercise of the rights granted herein. Err mx1.adamsgaard.dk 70 i-You are not responsible for enforcing compliance by third parties with Err mx1.adamsgaard.dk 70 i-this License. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 11. If, as a consequence of a court judgment or allegation of patent Err mx1.adamsgaard.dk 70 i-infringement or for any other reason (not limited to patent issues), Err mx1.adamsgaard.dk 70 i-conditions are imposed on you (whether by court order, agreement or Err mx1.adamsgaard.dk 70 i-otherwise) that contradict the conditions of this License, they do not Err mx1.adamsgaard.dk 70 i-excuse you from the conditions of this License. If you cannot Err mx1.adamsgaard.dk 70 i-distribute so as to satisfy simultaneously your obligations under this Err mx1.adamsgaard.dk 70 i-License and any other pertinent obligations, then as a consequence you Err mx1.adamsgaard.dk 70 i-may not distribute the Library at all. For example, if a patent Err mx1.adamsgaard.dk 70 i-license would not permit royalty-free redistribution of the Library by Err mx1.adamsgaard.dk 70 i-all those who receive copies directly or indirectly through you, then Err mx1.adamsgaard.dk 70 i-the only way you could satisfy both it and this License would be to Err mx1.adamsgaard.dk 70 i-refrain entirely from distribution of the Library. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-If any portion of this section is held invalid or unenforceable under any Err mx1.adamsgaard.dk 70 i-particular circumstance, the balance of the section is intended to apply, Err mx1.adamsgaard.dk 70 i-and the section as a whole is intended to apply in other circumstances. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-It is not the purpose of this section to induce you to infringe any Err mx1.adamsgaard.dk 70 i-patents or other property right claims or to contest validity of any Err mx1.adamsgaard.dk 70 i-such claims; this section has the sole purpose of protecting the Err mx1.adamsgaard.dk 70 i-integrity of the free software distribution system which is Err mx1.adamsgaard.dk 70 i-implemented by public license practices. Many people have made Err mx1.adamsgaard.dk 70 i-generous contributions to the wide range of software distributed Err mx1.adamsgaard.dk 70 i-through that system in reliance on consistent application of that Err mx1.adamsgaard.dk 70 i-system; it is up to the author/donor to decide if he or she is willing Err mx1.adamsgaard.dk 70 i-to distribute software through any other system and a licensee cannot Err mx1.adamsgaard.dk 70 i-impose that choice. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-This section is intended to make thoroughly clear what is believed to Err mx1.adamsgaard.dk 70 i-be a consequence of the rest of this License. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 12. If the distribution and/or use of the Library is restricted in Err mx1.adamsgaard.dk 70 i-certain countries either by patents or by copyrighted interfaces, the Err mx1.adamsgaard.dk 70 i-original copyright holder who places the Library under this License may add Err mx1.adamsgaard.dk 70 i-an explicit geographical distribution limitation excluding those countries, Err mx1.adamsgaard.dk 70 i-so that distribution is permitted only in or among countries not thus Err mx1.adamsgaard.dk 70 i-excluded. In such case, this License incorporates the limitation as if Err mx1.adamsgaard.dk 70 i-written in the body of this License. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 13. The Free Software Foundation may publish revised and/or new Err mx1.adamsgaard.dk 70 i-versions of the Lesser General Public License from time to time. Err mx1.adamsgaard.dk 70 i-Such new versions will be similar in spirit to the present version, Err mx1.adamsgaard.dk 70 i-but may differ in detail to address new problems or concerns. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-Each version is given a distinguishing version number. If the Library Err mx1.adamsgaard.dk 70 i-specifies a version number of this License which applies to it and Err mx1.adamsgaard.dk 70 i-"any later version", you have the option of following the terms and Err mx1.adamsgaard.dk 70 i-conditions either of that version or of any later version published by Err mx1.adamsgaard.dk 70 i-the Free Software Foundation. If the Library does not specify a Err mx1.adamsgaard.dk 70 i-license version number, you may choose any version ever published by Err mx1.adamsgaard.dk 70 i-the Free Software Foundation. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 14. If you wish to incorporate parts of the Library into other free Err mx1.adamsgaard.dk 70 i-programs whose distribution conditions are incompatible with these, Err mx1.adamsgaard.dk 70 i-write to the author to ask for permission. For software which is Err mx1.adamsgaard.dk 70 i-copyrighted by the Free Software Foundation, write to the Free Err mx1.adamsgaard.dk 70 i-Software Foundation; we sometimes make exceptions for this. Our Err mx1.adamsgaard.dk 70 i-decision will be guided by the two goals of preserving the free status Err mx1.adamsgaard.dk 70 i-of all derivatives of our free software and of promoting the sharing Err mx1.adamsgaard.dk 70 i-and reuse of software generally. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- NO WARRANTY Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO Err mx1.adamsgaard.dk 70 i-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. Err mx1.adamsgaard.dk 70 i-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR Err mx1.adamsgaard.dk 70 i-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY Err mx1.adamsgaard.dk 70 i-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE Err mx1.adamsgaard.dk 70 i-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR Err mx1.adamsgaard.dk 70 i-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE Err mx1.adamsgaard.dk 70 i-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME Err mx1.adamsgaard.dk 70 i-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN Err mx1.adamsgaard.dk 70 i-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY Err mx1.adamsgaard.dk 70 i-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU Err mx1.adamsgaard.dk 70 i-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR Err mx1.adamsgaard.dk 70 i-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE Err mx1.adamsgaard.dk 70 i-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING Err mx1.adamsgaard.dk 70 i-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A Err mx1.adamsgaard.dk 70 i-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF Err mx1.adamsgaard.dk 70 i-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH Err mx1.adamsgaard.dk 70 i-DAMAGES. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- END OF TERMS AND CONDITIONS Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/COPYRIGHT b/src/libthread/COPYRIGHT /src/plan9port/file/src/libthread/COPYRIGHT.gph mx1.adamsgaard.dk 70 it@@ -42,12 +42,3 @@ Contains parts of an earlier library that has: Err mx1.adamsgaard.dk 70 i * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY Err mx1.adamsgaard.dk 70 i * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. Err mx1.adamsgaard.dk 70 i */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-=== Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-The above notices do *NOT* apply to Linux-sparc64-context.S Err mx1.adamsgaard.dk 70 i-or to sparc64-ucontext.c. Those are functions from Err mx1.adamsgaard.dk 70 i-the GNU C library and are provided for systems that use the GNU C Err mx1.adamsgaard.dk 70 i-library but somehow are missing those functions. They are Err mx1.adamsgaard.dk 70 i-distributed under the Lesser GPL; see COPYING.SPARC64-CONTEXT. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/Linux-arm-asm.s b/src/libthread/Linux-arm-asm.s /src/plan9port/file/src/libthread/Linux-arm-asm.s.gph mx1.adamsgaard.dk 70 it@@ -1,41 +0,0 @@ Err mx1.adamsgaard.dk 70 i-.globl mygetmcontext Err mx1.adamsgaard.dk 70 i-mygetmcontext: Err mx1.adamsgaard.dk 70 i- str r1, [r0,#4] Err mx1.adamsgaard.dk 70 i- str r2, [r0,#8] Err mx1.adamsgaard.dk 70 i- str r3, [r0,#12] Err mx1.adamsgaard.dk 70 i- str r4, [r0,#16] Err mx1.adamsgaard.dk 70 i- str r5, [r0,#20] Err mx1.adamsgaard.dk 70 i- str r6, [r0,#24] Err mx1.adamsgaard.dk 70 i- str r7, [r0,#28] Err mx1.adamsgaard.dk 70 i- str r8, [r0,#32] Err mx1.adamsgaard.dk 70 i- str r9, [r0,#36] Err mx1.adamsgaard.dk 70 i- str r10, [r0,#40] Err mx1.adamsgaard.dk 70 i- str r11, [r0,#44] Err mx1.adamsgaard.dk 70 i- str r12, [r0,#48] Err mx1.adamsgaard.dk 70 i- str r13, [r0,#52] Err mx1.adamsgaard.dk 70 i- str r14, [r0,#56] Err mx1.adamsgaard.dk 70 i- /* store 1 as r0-to-restore */ Err mx1.adamsgaard.dk 70 i- mov r1, #1 Err mx1.adamsgaard.dk 70 i- str r1, [r0] Err mx1.adamsgaard.dk 70 i- /* return 0 */ Err mx1.adamsgaard.dk 70 i- mov r0, #0 Err mx1.adamsgaard.dk 70 i- mov pc, lr Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-.globl mysetmcontext Err mx1.adamsgaard.dk 70 i-mysetmcontext: Err mx1.adamsgaard.dk 70 i- ldr r1, [r0,#4] Err mx1.adamsgaard.dk 70 i- ldr r2, [r0,#8] Err mx1.adamsgaard.dk 70 i- ldr r3, [r0,#12] Err mx1.adamsgaard.dk 70 i- ldr r4, [r0,#16] Err mx1.adamsgaard.dk 70 i- ldr r5, [r0,#20] Err mx1.adamsgaard.dk 70 i- ldr r6, [r0,#24] Err mx1.adamsgaard.dk 70 i- ldr r7, [r0,#28] Err mx1.adamsgaard.dk 70 i- ldr r8, [r0,#32] Err mx1.adamsgaard.dk 70 i- ldr r9, [r0,#36] Err mx1.adamsgaard.dk 70 i- ldr r10, [r0,#40] Err mx1.adamsgaard.dk 70 i- ldr r11, [r0,#44] Err mx1.adamsgaard.dk 70 i- ldr r12, [r0,#48] Err mx1.adamsgaard.dk 70 i- ldr r13, [r0,#52] Err mx1.adamsgaard.dk 70 i- ldr r14, [r0,#56] Err mx1.adamsgaard.dk 70 i- ldr r0, [r0] Err mx1.adamsgaard.dk 70 i- mov pc, lr Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/Linux-sparc64-context.S b/src/libthread/Linux-sparc64-context.S /src/plan9port/file/src/libthread/Linux-sparc64-context.S.gph mx1.adamsgaard.dk 70 it@@ -1,135 +0,0 @@ Err mx1.adamsgaard.dk 70 i-/* Copyright (C) 2001 Free Software Foundation, Inc. Err mx1.adamsgaard.dk 70 i- This file is part of the GNU C Library. Err mx1.adamsgaard.dk 70 i- Contributed by Jakub Jelinek . Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The GNU C Library is free software; you can redistribute it and/or Err mx1.adamsgaard.dk 70 i- modify it under the terms of the GNU Lesser General Public Err mx1.adamsgaard.dk 70 i- License as published by the Free Software Foundation; either Err mx1.adamsgaard.dk 70 i- version 2.1 of the License, or (at your option) any later version. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The GNU C Library is distributed in the hope that it will be useful, Err mx1.adamsgaard.dk 70 i- but WITHOUT ANY WARRANTY; without even the implied warranty of Err mx1.adamsgaard.dk 70 i- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Err mx1.adamsgaard.dk 70 i- Lesser General Public License for more details. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- You should have received a copy of the GNU Lesser General Public Err mx1.adamsgaard.dk 70 i- License along with the GNU C Library; if not, write to the Free Err mx1.adamsgaard.dk 70 i- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Err mx1.adamsgaard.dk 70 i- 02111-1307 USA. */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* Constants shared between setcontext() and getcontext(). Don't Err mx1.adamsgaard.dk 70 i- install this header file. */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-#define UC_LINK 0 Err mx1.adamsgaard.dk 70 i-#define __UC_SIGMASK 16 Err mx1.adamsgaard.dk 70 i-#define UC_M_PC 40 Err mx1.adamsgaard.dk 70 i-#define UC_M_NPC 48 Err mx1.adamsgaard.dk 70 i-#define UC_SIGMASK 536 Err mx1.adamsgaard.dk 70 i-#define SIGMASK_WORDS 16 Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* Copyright (C) 1997, 2001 Free Software Foundation, Inc. Err mx1.adamsgaard.dk 70 i- This file is part of the GNU C Library. Err mx1.adamsgaard.dk 70 i- Contributed by Richard Henderson (rth@tamu.edu). Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The GNU C Library is free software; you can redistribute it and/or Err mx1.adamsgaard.dk 70 i- modify it under the terms of the GNU Lesser General Public Err mx1.adamsgaard.dk 70 i- License as published by the Free Software Foundation; either Err mx1.adamsgaard.dk 70 i- version 2.1 of the License, or (at your option) any later version. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The GNU C Library is distributed in the hope that it will be useful, Err mx1.adamsgaard.dk 70 i- but WITHOUT ANY WARRANTY; without even the implied warranty of Err mx1.adamsgaard.dk 70 i- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Err mx1.adamsgaard.dk 70 i- Lesser General Public License for more details. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- You should have received a copy of the GNU Lesser General Public Err mx1.adamsgaard.dk 70 i- License along with the GNU C Library; if not, write to the Free Err mx1.adamsgaard.dk 70 i- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Err mx1.adamsgaard.dk 70 i- 02111-1307 USA. */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-#define ENTRY(x) x: Err mx1.adamsgaard.dk 70 i-#define END(x) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/*#include "ucontext_i.h" (up above) */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* int getcontext(ucontext_t *); */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-ENTRY(getcontext) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- ldx [%o0 + UC_LINK], %o1 /* Preserve uc_link field, the Err mx1.adamsgaard.dk 70 i- trap clears it. */ Err mx1.adamsgaard.dk 70 i- ta 0x6e Err mx1.adamsgaard.dk 70 i-1: Err mx1.adamsgaard.dk 70 i- ldx [%o0 + UC_M_PC], %o2 Err mx1.adamsgaard.dk 70 i- ldx [%o0 + UC_M_NPC], %o3 Err mx1.adamsgaard.dk 70 i- ldx [%o0 + __UC_SIGMASK], %o4 Err mx1.adamsgaard.dk 70 i- stx %o1, [%o0 + UC_LINK] Err mx1.adamsgaard.dk 70 i- add %o2, 2f - 1b, %o2 Err mx1.adamsgaard.dk 70 i- stx %o2, [%o0 + UC_M_PC] Err mx1.adamsgaard.dk 70 i- add %o3, 2f - 1b, %o3 Err mx1.adamsgaard.dk 70 i- stx %o3, [%o0 + UC_M_NPC] Err mx1.adamsgaard.dk 70 i-#if SIGMASK_WORDS == 16 Err mx1.adamsgaard.dk 70 i- stx %o4, [%o0 + UC_SIGMASK] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 8] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 16] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 24] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 32] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 40] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 48] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 56] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 64] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 72] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 80] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 88] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 96] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 104] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 112] Err mx1.adamsgaard.dk 70 i- stx %g0, [%o0 + UC_SIGMASK + 120] Err mx1.adamsgaard.dk 70 i-#else Err mx1.adamsgaard.dk 70 i-# error Adjust getcontext Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i-2: Err mx1.adamsgaard.dk 70 i- retl Err mx1.adamsgaard.dk 70 i- clr %o0 Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-END(getcontext) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* Copyright (C) 1997, 2001 Free Software Foundation, Inc. Err mx1.adamsgaard.dk 70 i- This file is part of the GNU C Library. Err mx1.adamsgaard.dk 70 i- Contributed by Richard Henderson (rth@tamu.edu). Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The GNU C Library is free software; you can redistribute it and/or Err mx1.adamsgaard.dk 70 i- modify it under the terms of the GNU Lesser General Public Err mx1.adamsgaard.dk 70 i- License as published by the Free Software Foundation; either Err mx1.adamsgaard.dk 70 i- version 2.1 of the License, or (at your option) any later version. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The GNU C Library is distributed in the hope that it will be useful, Err mx1.adamsgaard.dk 70 i- but WITHOUT ANY WARRANTY; without even the implied warranty of Err mx1.adamsgaard.dk 70 i- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Err mx1.adamsgaard.dk 70 i- Lesser General Public License for more details. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- You should have received a copy of the GNU Lesser General Public Err mx1.adamsgaard.dk 70 i- License along with the GNU C Library; if not, write to the Free Err mx1.adamsgaard.dk 70 i- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Err mx1.adamsgaard.dk 70 i- 02111-1307 USA. */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i-#include Err mx1.adamsgaard.dk 70 i-#include "ucontext_i.h" Err mx1.adamsgaard.dk 70 i-*/ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* int setcontext(ucontext_t *ctx); */ Err mx1.adamsgaard.dk 70 i-.weak setcontext Err mx1.adamsgaard.dk 70 i-ENTRY(setcontext) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- mov 1, %o1 Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* int __setcontext(ucontext_t *ctx, int restoremask); */ Err mx1.adamsgaard.dk 70 i-ENTRY(__setcontext) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- ldx [%o0 + UC_SIGMASK], %o2 Err mx1.adamsgaard.dk 70 i- stx %o2, [%o0 + __UC_SIGMASK] Err mx1.adamsgaard.dk 70 i- ta 0x6f Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-END(__setcontext) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/OpenBSD-386-asm.s b/src/libthread/OpenBSD-386-asm.s /src/plan9port/file/src/libthread/OpenBSD-386-asm.s.gph mx1.adamsgaard.dk 70 it@@ -1,45 +0,0 @@ Err mx1.adamsgaard.dk 70 i-.globl getmcontext Err mx1.adamsgaard.dk 70 i-getmcontext: Err mx1.adamsgaard.dk 70 i- movl 4(%esp), %eax Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- movl %fs, 8(%eax) Err mx1.adamsgaard.dk 70 i- movl %es, 12(%eax) Err mx1.adamsgaard.dk 70 i- movl %ds, 16(%eax) Err mx1.adamsgaard.dk 70 i- movl %ss, 76(%eax) Err mx1.adamsgaard.dk 70 i- movl %edi, 20(%eax) Err mx1.adamsgaard.dk 70 i- movl %esi, 24(%eax) Err mx1.adamsgaard.dk 70 i- movl %ebp, 28(%eax) Err mx1.adamsgaard.dk 70 i- movl %ebx, 36(%eax) Err mx1.adamsgaard.dk 70 i- movl %edx, 40(%eax) Err mx1.adamsgaard.dk 70 i- movl %ecx, 44(%eax) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- movl $1, 48(%eax) /* %eax */ Err mx1.adamsgaard.dk 70 i- movl (%esp), %ecx /* %eip */ Err mx1.adamsgaard.dk 70 i- movl %ecx, 60(%eax) Err mx1.adamsgaard.dk 70 i- leal 4(%esp), %ecx /* %esp */ Err mx1.adamsgaard.dk 70 i- movl %ecx, 72(%eax) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- movl 44(%eax), %ecx /* restore %ecx */ Err mx1.adamsgaard.dk 70 i- movl $0, %eax Err mx1.adamsgaard.dk 70 i- ret Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-.globl setmcontext Err mx1.adamsgaard.dk 70 i-setmcontext: Err mx1.adamsgaard.dk 70 i- movl 4(%esp), %eax Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- movl 8(%eax), %fs Err mx1.adamsgaard.dk 70 i- movl 12(%eax), %es Err mx1.adamsgaard.dk 70 i- movl 16(%eax), %ds Err mx1.adamsgaard.dk 70 i- movl 76(%eax), %ss Err mx1.adamsgaard.dk 70 i- movl 20(%eax), %edi Err mx1.adamsgaard.dk 70 i- movl 24(%eax), %esi Err mx1.adamsgaard.dk 70 i- movl 28(%eax), %ebp Err mx1.adamsgaard.dk 70 i- movl 36(%eax), %ebx Err mx1.adamsgaard.dk 70 i- movl 40(%eax), %edx Err mx1.adamsgaard.dk 70 i- movl 44(%eax), %ecx Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- movl 72(%eax), %esp Err mx1.adamsgaard.dk 70 i- pushl 60(%eax) /* new %eip */ Err mx1.adamsgaard.dk 70 i- movl 48(%eax), %eax Err mx1.adamsgaard.dk 70 i- ret Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/OpenBSD-power-asm.S b/src/libthread/OpenBSD-power-asm.S /src/plan9port/file/src/libthread/OpenBSD-power-asm.S.gph mx1.adamsgaard.dk 70 it@@ -1,73 +0,0 @@ Err mx1.adamsgaard.dk 70 i-ENTRY(_getmcontext) /* xxx: instruction scheduling */ Err mx1.adamsgaard.dk 70 i- mflr %r0 Err mx1.adamsgaard.dk 70 i- mfcr %r5 Err mx1.adamsgaard.dk 70 i- mfctr %r6 Err mx1.adamsgaard.dk 70 i- mfxer %r7 Err mx1.adamsgaard.dk 70 i- stw %r0, 0*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r5, 1*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r6, 2*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r7, 3*4(%r3) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- stw %r1, 4*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r2, 5*4(%r3) Err mx1.adamsgaard.dk 70 i- li %r5, 1 /* return value for setmcontext */ Err mx1.adamsgaard.dk 70 i- stw %r5, 6*4(%r3) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- stw %r13, (0+7)*4(%r3) /* callee-save GPRs */ Err mx1.adamsgaard.dk 70 i- stw %r14, (1+7)*4(%r3) /* xxx: block move */ Err mx1.adamsgaard.dk 70 i- stw %r15, (2+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r16, (3+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r17, (4+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r18, (5+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r19, (6+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r20, (7+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r21, (8+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r22, (9+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r23, (10+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r24, (11+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r25, (12+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r26, (13+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r27, (14+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r28, (15+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r29, (16+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r30, (17+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- stw %r31, (18+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- li %r3, 0 /* return */ Err mx1.adamsgaard.dk 70 i- blr Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-ENTRY(_setmcontext) Err mx1.adamsgaard.dk 70 i- lwz %r13, (0+7)*4(%r3) /* callee-save GPRs */ Err mx1.adamsgaard.dk 70 i- lwz %r14, (1+7)*4(%r3) /* xxx: block move */ Err mx1.adamsgaard.dk 70 i- lwz %r15, (2+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r16, (3+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r17, (4+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r18, (5+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r19, (6+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r20, (7+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r21, (8+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r22, (9+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r23, (10+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r24, (11+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r25, (12+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r26, (13+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r27, (14+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r28, (15+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r29, (16+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r30, (17+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r31, (18+7)*4(%r3) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- lwz %r1, 4*4(%r3) Err mx1.adamsgaard.dk 70 i- lwz %r2, 5*4(%r3) Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- lwz %r0, 0*4(%r3) Err mx1.adamsgaard.dk 70 i- mtlr %r0 Err mx1.adamsgaard.dk 70 i- lwz %r0, 1*4(%r3) Err mx1.adamsgaard.dk 70 i- mtcr %r0 /* mtcrf 0xFF, %r0 */ Err mx1.adamsgaard.dk 70 i- lwz %r0, 2*4(%r3) Err mx1.adamsgaard.dk 70 i- mtctr %r0 Err mx1.adamsgaard.dk 70 i- lwz %r0, 3*4(%r3) Err mx1.adamsgaard.dk 70 i- mtxer %r0 Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- lwz %r3, 6*4(%r3) Err mx1.adamsgaard.dk 70 i- blr Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/OpenBSD-x86_64-asm.S b/src/libthread/OpenBSD-x86_64-asm.S /src/plan9port/file/src/libthread/OpenBSD-x86_64-asm.S.gph mx1.adamsgaard.dk 70 it@@ -1,44 +0,0 @@ Err mx1.adamsgaard.dk 70 i-.text Err mx1.adamsgaard.dk 70 i-.align 8 Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-.globl libthread_getmcontext Err mx1.adamsgaard.dk 70 i-libthread_getmcontext: Err mx1.adamsgaard.dk 70 i- movq $1, 0*8(%rdi) // rax Err mx1.adamsgaard.dk 70 i- movq %rbx, 1*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %rcx, 2*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %rdx, 3*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %rsi, 4*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %rdi, 5*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %rbp, 6*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %rsp, 7*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %r8, 8*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %r9, 9*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %r10, 10*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %r11, 11*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %r12, 12*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %r13, 13*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %r14, 14*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq %r15, 15*8(%rdi) Err mx1.adamsgaard.dk 70 i- movq $0, %rax Err mx1.adamsgaard.dk 70 i- ret Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-.globl libthread_setmcontext Err mx1.adamsgaard.dk 70 i-libthread_setmcontext: Err mx1.adamsgaard.dk 70 i- movq 0*8(%rdi), %rax Err mx1.adamsgaard.dk 70 i- movq 1*8(%rdi), %rbx Err mx1.adamsgaard.dk 70 i- movq 2*8(%rdi), %rcx Err mx1.adamsgaard.dk 70 i- movq 3*8(%rdi), %rdx Err mx1.adamsgaard.dk 70 i- movq 4*8(%rdi), %rsi Err mx1.adamsgaard.dk 70 i- // %rdi later Err mx1.adamsgaard.dk 70 i- movq 6*8(%rdi), %rbp Err mx1.adamsgaard.dk 70 i- movq 7*8(%rdi), %rsp Err mx1.adamsgaard.dk 70 i- movq 8*8(%rdi), %r8 Err mx1.adamsgaard.dk 70 i- movq 9*8(%rdi), %r9 Err mx1.adamsgaard.dk 70 i- movq 10*8(%rdi), %r10 Err mx1.adamsgaard.dk 70 i- movq 11*8(%rdi), %r11 Err mx1.adamsgaard.dk 70 i- movq 12*8(%rdi), %r12 Err mx1.adamsgaard.dk 70 i- movq 13*8(%rdi), %r13 Err mx1.adamsgaard.dk 70 i- movq 14*8(%rdi), %r14 Err mx1.adamsgaard.dk 70 i- movq 15*8(%rdi), %r15 Err mx1.adamsgaard.dk 70 i- movq 5*8(%rdi), %rdi Err mx1.adamsgaard.dk 70 i- ret Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/arm-ucontext.c b/src/libthread/arm-ucontext.c /src/plan9port/file/src/libthread/arm-ucontext.c.gph mx1.adamsgaard.dk 70 it@@ -1,24 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#include "threadimpl.h" Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- int i, *sp; Err mx1.adamsgaard.dk 70 i- va_list arg; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- sp = USPALIGN(uc, 4); Err mx1.adamsgaard.dk 70 i- va_start(arg, argc); Err mx1.adamsgaard.dk 70 i- for(i=0; i<4 && iuc_mcontext.arm_r0)[i] = va_arg(arg, uint); Err mx1.adamsgaard.dk 70 i- va_end(arg); Err mx1.adamsgaard.dk 70 i- uc->uc_mcontext.arm_sp = (uint)sp; Err mx1.adamsgaard.dk 70 i- uc->uc_mcontext.arm_lr = (uint)fn; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-int Err mx1.adamsgaard.dk 70 i-swapcontext(ucontext_t *oucp, const ucontext_t *ucp) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- if(getcontext(oucp) == 0) Err mx1.adamsgaard.dk 70 i- setcontext(ucp); Err mx1.adamsgaard.dk 70 i- return 0; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/mkfile b/src/libthread/mkfile /src/plan9port/file/src/libthread/mkfile.gph mx1.adamsgaard.dk 70 it@@ -1,15 +1,14 @@ Err mx1.adamsgaard.dk 70 i <$PLAN9/src/mkhdr Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i-SYSOFILES=`{sh ./sysofiles.sh} Err mx1.adamsgaard.dk 70 i LIB=libthread.a Err mx1.adamsgaard.dk 70 i OFILES=\ Err mx1.adamsgaard.dk 70 i- $SYSOFILES\ Err mx1.adamsgaard.dk 70 i bg.$O\ Err mx1.adamsgaard.dk 70 i channel.$O\ Err mx1.adamsgaard.dk 70 i daemonize.$O\ Err mx1.adamsgaard.dk 70 i exec.$O\ Err mx1.adamsgaard.dk 70 i ioproc.$O\ Err mx1.adamsgaard.dk 70 i iorw.$O\ Err mx1.adamsgaard.dk 70 i+ pthread.$O\ Err mx1.adamsgaard.dk 70 i ref.$O\ Err mx1.adamsgaard.dk 70 i thread.$O\ Err mx1.adamsgaard.dk 70 i wait.$O\ Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/power-ucontext.c b/src/libthread/power-ucontext.c /src/plan9port/file/src/libthread/power-ucontext.c.gph mx1.adamsgaard.dk 70 it@@ -1,26 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#include "threadimpl.h" Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- ulong *sp, *tos; Err mx1.adamsgaard.dk 70 i- va_list arg; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- if(argc != 2) Err mx1.adamsgaard.dk 70 i- sysfatal("libthread: makecontext misused"); Err mx1.adamsgaard.dk 70 i- sp = USPALIGN(ucp, 16); Err mx1.adamsgaard.dk 70 i- ucp->mc.pc = (long)func; Err mx1.adamsgaard.dk 70 i- ucp->mc.sp = (long)sp; Err mx1.adamsgaard.dk 70 i- va_start(arg, argc); Err mx1.adamsgaard.dk 70 i- ucp->mc.r3 = va_arg(arg, long); Err mx1.adamsgaard.dk 70 i- ucp->mc.r4 = va_arg(arg, long); Err mx1.adamsgaard.dk 70 i- va_end(arg); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-int Err mx1.adamsgaard.dk 70 i-swapcontext(ucontext_t *oucp, ucontext_t *ucp) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- if(getcontext(oucp) == 0) Err mx1.adamsgaard.dk 70 i- setcontext(ucp); Err mx1.adamsgaard.dk 70 i- return 0; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/power-ucontext.h b/src/libthread/power-ucontext.h /src/plan9port/file/src/libthread/power-ucontext.h.gph mx1.adamsgaard.dk 70 it@@ -1,36 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#define setcontext(u) _setmcontext(&(u)->mc) Err mx1.adamsgaard.dk 70 i-#define getcontext(u) _getmcontext(&(u)->mc) Err mx1.adamsgaard.dk 70 i-typedef struct mcontext mcontext_t; Err mx1.adamsgaard.dk 70 i-typedef struct ucontext ucontext_t; Err mx1.adamsgaard.dk 70 i-struct mcontext Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- ulong pc; /* lr */ Err mx1.adamsgaard.dk 70 i- ulong cr; /* mfcr */ Err mx1.adamsgaard.dk 70 i- ulong ctr; /* mfcr */ Err mx1.adamsgaard.dk 70 i- ulong xer; /* mfcr */ Err mx1.adamsgaard.dk 70 i- ulong sp; /* callee saved: r1 */ Err mx1.adamsgaard.dk 70 i- ulong toc; /* callee saved: r2 */ Err mx1.adamsgaard.dk 70 i- ulong r3; /* first arg to function, return register: r3 */ Err mx1.adamsgaard.dk 70 i- ulong gpr[19]; /* callee saved: r13-r31 */ Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i-// XXX: currently do not save vector registers or floating-point state Err mx1.adamsgaard.dk 70 i-// ulong pad; Err mx1.adamsgaard.dk 70 i-// uvlong fpr[18]; / * callee saved: f14-f31 * / Err mx1.adamsgaard.dk 70 i-// ulong vr[4*12]; / * callee saved: v20-v31, 256-bits each * / Err mx1.adamsgaard.dk 70 i-*/ Err mx1.adamsgaard.dk 70 i-}; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-struct ucontext Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- struct { Err mx1.adamsgaard.dk 70 i- void *ss_sp; Err mx1.adamsgaard.dk 70 i- uint ss_size; Err mx1.adamsgaard.dk 70 i- } uc_stack; Err mx1.adamsgaard.dk 70 i- sigset_t uc_sigmask; Err mx1.adamsgaard.dk 70 i- mcontext_t mc; Err mx1.adamsgaard.dk 70 i-}; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void makecontext(ucontext_t*, void(*)(void), int, ...); Err mx1.adamsgaard.dk 70 i-int swapcontext(ucontext_t*, ucontext_t*); Err mx1.adamsgaard.dk 70 i-int _getmcontext(mcontext_t*); Err mx1.adamsgaard.dk 70 i-void _setmcontext(mcontext_t*); Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/sparc64-ucontext.c b/src/libthread/sparc64-ucontext.c /src/plan9port/file/src/libthread/sparc64-ucontext.c.gph mx1.adamsgaard.dk 70 it@@ -1,49 +0,0 @@ Err mx1.adamsgaard.dk 70 i-/* Copyright (C) 2001 Free Software Foundation, Inc. Err mx1.adamsgaard.dk 70 i- This file is part of the GNU C Library. Err mx1.adamsgaard.dk 70 i- Contributed by Jakub Jelinek . Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The GNU C Library is free software; you can redistribute it and/or Err mx1.adamsgaard.dk 70 i- modify it under the terms of the GNU Lesser General Public Err mx1.adamsgaard.dk 70 i- License as published by the Free Software Foundation; either Err mx1.adamsgaard.dk 70 i- version 2.1 of the License, or (at your option) any later version. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- The GNU C Library is distributed in the hope that it will be useful, Err mx1.adamsgaard.dk 70 i- but WITHOUT ANY WARRANTY; without even the implied warranty of Err mx1.adamsgaard.dk 70 i- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Err mx1.adamsgaard.dk 70 i- Lesser General Public License for more details. Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- You should have received a copy of the GNU Lesser General Public Err mx1.adamsgaard.dk 70 i- License along with the GNU C Library; if not, write to the Free Err mx1.adamsgaard.dk 70 i- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Err mx1.adamsgaard.dk 70 i- 02111-1307 USA. */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-#include Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-#define UC_M_PC 40 Err mx1.adamsgaard.dk 70 i-#define UC_M_NPC 48 Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-extern int __getcontext (ucontext_t *ucp); Err mx1.adamsgaard.dk 70 i-extern int __setcontext (const ucontext_t *ucp, int restoremask); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-int Err mx1.adamsgaard.dk 70 i-swapcontext (ucontext_t *oucp, const ucontext_t *ucp) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- extern void __swapcontext_ret (void); Err mx1.adamsgaard.dk 70 i- /* Save the current machine context to oucp. */ Err mx1.adamsgaard.dk 70 i- __getcontext (oucp); Err mx1.adamsgaard.dk 70 i- /* Modify oucp to skip the __setcontext call on reactivation. */ Err mx1.adamsgaard.dk 70 i- *(long*)((char*)oucp+UC_M_PC) = (long)__swapcontext_ret; Err mx1.adamsgaard.dk 70 i- *(long*)((char*)oucp+UC_M_NPC) = (long)__swapcontext_ret + 4; Err mx1.adamsgaard.dk 70 i- /* Restore the machine context in ucp. */ Err mx1.adamsgaard.dk 70 i- __setcontext (ucp, 1); Err mx1.adamsgaard.dk 70 i- return 0; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-asm (" \n\ Err mx1.adamsgaard.dk 70 i- .text \n\ Err mx1.adamsgaard.dk 70 i- .type __swapcontext_ret, #function \n\ Err mx1.adamsgaard.dk 70 i-__swapcontext_ret: \n\ Err mx1.adamsgaard.dk 70 i- return %i7 + 8 \n\ Err mx1.adamsgaard.dk 70 i- clr %o0 \n\ Err mx1.adamsgaard.dk 70 i- .size __swapcontext_ret, .-__swapcontext_ret \n\ Err mx1.adamsgaard.dk 70 i- "); Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/stkmalloc.c b/src/libthread/stkmalloc.c /src/plan9port/file/src/libthread/stkmalloc.c.gph mx1.adamsgaard.dk 70 it@@ -1,13 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#include "threadimpl.h" Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void* Err mx1.adamsgaard.dk 70 i-_threadstkalloc(int n) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- return malloc(n); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_threadstkfree(void *v, int n) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- free(v); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/stkmmap.c b/src/libthread/stkmmap.c /src/plan9port/file/src/libthread/stkmmap.c.gph mx1.adamsgaard.dk 70 it@@ -1,25 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#include Err mx1.adamsgaard.dk 70 i-#include Err mx1.adamsgaard.dk 70 i-#include "threadimpl.h" Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-#ifndef MAP_STACK Err mx1.adamsgaard.dk 70 i-#define MAP_STACK 0 Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void* Err mx1.adamsgaard.dk 70 i-_threadstkalloc(int n) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- void *p; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- p = mmap(nil, n, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON|MAP_STACK, -1, 0); Err mx1.adamsgaard.dk 70 i- if(p == (void*)-1) Err mx1.adamsgaard.dk 70 i- return nil; Err mx1.adamsgaard.dk 70 i- return p; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_threadstkfree(void *v, int n) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- if(n > 0) Err mx1.adamsgaard.dk 70 i- munmap(v, n); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/sysofiles.sh b/src/libthread/sysofiles.sh /src/plan9port/file/src/libthread/sysofiles.sh.gph mx1.adamsgaard.dk 70 it@@ -1,27 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#!/bin/sh Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-test -f $PLAN9/config && . $PLAN9/config Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-echo pthread.o Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-case "$SYSNAME" in Err mx1.adamsgaard.dk 70 i-OpenBSD) Err mx1.adamsgaard.dk 70 i- echo stkmmap.o Err mx1.adamsgaard.dk 70 i- ;; Err mx1.adamsgaard.dk 70 i-*) Err mx1.adamsgaard.dk 70 i- echo stkmalloc.o Err mx1.adamsgaard.dk 70 i-esac Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-# Various libc don't supply swapcontext, makecontext, so we do. Err mx1.adamsgaard.dk 70 i-case "$SYSNAME-$OBJTYPE" in Err mx1.adamsgaard.dk 70 i-Linux-arm | Linux-sparc64 | NetBSD-arm | OpenBSD-386 | OpenBSD-power | OpenBSD-x86_64) Err mx1.adamsgaard.dk 70 i- echo $OBJTYPE-ucontext.o Err mx1.adamsgaard.dk 70 i- ;; Err mx1.adamsgaard.dk 70 i-esac Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-# A few libc don't supply setcontext, getcontext, so we do. Err mx1.adamsgaard.dk 70 i-case "$SYSNAME-$OBJTYPE" in Err mx1.adamsgaard.dk 70 i-Linux-arm | Linux-sparc64 | OpenBSD-386 | OpenBSD-power | OpenBSD-x86_64) Err mx1.adamsgaard.dk 70 i- echo $SYSNAME-$OBJTYPE-asm.o Err mx1.adamsgaard.dk 70 i- ;; Err mx1.adamsgaard.dk 70 i-esac Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/thread.c b/src/libthread/thread.c /src/plan9port/file/src/libthread/thread.c.gph mx1.adamsgaard.dk 70 it@@ -7,7 +7,6 @@ static uint threadnsysproc; Err mx1.adamsgaard.dk 70 i static Lock threadnproclock; Err mx1.adamsgaard.dk 70 i static Ref threadidref; Err mx1.adamsgaard.dk 70 i static Proc *threadmainproc; Err mx1.adamsgaard.dk 70 i-static int pthreadperthread = 1; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i static void addproc(Proc*); Err mx1.adamsgaard.dk 70 i static void delproc(Proc*); Err mx1.adamsgaard.dk 70 it@@ -16,9 +15,7 @@ static void delthread(_Threadlist*, _Thread*); Err mx1.adamsgaard.dk 70 i static int onlist(_Threadlist*, _Thread*); Err mx1.adamsgaard.dk 70 i static void addthreadinproc(Proc*, _Thread*); Err mx1.adamsgaard.dk 70 i static void delthreadinproc(Proc*, _Thread*); Err mx1.adamsgaard.dk 70 i-static void contextswitch(Context *from, Context *to); Err mx1.adamsgaard.dk 70 i static void procmain(Proc*); Err mx1.adamsgaard.dk 70 i-static void procscheduler(Proc*); Err mx1.adamsgaard.dk 70 i static int threadinfo(void*, char*); Err mx1.adamsgaard.dk 70 i static void pthreadscheduler(Proc *p); Err mx1.adamsgaard.dk 70 i static void pthreadsleepschedlocked(Proc *p, _Thread *t); Err mx1.adamsgaard.dk 70 it@@ -86,114 +83,24 @@ procalloc(void) Err mx1.adamsgaard.dk 70 i return p; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i-static void Err mx1.adamsgaard.dk 70 i-threadstart(uint y, uint x) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- _Thread *t; Err mx1.adamsgaard.dk 70 i- ulong z; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-//print("threadstart\n"); Err mx1.adamsgaard.dk 70 i- z = (ulong)x << 16; /* hide undefined 32-bit shift from 32-bit compilers */ Err mx1.adamsgaard.dk 70 i- z <<= 16; Err mx1.adamsgaard.dk 70 i- z |= y; Err mx1.adamsgaard.dk 70 i- t = (_Thread*)z; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-//print("threadstart sp=%p arg=%p startfn=%p t=%p\n", &t, t, t->startfn, t->startarg); Err mx1.adamsgaard.dk 70 i- t->startfn(t->startarg); Err mx1.adamsgaard.dk 70 i-/*print("threadexits %p\n", v); */ Err mx1.adamsgaard.dk 70 i- threadexits(nil); Err mx1.adamsgaard.dk 70 i-/*print("not reacehd\n"); */ Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static _Thread* Err mx1.adamsgaard.dk 70 i-threadalloc(void (*fn)(void*), void *arg, uint stack) Err mx1.adamsgaard.dk 70 i+_Thread* Err mx1.adamsgaard.dk 70 i+_threadcreate(Proc *p, void (*fn)(void*), void *arg, uint stack) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i _Thread *t; Err mx1.adamsgaard.dk 70 i- sigset_t zero; Err mx1.adamsgaard.dk 70 i- uint x, y; Err mx1.adamsgaard.dk 70 i- ulong z; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- /* allocate the task and stack together */ Err mx1.adamsgaard.dk 70 i+ USED(stack); Err mx1.adamsgaard.dk 70 i t = malloc(sizeof *t); Err mx1.adamsgaard.dk 70 i if(t == nil) Err mx1.adamsgaard.dk 70 i- sysfatal("threadalloc malloc: %r"); Err mx1.adamsgaard.dk 70 i+ sysfatal("threadcreate malloc: %r"); Err mx1.adamsgaard.dk 70 i memset(t, 0, sizeof *t); Err mx1.adamsgaard.dk 70 i t->id = incref(&threadidref); Err mx1.adamsgaard.dk 70 i-//print("fn=%p arg=%p\n", fn, arg); Err mx1.adamsgaard.dk 70 i t->startfn = fn; Err mx1.adamsgaard.dk 70 i t->startarg = arg; Err mx1.adamsgaard.dk 70 i-//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* do a reasonable initialization */ Err mx1.adamsgaard.dk 70 i- if(stack == 0) Err mx1.adamsgaard.dk 70 i- return t; Err mx1.adamsgaard.dk 70 i- t->stk = _threadstkalloc(stack); Err mx1.adamsgaard.dk 70 i- if(t->stk == nil) Err mx1.adamsgaard.dk 70 i- sysfatal("threadalloc malloc stack: %r"); Err mx1.adamsgaard.dk 70 i- t->stksize = stack; Err mx1.adamsgaard.dk 70 i- memset(&t->context.uc, 0, sizeof t->context.uc); Err mx1.adamsgaard.dk 70 i- sigemptyset(&zero); Err mx1.adamsgaard.dk 70 i- sigprocmask(SIG_BLOCK, &zero, &t->context.uc.uc_sigmask); Err mx1.adamsgaard.dk 70 i-//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* must initialize with current context */ Err mx1.adamsgaard.dk 70 i- if(getcontext(&t->context.uc) < 0) Err mx1.adamsgaard.dk 70 i- sysfatal("threadalloc getcontext: %r"); Err mx1.adamsgaard.dk 70 i-//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * Call makecontext to do the real work. Err mx1.adamsgaard.dk 70 i- * To avoid various mistakes on other system software, Err mx1.adamsgaard.dk 70 i- * debuggers, and so on, don't get too close to both Err mx1.adamsgaard.dk 70 i- * ends of the stack. Just staying away is much easier Err mx1.adamsgaard.dk 70 i- * than debugging everything (outside our control) Err mx1.adamsgaard.dk 70 i- * that has off-by-one errors. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- t->context.uc.uc_stack.ss_sp = (void*)(t->stk+64); Err mx1.adamsgaard.dk 70 i- t->context.uc.uc_stack.ss_size = t->stksize-2*64; Err mx1.adamsgaard.dk 70 i-#if defined(__sun__) && !defined(__MAKECONTEXT_V2_SOURCE) /* sigh */ Err mx1.adamsgaard.dk 70 i- /* can avoid this with __MAKECONTEXT_V2_SOURCE but only on SunOS 5.9 */ Err mx1.adamsgaard.dk 70 i- t->context.uc.uc_stack.ss_sp = Err mx1.adamsgaard.dk 70 i- (char*)t->context.uc.uc_stack.ss_sp Err mx1.adamsgaard.dk 70 i- +t->context.uc.uc_stack.ss_size; Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * All this magic is because you have to pass makecontext a Err mx1.adamsgaard.dk 70 i- * function that takes some number of word-sized variables, Err mx1.adamsgaard.dk 70 i- * and on 64-bit machines pointers are bigger than words. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i-//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn); Err mx1.adamsgaard.dk 70 i- z = (ulong)t; Err mx1.adamsgaard.dk 70 i- y = z; Err mx1.adamsgaard.dk 70 i- z >>= 16; /* hide undefined 32-bit shift from 32-bit compilers */ Err mx1.adamsgaard.dk 70 i- x = z>>16; Err mx1.adamsgaard.dk 70 i- makecontext(&t->context.uc, (void(*)(void))threadstart, 2, y, x); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- return t; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-_Thread* Err mx1.adamsgaard.dk 70 i-_threadcreate(Proc *p, void (*fn)(void*), void *arg, uint stack) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- _Thread *t; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* defend against bad C libraries */ Err mx1.adamsgaard.dk 70 i- if(stack < (256<<10)) Err mx1.adamsgaard.dk 70 i- stack = 256<<10; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- if(p->nthread == 0 || pthreadperthread) Err mx1.adamsgaard.dk 70 i- stack = 0; // not using it Err mx1.adamsgaard.dk 70 i- t = threadalloc(fn, arg, stack); Err mx1.adamsgaard.dk 70 i t->proc = p; Err mx1.adamsgaard.dk 70 i- if(pthreadperthread) { Err mx1.adamsgaard.dk 70 i- if(p->nthread != 0) Err mx1.adamsgaard.dk 70 i- _threadpthreadstart(p, t); Err mx1.adamsgaard.dk 70 i- else Err mx1.adamsgaard.dk 70 i- t->mainthread = 1; Err mx1.adamsgaard.dk 70 i- } else { Err mx1.adamsgaard.dk 70 i- if(p->nthread == 0) Err mx1.adamsgaard.dk 70 i- p->thread0 = t; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i+ if(p->nthread != 0) Err mx1.adamsgaard.dk 70 i+ _threadpthreadstart(p, t); Err mx1.adamsgaard.dk 70 i+ else Err mx1.adamsgaard.dk 70 i+ t->mainthread = 1; Err mx1.adamsgaard.dk 70 i p->nthread++; Err mx1.adamsgaard.dk 70 i addthreadinproc(p, t); Err mx1.adamsgaard.dk 70 i _threadready(t); Err mx1.adamsgaard.dk 70 it@@ -232,15 +139,8 @@ _threadswitch(void) Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i needstack(0); Err mx1.adamsgaard.dk 70 i p = proc(); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i /*print("threadswtch %p\n", p); */ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- if(pthreadperthread) Err mx1.adamsgaard.dk 70 i- pthreadscheduler(p); Err mx1.adamsgaard.dk 70 i- else if(p->thread == p->thread0) Err mx1.adamsgaard.dk 70 i- procscheduler(p); Err mx1.adamsgaard.dk 70 i- else Err mx1.adamsgaard.dk 70 i- contextswitch(&p->thread->context, &p->schedcontext); Err mx1.adamsgaard.dk 70 i+ pthreadscheduler(p); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 it@@ -339,15 +239,6 @@ threadsysfatal(char *fmt, va_list arg) Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i static void Err mx1.adamsgaard.dk 70 i-contextswitch(Context *from, Context *to) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- if(swapcontext(&from->uc, &to->uc) < 0){ Err mx1.adamsgaard.dk 70 i- fprint(2, "swapcontext failed: %r\n"); Err mx1.adamsgaard.dk 70 i- assert(0); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static void Err mx1.adamsgaard.dk 70 i procmain(Proc *p) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i _Thread *t; Err mx1.adamsgaard.dk 70 it@@ -357,7 +248,6 @@ procmain(Proc *p) Err mx1.adamsgaard.dk 70 i /* take out first thread to run on system stack */ Err mx1.adamsgaard.dk 70 i t = p->runqueue.head; Err mx1.adamsgaard.dk 70 i delthread(&p->runqueue, t); Err mx1.adamsgaard.dk 70 i- memset(&t->context.uc, 0, sizeof t->context.uc); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i /* run it */ Err mx1.adamsgaard.dk 70 i p->thread = t; Err mx1.adamsgaard.dk 70 it@@ -379,84 +269,6 @@ _threadpthreadmain(Proc *p, _Thread *t) Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i static void Err mx1.adamsgaard.dk 70 i-procscheduler(Proc *p) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- _Thread *t; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- _threaddebug(nil, "scheduler enter"); Err mx1.adamsgaard.dk 70 i-//print("s %p\n", p); Err mx1.adamsgaard.dk 70 i- for(;;) { Err mx1.adamsgaard.dk 70 i- /* Finish running current thread. */ Err mx1.adamsgaard.dk 70 i- lock(&p->lock); Err mx1.adamsgaard.dk 70 i- t = p->thread; Err mx1.adamsgaard.dk 70 i- p->thread = nil; Err mx1.adamsgaard.dk 70 i- if(t->exiting){ Err mx1.adamsgaard.dk 70 i- delthreadinproc(p, t); Err mx1.adamsgaard.dk 70 i- p->nthread--; Err mx1.adamsgaard.dk 70 i- /*print("nthread %d\n", p->nthread); */ Err mx1.adamsgaard.dk 70 i- _threadstkfree(t->stk, t->stksize); Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * Cannot free p->thread0 yet: it is used for the Err mx1.adamsgaard.dk 70 i- * context switches back to the scheduler. Err mx1.adamsgaard.dk 70 i- * Instead, we will free it at the end of this function. Err mx1.adamsgaard.dk 70 i- * But all the other threads can be freed now. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- if(t != p->thread0) Err mx1.adamsgaard.dk 70 i- free(t); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* Pick next thread. */ Err mx1.adamsgaard.dk 70 i- t = procnext(p, nil); Err mx1.adamsgaard.dk 70 i- if(t == nil) Err mx1.adamsgaard.dk 70 i- break; Err mx1.adamsgaard.dk 70 i- _threaddebug(nil, "run %d (%s)", t->id, t->name); Err mx1.adamsgaard.dk 70 i- //print("run %p %p %p %p\n", t, *(uintptr*)(t->context.uc.mc.sp), t->context.uc.mc.di, t->context.uc.mc.si); Err mx1.adamsgaard.dk 70 i- unlock(&p->lock); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* Switch to next thread. */ Err mx1.adamsgaard.dk 70 i- if(t == p->thread0) Err mx1.adamsgaard.dk 70 i- return; Err mx1.adamsgaard.dk 70 i- contextswitch(&p->schedcontext, &t->context); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- _threaddebug(nil, "back in scheduler"); Err mx1.adamsgaard.dk 70 i- /*print("back in scheduler\n"); */ Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* No more threads in proc. Clean up. */ Err mx1.adamsgaard.dk 70 i- _threaddebug(nil, "scheduler exit"); Err mx1.adamsgaard.dk 70 i- if(p->mainproc){ Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * Stupid bug - on Linux 2.6 and maybe elsewhere, Err mx1.adamsgaard.dk 70 i- * if the main thread exits then the others keep running Err mx1.adamsgaard.dk 70 i- * but the process shows up as a zombie in ps and is not Err mx1.adamsgaard.dk 70 i- * attachable with ptrace. We'll just sit around pretending Err mx1.adamsgaard.dk 70 i- * to be a system proc instead of exiting. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- _threaddaemonize(); Err mx1.adamsgaard.dk 70 i- lock(&threadnproclock); Err mx1.adamsgaard.dk 70 i- if(++threadnsysproc == threadnproc) Err mx1.adamsgaard.dk 70 i- threadexitsall(p->msg); Err mx1.adamsgaard.dk 70 i- p->sysproc = 1; Err mx1.adamsgaard.dk 70 i- unlock(&threadnproclock); Err mx1.adamsgaard.dk 70 i- for(;;) Err mx1.adamsgaard.dk 70 i- sleep(1000); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- delproc(p); Err mx1.adamsgaard.dk 70 i- lock(&threadnproclock); Err mx1.adamsgaard.dk 70 i- if(p->sysproc) Err mx1.adamsgaard.dk 70 i- --threadnsysproc; Err mx1.adamsgaard.dk 70 i- if(--threadnproc == threadnsysproc) Err mx1.adamsgaard.dk 70 i- threadexitsall(p->msg); Err mx1.adamsgaard.dk 70 i- unlock(&threadnproclock); Err mx1.adamsgaard.dk 70 i- unlock(&p->lock); Err mx1.adamsgaard.dk 70 i- _threadsetproc(nil); Err mx1.adamsgaard.dk 70 i- free(p->thread0); Err mx1.adamsgaard.dk 70 i- free(p); Err mx1.adamsgaard.dk 70 i- _threadpexit(); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static void Err mx1.adamsgaard.dk 70 i pthreadsleepschedlocked(Proc *p, _Thread *t) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i _threaddebug(t, "pthreadsleepsched %p %d", p, t->id);; Err mx1.adamsgaard.dk 70 it@@ -913,15 +725,6 @@ main(int argc, char **argv) Err mx1.adamsgaard.dk 70 i if(opts == nil) Err mx1.adamsgaard.dk 70 i opts = ""; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- pthreadperthread = (strstr(opts, "pthreadperthread") != nil); Err mx1.adamsgaard.dk 70 i-#ifdef PLAN9PORT_ASAN Err mx1.adamsgaard.dk 70 i- // ASAN can't deal with the coroutine stack switches. Err mx1.adamsgaard.dk 70 i- // In theory it has support for informing it about stack switches, Err mx1.adamsgaard.dk 70 i- // but even with those calls added it can't deal with things Err mx1.adamsgaard.dk 70 i- // like fork or exit from a coroutine stack. Err mx1.adamsgaard.dk 70 i- // Easier to just run in pthread-per-thread mode. Err mx1.adamsgaard.dk 70 i- pthreadperthread = 1; Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i if(threadmaybackground() && strstr(opts, "nodaemon") == nil && getenv("NOLIBTHREADDAEMONIZE") == nil) Err mx1.adamsgaard.dk 70 i _threadsetupdaemonize(); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -956,7 +759,7 @@ main(int argc, char **argv) Err mx1.adamsgaard.dk 70 i t = _threadcreate(p, threadmainstart, nil, mainstacksize); Err mx1.adamsgaard.dk 70 i t->mainthread = 1; Err mx1.adamsgaard.dk 70 i procmain(p); Err mx1.adamsgaard.dk 70 i- sysfatal("procscheduler returned in threadmain!"); Err mx1.adamsgaard.dk 70 i+ sysfatal("procmain returned in libthread"); Err mx1.adamsgaard.dk 70 i /* does not return */ Err mx1.adamsgaard.dk 70 i return 0; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h /src/plan9port/file/src/libthread/threadimpl.h.gph mx1.adamsgaard.dk 70 it@@ -9,36 +9,11 @@ Err mx1.adamsgaard.dk 70 i # if defined(__APPLE__) Err mx1.adamsgaard.dk 70 i # define _XOPEN_SOURCE /* for Snow Leopard */ Err mx1.adamsgaard.dk 70 i # endif Err mx1.adamsgaard.dk 70 i-# include Err mx1.adamsgaard.dk 70 i #endif Err mx1.adamsgaard.dk 70 i #include Err mx1.adamsgaard.dk 70 i #include "libc.h" Err mx1.adamsgaard.dk 70 i #include "thread.h" Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i-#if defined(__OpenBSD__) Err mx1.adamsgaard.dk 70 i-# define mcontext libthread_mcontext Err mx1.adamsgaard.dk 70 i-# define mcontext_t libthread_mcontext_t Err mx1.adamsgaard.dk 70 i-# define ucontext libthread_ucontext Err mx1.adamsgaard.dk 70 i-# define ucontext_t libthread_ucontext_t Err mx1.adamsgaard.dk 70 i-# if defined __i386__ Err mx1.adamsgaard.dk 70 i-# include "386-ucontext.h" Err mx1.adamsgaard.dk 70 i-# elif defined __amd64__ Err mx1.adamsgaard.dk 70 i-# include "x86_64-ucontext.h" Err mx1.adamsgaard.dk 70 i-# else Err mx1.adamsgaard.dk 70 i-# include "power-ucontext.h" Err mx1.adamsgaard.dk 70 i-# endif Err mx1.adamsgaard.dk 70 i-extern pid_t rfork_thread(int, void*, int(*)(void*), void*); Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-#if defined(__arm__) Err mx1.adamsgaard.dk 70 i-int mygetmcontext(ulong*); Err mx1.adamsgaard.dk 70 i-void mysetmcontext(const ulong*); Err mx1.adamsgaard.dk 70 i-#define setcontext(u) mysetmcontext(&(u)->uc_mcontext.arm_r0) Err mx1.adamsgaard.dk 70 i-#define getcontext(u) mygetmcontext(&(u)->uc_mcontext.arm_r0) Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-typedef struct Context Context; Err mx1.adamsgaard.dk 70 i typedef struct Execjob Execjob; Err mx1.adamsgaard.dk 70 i typedef struct Proc Proc; Err mx1.adamsgaard.dk 70 i typedef struct _Procrendez _Procrendez; Err mx1.adamsgaard.dk 70 it@@ -54,11 +29,6 @@ enum Err mx1.adamsgaard.dk 70 i STACK = 8192 Err mx1.adamsgaard.dk 70 i }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i-struct Context Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- ucontext_t uc; Err mx1.adamsgaard.dk 70 i-}; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i struct Execjob Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i int *fd; Err mx1.adamsgaard.dk 70 it@@ -72,11 +42,7 @@ struct _Procrendez Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i Lock *l; Err mx1.adamsgaard.dk 70 i int asleep; Err mx1.adamsgaard.dk 70 i-#ifdef PLAN9PORT_USING_PTHREADS Err mx1.adamsgaard.dk 70 i pthread_cond_t cond; Err mx1.adamsgaard.dk 70 i-#else Err mx1.adamsgaard.dk 70 i- int pid; Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i struct _Thread Err mx1.adamsgaard.dk 70 it@@ -85,15 +51,10 @@ struct _Thread Err mx1.adamsgaard.dk 70 i _Thread *prev; Err mx1.adamsgaard.dk 70 i _Thread *allnext; Err mx1.adamsgaard.dk 70 i _Thread *allprev; Err mx1.adamsgaard.dk 70 i- Context context; Err mx1.adamsgaard.dk 70 i void (*startfn)(void*); Err mx1.adamsgaard.dk 70 i void *startarg; Err mx1.adamsgaard.dk 70 i uint id; Err mx1.adamsgaard.dk 70 i-#ifdef PLAN9PORT_USING_PTHREADS Err mx1.adamsgaard.dk 70 i pthread_t osprocid; Err mx1.adamsgaard.dk 70 i-#else Err mx1.adamsgaard.dk 70 i- int osprocid; Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i uchar *stk; Err mx1.adamsgaard.dk 70 i uint stksize; Err mx1.adamsgaard.dk 70 i int exiting; Err mx1.adamsgaard.dk 70 it@@ -115,11 +76,7 @@ struct Proc Err mx1.adamsgaard.dk 70 i Proc *next; Err mx1.adamsgaard.dk 70 i Proc *prev; Err mx1.adamsgaard.dk 70 i char msg[128]; Err mx1.adamsgaard.dk 70 i-#ifdef PLAN9PORT_USING_PTHREADS Err mx1.adamsgaard.dk 70 i pthread_t osprocid; Err mx1.adamsgaard.dk 70 i-#else Err mx1.adamsgaard.dk 70 i- int osprocid; Err mx1.adamsgaard.dk 70 i-#endif Err mx1.adamsgaard.dk 70 i Lock lock; Err mx1.adamsgaard.dk 70 i int nswitch; Err mx1.adamsgaard.dk 70 i _Thread *thread0; Err mx1.adamsgaard.dk 70 it@@ -133,7 +90,6 @@ struct Proc Err mx1.adamsgaard.dk 70 i _Procrendez runrend; Err mx1.adamsgaard.dk 70 i Lock schedlock; Err mx1.adamsgaard.dk 70 i _Thread *schedthread; Err mx1.adamsgaard.dk 70 i- Context schedcontext; Err mx1.adamsgaard.dk 70 i void *udata; Err mx1.adamsgaard.dk 70 i Jmp sigjmp; Err mx1.adamsgaard.dk 70 i int mainproc; Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/x86_64-ucontext.c b/src/libthread/x86_64-ucontext.c /src/plan9port/file/src/libthread/x86_64-ucontext.c.gph mx1.adamsgaard.dk 70 it@@ -1,28 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#include "threadimpl.h" Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- uintptr *sp; Err mx1.adamsgaard.dk 70 i- va_list arg; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- if(argc != 2) Err mx1.adamsgaard.dk 70 i- sysfatal("libthread: makecontext misused"); Err mx1.adamsgaard.dk 70 i- va_start(arg, argc); Err mx1.adamsgaard.dk 70 i- uc->mc.di = va_arg(arg, uint); Err mx1.adamsgaard.dk 70 i- uc->mc.si = va_arg(arg, uint); Err mx1.adamsgaard.dk 70 i- va_end(arg); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- sp = USPALIGN(uc, 16); Err mx1.adamsgaard.dk 70 i- *--sp = 0; // fn's return address Err mx1.adamsgaard.dk 70 i- *--sp = (uintptr)fn; // return address of setcontext Err mx1.adamsgaard.dk 70 i- uc->mc.sp = (uintptr)sp; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-int Err mx1.adamsgaard.dk 70 i-swapcontext(ucontext_t *oucp, ucontext_t *ucp) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- if(getcontext(oucp) == 0) Err mx1.adamsgaard.dk 70 i- setcontext(ucp); Err mx1.adamsgaard.dk 70 i- return 0; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/x86_64-ucontext.h b/src/libthread/x86_64-ucontext.h /src/plan9port/file/src/libthread/x86_64-ucontext.h.gph mx1.adamsgaard.dk 70 it@@ -1,42 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#define setcontext(u) libthread_setmcontext(&(u)->mc) Err mx1.adamsgaard.dk 70 i-#define getcontext(u) libthread_getmcontext(&(u)->mc) Err mx1.adamsgaard.dk 70 i-typedef struct mcontext mcontext_t; Err mx1.adamsgaard.dk 70 i-typedef struct ucontext ucontext_t; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-struct mcontext Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- uintptr ax; Err mx1.adamsgaard.dk 70 i- uintptr bx; Err mx1.adamsgaard.dk 70 i- uintptr cx; Err mx1.adamsgaard.dk 70 i- uintptr dx; Err mx1.adamsgaard.dk 70 i- uintptr si; Err mx1.adamsgaard.dk 70 i- uintptr di; Err mx1.adamsgaard.dk 70 i- uintptr bp; Err mx1.adamsgaard.dk 70 i- uintptr sp; Err mx1.adamsgaard.dk 70 i- uintptr r8; Err mx1.adamsgaard.dk 70 i- uintptr r9; Err mx1.adamsgaard.dk 70 i- uintptr r10; Err mx1.adamsgaard.dk 70 i- uintptr r11; Err mx1.adamsgaard.dk 70 i- uintptr r12; Err mx1.adamsgaard.dk 70 i- uintptr r13; Err mx1.adamsgaard.dk 70 i- uintptr r14; Err mx1.adamsgaard.dk 70 i- uintptr r15; Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i-// XXX: currently do not save vector registers or floating-point state Err mx1.adamsgaard.dk 70 i-*/ Err mx1.adamsgaard.dk 70 i-}; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-struct ucontext Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- struct { Err mx1.adamsgaard.dk 70 i- void *ss_sp; Err mx1.adamsgaard.dk 70 i- uint ss_size; Err mx1.adamsgaard.dk 70 i- } uc_stack; Err mx1.adamsgaard.dk 70 i- sigset_t uc_sigmask; Err mx1.adamsgaard.dk 70 i- mcontext_t mc; Err mx1.adamsgaard.dk 70 i-}; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void makecontext(ucontext_t*, void(*)(void), int, ...); Err mx1.adamsgaard.dk 70 i-int swapcontext(ucontext_t*, ucontext_t*); Err mx1.adamsgaard.dk 70 i-int libthread_getmcontext(mcontext_t*); Err mx1.adamsgaard.dk 70 i-void libthread_setmcontext(mcontext_t*); Err mx1.adamsgaard.dk 70 .