Blame


1 0c7c441e 2006-02-10 devnull /* Copyright (C) 2001 Free Software Foundation, Inc.
2 0c7c441e 2006-02-10 devnull This file is part of the GNU C Library.
3 0c7c441e 2006-02-10 devnull Contributed by Jakub Jelinek <jakub@redhat.com>.
4 0c7c441e 2006-02-10 devnull
5 0c7c441e 2006-02-10 devnull The GNU C Library is free software; you can redistribute it and/or
6 0c7c441e 2006-02-10 devnull modify it under the terms of the GNU Lesser General Public
7 0c7c441e 2006-02-10 devnull License as published by the Free Software Foundation; either
8 0c7c441e 2006-02-10 devnull version 2.1 of the License, or (at your option) any later version.
9 0c7c441e 2006-02-10 devnull
10 0c7c441e 2006-02-10 devnull The GNU C Library is distributed in the hope that it will be useful,
11 0c7c441e 2006-02-10 devnull but WITHOUT ANY WARRANTY; without even the implied warranty of
12 0c7c441e 2006-02-10 devnull MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 0c7c441e 2006-02-10 devnull Lesser General Public License for more details.
14 0c7c441e 2006-02-10 devnull
15 0c7c441e 2006-02-10 devnull You should have received a copy of the GNU Lesser General Public
16 0c7c441e 2006-02-10 devnull License along with the GNU C Library; if not, write to the Free
17 0c7c441e 2006-02-10 devnull Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 0c7c441e 2006-02-10 devnull 02111-1307 USA. */
19 0c7c441e 2006-02-10 devnull
20 0c7c441e 2006-02-10 devnull #include <ucontext.h>
21 0c7c441e 2006-02-10 devnull
22 8712d1a3 2006-02-16 devnull #define UC_M_PC 40
23 8712d1a3 2006-02-16 devnull #define UC_M_NPC 48
24 8712d1a3 2006-02-16 devnull
25 0c7c441e 2006-02-10 devnull extern int __getcontext (ucontext_t *ucp);
26 0c7c441e 2006-02-10 devnull extern int __setcontext (const ucontext_t *ucp, int restoremask);
27 0c7c441e 2006-02-10 devnull
28 0c7c441e 2006-02-10 devnull int
29 8712d1a3 2006-02-16 devnull swapcontext (ucontext_t *oucp, const ucontext_t *ucp)
30 0c7c441e 2006-02-10 devnull {
31 0c7c441e 2006-02-10 devnull extern void __swapcontext_ret (void);
32 0c7c441e 2006-02-10 devnull /* Save the current machine context to oucp. */
33 0c7c441e 2006-02-10 devnull __getcontext (oucp);
34 0c7c441e 2006-02-10 devnull /* Modify oucp to skip the __setcontext call on reactivation. */
35 8712d1a3 2006-02-16 devnull *(long*)((char*)oucp+UC_M_PC) = (long)__swapcontext_ret;
36 8712d1a3 2006-02-16 devnull *(long*)((char*)oucp+UC_M_NPC) = (long)__swapcontext_ret + 4;
37 0c7c441e 2006-02-10 devnull /* Restore the machine context in ucp. */
38 0c7c441e 2006-02-10 devnull __setcontext (ucp, 1);
39 0c7c441e 2006-02-10 devnull return 0;
40 0c7c441e 2006-02-10 devnull }
41 0c7c441e 2006-02-10 devnull
42 0c7c441e 2006-02-10 devnull asm (" \n\
43 0c7c441e 2006-02-10 devnull .text \n\
44 0c7c441e 2006-02-10 devnull .type __swapcontext_ret, #function \n\
45 0c7c441e 2006-02-10 devnull __swapcontext_ret: \n\
46 0c7c441e 2006-02-10 devnull return %i7 + 8 \n\
47 0c7c441e 2006-02-10 devnull clr %o0 \n\
48 0c7c441e 2006-02-10 devnull .size __swapcontext_ret, .-__swapcontext_ret \n\
49 0c7c441e 2006-02-10 devnull ");
50 0c7c441e 2006-02-10 devnull