summary refs log tree commit diff
path: root/ports/sysdeps/am33
diff options
context:
space:
mode:
Diffstat (limited to 'ports/sysdeps/am33')
-rw-r--r--ports/sysdeps/am33/Implies3
-rw-r--r--ports/sysdeps/am33/__longjmp.S60
-rw-r--r--ports/sysdeps/am33/atomicity.h86
-rw-r--r--ports/sysdeps/am33/bits/endian.h7
-rw-r--r--ports/sysdeps/am33/bits/setjmp.h26
-rw-r--r--ports/sysdeps/am33/bsd-_setjmp.S1
-rw-r--r--ports/sysdeps/am33/bsd-setjmp.S1
-rw-r--r--ports/sysdeps/am33/dl-machine.h481
-rw-r--r--ports/sysdeps/am33/elf/start.S80
-rw-r--r--ports/sysdeps/am33/fpu/bits/fenv.h66
-rw-r--r--ports/sysdeps/am33/fpu/fclrexcpt.c51
-rw-r--r--ports/sysdeps/am33/fpu/fedisblxcpt.c41
-rw-r--r--ports/sysdeps/am33/fpu/feenablxcpt.c41
-rw-r--r--ports/sysdeps/am33/fpu/fegetenv.c34
-rw-r--r--ports/sysdeps/am33/fpu/fegetexcept.c34
-rw-r--r--ports/sysdeps/am33/fpu/fegetround.c34
-rw-r--r--ports/sysdeps/am33/fpu/feholdexcpt.c38
-rw-r--r--ports/sysdeps/am33/fpu/fenv_libc.h32
-rw-r--r--ports/sysdeps/am33/fpu/fesetenv.c59
-rw-r--r--ports/sysdeps/am33/fpu/fesetround.c28
-rw-r--r--ports/sysdeps/am33/fpu/feupdateenv.c46
-rw-r--r--ports/sysdeps/am33/fpu/fgetexcptflg.c43
-rw-r--r--ports/sysdeps/am33/fpu/fpu_control.h74
-rw-r--r--ports/sysdeps/am33/fpu/fraiseexcpt.c78
-rw-r--r--ports/sysdeps/am33/fpu/fsetexcptflg.c56
-rw-r--r--ports/sysdeps/am33/fpu/ftestexcept.c33
-rw-r--r--ports/sysdeps/am33/jmpbuf-offsets.h19
-rw-r--r--ports/sysdeps/am33/jmpbuf-unwind.h25
-rw-r--r--ports/sysdeps/am33/linuxthreads/pspinlock.c73
-rw-r--r--ports/sysdeps/am33/linuxthreads/pt-machine.h67
-rw-r--r--ports/sysdeps/am33/memusage.h22
-rw-r--r--ports/sysdeps/am33/preconfigure5
-rw-r--r--ports/sysdeps/am33/setjmp.S79
-rw-r--r--ports/sysdeps/am33/shlib-versions1
-rw-r--r--ports/sysdeps/am33/stackinfo.h27
-rw-r--r--ports/sysdeps/am33/sys/ucontext.h122
-rw-r--r--ports/sysdeps/am33/sysdep.h81
37 files changed, 2054 insertions, 0 deletions
diff --git a/ports/sysdeps/am33/Implies b/ports/sysdeps/am33/Implies
new file mode 100644
index 0000000000..780c4e2467
--- /dev/null
+++ b/ports/sysdeps/am33/Implies
@@ -0,0 +1,3 @@
+wordsize-32
+ieee754/flt-32
+ieee754/dbl-64
diff --git a/ports/sysdeps/am33/__longjmp.S b/ports/sysdeps/am33/__longjmp.S
new file mode 100644
index 0000000000..1d6c29e99f
--- /dev/null
+++ b/ports/sysdeps/am33/__longjmp.S
@@ -0,0 +1,60 @@
+/* longjmp for AM33.
+   Copyright 2001 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+#include <asm-syntax.h>
+
+ENTRY (__longjmp)
+	mov d0,a0
+	mov (8,a0),d2
+	mov d2,mdr
+	mov (0,a0),d2
+	mov (4,a0),d3
+	mov (12,a0),a2
+	mov (16,a0),a3
+	mov (20,a0),a1
+	mov a1,sp
+	add 24,a0
+	mov (a0+),r4
+	mov (a0+),r5
+	mov (a0+),r6
+	mov (a0+),r7
+#ifdef __AM33_2__
+	fmov (a0+),fs4
+	fmov (a0+),fs5
+	fmov (a0+),fs6
+	fmov (a0+),fs7
+	fmov (a0+),fs8
+	fmov (a0+),fs9
+	fmov (a0+),fs10
+	fmov (a0+),fs11
+	fmov (a0+),fs12
+	fmov (a0+),fs13
+	fmov (a0+),fs14
+	fmov (a0+),fs15
+	fmov (a0+),fs16
+	fmov (a0+),fs17
+	fmov (a0+),fs18
+	fmov (a0+),fs19
+#endif
+	mov d1,d0
+	retf [],0
+END (__longjmp)
diff --git a/ports/sysdeps/am33/atomicity.h b/ports/sysdeps/am33/atomicity.h
new file mode 100644
index 0000000000..b0ba43db4b
--- /dev/null
+++ b/ports/sysdeps/am33/atomicity.h
@@ -0,0 +1,86 @@
+/* Low-level functions for atomic operations.  AM33 version.
+   Copyright 1999, 2001 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>.
+   Based on ../sparc/sparc32/atomicity.h
+
+   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.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _ATOMICITY_H
+#define _ATOMICITY_H	1
+
+#include <inttypes.h>
+
+#define __acquire_lock(lock) \
+  __asm__ __volatile__("1:	bset	%1, (%0)\n\t"		\
+		       "	beq	1b"			\
+		       : : "a" (&(lock)), "d" (1)		\
+		       : "memory")
+
+#define __release_lock(lock) lock = 0
+
+static int
+__attribute__ ((unused))
+exchange_and_add (volatile uint32_t *mem, int val)
+{
+  static unsigned char lock;
+  int result;
+
+  __acquire_lock (lock);
+
+  result = *mem;
+  *mem += val;
+
+  __release_lock (lock);
+
+  return result;
+}
+
+static void
+__attribute__ ((unused))
+atomic_add (volatile uint32_t *mem, int val)
+{
+  static unsigned char lock;
+
+  __acquire_lock (lock);
+
+  *mem += val;
+
+  __release_lock (lock);
+}
+
+static int
+__attribute__ ((unused))
+compare_and_swap (volatile long int *p, long int oldval, long int newval)
+{
+  static unsigned char lock;
+  int ret;
+
+  __acquire_lock (lock);
+
+  if (*p != oldval)
+    ret = 0;
+  else
+    {
+      *p = newval;
+      ret = 1;
+    }
+
+  __release_lock (lock);
+
+  return ret;
+}
+
+#endif /* atomicity.h */
diff --git a/ports/sysdeps/am33/bits/endian.h b/ports/sysdeps/am33/bits/endian.h
new file mode 100644
index 0000000000..7423f09570
--- /dev/null
+++ b/ports/sysdeps/am33/bits/endian.h
@@ -0,0 +1,7 @@
+/* AM33 is little-endian.  */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#define __BYTE_ORDER __LITTLE_ENDIAN
diff --git a/ports/sysdeps/am33/bits/setjmp.h b/ports/sysdeps/am33/bits/setjmp.h
new file mode 100644
index 0000000000..6dd87cb655
--- /dev/null
+++ b/ports/sysdeps/am33/bits/setjmp.h
@@ -0,0 +1,26 @@
+/* Copyright 2001 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Define the machine-dependent type `jmp_buf'.  AM33 version. */
+
+#ifndef _SETJMP_H
+# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+#endif
+
+#ifndef _ASM
+typedef int __jmp_buf[26];
+#endif
diff --git a/ports/sysdeps/am33/bsd-_setjmp.S b/ports/sysdeps/am33/bsd-_setjmp.S
new file mode 100644
index 0000000000..9bbfcbbba7
--- /dev/null
+++ b/ports/sysdeps/am33/bsd-_setjmp.S
@@ -0,0 +1 @@
+/* _setjmp is in setjmp.S */
diff --git a/ports/sysdeps/am33/bsd-setjmp.S b/ports/sysdeps/am33/bsd-setjmp.S
new file mode 100644
index 0000000000..b6b239e67d
--- /dev/null
+++ b/ports/sysdeps/am33/bsd-setjmp.S
@@ -0,0 +1 @@
+/* setjmp is in setjmp.S */
diff --git a/ports/sysdeps/am33/dl-machine.h b/ports/sysdeps/am33/dl-machine.h
new file mode 100644
index 0000000000..52278c0a4e
--- /dev/null
+++ b/ports/sysdeps/am33/dl-machine.h
@@ -0,0 +1,481 @@
+/* Machine-dependent ELF dynamic relocation inline functions.  AM33 version.
+   Copyright (C) 1995,96,97,98,99,2000,2001, 2004, 2011
+   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.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef dl_machine_h
+#define dl_machine_h
+
+#define ELF_MACHINE_NAME "mn10300"
+
+#include <sys/param.h>
+
+/* Return nonzero iff ELF header is compatible with the running host.  */
+static inline int __attribute__ ((unused))
+elf_machine_matches_host (const Elf32_Ehdr *ehdr)
+{
+  return ehdr->e_machine == EM_MN10300;
+}
+
+
+/* Return the link-time address of _DYNAMIC.  Conveniently, this is the
+   first element of the GOT.  This must be inlined in a function which
+   uses global data.  */
+static inline Elf32_Addr __attribute__ ((unused))
+elf_machine_dynamic (void)
+{
+  register Elf32_Addr *got asm ("a2");
+  return *got;
+}
+
+
+/* Return the run-time load address of the shared object.  */
+static inline Elf32_Addr __attribute__ ((unused))
+elf_machine_load_address (void)
+{
+  register Elf32_Addr gotaddr asm ("a2");
+  Elf32_Addr off, gotval;
+
+  asm ("mov _dl_start@GOTOFF,%0" : "=r" (off));
+  asm ("mov (_dl_start@GOT,%1),%0" : "=r" (gotval) : "r" (gotaddr));
+
+  return off + gotaddr - gotval;
+}
+
+#if !defined PROF && !__BOUNDED_POINTERS__
+/* We add a declaration of this function here so that in dl-runtime.c
+   the ELF_MACHINE_RUNTIME_TRAMPOLINE macro really can pass the parameters
+   in registers.
+
+   We cannot use this scheme for profiling because the _mcount call
+   destroys the passed register information.  */
+/* GKM FIXME: Fix trampoline to pass bounds so we can do
+   without the `__unbounded' qualifier.  */
+static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset)
+     __attribute__ ((unused));
+static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset,
+				 ElfW(Addr) retaddr)
+     __attribute__ ((unused));
+#endif
+
+/* Set up the loaded object described by L so its unrelocated PLT
+   entries will jump to the on-demand fixup code in dl-runtime.c.  */
+
+static inline int __attribute__ ((unused))
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+  Elf32_Addr *got;
+  extern void _dl_runtime_resolve (Elf32_Word) attribute_hidden;
+  extern void _dl_runtime_profile (Elf32_Word) attribute_hidden;
+
+  if (l->l_info[DT_JMPREL] && lazy)
+    {
+      /* The GOT entries for functions in the PLT have not yet been filled
+	 in.  Their initial contents will arrange when called to push an
+	 offset into the .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1],
+	 and then jump to _GLOBAL_OFFSET_TABLE[2].  */
+      got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
+      got[1] = (Elf32_Addr) l;	/* Identify this shared object.  */
+
+      /* The got[2] entry contains the address of a function which gets
+	 called to get the address of a so far unresolved function and
+	 jump to it.  The profiling extension of the dynamic linker allows
+	 to intercept the calls to collect information.  In this case we
+	 don't store the address in the GOT so that all future calls also
+	 end in this function.  */
+      if (__builtin_expect (profile, 0))
+	{
+	  got[2] = (Elf32_Addr) &_dl_runtime_profile;
+
+	  if (_dl_name_match_p (GLRO(dl_profile), l))
+	    /* This is the object we are looking for.  Say that we really
+	       want profiling and the timers are started.  */
+	    GL(dl_profile_map) = l;
+	}
+      else
+	/* This function will get called to fix up the GOT entry indicated by
+	   the offset on the stack, and then jump to the resolved address.  */
+	got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+    }
+
+  return lazy;
+}
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+   and then redirect to the address it returns.  */
+#if !defined PROF && !__BOUNDED_POINTERS__
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+	.text\n\
+	.globl _dl_runtime_resolve\n\
+	.type _dl_runtime_resolve, @function\n\
+_dl_runtime_resolve:\n\
+	add -12,sp		# Preserve registers otherwise clobbered.\n\
+	mov d1,(20,sp)\n\
+	mov d0,(16,sp)\n\
+	mov r1,d0\n\
+	mov r0,d1\n\
+	call fixup,[],0		# Call resolver.\n\
+	mov d0,a0\n\
+	mov (12,sp),d1		# Copy return address back to mdr,\n\
+	mov d1,mdr		# in case the callee returns with retf\n\
+	mov (16,sp),d0		# Get register content back.\n\
+	mov (20,sp),d1\n\
+	add 12,sp\n\
+	jmp (a0)\n\
+	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
+\n\
+	.globl _dl_runtime_profile\n\
+	.type _dl_runtime_profile, @function\n\
+_dl_runtime_profile:\n\
+	add -12,sp		# Preserve registers otherwise clobbered.\n\
+	mov d1,(20,sp)\n\
+	mov d0,(16,sp)\n\
+	mov r1,d0\n\
+	mov r0,d1\n\
+	call profile_fixup,[],0		# Call resolver.\n\
+	mov d0,a0\n\
+	mov (12,sp),d1		# Copy return address back to mdr,\n\
+	mov d1,mdr		# in case the callee returns with retf\n\
+	mov (16,sp),d0		# Get register content back.\n\
+	mov (20,sp),d1\n\
+	add 12,sp\n\
+	jmp (a0)\n\
+	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
+	.previous\n\
+");
+#else
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
+	.text\n\
+	.globl _dl_runtime_resolve\n\
+	.globl _dl_runtime_profile\n\
+	.type _dl_runtime_resolve, @function\n\
+	.type _dl_runtime_profile, @function\n\
+_dl_runtime_resolve:\n\
+_dl_runtime_profile:\n\
+	add -12,sp		# Preserve registers otherwise clobbered.\n\
+	mov d1,(20,sp)\n\
+	mov d0,(16,sp)\n\
+	mov r1,d0\n\
+	mov r0,d1\n\
+	call profile_fixup,[],0		# Call resolver.\n\
+	mov d0,a0\n\
+	mov (12,sp),d1		# Copy return address back to mdr,\n\
+	mov d1,mdr		# in case the callee returns with retf\n\
+	mov (16,sp),d0		# Get register content back.\n\
+	mov (20,sp),d1\n\
+	add 12,sp\n\
+	jmp (a0)\n\
+	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
+	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
+	.previous\n\
+");
+#endif
+
+/* Mask identifying addresses reserved for the user program,
+   where the dynamic linker should not map anything.  */
+#define ELF_MACHINE_USER_ADDRESS_MASK	0xf8000000UL
+
+/* Initial entry point code for the dynamic linker.
+   The C function `_dl_start' is the real entry point;
+   its return value is the user program's entry point.  */
+#define RTLD_START asm ("\n\
+	.text\n\
+.globl _start\n\
+.globl _dl_start_user\n\
+_start:\n\
+	mov 0,a3	# Mark the top of the stack\n\
+	mov sp,a1\n\
+	add -20,sp	# Prepare for function call\n\
+	mov a1,d0\n\
+	call _dl_start,[],0\n\
+_dl_start_user:\n\
+	# Save the user entry point address in d2.\n\
+	mov d0,d2\n\
+	# Point a2 at the GOT.\n\
+0:	mov pc,a2\n\
+	add _GLOBAL_OFFSET_TABLE_ - (0b-.),a2\n\
+	# Store the highest stack address\n\
+	mov (__libc_stack_end@GOT,a2),a0\n\
+	mov a1,(a0)\n\
+	# See if we were run as a command with the executable file\n\
+	# name as an extra leading argument.\n\
+	mov (_dl_skip_args@GOT,a2),a0\n\
+	mov (a0),d0\n\
+	# Pop the original argument count.\n\
+	mov (20,sp),d3\n\
+	# Subtract _dl_skip_args from it.\n\
+	sub d0,d3\n\
+	# Adjust the stack pointer to skip _dl_skip_args words.\n\
+	asl2 d0\n\
+	mov sp,a0\n\
+	add d0,a0\n\
+	mov a0,sp\n\
+	# Push argc back on the stack.\n\
+	mov d3,(20,sp)\n\
+	# The special initializer gets called with the stack just\n\
+	# as the application's entry point will see it; it can\n\
+	# switch stacks if it moves these contents over.\n\
+" RTLD_START_SPECIAL_INIT "\n\
+	# Load the parameters again.\n\
+	# (d0, d1, (12,sp), (16,sp)) = (_dl_loaded, argc, argv, envp)\n\
+	add 24,a0\n\
+	mov a0,(12,sp)	# a0 is 24+sp\n\
+	mov d3,d1	# d3 contained argc\n\
+	inc d3\n\
+	asl2 d3		# d3 is now (argc+1)*4,\n\
+	add d3,a0	# the offset between argv and envp\n\
+	mov a0,(16,sp)\n\
+	mov (_rtld_local@GOTOFF,a2),d0\n\
+	# Call the function to run the initializers.\n\
+	call _dl_init@PLT,[],0\n\
+	# Pass our finalizer function to the user in d0, as per ELF ABI.\n\
+	mov (_dl_fini@GOT,a2),d0\n\
+	add 20,sp\n\
+	# Jump to the user's entry point.\n\
+	mov d2,a1\n\
+	jmp (a1)\n\
+	.previous\n\
+");
+
+#ifndef RTLD_START_SPECIAL_INIT
+#define RTLD_START_SPECIAL_INIT /* nothing */
+#endif
+
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_MN10300_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)	\
+   | (((type) == R_MN10300_COPY) * ELF_RTYPE_CLASS_COPY))
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
+#define ELF_MACHINE_JMP_SLOT	R_MN10300_JMP_SLOT
+
+static inline Elf32_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+		       const Elf32_Rela *reloc,
+		       Elf32_Addr *reloc_addr, Elf32_Addr value)
+{
+  return *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_Rela *reloc,
+		       Elf32_Addr value)
+{
+  return value + reloc->r_addend;
+}
+
+#endif /* !dl_machine_h */
+
+#ifdef RESOLVE
+
+/* The mn10300 never uses Elf32_Rel relocations.  */
+#define ELF_MACHINE_NO_REL 1
+
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+   MAP is the object containing the reloc.  */
+
+static inline void
+elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+		  const Elf32_Sym *sym, const struct r_found_version *version,
+		  void *const reloc_addr_arg, int skip_ifunc)
+{
+  const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
+  Elf32_Addr value, *reloc_addr;
+
+  /* Make sure we drop any previous alignment assumptions.  */
+  asm ("" : "=r" (reloc_addr) : "0" (reloc_addr_arg));
+
+#define COPY_UNALIGNED_WORD(sw, tw, align) \
+  { \
+    unsigned long *__sl = (void*)&(sw), *__tl = (void*)&(tw); \
+    unsigned short *__ss = (void*)&(sw), *__ts = (void*)&(tw); \
+    unsigned char *__sc = (void*)&(sw), *__tc = (void*)&(tw); \
+    switch ((align)) \
+    { \
+    case 0: \
+      *__tl = *__sl; \
+      break; \
+    case 2: \
+      *__ts++ = *__ss++; \
+      *__ts = *__ss; \
+      break; \
+    default: \
+      *__tc++ = *__sc++; \
+      *__tc++ = *__sc++; \
+      *__tc++ = *__sc++; \
+      *__tc = *__sc; \
+      break; \
+    } \
+  }
+
+#define COPY_UNALIGNED_HALFWORD(sw, tw, align) \
+  { \
+    unsigned short *__ss = (void*)&(sw), *__ts = (void*)&(tw); \
+    unsigned char *__sc = (void*)&(sw), *__tc = (void*)&(tw); \
+    switch ((align)) \
+    { \
+    case 0: \
+      *__ts = *__ss; \
+      break; \
+    default: \
+      *__tc++ = *__sc++; \
+      *__tc = *__sc; \
+      break; \
+    } \
+  }
+
+#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
+  if (__builtin_expect (r_type == R_MN10300_RELATIVE, 0))
+    {
+# if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
+      /* This is defined in rtld.c, but nowhere in the static libc.a;
+	 make the reference weak so static programs can still link.
+	 This declaration cannot be done when compiling rtld.c (i.e.
+	 #ifdef RTLD_BOOTSTRAP) because rtld.c contains the common
+	 defn for _dl_rtld_map, which is incompatible with a weak decl
+	 in the same file.  */
+      weak_extern (_dl_rtld_map);
+      if (map != &_dl_rtld_map) /* Already done in rtld itself. */
+# endif
+	{
+	  COPY_UNALIGNED_WORD (*reloc_addr, value, (int) reloc_addr & 3);
+	  value += map->l_addr;
+	  COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3);
+	}
+    }
+# ifndef RTLD_BOOTSTRAP
+  else if (__builtin_expect (r_type == R_MN10300_NONE, 0))
+    return;
+# endif
+  else
+#endif
+    {
+#ifndef RTLD_BOOTSTRAP
+      const Elf32_Sym *const refsym = sym;
+#endif
+
+      value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
+      if (sym)
+	value += sym->st_value;
+      value += reloc->r_addend;	/* Assume copy relocs have zero addend.  */
+
+      switch (r_type)
+	{
+#ifndef RTLD_BOOTSTRAP
+	case R_MN10300_COPY:
+	  if (sym == NULL)
+	    /* This can happen in trace mode if an object could not be
+	       found.  */
+	    break;
+	  if (sym->st_size > refsym->st_size
+	      || (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
+	    {
+	      extern char **_dl_argv;
+	      const char *strtab;
+
+	      strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+	      _dl_error_printf ("\
+%s: Symbol `%s' has different size in shared object, consider re-linking\n",
+				_dl_argv[0] ?: "<program name unknown>",
+				strtab + refsym->st_name);
+	    }
+	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
+						   refsym->st_size));
+	  break;
+#endif
+	case R_MN10300_GLOB_DAT:
+	case R_MN10300_JMP_SLOT:
+	  /* These addresses are always aligned.  */
+	  *reloc_addr = value;
+	  break;
+	case R_MN10300_32:
+	  COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3);
+	  break;
+#ifndef RTLD_BOOTSTRAP
+	case R_MN10300_16:
+	  COPY_UNALIGNED_HALFWORD (value, *reloc_addr, (int) reloc_addr & 1);
+	  break;
+	case R_MN10300_8:
+	  *(char *) reloc_addr = value;
+	  break;
+	case R_MN10300_PCREL32:
+	  value -= (Elf32_Addr) reloc_addr;
+	  COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3);
+	  break;
+	case R_MN10300_PCREL16:
+	  value -= (Elf32_Addr) reloc_addr;
+	  COPY_UNALIGNED_HALFWORD (value, *reloc_addr, (int) reloc_addr & 1);
+	  break;
+	case R_MN10300_PCREL8:
+	  value -= (Elf32_Addr) reloc_addr;
+	  *(char *) reloc_addr = (value - (Elf32_Addr) reloc_addr);
+	  break;
+#endif
+	case R_MN10300_NONE:		/* Alright, Wilbur.  */
+	  break;
+#if !defined RTLD_BOOTSTRAP || defined _NDEBUG
+	default:
+	  _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
+	  break;
+#endif
+	}
+
+    }
+}
+
+static inline void
+elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+			   void *const reloc_addr_arg)
+{
+  Elf32_Addr value, *reloc_addr;
+
+  asm ("" : "=r" (reloc_addr) : "0" (reloc_addr_arg));
+
+  COPY_UNALIGNED_WORD (*reloc_addr, value, (int)reloc_addr & 3);
+  value += l_addr;
+  COPY_UNALIGNED_WORD (value, *reloc_addr, (int)reloc_addr & 3);
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map,
+		      Elf32_Addr l_addr, const Elf32_Rela *reloc,
+		      int skip_ifunc)
+{
+  unsigned long int const r_type = ELF32_R_TYPE (reloc->r_info);
+
+  /* Check for unexpected PLT reloc type.  */
+  if (__builtin_expect (r_type, R_MN10300_JMP_SLOT) == R_MN10300_JMP_SLOT)
+    {
+      Elf32_Addr* const reloc_addr = (void *)(l_addr + reloc->r_offset);
+      Elf32_Addr value;
+
+      /* Perform a RELATIVE reloc on the .got entry that transfers
+	 to the .plt.  */
+      COPY_UNALIGNED_WORD (*reloc_addr, value, (int)reloc_addr & 3);
+      value += l_addr;
+      COPY_UNALIGNED_WORD (value, *reloc_addr, (int)reloc_addr & 3);
+    }
+  else if (__builtin_expect (r_type, R_MN10300_NONE) != R_MN10300_NONE)
+    _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
+
+}
+
+#endif /* RESOLVE */
diff --git a/ports/sysdeps/am33/elf/start.S b/ports/sysdeps/am33/elf/start.S
new file mode 100644
index 0000000000..518e75e478
--- /dev/null
+++ b/ports/sysdeps/am33/elf/start.S
@@ -0,0 +1,80 @@
+/* Startup code compliant to the ELF MN10300 ABI.
+   Copyright (C) 1995,1996,1997,1998,2000,2001 Free Software Foundation, Inc.
+   Contributed by Alexandre Oliva  <aoliva@redhat.com>
+   Based on ../../i386/elf/start.S.
+   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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This is the canonical entry point, usually the first thing in the text
+   segment.  The SVR4/i386 ABI (pages 3-31, 3-32) says that when the entry
+   point runs, most registers' values are unspecified, except for:
+
+   a0		Contains a function pointer to be registered with `atexit'.
+		This is how the dynamic linker arranges to have DT_FINI
+		functions called for shared libraries that have been loaded
+		before this code runs.
+
+   sp		The stack contains the arguments and environment:
+		(4,sp)			argc
+		(8,sp)			argv[0]
+		...
+		(4*(argc+1),sp)		NULL
+		(4*(argc+2),sp)		envp[0]
+		...
+					NULL
+*/
+
+#include "bp-sym.h"
+
+	.text
+	.globl _start
+	.type _start,@function
+_start:
+	/* Extract the arguments as encoded on the stack and set up
+	   the arguments for `main': argc, argv.  envp will be determined
+	   later in __libc_start_main.  */
+	mov sp,a3
+	add -32,sp
+	
+	mov a3,(28,sp)		/* stack_end.  */	
+	mov d0,(24,sp)		/* rtld_fini.  */
+	mov _fini, d3
+	mov d3,(20,sp)		/* fini.  */
+	mov _init, d2
+	mov d2,(16,sp)		/* init.  */
+	inc4 a3
+	mov a3,(12,sp)		/* argv.  */
+	
+	/* Set the initial frame pointer as 0, so that the bottom of
+	   the stack is clearly marked.  */
+	mov 0,a3
+
+	mov (32,sp), d1		/* argc.  */
+	mov BP_SYM (main), d0	/* main.  */
+
+	/* Call the user's main function, and exit with its value.
+	   But let the libc call main.    */
+	call BP_SYM (__libc_start_main),[],0
+
+	call BP_SYM (abort),[],0 /* Crash if somehow `exit' does return.  */
+
+/* Define a symbol for the first piece of initialized data.  */
+	.data
+	.globl __data_start
+__data_start:
+	.long 0
+	.weak data_start
+	data_start = __data_start
diff --git a/ports/sysdeps/am33/fpu/bits/fenv.h b/ports/sysdeps/am33/fpu/bits/fenv.h
new file mode 100644
index 0000000000..d3a89982bf
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/bits/fenv.h
@@ -0,0 +1,66 @@
+/* Copyright (C) 1998, 1999, 2000, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on the corresponding file in the mips port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _FENV_H
+# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
+#endif
+
+
+/* Define bits representing the exception.  We use the EF bit
+   positions of the appropriate bits in the FPCR register.  */
+enum
+  {
+    FE_INEXACT = 0x01,
+#define FE_INEXACT	FE_INEXACT
+    FE_UNDERFLOW = 0x02,
+#define FE_UNDERFLOW	FE_UNDERFLOW
+    FE_OVERFLOW = 0x04,
+#define FE_OVERFLOW	FE_OVERFLOW
+    FE_DIVBYZERO = 0x08,
+#define FE_DIVBYZERO	FE_DIVBYZERO
+    FE_INVALID = 0x10,
+#define FE_INVALID	FE_INVALID
+  };
+
+#define FE_ALL_EXCEPT \
+	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
+
+/* The AM33/2.0 FPU supports only Round to nearest.  Bits 3<<16 are
+   reserved to represent other rounding modes.  */
+enum
+  {
+    FE_TONEAREST = 0x00000,
+#define FE_TONEAREST	FE_TONEAREST
+  };
+
+
+/* Type representing exception flags.  */
+typedef unsigned int fexcept_t;
+
+
+/* Type representing floating-point environment.  */
+typedef unsigned int fenv_t;
+
+/* If the default argument is used we use this value.  */
+#define FE_DFL_ENV	((__const fenv_t *) -1)
+
+#ifdef __USE_GNU
+/* Floating-point environment where none of the exception is masked.  */
+# define FE_NOMASK_ENV  ((__const fenv_t *) -2)
+#endif
diff --git a/ports/sysdeps/am33/fpu/fclrexcpt.c b/ports/sysdeps/am33/fpu/fclrexcpt.c
new file mode 100644
index 0000000000..2b15f45a63
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fclrexcpt.c
@@ -0,0 +1,51 @@
+/* Clear given exceptions in current floating-point environment.
+   Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+#include <shlib-compat.h>
+
+int
+__feclearexcept (int excepts)
+{
+  fpu_control_t cw;
+
+  /* Mask out unsupported bits/exceptions.  */
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Read the complete control word.  */
+  _FPU_GETCW (cw);
+
+  /* Clear exception flag bits and cause bits.  EF bits are cleared by
+     assigning 1 to them (and there's no way to set them); other bits
+     are copied normally.  */
+
+  cw &= ~((excepts << CAUSE_SHIFT) | FE_ALL_EXCEPT);
+  cw |= excepts;
+
+  /* Put the new data in effect.  */
+  _FPU_SETFCW (cw);
+
+  /* Success.  */
+  return 0;
+}
+
+versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2);
diff --git a/ports/sysdeps/am33/fpu/fedisblxcpt.c b/ports/sysdeps/am33/fpu/fedisblxcpt.c
new file mode 100644
index 0000000000..170f8200ed
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fedisblxcpt.c
@@ -0,0 +1,41 @@
+/* Disable floating-point exceptions.
+   Copyright (C) 2000, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fedisableexcept (int excepts)
+{
+  fpu_control_t new_exc, old_exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (new_exc);
+
+  old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  new_exc &= ~(excepts << ENABLE_SHIFT);
+  _FPU_SETCW (new_exc);
+
+  return old_exc;
+}
diff --git a/ports/sysdeps/am33/fpu/feenablxcpt.c b/ports/sysdeps/am33/fpu/feenablxcpt.c
new file mode 100644
index 0000000000..fe6d880c21
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/feenablxcpt.c
@@ -0,0 +1,41 @@
+/* Enable floating-point exceptions.
+   Copyright (C) 2000, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+feenableexcept (int excepts)
+{
+  fpu_control_t new_exc, old_exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (new_exc);
+
+  old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  new_exc |= excepts << ENABLE_SHIFT;
+  _FPU_SETCW (new_exc);
+
+  return old_exc;
+}
diff --git a/ports/sysdeps/am33/fpu/fegetenv.c b/ports/sysdeps/am33/fpu/fegetenv.c
new file mode 100644
index 0000000000..6da6eeb913
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fegetenv.c
@@ -0,0 +1,34 @@
+/* Store current floating-point environment.
+   Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <shlib-compat.h>
+
+int
+__fegetenv (fenv_t *envp)
+{
+  _FPU_GETCW (*envp);
+
+  /* Success.  */
+  return 0;
+}
+
+versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
diff --git a/ports/sysdeps/am33/fpu/fegetexcept.c b/ports/sysdeps/am33/fpu/fegetexcept.c
new file mode 100644
index 0000000000..13e5306af9
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fegetexcept.c
@@ -0,0 +1,34 @@
+/* Get enabled floating-point exceptions.
+   Copyright (C) 2000, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fegetexcept (void)
+{
+  unsigned int exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (exc);
+
+  return (exc & ENABLE_MASK) >> ENABLE_SHIFT;
+}
diff --git a/ports/sysdeps/am33/fpu/fegetround.c b/ports/sysdeps/am33/fpu/fegetround.c
new file mode 100644
index 0000000000..d649f18bf7
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fegetround.c
@@ -0,0 +1,34 @@
+/* Return current rounding direction.
+   Copyright (C) 1998, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fegetround (void)
+{
+  int cw;
+
+  /* Get control word.  */
+  _FPU_GETCW (cw);
+
+  return (cw & ROUND_MASK);
+}
diff --git a/ports/sysdeps/am33/fpu/feholdexcpt.c b/ports/sysdeps/am33/fpu/feholdexcpt.c
new file mode 100644
index 0000000000..1c002d8d94
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/feholdexcpt.c
@@ -0,0 +1,38 @@
+/* Store current floating-point environment and clear exceptions.
+   Copyright (C) 2000, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+feholdexcept (fenv_t *envp)
+{
+  fpu_control_t cw;
+
+  /* Save the current state.  */
+  _FPU_GETCW (cw);
+  *envp = cw;
+
+  /* Clear all exception enable bits and flags.  */
+  cw &= ~(_FPU_MASK_V|_FPU_MASK_Z|_FPU_MASK_O|_FPU_MASK_U|_FPU_MASK_I);
+  _FPU_SETFCW (cw);
+
+  return 0;
+}
diff --git a/ports/sysdeps/am33/fpu/fenv_libc.h b/ports/sysdeps/am33/fpu/fenv_libc.h
new file mode 100644
index 0000000000..40d57259bd
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fenv_libc.h
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on the corresponding file in the mips port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _FENV_LIBC_H
+#define _FENV_LIBC_H    1
+
+/* Mask for enabling exceptions and for the CAUSE bits.  */
+#define ENABLE_MASK	0x003E0U
+#define CAUSE_MASK	0x07C00U
+#define ROUND_MASK	0x30000U
+
+/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits.  */
+#define	ENABLE_SHIFT	5
+#define	CAUSE_SHIFT	10
+
+#endif /* _FENV_LIBC_H */
diff --git a/ports/sysdeps/am33/fpu/fesetenv.c b/ports/sysdeps/am33/fpu/fesetenv.c
new file mode 100644
index 0000000000..110c49c9f8
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fesetenv.c
@@ -0,0 +1,59 @@
+/* Install given floating-point environment.
+   Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <shlib-compat.h>
+
+int
+__fesetenv (const fenv_t *envp)
+{
+  fpu_control_t cw;
+
+  /* We want to clear all EF bits for the default end IEEE.  */
+
+  if (envp == FE_DFL_ENV)
+    _FPU_SETFCW (_FPU_DEFAULT|FE_ALL_EXCEPT);
+  else if (envp == FE_NOMASK_ENV)
+    _FPU_SETFCW (_FPU_IEEE|FE_ALL_EXCEPT);
+  else
+    {
+      fpu_control_t temp;
+
+      _FPU_GETCW (temp);
+      cw = *envp;
+
+      /* If EF bits are cleared and the user requests them to be set,
+	 we have to fail, because there's no way to do it.  */
+      if (~temp & cw & FE_ALL_EXCEPT)
+	return -1;
+
+      /* We clear EF bits by storing a 1 in them, so flip the
+	 FE_ALL_EXCEPT bits.  */
+      cw = (cw & ~FE_ALL_EXCEPT) | (~cw & FE_ALL_EXCEPT);
+      _FPU_SETFCW (cw);
+    }
+
+  /* Success.  */
+  return 0;
+}
+
+libm_hidden_ver (__fesetenv, fesetenv)
+versioned_symbol (libm, __fesetenv, fesetenv, GLIBC_2_2);
diff --git a/ports/sysdeps/am33/fpu/fesetround.c b/ports/sysdeps/am33/fpu/fesetround.c
new file mode 100644
index 0000000000..e77dc7684f
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fesetround.c
@@ -0,0 +1,28 @@
+/* Set current rounding direction.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+
+int
+fesetround (int round)
+{
+  /* The only supported rounding mode is to-nearest.  Just check
+     whether we're switching to it.  */
+  return (round != FE_TONEAREST);
+}
diff --git a/ports/sysdeps/am33/fpu/feupdateenv.c b/ports/sysdeps/am33/fpu/feupdateenv.c
new file mode 100644
index 0000000000..70951a3675
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/feupdateenv.c
@@ -0,0 +1,46 @@
+/* Install given floating-point environment and raise exceptions.
+   Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <shlib-compat.h>
+
+int
+__feupdateenv (const fenv_t *envp)
+{
+  int temp;
+
+  /* Save current exceptions.  */
+  _FPU_GETCW (temp);
+  temp &= FE_ALL_EXCEPT;
+
+  /* Install new environment.  */
+  fesetenv (envp);
+
+  /* Raise the safed exception.  Incidently for us the implementation
+     defined format of the values in objects of type fexcept_t is the
+     same as the ones specified using the FE_* constants.  */
+  feraiseexcept (temp);
+
+  /* Success.  */
+  return 0;
+}
+
+versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2);
diff --git a/ports/sysdeps/am33/fpu/fgetexcptflg.c b/ports/sysdeps/am33/fpu/fgetexcptflg.c
new file mode 100644
index 0000000000..d5828e6011
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fgetexcptflg.c
@@ -0,0 +1,43 @@
+/* Store current representation for exceptions.
+   Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <shlib-compat.h>
+
+int
+__fegetexceptflag (fexcept_t *flagp, int excepts)
+{
+  fexcept_t temp;
+
+  /* Get the current exceptions.  */
+  _FPU_GETCW (temp);
+
+  /* We only save the relevant bits here. In particular, care has to be 
+     taken with the CAUSE bits, as an inadvertent restore later on could
+     generate unexpected exceptions.  */
+
+  *flagp = temp & excepts & FE_ALL_EXCEPT;
+
+  /* Success.  */
+  return 0;
+}
+
+versioned_symbol (libm, __fegetexceptflag, fegetexceptflag, GLIBC_2_2);
diff --git a/ports/sysdeps/am33/fpu/fpu_control.h b/ports/sysdeps/am33/fpu/fpu_control.h
new file mode 100644
index 0000000000..de28228e71
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fpu_control.h
@@ -0,0 +1,74 @@
+/* FPU control word bits.  AM33/2.0 version.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on the corresponding file in the mips port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _FPU_CONTROL_H
+#define _FPU_CONTROL_H
+
+/* AM33/2.0 FPU floating point control register bits.
+ *
+ * 31-22  -> reserved
+ * 21-18  -> floating-point condition codes (L, G, E, U)
+ * 17-16  -> rounding modes (00 is to-nearest; other values are reserved
+ * 15     -> reserved (read as 0, write with 0)
+ * 14-10  -> Exception Cause (inValid, divZero, Overflow, Underflow, Inexact)
+ *  9- 5  -> Exception Enable
+ *  4- 0  -> Exception Flag, cleared when exception cause is set
+ */
+
+#include <features.h>
+#include <fenv.h>
+
+/* masking of interrupts */
+#define _FPU_MASK_V     0x0200  /* Invalid operation */
+#define _FPU_MASK_Z     0x0100  /* Division by zero  */
+#define _FPU_MASK_O     0x0080  /* Overflow          */
+#define _FPU_MASK_U     0x0040  /* Underflow         */
+#define _FPU_MASK_I     0x0020  /* Inexact operation */
+
+/* rounding control */
+#define _FPU_RC_NEAREST 0x0     /* Only available mode */
+
+#define _FPU_RESERVED 0xffc08000  /* Reserved bits in fpcr */
+
+
+/* The fdlibm code requires strict IEEE double precision arithmetic,
+   and no interrupts for exceptions, rounding to nearest.  */
+
+#define _FPU_DEFAULT  0x0000001f
+
+/* IEEE:  same as above, but exceptions */
+#define _FPU_IEEE     0x000003ff
+
+/* Type of the control word.  */
+typedef unsigned int fpu_control_t;
+
+/* Macros for accessing the hardware control word.  _FPU_SETCW is
+   defined such that it won't modify the EF bits, that are cleared
+   when assigned bits that are set.  Use SETFCW to get them actually
+   reset.  */
+#define _FPU_SETFCW(cw) __asm__ ("fmov %0,fpcr" : : "ri" (cw))
+#define _FPU_SETCW(cw) _FPU_SETFCW((cw) & ~FE_ALL_EXCEPT)
+#define _FPU_GETCW(cw) __asm__ ("fmov fpcr,%0" : "=r" (cw))
+
+/* Default control word set at startup.  */
+extern fpu_control_t __fpu_control;
+
+#endif	/* fpu_control.h */
diff --git a/ports/sysdeps/am33/fpu/fraiseexcpt.c b/ports/sysdeps/am33/fpu/fraiseexcpt.c
new file mode 100644
index 0000000000..628ad56e9b
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fraiseexcpt.c
@@ -0,0 +1,78 @@
+/* Raise given exceptions.
+   Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the M68K port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <float.h>
+#include <math.h>
+#include <shlib-compat.h>
+
+int
+__feraiseexcept (int excepts)
+{
+  /* Raise exceptions represented by EXCEPTS.  But we must raise only one
+     signal at a time.  It is important that if the overflow/underflow
+     exception and the divide by zero exception are given at the same
+     time, the overflow/underflow exception follows the divide by zero
+     exception.  */
+
+  /* First: invalid exception.  */
+  if (excepts & FE_INVALID)
+    {
+      /* One example of a invalid operation is 0 * Infinity.  */
+      float x = HUGE_VALF, y = 0.0f;
+      __asm__ __volatile__ ("fmul %1,%0" : "+f" (x) : "f" (y));
+    }
+
+  /* Next: division by zero.  */
+  if (excepts & FE_DIVBYZERO)
+    {
+      float x = 1.0f, y = 0.0f;
+      __asm__ __volatile__ ("fdiv %1,%0" : "+f" (x) : "f" (y));
+    }
+
+  /* Next: overflow.  */
+  if (excepts & FE_OVERFLOW)
+    {
+      float x = FLT_MAX;
+
+      __asm__ __volatile__ ("fmul %0,%0" : "+f" (x));
+    }
+
+  /* Next: underflow.  */
+  if (excepts & FE_UNDERFLOW)
+    {
+      float x = -FLT_MIN;
+
+      __asm__ __volatile__ ("fmul %0,%0" : "+f" (x));
+    }
+
+  /* Last: inexact.  */
+  if (excepts & FE_INEXACT)
+    {
+      float x = 1.0f, y = 3.0f;
+      __asm__ __volatile__ ("fdiv %1,%0" : "=f" (x) : "f" (y));
+    }
+
+  /* Success.  */
+  return 0;
+}
+
+libm_hidden_ver (__feraiseexcept, feraiseexcept)
+versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2);
diff --git a/ports/sysdeps/am33/fpu/fsetexcptflg.c b/ports/sysdeps/am33/fpu/fsetexcptflg.c
new file mode 100644
index 0000000000..a5bde40200
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/fsetexcptflg.c
@@ -0,0 +1,56 @@
+/* Set floating-point environment exception handling.
+   Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <shlib-compat.h>
+
+int
+__fesetexceptflag (const fexcept_t *flagp, int excepts)
+{
+  fpu_control_t cw, temp;
+
+  /* Get the current exceptions.  */
+  _FPU_GETCW (cw);
+
+  /* Make sure the flags we want restored are legal.  */
+  excepts &= FE_ALL_EXCEPT;
+  temp = *flagp & excepts;
+
+  /* If EF bits are clear and the user requests them to be set,
+     we have to fail, because there's no way to do it.  */
+  if (~(cw & excepts) & temp)
+    return -1;
+
+  /* We clear EF bits by storing a 1 in them, so flip the
+     FE_ALL_EXCEPT bits.  */
+  temp = (~temp & FE_ALL_EXCEPT);
+
+  /* Now clear the bits called for, and copy them in from flagp. Note that
+     we ignore all non-flag bits from *flagp, so they don't matter.  */
+  cw = (cw & ~FE_ALL_EXCEPT) | temp;
+
+  _FPU_SETFCW (cw);
+
+  /* Success.  */
+  return 0;
+}
+
+versioned_symbol (libm, __fesetexceptflag, fesetexceptflag, GLIBC_2_2);
diff --git a/ports/sysdeps/am33/fpu/ftestexcept.c b/ports/sysdeps/am33/fpu/ftestexcept.c
new file mode 100644
index 0000000000..ef3e761fcc
--- /dev/null
+++ b/ports/sysdeps/am33/fpu/ftestexcept.c
@@ -0,0 +1,33 @@
+/* Test exception in current environment.
+   Copyright (C) 1998, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   based on corresponding file in the MIPS port.
+
+   The GNU C Library 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 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fetestexcept (int excepts)
+{
+  int cw;
+
+  /* Get current control word.  */
+  _FPU_GETCW (cw);
+
+  return cw & excepts & FE_ALL_EXCEPT;
+}
diff --git a/ports/sysdeps/am33/jmpbuf-offsets.h b/ports/sysdeps/am33/jmpbuf-offsets.h
new file mode 100644
index 0000000000..9884f2e3c0
--- /dev/null
+++ b/ports/sysdeps/am33/jmpbuf-offsets.h
@@ -0,0 +1,19 @@
+/* Private macros for accessing __jmp_buf contents.  AM33 version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#define __JMP_BUF_SP		20
diff --git a/ports/sysdeps/am33/jmpbuf-unwind.h b/ports/sysdeps/am33/jmpbuf-unwind.h
new file mode 100644
index 0000000000..d5c01e2797
--- /dev/null
+++ b/ports/sysdeps/am33/jmpbuf-unwind.h
@@ -0,0 +1,25 @@
+/* Examine __jmp_buf for unwinding frames.  AM33 version.
+   Copyright (C) 2006 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <setjmp.h>
+#include <jmpbuf-offsets.h>
+
+/* Test if longjmp to JMPBUF would unwind the frame
+   containing a local variable at ADDRESS.  */
+#define _JMPBUF_UNWINDS(jmpbuf, address, demangle)			\
+  ((void *) (address) < (void *) demangle (jmpbuf[__JMP_BUF_SP]))
diff --git a/ports/sysdeps/am33/linuxthreads/pspinlock.c b/ports/sysdeps/am33/linuxthreads/pspinlock.c
new file mode 100644
index 0000000000..a1674974ab
--- /dev/null
+++ b/ports/sysdeps/am33/linuxthreads/pspinlock.c
@@ -0,0 +1,73 @@
+/* POSIX spinlock implementation.  AM33 version.
+   Copyright 2001 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.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <pthread.h>
+#include "internals.h"
+
+int
+__pthread_spin_lock (pthread_spinlock_t *lock)
+{
+  __asm__ __volatile__("1: bset %1, (%0); beq 1b"
+		       : : "a" (lock), "d" (1) : "memory");
+  return 0;
+}
+weak_alias (__pthread_spin_lock, pthread_spin_lock)
+
+
+int
+__pthread_spin_trylock (pthread_spinlock_t *lock)
+{
+  int oldval = 1;
+
+  __asm__ __volatile__ ("bset %0, (%1); beq 1f; clr %0; 1:" :
+			"+d" (oldval) : "a" (lock) : "memory");
+
+  return oldval ? EBUSY : 0;
+}
+weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
+
+
+int
+__pthread_spin_unlock (pthread_spinlock_t *lock)
+{
+  *lock = 0;
+  return 0;
+}
+weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
+
+
+int
+__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
+{
+  /* We can ignore the `pshared' parameter.  Since we are busy-waiting
+     all processes which can access the memory location `lock' points
+     to can use the spinlock.  */
+  *lock = 0;
+  return 0;
+}
+weak_alias (__pthread_spin_init, pthread_spin_init)
+
+
+int
+__pthread_spin_destroy (pthread_spinlock_t *lock)
+{
+  /* Nothing to do.  */
+  return 0;
+}
+weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/ports/sysdeps/am33/linuxthreads/pt-machine.h b/ports/sysdeps/am33/linuxthreads/pt-machine.h
new file mode 100644
index 0000000000..86d0f8b1e1
--- /dev/null
+++ b/ports/sysdeps/am33/linuxthreads/pt-machine.h
@@ -0,0 +1,67 @@
+/* Machine-dependent pthreads configuration and inline functions.
+   am33 version.
+   Copyright (C) 1996,1997,1998,1999,2000,2001, 2004
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   Based on ../i386/pt-machine.h.
+
+   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.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _PT_MACHINE_H
+#define _PT_MACHINE_H	1
+
+#ifndef __ASSEMBLER__
+#ifndef PT_EI
+# define PT_EI extern inline
+#endif
+
+/* Get some notion of the current stack.  Need not be exactly the top
+   of the stack, just something somewhere in the current frame.  */
+#define CURRENT_STACK_FRAME  __builtin_frame_address (0)
+
+/* Spinlock implementation; required.  */
+PT_EI long int
+testandset (int *spinlock)
+{
+  long int ret = 1;
+
+  /* This won't test&set the entire int, only the least significant
+     byte.  I hope this doesn't matter, since we can't do better.  */
+  __asm__ __volatile__ ("bset %0, %1; bne 1f; clr %0; 1:" :
+			"+d" (ret), "+m" (*(volatile int *)spinlock));
+
+  return ret;
+}
+
+
+PT_EI int
+get_eflags (void)
+{
+  int res;
+  __asm__ __volatile__ ("mov psw,%0" : "=d" (res));
+  return res;
+}
+
+
+PT_EI void
+set_eflags (int newflags)
+{
+  __asm__ __volatile__ ("mov %0,psw" : : "d" (newflags) : "cc");
+}
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* pt-machine.h */
diff --git a/ports/sysdeps/am33/memusage.h b/ports/sysdeps/am33/memusage.h
new file mode 100644
index 0000000000..19d7a732ca
--- /dev/null
+++ b/ports/sysdeps/am33/memusage.h
@@ -0,0 +1,22 @@
+/* Copyright 2000, 2001 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#define GETSP() ({ uintptr_t stack_ptr; \
+		   asm ("mov sp,%0" : "=a" (stack_ptr)); \
+		   stack_ptr; })
+
+#include <sysdeps/generic/memusage.h>
diff --git a/ports/sysdeps/am33/preconfigure b/ports/sysdeps/am33/preconfigure
new file mode 100644
index 0000000000..9495465389
--- /dev/null
+++ b/ports/sysdeps/am33/preconfigure
@@ -0,0 +1,5 @@
+case "$machine" in
+am33*)
+  base_machine=am33 machine=am33
+  ;;
+esac
diff --git a/ports/sysdeps/am33/setjmp.S b/ports/sysdeps/am33/setjmp.S
new file mode 100644
index 0000000000..54b239d65c
--- /dev/null
+++ b/ports/sysdeps/am33/setjmp.S
@@ -0,0 +1,79 @@
+/* setjmp for am33.
+   Copyright (C) 2001, 2004 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+#include <asm-syntax.h>
+
+
+ENTRY (__sigsetjmp)
+.Lsigsetjmp:
+	/* Save registers.  */
+	mov d0,a0
+	mov d2,(0,a0)
+	mov d3,(4,a0)
+	mov mdr,d0
+	mov d0,(8,a0)
+	/* Restore d0 for __sigjmp_save.  */
+	mov a0,d0
+	mov a2,(12,a0)
+	mov a3,(16,a0)
+	mov sp,a1
+	mov a1,(20,a0)
+	add 24,a0
+	mov r4,(a0+)
+	mov r5,(a0+)
+	mov r6,(a0+)
+	mov r7,(a0+)
+#ifdef __AM33_2__
+	fmov fs4,(a0+)
+	fmov fs5,(a0+)
+	fmov fs6,(a0+)
+	fmov fs7,(a0+)
+	fmov fs8,(a0+)
+	fmov fs9,(a0+)
+	fmov fs10,(a0+)
+	fmov fs11,(a0+)
+	fmov fs12,(a0+)
+	fmov fs13,(a0+)
+	fmov fs14,(a0+)
+	fmov fs15,(a0+)
+	fmov fs16,(a0+)
+	fmov fs17,(a0+)
+	fmov fs18,(a0+)
+	fmov fs19,(a0+)
+#endif
+	/* Make a tail call to __sigjmp_save; it takes the same args.  */
+	jmp __sigjmp_save
+END (__sigsetjmp)
+
+/* BSD `_setjmp' entry point to `sigsetjmp (..., 1)'.  */
+ENTRY (setjmp)
+	/* Tail-call setsetjmp with savesigs==1.  */
+	mov 1,d1
+	bra .Lsigsetjmp
+END (setjmp)
+
+/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'.  */
+ENTRY (_setjmp)
+	/* Tail-call setsetjmp with savesigs==0.  */
+	clr d1
+	bra .Lsigsetjmp
+END (_setjmp)
diff --git a/ports/sysdeps/am33/shlib-versions b/ports/sysdeps/am33/shlib-versions
new file mode 100644
index 0000000000..ad6ded9dc4
--- /dev/null
+++ b/ports/sysdeps/am33/shlib-versions
@@ -0,0 +1 @@
+am33.*-.*-linux.*	DEFAULT			GLIBC_2.2.5
diff --git a/ports/sysdeps/am33/stackinfo.h b/ports/sysdeps/am33/stackinfo.h
new file mode 100644
index 0000000000..c7a7977773
--- /dev/null
+++ b/ports/sysdeps/am33/stackinfo.h
@@ -0,0 +1,27 @@
+/* Copyright 2001 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This file contains a bit of information about the stack allocation
+   of the processor.  */
+
+#ifndef _STACKINFO_H
+#define _STACKINFO_H	1
+
+/* On am33 the stack grows down.  */
+#define _STACK_GROWS_DOWN	1
+
+#endif	/* stackinfo.h */
diff --git a/ports/sysdeps/am33/sys/ucontext.h b/ports/sysdeps/am33/sys/ucontext.h
new file mode 100644
index 0000000000..1615b6368c
--- /dev/null
+++ b/ports/sysdeps/am33/sys/ucontext.h
@@ -0,0 +1,122 @@
+/* Copyright 1997, 1999, 2000, 2002 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.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* AM33/2.0 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	28
+
+/* Container for all general registers.  */
+typedef greg_t gregset_t[NGREG];
+
+/* Number of each register is the `gregset_t' array.  */
+enum
+{
+  REG_D0 = 0,
+#define REG_D0	REG_D0
+  REG_D1,
+#define REG_D1	REG_D1
+  REG_D2,
+#define REG_D2	REG_D2
+  REG_D3,
+#define REG_D3	REG_D3
+  REG_A0,
+#define REG_A0	REG_A0
+  REG_A1,
+#define REG_A1	REG_A1
+  REG_A2,
+#define REG_A2	REG_A2
+  REG_A3,
+#define REG_A3	REG_A3
+  REG_E0,
+#define REG_E0	REG_E0
+  REG_E1,
+#define REG_E1	REG_E1
+  REG_E2,
+#define REG_E2	REG_E2
+  REG_E3,
+#define REG_E3	REG_E3
+  REG_E4,
+#define REG_E4	REG_E4
+  REG_E5,
+#define REG_E5	REG_E5
+  REG_E6,
+#define REG_E6	REG_E6
+  REG_E7,
+#define REG_E7	REG_E7
+  REG_LAR,
+#define REG_LAR	REG_LAR
+  REG_LIR,
+#define REG_LIR	REG_LIR
+  REG_MDR,
+#define REG_MDR	REG_MDR
+  REG_MCVF,
+#define REG_MCVF	REG_MCVF
+  REG_MCRL,
+#define REG_MCRL	REG_MCRL
+  REG_MCRH,
+#define REG_MCRH	REG_MCRH
+  REG_MDRQ,
+#define REG_MDRQ	REG_MDRQ
+  REG_SP,
+#define REG_SP	REG_SP
+  REG_EPSW,
+#define REG_EPSW	REG_EPSW
+  REG_PC,
+#define REG_PC	REG_PC
+};
+
+typedef int freg_t;
+
+/* Structure to describe FPU registers.  */
+typedef struct {
+  union {
+    double fp_dregs[16];
+    float fp_fregs[32];
+    freg_t fp_regs[32];
+  } regs;
+  freg_t fpcr;
+} 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_link;
+    __sigset_t uc_sigmask;
+    stack_t uc_stack;
+    mcontext_t uc_mcontext;
+    long int uc_filler[5];
+  } ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/ports/sysdeps/am33/sysdep.h b/ports/sysdeps/am33/sysdep.h
new file mode 100644
index 0000000000..2ddb656957
--- /dev/null
+++ b/ports/sysdeps/am33/sysdep.h
@@ -0,0 +1,81 @@
+/* Copyright 2001 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>.
+   Based on ../i386/sysdep.h.
+
+   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.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/generic/sysdep.h>
+
+#ifdef	__ASSEMBLER__
+
+/* Syntactic details of assembler.  */
+
+#ifdef HAVE_ELF
+/* For ELF we need the `.type' directive to make shared libs work right.  */
+#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name;
+
+/* In ELF C symbols are asm symbols.  */
+#undef	NO_UNDERSCORES
+#define NO_UNDERSCORES
+#else
+#define ASM_TYPE_DIRECTIVE(name,type)	/* Nothing is specified.  */
+#define ASM_SIZE_DIRECTIVE(name)	/* Nothing is specified.  */
+#endif
+
+/* Define an entry point visible from C.  */
+#define	ENTRY(name)							      \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
+  C_LABEL(name)								      \
+  CALL_MCOUNT
+
+#undef	END
+#define END(name)							      \
+  ASM_SIZE_DIRECTIVE(name)						      \
+
+/* If compiled for profiling, call `mcount' at the start of each function.  */
+#ifdef	PROF
+/* The mcount code relies on a normal frame pointer being on the stack
+   to locate our caller, so push one just for its benefit.  */
+#define CALL_MCOUNT \
+  movm [a3],(sp); mov sp,a3; add -12,sp; \
+  call JUMPTARGET(mcount),[],0; add 12,sp; movm (sp),[a3];
+#else
+#define CALL_MCOUNT		/* Do nothing.  */
+#endif
+
+#ifdef	NO_UNDERSCORES
+/* Since C identifiers are not normally prefixed with an underscore
+   on this system, the asm identifier `syscall_error' intrudes on the
+   C name space.  Make sure we use an innocuous name.  */
+#define	syscall_error	__syscall_error
+#define mcount		_mcount
+#endif
+
+#undef JUMPTARGET
+#ifdef PIC
+#define JUMPTARGET(name)	name##@PLT
+#else
+#define JUMPTARGET(name)	name
+#endif
+
+/* Local label name for asm code. */
+#ifndef L
+#define L(name)		name
+#endif
+
+#endif	/* __ASSEMBLER__ */