spu-manage-$(CONFIG_PPC_CELL_NATIVE)   += spu_manage.o
 
 obj-$(CONFIG_SPU_BASE)                 += spu_callbacks.o spu_base.o \
-                                          spu_coredump.o spu_syscalls.o \
+                                          spu_syscalls.o \
                                           $(spu-priv1-y) \
                                           $(spu-manage-y) \
                                           spufs/
 
+++ /dev/null
-/*
- * SPU core dump code
- *
- * (C) Copyright 2006 IBM Corp.
- *
- * Author: Dwayne Grant McConnell <decimal@us.ibm.com>
- *
- * This program 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.
- *
- * This program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/file.h>
-#include <linux/module.h>
-#include <linux/syscalls.h>
-
-#include <asm/spu.h>
-
-static struct spu_coredump_calls *spu_coredump_calls;
-static DEFINE_MUTEX(spu_coredump_mutex);
-
-int arch_notes_size(void)
-{
-       int ret;
-
-       mutex_lock(&spu_coredump_mutex);
-
-       if (spu_coredump_calls && try_module_get(spu_coredump_calls->owner)) {
-               ret = spu_coredump_calls->arch_notes_size();
-               module_put(spu_coredump_calls->owner);
-       } else {
-               ret = 0;
-       }
-
-       mutex_unlock(&spu_coredump_mutex);
-
-       return ret;
-}
-
-void arch_write_notes(struct file *file)
-{
-       mutex_lock(&spu_coredump_mutex);
-       if (spu_coredump_calls && try_module_get(spu_coredump_calls->owner)) {
-               spu_coredump_calls->arch_write_notes(file);
-               module_put(spu_coredump_calls->owner);
-       }
-       mutex_unlock(&spu_coredump_mutex);
-}
-
-int register_arch_coredump_calls(struct spu_coredump_calls *calls)
-{
-       int ret = 0;
-
-
-       mutex_lock(&spu_coredump_mutex);
-       if (spu_coredump_calls)
-               ret = -EBUSY;
-       else
-               spu_coredump_calls = calls;
-       mutex_unlock(&spu_coredump_mutex);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(register_arch_coredump_calls);
-
-void unregister_arch_coredump_calls(struct spu_coredump_calls *calls)
-{
-       BUG_ON(spu_coredump_calls != calls);
-
-       mutex_lock(&spu_coredump_mutex);
-       spu_coredump_calls = NULL;
-       mutex_unlock(&spu_coredump_mutex);
-}
-EXPORT_SYMBOL_GPL(unregister_arch_coredump_calls);
 
  * SPU file system -- system call stubs
  *
  * (C) Copyright IBM Deutschland Entwicklung GmbH 2005
+ * (C) Copyright 2006-2007, IBM Corporation
  *
  * Author: Arnd Bergmann <arndb@de.ibm.com>
  *
        return ret;
 }
 
+int arch_notes_size(void)
+{
+       struct spufs_calls *calls;
+       int ret;
+
+       calls = spufs_calls_get();
+       if (!calls)
+               return 0;
+
+       ret = calls->coredump_extra_notes_size();
+
+       spufs_calls_put(calls);
+
+       return ret;
+}
+
+void arch_write_notes(struct file *file)
+{
+       struct spufs_calls *calls;
+
+       calls = spufs_calls_get();
+       if (!calls)
+               return;
+
+       calls->coredump_extra_notes_write(file);
+
+       spufs_calls_put(calls);
+}
+
 int register_spu_syscalls(struct spufs_calls *calls)
 {
        if (spufs_calls)
 
        return ctx;
 }
 
-static int spufs_arch_notes_size(void)
+int spufs_coredump_extra_notes_size(void)
 {
        struct spu_context *ctx;
        int size = 0, rc, fd;
        free_page((unsigned long)buf);
 }
 
-static void spufs_arch_write_notes(struct file *file)
+void spufs_coredump_extra_notes_write(struct file *file)
 {
        struct spu_context *ctx;
        int fd, j;
                spu_release_saved(ctx);
        }
 }
-
-struct spu_coredump_calls spufs_coredump_calls = {
-       .arch_notes_size = spufs_arch_notes_size,
-       .arch_write_notes = spufs_arch_write_notes,
-       .owner = THIS_MODULE,
-};
 
        ret = register_spu_syscalls(&spufs_calls);
        if (ret)
                goto out_fs;
-       ret = register_arch_coredump_calls(&spufs_coredump_calls);
-       if (ret)
-               goto out_syscalls;
 
        spufs_init_isolated_loader();
 
        return 0;
 
-out_syscalls:
-       unregister_spu_syscalls(&spufs_calls);
 out_fs:
        unregister_filesystem(&spufs_type);
 out_sched:
 {
        spu_sched_exit();
        spufs_exit_isolated_loader();
-       unregister_arch_coredump_calls(&spufs_coredump_calls);
        unregister_spu_syscalls(&spufs_calls);
        unregister_filesystem(&spufs_type);
        kmem_cache_destroy(spufs_inode_cache);
 
 long spufs_run_spu(struct spu_context *ctx, u32 *npc, u32 *status);
 long spufs_create(struct nameidata *nd, unsigned int flags,
                        mode_t mode, struct file *filp);
+/* ELF coredump callbacks for writing SPU ELF notes */
+extern int spufs_coredump_extra_notes_size(void);
+extern void spufs_coredump_extra_notes_write(struct file *file);
+
 extern const struct file_operations spufs_context_fops;
 
 /* gang management */
 
 struct spufs_calls spufs_calls = {
        .create_thread = do_spu_create,
        .spu_run = do_spu_run,
+       .coredump_extra_notes_size = spufs_coredump_extra_notes_size,
+       .coredump_extra_notes_write = spufs_coredump_extra_notes_write,
        .owner = THIS_MODULE,
 };
 
                                        struct file *neighbor);
        long (*spu_run)(struct file *filp, __u32 __user *unpc,
                                                __u32 __user *ustatus);
-       struct module *owner;
-};
-
-/* coredump calls implemented in spufs */
-struct spu_coredump_calls {
-       asmlinkage int (*arch_notes_size)(void);
-       asmlinkage void (*arch_write_notes)(struct file *file);
+       int (*coredump_extra_notes_size)(void);
+       void (*coredump_extra_notes_write)(struct file *file);
        struct module *owner;
 };
 
 int register_spu_syscalls(struct spufs_calls *calls);
 void unregister_spu_syscalls(struct spufs_calls *calls);
 
-int register_arch_coredump_calls(struct spu_coredump_calls *calls);
-void unregister_arch_coredump_calls(struct spu_coredump_calls *calls);
-
 int spu_add_sysdev_attr(struct sysdev_attribute *attr);
 void spu_remove_sysdev_attr(struct sysdev_attribute *attr);