[BACK]Return to makecontext.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / arch / x86_64 / gen

Annotation of src/lib/libc/arch/x86_64/gen/makecontext.c, Revision 1.4

1.4     ! dsl         1: /*     $NetBSD: makecontext.c,v 1.3 2008/04/28 20:22:58 martin Exp $   */
1.1       fvdl        2:
                      3: /*-
                      4:  * Copyright (c) 1999 The NetBSD Foundation, Inc.
                      5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to The NetBSD Foundation
                      8:  * by Klaus Klein.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     20:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     21:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     22:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     23:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     24:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     25:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     26:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     27:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     28:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     29:  * POSSIBILITY OF SUCH DAMAGE.
                     30:  *
                     31:  * Modified from the i386 version for x86_64 by fvdl@wasabisystems.com.
                     32:  *
                     33:  */
                     34:
                     35: #include <sys/cdefs.h>
                     36: #if defined(LIBC_SCCS) && !defined(lint)
1.4     ! dsl        37: __RCSID("$NetBSD: makecontext.c,v 1.3 2008/04/28 20:22:58 martin Exp $");
1.1       fvdl       38: #endif
                     39:
                     40: #include <inttypes.h>
                     41: #include <stddef.h>
                     42: #include <ucontext.h>
                     43: #include "extern.h"
                     44:
                     45: #include <stdarg.h>
                     46:
                     47: void
                     48: makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
                     49: {
                     50:        __greg_t *gr = ucp->uc_mcontext.__gregs;
                     51:        uintptr_t *sp;
                     52:        va_list ap;
                     53:        int stackargs, i;
                     54:
                     55:        stackargs = argc - 6;
                     56:
                     57:        /* LINTED __greg_t is safe */
                     58:        gr[_REG_RIP] = (__greg_t)func;
                     59:
                     60:        /* LINTED uintptr_t is safe */
                     61:        sp  = (uintptr_t *)
                     62:            ((uintptr_t)ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
                     63:
                     64:        /* LINTED uintptr_t is safe */
1.2       drochner   65:        sp  = (uintptr_t *)(((uintptr_t)sp & ~15));
1.1       fvdl       66:        sp--;
                     67:        if (stackargs > 0)
                     68:                sp -= stackargs;
                     69:        /* LINTED __greg_t is safe */
1.4     ! dsl        70:        gr[_REG_RSP] = (__greg_t)sp;
1.1       fvdl       71:        gr[_REG_RBP] = (__greg_t)0;     /* Wipe out frame pointer. */
                     72:
                     73:        /* Put return address on top of stack. */
                     74:        /* LINTED uintptr_t is safe */
                     75:        *sp++ = (uintptr_t)_resumecontext;
                     76:
                     77:        /*
                     78:         * Construct argument list.
                     79:         * The registers used to pass the first 6 arguments
                     80:         * (rdi, rsi, rdx, rcx, r8, r9) are the first 6 in gregs,
                     81:         * in that order, so those arguments can just be copied to
                     82:         * the gregs array.
                     83:         */
                     84:        va_start(ap, argc);
                     85:        for (i = 0; i < 6 && argc > 0; i++) {
                     86:                argc--;
                     87:                /* LINTED __greg_t is safe */
                     88:                gr[i] = va_arg(ap, __greg_t);
                     89:        }
                     90:
                     91:        while (stackargs-- > 0) {
                     92:                /* LINTED uintptr_t is safe */
                     93:                *sp++ = va_arg(ap, uintptr_t);
                     94:        }
                     95:
                     96:        va_end(ap);
                     97: }

CVSweb <webmaster@jp.NetBSD.org>