Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libpthread/arch/x86_64 libpthread support for x86_64.



details:   https://anonhg.NetBSD.org/src/rev/87d163a223f9
branches:  trunk
changeset: 542471:87d163a223f9
user:      fvdl <fvdl%NetBSD.org@localhost>
date:      Thu Jan 30 02:10:31 2003 +0000

description:
libpthread support for x86_64.

diffstat:

 lib/libpthread/arch/x86_64/_context_u.S     |  132 ++++++++++
 lib/libpthread/arch/x86_64/genassym.cf      |   92 +++++++
 lib/libpthread/arch/x86_64/pthread_md.h     |  154 ++++++++++++
 lib/libpthread/arch/x86_64/pthread_switch.S |  344 ++++++++++++++++++++++++++++
 4 files changed, 722 insertions(+), 0 deletions(-)

diffs (truncated from 738 to 300 lines):

diff -r 3ab2286e2a20 -r 87d163a223f9 lib/libpthread/arch/x86_64/_context_u.S
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libpthread/arch/x86_64/_context_u.S   Thu Jan 30 02:10:31 2003 +0000
@@ -0,0 +1,132 @@
+/*     $NetBSD: _context_u.S,v 1.1 2003/01/30 02:10:31 fvdl Exp $      */
+
+/*-
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Nathan J. Williams.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Adapted for x86_64 by fvdl%netbsd.org@localhost
+ */
+
+#include <machine/asm.h>
+#include "assym.h"
+
+#define GETC \
+       movq    (%rsp), %r11                                    ; \
+       movq    %r11, (UC_REGS + _REG_RIP * 8)(%rdi)            ; \
+       movq    %rbx, (UC_REGS + _REG_RBX * 8)(%rdi)            ; \
+       movq    %rbp, (UC_REGS + _REG_RBP * 8)(%rdi)            ; \
+       movq    %r12, (UC_REGS + _REG_R12 * 8)(%rdi)            ; \
+       movq    %r13, (UC_REGS + _REG_R13 * 8)(%rdi)            ; \
+       movq    %r14, (UC_REGS + _REG_R14 * 8)(%rdi)            ; \
+       movq    %r15, (UC_REGS + _REG_R15 * 8)(%rdi)            ; \
+       fxsave  UC_FPREGS(%rdi)                                 ; \
+       movl    $(_UC_USER | _UC_CPU | _UC_FPU),UC_FLAGS(%rdi)
+
+#define SETC \
+       movl    UC_FLAGS(%rdi), %eax                            ; \
+       btl     $_UC_USER_BIT, %eax                             ; \
+       jnc     1f                                              ; \
+       fxrstor UC_FPREGS(%rdi)                                 ; \
+       movq    (UC_REGS + _REG_RBX * 8)(%rdi),%rbx             ; \
+       movq    (UC_REGS + _REG_RBP * 8)(%rdi),%rbp             ; \
+       movq    (UC_REGS + _REG_R12 * 8)(%rdi),%r12             ; \
+       movq    (UC_REGS + _REG_R13 * 8)(%rdi),%r13             ; \
+       movq    (UC_REGS + _REG_R14 * 8)(%rdi),%r14             ; \
+       movq    (UC_REGS + _REG_R15 * 8)(%rdi),%r15             ; \
+       movq    (UC_REGS + _REG_URSP * 8)(%rdi),%r11            ; \
+       movq    (UC_REGS + _REG_RIP * 8)(%rdi),%rax             ; \
+       leaq    -8(%r11),%rsp                                   ; \
+       movq    %rax, (%rsp)                                    ; \
+       ret                                                     ; \
+1:     andl    $_UC_FPU, %eax                                  ; \
+       jz      2f                                              ; \
+       fxrstor UC_FPREGS(%rdi)                                 ; \
+2:     xorq    %rax,%rax                                       ; \
+       movw    (UC_REGS + _REG_GS * 8)(%rdi), %gs              ; \
+       movw    (UC_REGS + _REG_FS * 8)(%rdi), %fs              ; \
+       movw    (UC_REGS + _REG_ES * 8)(%rdi), %es              ; \
+       movq    (UC_REGS + _REG_URSP * 8)(%rdi), %r11           ; \
+       movq    (UC_REGS + _REG_RBX * 8)(%rdi), %rbx            ; \
+       movq    (UC_REGS + _REG_RBP * 8)(%rdi), %rbp            ; \
+       movq    (UC_REGS + _REG_R12 * 8)(%rdi), %r12            ; \
+       movq    (UC_REGS + _REG_R13 * 8)(%rdi), %r13            ; \
+       movq    (UC_REGS + _REG_R14 * 8)(%rdi), %r14            ; \
+       movq    (UC_REGS + _REG_R15 * 8)(%rdi), %r15            ; \
+       movq    (UC_REGS + _REG_RBX * 8)(%rdi), %rbx            ; \
+       movq    (UC_REGS + _REG_R10 * 8)(%rdi), %r10            ; \
+       movq    (UC_REGS + _REG_R9  * 8)(%rdi), %r9             ; \
+       movq    (UC_REGS + _REG_R8  * 8)(%rdi), %r8             ; \
+       movq    (UC_REGS + _REG_RCX * 8)(%rdi), %rcx            ; \
+       movq    (UC_REGS + _REG_RDX * 8)(%rdi), %rdx            ; \
+       movq    (UC_REGS + _REG_RSI * 8)(%rdi), %rsi            ; \
+       movw    (UC_REGS + _REG_CS * 8)(%rdi), %ax              ; \
+       movq    %rax, -8(%r11)                                  ; \
+       movw    (UC_REGS + _REG_DS * 8)(%rdi), %ax              ; \
+       movq    %rax, -32(%r11)                                 ; \
+       movq    (UC_REGS + _REG_RIP * 8)(%rdi), %rax            ; \
+       movq    %rax, -16(%r11)                                 ; \
+       movq    (UC_REGS + _REG_RAX)(%rdi), %rax                ; \
+       movq    %rax, -24(%r11)                                 ; \
+       movq    (UC_REGS + _REG_R11 * 8)(%rdi), %rax            ; \
+       movq    %rax, -40(%r11)                                 ; \
+       movq    (UC_REGS + _REG_RFL * 8)(%rdi), %rax            ; \
+       movq    %rax, -48(%r11)                                 ; \
+                                                               ; \
+       movw    (UC_REGS + _REG_SS * 8)(%rdi), %ss              ; \
+       movq    (UC_REGS + _REG_RDI)(%rdi), %rdi                ; \
+       leaq    -48(%r11), %rsp                                 ; \
+                                                               ; \
+       popfq                                                   ; \
+       popq    %r11                                            ; \
+       popq    %rax                                            ; \
+       movl    %eax,%ds                                        ; \
+       popq    %rax                                            ; \
+       lretq
+
+ENTRY(_getcontext_u)
+       GETC
+       leaq    8(%rsp), %r11
+       movq    %r11, (UC_REGS + _REG_URSP * 8)(%rdi)
+       xorl    %eax, %eax
+       ret
+
+ENTRY(_setcontext_u)                                   
+       SETC
+
+ENTRY(_swapcontext_u)
+       GETC
+       leaq    8(%rsp),%rax
+       movq    %rax, (UC_REGS + _REG_URSP * 8)(%rdi)
+       movq    %rsi, %rdi
+       SETC
diff -r 3ab2286e2a20 -r 87d163a223f9 lib/libpthread/arch/x86_64/genassym.cf
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libpthread/arch/x86_64/genassym.cf    Thu Jan 30 02:10:31 2003 +0000
@@ -0,0 +1,92 @@
+#      $NetBSD: genassym.cf,v 1.1 2003/01/30 02:10:31 fvdl Exp $
+
+# Copyright (c) 2001 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Nathan J. Williams.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#        This product includes software developed by the NetBSD
+#        Foundation, Inc. and its contributors.
+# 4. Neither the name of The NetBSD Foundation nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+
+include <ucontext.h>
+include <sys/queue.h>
+include "pthread.h"
+include "pthread_int.h"
+include "pthread_md.h"
+
+define PT_NEXT         offsetof(struct pthread_st, pt_next)
+define PT_STATE                offsetof(struct pthread_st, pt_state)
+define PT_SWITCHTO     offsetof(struct pthread_st, pt_switchto)
+define PT_SWITCHTOUC   offsetof(struct pthread_st, pt_switchtouc)
+define PT_SLEEPUC      offsetof(struct pthread_st, pt_sleepuc)
+define PT_SPINLOCKS    offsetof(struct pthread_st, pt_spinlocks)
+define PT_HELDLOCK     offsetof(struct pthread_st, pt_heldlock)
+define PT_UC           offsetof(struct pthread_st, pt_uc)
+define CONTEXTSIZE     sizeof(ucontext_t)
+define UC_FLAGS                offsetof(ucontext_t, uc_flags)
+define UC_REGS         offsetof(ucontext_t, uc_mcontext.__gregs)
+define UC_RIP          offsetof(ucontext_t, uc_mcontext.__gregs[_REG_RIP])
+define UC_FPREGS       offsetof(ucontext_t, uc_mcontext.__fpregs)
+
+define PT_STATE_RECYCLABLE     PT_STATE_RECYCLABLE
+define STACKSPACE              STACKSPACE
+
+define _UC_CPU         _UC_CPU
+define _UC_FPU         _UC_FPU
+define _UC_USER                _UC_USER
+define _UC_USER_BIT    _UC_USER_BIT
+
+define _REG_GS         _REG_GS
+define _REG_FS         _REG_FS
+define _REG_ES         _REG_ES
+define _REG_DS         _REG_DS
+define _REG_RDI                _REG_RDI
+define _REG_RSI                _REG_RSI
+define _REG_RBP                _REG_RBP
+define _REG_RBX                _REG_RBX
+define _REG_RDX                _REG_RDX
+define _REG_RCX                _REG_RCX
+define _REG_RAX                _REG_RAX
+define _REG_TRAPNO     _REG_TRAPNO
+define _REG_ERR                _REG_ERR
+define _REG_RIP                _REG_RIP
+define _REG_CS         _REG_CS
+define _REG_RFL                _REG_RFL
+define _REG_URSP       _REG_URSP
+define _REG_SS         _REG_SS
+define _REG_R8         _REG_R8
+define _REG_R9         _REG_R9
+define _REG_R10                _REG_R10
+define _REG_R11                _REG_R11
+define _REG_R12                _REG_R12
+define _REG_R13                _REG_R13
+define _REG_R14                _REG_R14
+define _REG_R15                _REG_R15
diff -r 3ab2286e2a20 -r 87d163a223f9 lib/libpthread/arch/x86_64/pthread_md.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libpthread/arch/x86_64/pthread_md.h   Thu Jan 30 02:10:31 2003 +0000
@@ -0,0 +1,154 @@
+/*     $NetBSD: pthread_md.h,v 1.1 2003/01/30 02:10:32 fvdl Exp $      */
+
+/*-
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Nathan J. Williams.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Adapted for x86_64 by fvdl%netbsd.org@localhost
+ */
+
+#ifndef _LIB_PTHREAD_X86_64_MD_H
+#define _LIB_PTHREAD_X86_64_MD_H
+
+#include <sys/ucontext.h>
+
+static __inline long
+pthread__sp(void)
+{
+       long ret;
+       __asm("movq %%rsp, %0" : "=g" (ret));
+
+       return ret;
+}
+
+#define pthread__uc_sp(ucp) ((ucp)->uc_mcontext.__gregs[_REG_URSP])
+#define pthread__uc_pc(ucp) ((ucp)->uc_mcontext.__gregs[_REG_RIP])
+
+/*
+ * Set initial, sane values for registers whose values aren't just
+ * "don't care".
+ * 0x23 is GSEL(GUDATA_SEL, SEL_UPL), and
+ * 0x1b is GSEL(GUCODE_SEL, SEL_UPL).
+ * 0x202 is PSL_USERSET.
+ */



Home | Main Index | Thread Index | Old Index