r1277 - trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64
Author: ps-guest
Date: 2006-02-28 17:32:32 +0000 (Tue, 28 Feb 2006)
New Revision: 1277
Added:
trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/makecontext.S
trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/ucontext_i.h
Removed:
trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/makecontext.c
Log:
* attempt to functional makecontext() on amd64
Added: trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/makecontext.S
===================================================================
--- trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/makecontext.S 2006-02-28 15:05:21 UTC (rev 1276)
+++ trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/makecontext.S 2006-02-28 17:32:32 UTC (rev 1277)
@@ -0,0 +1,146 @@
+/* makecontext() for FreeBSD/amd64.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Petr Salinger, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#include <ucontext_i.h>
+
+/*
+ void makecontext(ucontext_t *ucp, void *func(), int argc, ...);
+
+
+ input parameters:
+
+ rdi ucp
+ rsi func
+ edx argc
+ rcx arg1 -> ucp.rdi
+ r8 arg2 -> ucp.rsi
+ r9 arg3 -> ucp.rdx
+ 8(%rsp) arg4 -> ucp.rcx
+ 16(%rsp) arg5 -> ucp.r8
+ 24(%rsp) arg6 -> ucp.r9
+ i*8+24(%rsp) arg(6+i)-> future stack
+
+*/
+
+ENTRY(__makecontext)
+
+ /* Compute the address of the stack.
+ The information comes from us_stack element. */
+ movq oSS_SP(%rdi), %rax
+ addq oSS_SIZE(%rdi), %rax
+
+ /* Put start addr into ucp */
+ movq %rsi, oRIP(%rdi)
+
+ /* properly align future stack */
+ andq $-16, %rax
+ subq $8, %rax
+
+ /* Put the next context into preserved ucp.rbx
+ (from the uc_link element). */
+ movq oLINK(%rdi), %rsi
+ movq %rsi, oRBX(%rdi)
+
+ /* save future registers arguments */
+
+ orl %edx, %edx
+ jz L(param_done)
+
+ decl %edx
+ movq %rcx, oRDI(%rdi)
+ jz L(param_done)
+
+ decl %edx
+ movq %r8, oRSI(%rdi)
+ jz L(param_done)
+
+ decl %edx
+ movq %r9, oRDX(%rdi)
+ jz L(param_done)
+
+ movq 8(%rsp), %rsi
+ decl %edx
+ movq %rsi, oRCX(%rdi)
+ jz L(param_done)
+
+ movq 16(%rsp), %rcx
+ decl %edx
+ movq %rcx, oR8(%rdi)
+ jz L(param_done)
+
+ movq 24(%rsp), %rsi
+ decl %edx
+ movq %rsi, oR9(%rdi)
+ jz L(param_done)
+
+ /* we have to copy some arguments also on the future stack */
+ movl %edx, %ecx
+ negq %rdx
+ leaq -16(%rax,%rdx,8), %rax /* we a litle bit waste stack space */
+ orq $8, %rax
+
+1: movq 24(%rsp,%rcx,8), %rsi
+ movq %rsi,(%rax,%rcx,8)
+ loop 1b
+
+L(param_done):
+
+ /* Store the future stack pointer and chain helper code. */
+ leaq L(exitcode)(%rip), %rdx
+ movq %rax, oRSP(%rdi)
+ movq %rdx, (%rax)
+
+ /* 'makecontext' returns no value. */
+ ret
+
+/***************************************************************************/
+
+ /* This is the helper code which gets called if a function which
+ is registered with 'makecontext' returns. In this case we
+ have to install the context listed in the uc_link element of
+ the context 'makecontext' manipulated at the time of the
+ 'makecontext' call. If the pointer is NULL the process must
+ terminate. */
+
+L(exitcode):
+ /* we don't bother with extra arguments left on the stack
+ - more than 6 arguments is rare
+ - setcontext changes stacks immediately
+ - exit will call _exit in near future
+ */
+
+ testq %rbx, %rbx /* If it is zero exit. */
+ jz 2f
+
+ movq %rbx, %rdi
+ call JUMPTARGET(__setcontext)
+ /* If this returns (which can happen if the syscall fails) we'll
+ exit the program with the return error value (-1). */
+
+2: movq %rax, %rdi
+ call HIDDEN_JUMPTARGET(exit)
+ /* The 'exit' call should never return. In case it does cause
+ the process to terminate. */
+ hlt
+END(__makecontext)
+
+weak_alias(__makecontext, makecontext)
+
Deleted: trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/makecontext.c
===================================================================
--- trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/makecontext.c 2006-02-28 15:05:21 UTC (rev 1276)
+++ trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/makecontext.c 2006-02-28 17:32:32 UTC (rev 1277)
@@ -1,32 +0,0 @@
-/* Copyright (C) 1998 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <ucontext.h>
-#include <string.h>
-
-void
-makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
-{
- __set_errno (ENOSYS);
- memset(ucp, 0, sizeof(ucontext_t));
-}
-
-
-stub_warning (makecontext)
-#include <stub-tag.h>
Added: trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/ucontext_i.h
===================================================================
--- trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/ucontext_i.h 2006-02-28 15:05:21 UTC (rev 1276)
+++ trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/ucontext_i.h 2006-02-28 17:32:32 UTC (rev 1277)
@@ -0,0 +1,38 @@
+/* Offsets needed in the makecontext() function implementation.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* Offsets of the fields in the ucontext_t structure. */
+
+#define oRDI 24
+#define oRSI 32
+#define oRDX 40
+#define oRCX 48
+#define oR8 56
+#define oR9 64
+
+#define oRAX 72
+#define oRBX 80
+#define oRBP 88
+
+#define oRIP 176
+#define oRSP 200
+
+#define oLINK 816
+#define oSS_SP 824
+#define oSS_SIZE 832
Reply to: