From b3a3914c28f82be42610b4940e30facd84fb9c21 Mon Sep 17 00:00:00 2001 From: "Neal H. Walfield" Date: Fri, 16 Jan 2009 22:30:14 +0100 Subject: Add initial support for x86-64 to run-time libraries. libc-parts/ 2009-01-16 Neal H. Walfield * 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 * 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 * 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. --- libc-parts/ChangeLog | 5 ++ libc-parts/Makefile.am | 6 ++ libc-parts/x86-64-crt0.S | 65 ++++++++++++++++++++++ libhurd-mm/ChangeLog | 9 +++ libhurd-mm/Makefile.am | 9 ++- libhurd-mm/x86-64-exception-entry.S | 7 +++ libpthread/ChangeLog | 8 +++ libpthread/Makefile.am | 3 + libpthread/sysdeps/viengoos/x86_64/pt-machdep.c | 20 +++++++ libpthread/sysdeps/viengoos/x86_64/pt-setup.c | 45 +++++++++++++++ .../viengoos/x86_64/signal-dispatch-lowlevel.c | 32 +++++++++++ libpthread/sysdeps/x86_64/pt-machdep.h | 29 ++++++++++ 12 files changed, 235 insertions(+), 3 deletions(-) create mode 100644 libc-parts/x86-64-crt0.S create mode 100644 libhurd-mm/x86-64-exception-entry.S create mode 100644 libpthread/sysdeps/viengoos/x86_64/pt-machdep.c create mode 100644 libpthread/sysdeps/viengoos/x86_64/pt-setup.c create mode 100644 libpthread/sysdeps/viengoos/x86_64/signal-dispatch-lowlevel.c create mode 100644 libpthread/sysdeps/x86_64/pt-machdep.h 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 + * 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 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,3 +1,12 @@ +2009-01-16 Neal H. Walfield + + * 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 * anonymous.h: Don't include . Include 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,3 +1,11 @@ +2009-01-16 Neal H. Walfield + + * 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 * sysdeps/viengoos/pt-spin.c [USE_L4]: Only include in this 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 + +/* 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 . + + 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 + . */ + +#include +#include + +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 */ -- cgit v1.2.3