/*************************************************************************** * * Copyright (C) 2001 International Business Machines * All rights reserved. * * This file is part of the GPFS mmfslinux kernel module. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *************************************************************************** */ /* @(#)27 1.5 src/avs/fs/mmfs/ts/kernext/gpl-linux/ppc64/ss_ppc64.c, mmfs, avs_rgpfs24, rgpfs240610b 9/15/04 23:29:27 */ /* * Implementation of shared segment for GPFS daemon and GPFS kernel code. * */ #include #include #include #include #include #include #include #include #include #if LINUX_KERNEL_VERSION < 2060000 #include #endif #include int kxSaveThreadInfo(int tid, void* regP) { struct task_struct *g, *t; int rc = ENOENT; unsigned long sp; read_lock(&tasklist_lock); DO_EACH_THREAD(g,t) { if (t->pid != tid) continue; rc = 0; goto found_it; } WHILE_EACH_THREAD(g,t); found_it: read_unlock(&tasklist_lock); if (rc == 0) { if (t->thread.regs != NULL) copy_to_user(regP, t->thread.regs, sizeof(struct pt_regs)); else { #if LINUX_KERNEL_VERSION < 2060000 sp = (unsigned long)t + sizeof(union task_union); #else /* ??? */ sp = (unsigned long)t->thread_info + THREAD_SIZE; #endif sp -= sizeof(struct pt_regs); copy_to_user(regP, (void*)sp, sizeof(struct pt_regs)); } } return rc; }