summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2009-01-16 22:30:14 +0100
committerNeal H. Walfield <neal@gnu.org>2009-01-16 22:30:14 +0100
commitb3a3914c28f82be42610b4940e30facd84fb9c21 (patch)
treec313b43287f8db31d005ca7bc84c4d82da1449f5
parent379e11c21336d5a5f846910d01b258120d023645 (diff)
Add initial support for x86-64 to run-time libraries.
libc-parts/ 2009-01-16 Neal H. Walfield <neal@gnu.org> * Makefile.am (ARCH_COMMON_SOURCES) [ARCH_X86_64]: Define. (ARCH_USER_SOURCES) [ARCH_X86_64]: Likewise. (ARCH_KERNEL_SOURCES) [ARCH_X86_64]: Likewise. * x86-64-crt0.S: New file. * loader.c (loader_elf_load): Add support for ELF 64 and x86-64. libhurd-mm/ 2009-01-16 Neal H. Walfield <neal@gnu.org> * Makefile.am (ARCH_SOURCES) [ARCH_X86_64]: Define. (libhurd_mm_a_CFLAGS): Set preferred stack boundary to 2^4, not 2^2. (libas_kernel_a_CFLAGS): Don't set a preferred stack boundary. (libas_check_a_CFLAGS): Likewise. * x86-64-exception-entry.S: New stub file. libpthread/ 2009-01-16 Neal H. Walfield <neal@gnu.org> * Makefile.am (arch) [ARCH_X86_64]: Define. * sysdeps/x86_64/pt-machdep.h: New stub file. * sysdeps/viengoos/x86_64/pt-machdep.c: Likewise. * sysdeps/viengoos/x86_64/signal-dispatch-lowlevel.c: Likewise. * sysdeps/viengoos/x86_64/pt-setup.c: Likewise.
-rw-r--r--libc-parts/ChangeLog5
-rw-r--r--libc-parts/Makefile.am6
-rw-r--r--libc-parts/x86-64-crt0.S65
-rw-r--r--libhurd-mm/ChangeLog9
-rw-r--r--libhurd-mm/Makefile.am9
-rw-r--r--libhurd-mm/x86-64-exception-entry.S7
-rw-r--r--libpthread/ChangeLog8
-rw-r--r--libpthread/Makefile.am3
-rw-r--r--libpthread/sysdeps/viengoos/x86_64/pt-machdep.c20
-rw-r--r--libpthread/sysdeps/viengoos/x86_64/pt-setup.c45
-rw-r--r--libpthread/sysdeps/viengoos/x86_64/signal-dispatch-lowlevel.c32
-rw-r--r--libpthread/sysdeps/x86_64/pt-machdep.h29
12 files changed, 235 insertions, 3 deletions
diff --git a/libc-parts/ChangeLog b/libc-parts/ChangeLog
index df1b8e3..b2f2e72 100644
--- a/libc-parts/ChangeLog
+++ b/libc-parts/ChangeLog
@@ -1,5 +1,10 @@
2009-01-16 Neal H. Walfield <neal@gnu.org>
+ * Makefile.am (ARCH_COMMON_SOURCES) [ARCH_X86_64]: Define.
+ (ARCH_USER_SOURCES) [ARCH_X86_64]: Likewise.
+ (ARCH_KERNEL_SOURCES) [ARCH_X86_64]: Likewise.
+ * x86-64-crt0.S: New file.
+
* loader.c (loader_elf_load): Add support for ELF 64 and x86-64.
2009-01-16 Neal H. Walfield <neal@gnu.org>
diff --git a/libc-parts/Makefile.am b/libc-parts/Makefile.am
index 58d20ce..70958d8 100644
--- a/libc-parts/Makefile.am
+++ b/libc-parts/Makefile.am
@@ -24,6 +24,12 @@ if ARCH_IA32
ARCH_KERNEL_SOURCES = ia32-setjmp.S
endif
+if ARCH_X86_64
+ ARCH_COMMON_SOURCES =
+ ARCH_USER_SOURCES = ia32-cmain.c x86-64-crt0.S
+ ARCH_KERNEL_SOURCES =
+endif
+
if ! ENABLE_TESTS
noinst_LIBRARIES = libc-parts.a libc-kernel.a
endif
diff --git a/libc-parts/x86-64-crt0.S b/libc-parts/x86-64-crt0.S
new file mode 100644
index 0000000..d882be2
--- /dev/null
+++ b/libc-parts/x86-64-crt0.S
@@ -0,0 +1,65 @@
+/* x86-64-crt0.S - Startup code for x86-64.
+ Copyright (C) 2009 Free Software Foundation, Inc.
+
+ This file is part of the GNU Hurd.
+
+ The GNU Hurd is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ The GNU Hurd 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
+
+/* The size of our initial stack (32 pages). */
+#define STACK_SIZE 0x32000
+
+ .text
+
+ .globl start, _start
+start:
+_start:
+ /* The location of the Hurd startup data is stored in rsp. */
+ movq %rsp, __hurd_startup_data
+
+ /* Initialize the stack pointer. */
+ movq $(stack + STACK_SIZE), %rsp
+
+ /* Reset EFLAGS. */
+ pushq $0
+ popf
+
+ /* Now enter the cmain function. Instead of using call, we
+ jump and put a return address of 0 on the stack. We also zeor
+ the frame pointer. In this way, __builtin_return_address
+ works more reliably. */
+ pushq $0
+ xor %ebp, %ebp
+ jmp cmain
+
+ /* Not reached. */
+loop: hlt
+ jmp loop
+
+ .data
+
+ /* Our stack area. */
+ .global stack, _stack
+stack:
+_stack:
+ .align 0x1000
+ .fill STACK_SIZE, 1
+ .global stack_end, _stack_end
+stack_end:
+_stack_end:
+
+ /* This variable holds a pointer to the Hurd startup data. */
+ .global __hurd_startup_data
+__hurd_startup_data:
+ .long 0
diff --git a/libhurd-mm/ChangeLog b/libhurd-mm/ChangeLog
index aad6471..5b8bb92 100644
--- a/libhurd-mm/ChangeLog
+++ b/libhurd-mm/ChangeLog
@@ -1,5 +1,14 @@
2009-01-16 Neal H. Walfield <neal@gnu.org>
+ * Makefile.am (ARCH_SOURCES) [ARCH_X86_64]: Define.
+ (libhurd_mm_a_CFLAGS): Set preferred stack boundary to 2^4, not
+ 2^2.
+ (libas_kernel_a_CFLAGS): Don't set a preferred stack boundary.
+ (libas_check_a_CFLAGS): Likewise.
+ * x86-64-exception-entry.S: New stub file.
+
+2009-01-16 Neal H. Walfield <neal@gnu.org>
+
* anonymous.h: Don't include <l4/thread.h>. Include
<viengoos/thread.h>.
(struct anonymous_pager): Change fill_thread's type to
diff --git a/libhurd-mm/Makefile.am b/libhurd-mm/Makefile.am
index 64dce7c..72619a7 100644
--- a/libhurd-mm/Makefile.am
+++ b/libhurd-mm/Makefile.am
@@ -21,6 +21,9 @@
if ARCH_IA32
ARCH_SOURCES = ia32-exception-entry.S
endif
+if ARCH_X86_64
+ ARCH_SOURCES = x86-64-exception-entry.S
+endif
if ENABLE_TESTS
lib_LIBRARIES = libas-check.a
@@ -33,7 +36,7 @@ includehurd_HEADERS = mm.h storage.h as.h
libhurd_mm_a_CPPFLAGS = $(USER_CPPFLAGS)
libhurd_mm_a_CCASFLAGS = $(USER_CPPFLAGS) -DASM
-libhurd_mm_a_CFLAGS = $(USER_CFLAGS) -mpreferred-stack-boundary=2
+libhurd_mm_a_CFLAGS = $(USER_CFLAGS) -mpreferred-stack-boundary=4
libhurd_mm_a_SOURCES = mm.h \
bits.h \
mm-init.c \
@@ -55,10 +58,10 @@ libhurd_mm_a_SOURCES = mm.h \
libas_kernel_a_CPPFLAGS = $(KERNEL_CPPFLAGS)
libas_kernel_a_CCASFLAGS = $(KERNEL_CPPFLAGS) -DASM
-libas_kernel_a_CFLAGS = $(KERNEL_CFLAGS) -mpreferred-stack-boundary=2
+libas_kernel_a_CFLAGS = $(KERNEL_CFLAGS)
libas_kernel_a_SOURCES = as.h bits.h as-build.c as-lookup.c as-dump.c
libas_check_a_CPPFLAGS = $(CHECK_CPPFLAGS) -DRM_INTERN
libas_check_a_CCASFLAGS = $(CHECK_CPPFLAGS) -DASM
-libas_check_a_CFLAGS = $(KERNEL_CFLAGS) -mpreferred-stack-boundary=2
+libas_check_a_CFLAGS = $(CHECK_CFLAGS)
libas_check_a_SOURCES = as.h bits.h as-build.c as-lookup.c as-dump.c
diff --git a/libhurd-mm/x86-64-exception-entry.S b/libhurd-mm/x86-64-exception-entry.S
new file mode 100644
index 0000000..85756e1
--- /dev/null
+++ b/libhurd-mm/x86-64-exception-entry.S
@@ -0,0 +1,7 @@
+ /* Handle an activation. */
+ .globl hurd_activation_handler_entry, _hurd_activation_handler_entry
+hurd_activation_handler_entry:
+_hurd_activation_handler_entry:
+ .global hurd_activation_handler_end, _hurd_activation_handler_end
+hurd_activation_handler_end:
+_hurd_activation_handler_end:
diff --git a/libpthread/ChangeLog b/libpthread/ChangeLog
index 93f7d23..2377b48 100644
--- a/libpthread/ChangeLog
+++ b/libpthread/ChangeLog
@@ -1,5 +1,13 @@
2009-01-16 Neal H. Walfield <neal@gnu.org>
+ * Makefile.am (arch) [ARCH_X86_64]: Define.
+ * sysdeps/x86_64/pt-machdep.h: New stub file.
+ * sysdeps/viengoos/x86_64/pt-machdep.c: Likewise.
+ * sysdeps/viengoos/x86_64/signal-dispatch-lowlevel.c: Likewise.
+ * sysdeps/viengoos/x86_64/pt-setup.c: Likewise.
+
+2009-01-16 Neal H. Walfield <neal@gnu.org>
+
* sysdeps/viengoos/pt-spin.c [USE_L4]: Only include <l4.h> in this
case.
(_pthread_spin_lock): Only implement exponential back off if a
diff --git a/libpthread/Makefile.am b/libpthread/Makefile.am
index 4e820de..e84d725 100644
--- a/libpthread/Makefile.am
+++ b/libpthread/Makefile.am
@@ -20,6 +20,9 @@
if ARCH_IA32
arch=ia32
endif
+if ARCH_X86_64
+ arch=x86_64
+endif
if ARCH_POWERPC
arch=powerpc
endif
diff --git a/libpthread/sysdeps/viengoos/x86_64/pt-machdep.c b/libpthread/sysdeps/viengoos/x86_64/pt-machdep.c
new file mode 100644
index 0000000..b5209c2
--- /dev/null
+++ b/libpthread/sysdeps/viengoos/x86_64/pt-machdep.c
@@ -0,0 +1,20 @@
+/* Machine dependent pthreads code. Hurd/x86_64 version.
+ Copyright (C) 2000 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 Library General Public License as
+ published by the Free Software Foundation; either version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* Nothing to do. */
diff --git a/libpthread/sysdeps/viengoos/x86_64/pt-setup.c b/libpthread/sysdeps/viengoos/x86_64/pt-setup.c
new file mode 100644
index 0000000..e6a2977
--- /dev/null
+++ b/libpthread/sysdeps/viengoos/x86_64/pt-setup.c
@@ -0,0 +1,45 @@
+/* Setup thread stack. Viengoos/x86_64 version.
+ Copyright (C) 2000, 2002, 2008, 2009 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 Library General Public License as
+ published by the Free Software Foundation; either version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <pt-internal.h>
+
+/* Set up the stack for THREAD, such that it appears as if
+ START_ROUTINE and ARG were passed to the new thread's entry-point.
+ Return the stack pointer for the new thread. We also take the
+ opportunity to install THREAD in our utcb. */
+static void *
+stack_setup (struct __pthread *thread,
+ void *(*start_routine)(void *), void *arg,
+ void (*entry_point)(void *(*)(void *), void *))
+{
+# warning Not ported to this architecture.
+ assert (0);
+ return 0;
+}
+
+int
+__pthread_setup (struct __pthread *thread,
+ void (*entry_point)(void *(*)(void *), void *),
+ void *(*start_routine)(void *), void *arg)
+{
+ thread->mcontext.pc = (void *) 0;
+ thread->mcontext.sp = (void *) stack_setup (thread, start_routine, arg,
+ entry_point);
+ return 0;
+}
diff --git a/libpthread/sysdeps/viengoos/x86_64/signal-dispatch-lowlevel.c b/libpthread/sysdeps/viengoos/x86_64/signal-dispatch-lowlevel.c
new file mode 100644
index 0000000..a196faf
--- /dev/null
+++ b/libpthread/sysdeps/viengoos/x86_64/signal-dispatch-lowlevel.c
@@ -0,0 +1,32 @@
+/* signal-dispatch-lowlevel.c - x86_64 specific signal handling functions.
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ Written by Neal H. Walfield <neal@gnu.org>.
+
+ This file is part of the GNU Hurd.
+
+ The GNU Hurd 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 3 of
+ the License, or (at your option) any later version.
+
+ The GNU Hurd 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 this program. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <pt-internal.h>
+#include <sig-internal.h>
+
+void
+signal_dispatch_lowlevel (struct signal_state *ss, pthread_t tid,
+ siginfo_t si)
+{
+ assert (pthread_mutex_trylock (&ss->lock) == EBUSY);
+
+#warning Not ported to this architecture.
+ assert (0);
+}
diff --git a/libpthread/sysdeps/x86_64/pt-machdep.h b/libpthread/sysdeps/x86_64/pt-machdep.h
new file mode 100644
index 0000000..53424a6
--- /dev/null
+++ b/libpthread/sysdeps/x86_64/pt-machdep.h
@@ -0,0 +1,29 @@
+/* Machine dependent pthreads internal defenitions. x86_64 version.
+ Copyright (C) 2000, 2009 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 Library General Public License as
+ published by the Free Software Foundation; either version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _PT_MACHDEP_H
+#define _PT_MACHDEP_H 1
+
+struct pthread_mcontext
+{
+ void *pc;
+ void *sp;
+};
+
+#endif /* pt-machdep.h */