~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/mips/math-emu/kernel_linkage.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Kevin D. Kissell, kevink@mips and Carsten Langgaard, carstenl@mips.com
 
3
 *  Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
 
4
 *
 
5
 *  This program is free software; you can distribute it and/or modify it
 
6
 *  under the terms of the GNU General Public License (Version 2) as
 
7
 *  published by the Free Software Foundation.
 
8
 *
 
9
 *  This program is distributed in the hope it will be useful, but WITHOUT
 
10
 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 
11
 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 
12
 *  for more details.
 
13
 *
 
14
 *  You should have received a copy of the GNU General Public License along
 
15
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 
16
 *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
 
17
 *
 
18
 * Routines corresponding to Linux kernel FP context
 
19
 * manipulation primitives for the Algorithmics MIPS
 
20
 * FPU Emulator
 
21
 */
 
22
#include <linux/sched.h>
 
23
#include <asm/processor.h>
 
24
#include <asm/signal.h>
 
25
#include <asm/uaccess.h>
 
26
 
 
27
#include <asm/fpu.h>
 
28
#include <asm/fpu_emulator.h>
 
29
 
 
30
#define SIGNALLING_NAN 0x7ff800007ff80000LL
 
31
 
 
32
void fpu_emulator_init_fpu(void)
 
33
{
 
34
        static int first = 1;
 
35
        int i;
 
36
 
 
37
        if (first) {
 
38
                first = 0;
 
39
                printk("Algorithmics/MIPS FPU Emulator v1.5\n");
 
40
        }
 
41
 
 
42
        current->thread.fpu.fcr31 = 0;
 
43
        for (i = 0; i < 32; i++) {
 
44
                current->thread.fpu.fpr[i] = SIGNALLING_NAN;
 
45
        }
 
46
}
 
47
 
 
48
 
 
49
/*
 
50
 * Emulator context save/restore to/from a signal context
 
51
 * presumed to be on the user stack, and therefore accessed
 
52
 * with appropriate macros from uaccess.h
 
53
 */
 
54
 
 
55
int fpu_emulator_save_context(struct sigcontext __user *sc)
 
56
{
 
57
        int i;
 
58
        int err = 0;
 
59
 
 
60
        for (i = 0; i < 32; i++) {
 
61
                err |=
 
62
                    __put_user(current->thread.fpu.fpr[i], &sc->sc_fpregs[i]);
 
63
        }
 
64
        err |= __put_user(current->thread.fpu.fcr31, &sc->sc_fpc_csr);
 
65
 
 
66
        return err;
 
67
}
 
68
 
 
69
int fpu_emulator_restore_context(struct sigcontext __user *sc)
 
70
{
 
71
        int i;
 
72
        int err = 0;
 
73
 
 
74
        for (i = 0; i < 32; i++) {
 
75
                err |=
 
76
                    __get_user(current->thread.fpu.fpr[i], &sc->sc_fpregs[i]);
 
77
        }
 
78
        err |= __get_user(current->thread.fpu.fcr31, &sc->sc_fpc_csr);
 
79
 
 
80
        return err;
 
81
}
 
82
 
 
83
#ifdef CONFIG_64BIT
 
84
/*
 
85
 * This is the o32 version
 
86
 */
 
87
 
 
88
int fpu_emulator_save_context32(struct sigcontext32 __user *sc)
 
89
{
 
90
        int i;
 
91
        int err = 0;
 
92
 
 
93
        for (i = 0; i < 32; i+=2) {
 
94
                err |=
 
95
                    __put_user(current->thread.fpu.fpr[i], &sc->sc_fpregs[i]);
 
96
        }
 
97
        err |= __put_user(current->thread.fpu.fcr31, &sc->sc_fpc_csr);
 
98
 
 
99
        return err;
 
100
}
 
101
 
 
102
int fpu_emulator_restore_context32(struct sigcontext32 __user *sc)
 
103
{
 
104
        int i;
 
105
        int err = 0;
 
106
 
 
107
        for (i = 0; i < 32; i+=2) {
 
108
                err |=
 
109
                    __get_user(current->thread.fpu.fpr[i], &sc->sc_fpregs[i]);
 
110
        }
 
111
        err |= __get_user(current->thread.fpu.fcr31, &sc->sc_fpc_csr);
 
112
 
 
113
        return err;
 
114
}
 
115
#endif