diff options
Diffstat (limited to 'sysdeps/i386')
-rw-r--r-- | sysdeps/i386/dl-machine.h | 8 | ||||
-rw-r--r-- | sysdeps/i386/elf/start.S | 7 | ||||
-rw-r--r-- | sysdeps/i386/setjmp.S | 8 | ||||
-rw-r--r-- | sysdeps/i386/sys/ucontext.h | 120 |
4 files changed, 140 insertions, 3 deletions
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index 0ac67c05d9..c347a515a4 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -290,6 +290,14 @@ elf_machine_fixup_plt (struct link_map *map, const Elf32_Rel *reloc, *reloc_addr = value; } +/* Return the final value of a plt relocation. */ +static inline Elf32_Addr +elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc, + Elf32_Addr value) +{ + return value; +} + #endif /* !dl_machine_h */ #ifdef RESOLVE diff --git a/sysdeps/i386/elf/start.S b/sysdeps/i386/elf/start.S index 706e5c963f..7416c0ace9 100644 --- a/sysdeps/i386/elf/start.S +++ b/sysdeps/i386/elf/start.S @@ -94,6 +94,13 @@ _start: call exit hlt /* Crash if somehow `exit' does return. */ +/* To fulfill the System V/i386 ABI we need this symbol. Yuck, it's so + meaningless since we don't support machines < 80386. */ + .section .rodata + .globl _fp_hw + .long 3 + .size _fp_hw, 4 + /* Define a symbol for the first piece of initialized data. */ .data .globl __data_start diff --git a/sysdeps/i386/setjmp.S b/sysdeps/i386/setjmp.S index 1ba3fc5a75..598eef78e7 100644 --- a/sysdeps/i386/setjmp.S +++ b/sysdeps/i386/setjmp.S @@ -20,6 +20,7 @@ #include <sysdep.h> #define _ASM #include <bits/setjmp.h> +#include <asm-syntax.h> /* Binary compatibility entry point. */ ENTRY (__setjmp) @@ -47,9 +48,10 @@ ENTRY (__sigsetjmp) we can't save and restore our caller's value. Instead, we do an indirect jump through the GOT, using for the temporary register %ecx, which is call-clobbered. */ - call here -here: popl %ecx - addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx + call L(here) +L(here): + popl %ecx + addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ecx movl C_SYMBOL_NAME(__sigjmp_save@GOT)(%ecx), %ecx jmp *%ecx #else diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h new file mode 100644 index 0000000000..17b6b6c76b --- /dev/null +++ b/sysdeps/i386/sys/ucontext.h @@ -0,0 +1,120 @@ +/* Copyright (C) 1997 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. */ + +/* System V/i386 ABI compliant context switching support. */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> + +/* Type for general register. */ +typedef int greg_t; + +/* Number of general registers. */ +#define NGREG 19 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NGREG]; + +/* Number of each register is the `gregset_t' array. */ +enum +{ + GS = 0, +#define GS GS + FS, +#define FS FS + ES, +#define ES ES + DS, +#define DS DS + EDI +#define EDI EDI + ESI +#define ESI ESI + EBP, +#define EBP EBP + ESP, +#define ESP ESP + EBX, +#define EBX EBX + EDX, +#define EDX EDX + ECX, +#define ECX ECX + EAX, +#define EAX EAX + TRAPNO, +#define TRAPNO TRAPNO + ERR, +#define ERR ERR + EIP, +#define EIP EIP + CS, +#define CS CS + EFL, +#define EFL EFL + UESP, +#define UESP UESP + SS +#define SS SS +}; + +/* Structure to describe FPU registers. */ +typedef struct fpregset + { + union + { + struct fpchip_state + { + int state[27]; + int status; + } fpchip_state; + + struct fp_emul_space + { + char fp_emul[246]; + char fp_epad[2]; + } fp_emul_space; + + int f_fpregs[62]; + } fp_reg_set; + + long int f_wregs[33]; + } fpregset_t; + +/* Context to describe whole processor state. */ +typedef struct + { + gregset_t gregs; + fpregset_t fpregs; + } mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext + { + unsigned long int uc_flags; + struct ucontext *uc_links; + __sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; + long int uc_filler[5]; + } ucontext_t; + +#endif /* sys/ucontext.h */ |