summaryrefslogtreecommitdiffstats
path: root/arch/ppc/kernel/softemu8xx.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1999-06-13 16:29:25 +0000
committerRalf Baechle <ralf@linux-mips.org>1999-06-13 16:29:25 +0000
commitdb7d4daea91e105e3859cf461d7e53b9b77454b2 (patch)
tree9bb65b95440af09e8aca63abe56970dd3360cc57 /arch/ppc/kernel/softemu8xx.c
parent9c1c01ead627bdda9211c9abd5b758d6c687d8ac (diff)
Merge with Linux 2.2.8.
Diffstat (limited to 'arch/ppc/kernel/softemu8xx.c')
-rw-r--r--arch/ppc/kernel/softemu8xx.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/arch/ppc/kernel/softemu8xx.c b/arch/ppc/kernel/softemu8xx.c
index ae44266f7..b90760d7e 100644
--- a/arch/ppc/kernel/softemu8xx.c
+++ b/arch/ppc/kernel/softemu8xx.c
@@ -38,6 +38,7 @@
#define LFDU 51
#define STFD 54
#define STFDU 55
+#define FMR 63
/*
* We return 0 on success, 1 on unimplemented instruction, and EFAULT
@@ -49,6 +50,7 @@ Soft_emulate_8xx(struct pt_regs *regs)
uint inst, instword;
uint flreg, idxreg, disp;
uint retval;
+ signed short sdisp;
uint *ea, *ip;
retval = 0;
@@ -66,6 +68,11 @@ Soft_emulate_8xx(struct pt_regs *regs)
switch ( inst )
{
case LFD:
+ /* this is a 16 bit quantity that is sign extended
+ * so use a signed short here -- Cort
+ */
+ sdisp = (instword & 0xffff);
+ ea = (uint *)(regs->gpr[idxreg] + sdisp);
if (copy_from_user(ip, ea, sizeof(double)))
retval = EFAULT;
break;
@@ -77,6 +84,11 @@ Soft_emulate_8xx(struct pt_regs *regs)
regs->gpr[idxreg] = (uint)ea;
break;
case STFD:
+ /* this is a 16 bit quantity that is sign extended
+ * so use a signed short here -- Cort
+ */
+ sdisp = (instword & 0xffff);
+ ea = (uint *)(regs->gpr[idxreg] + sdisp);
if (copy_to_user(ea, ip, sizeof(double)))
retval = EFAULT;
break;
@@ -87,6 +99,11 @@ Soft_emulate_8xx(struct pt_regs *regs)
else
regs->gpr[idxreg] = (uint)ea;
break;
+ case FMR:
+ /* assume this is a fp move -- Cort */
+ memcpy( ip, &current->tss.fpr[(instword>>11)&0x1f],
+ sizeof(double) );
+ break;
default:
retval = 1;
printk("Bad emulation %s/%d\n"
@@ -98,7 +115,7 @@ Soft_emulate_8xx(struct pt_regs *regs)
(instword>>16)&0x1f,
(instword>>11)&0x1f,
(instword>>6)&0x1f,
- (instword>>1)&0x1f,
+ (instword>>1)&0x3ff,
instword&1);
{
int pa;