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