diff options
author | Paul Mundt <lethal@linux-sh.org> | 2010-01-12 22:51:40 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2010-01-12 22:51:40 -0500 |
commit | 0ea820cf9bf58f735ed40ec67947159c4f170012 (patch) | |
tree | 77320006b4dded5804c678c1a869571be5c0b95f /arch/sh/math-emu | |
parent | a3705799e2cc5fb69d88ad6a7f317a8f5597f18d (diff) |
sh: Move over to dynamically allocated FPU context.
This follows the x86 xstate changes and implements a task_xstate slab
cache that is dynamically sized to match one of hard FP/soft FP/FPU-less.
This also tidies up and consolidates some of the SH-2A/SH-4 FPU
fragmentation. Now fpu state restorers are commonly defined, with the
init_fpu()/fpu_init() mess reworked to follow the x86 convention.
The fpu_init() register initialization has been replaced by xstate setup
followed by writing out to hardware via the standard restore path.
As init_fpu() now performs a slab allocation a secondary lighterweight
restorer is also introduced for the context switch.
In the future the DSP state will be rolled in here, too.
More work remains for math emulation and the SH-5 FPU, which presently
uses its own special (UP-only) interfaces.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/math-emu')
-rw-r--r-- | arch/sh/math-emu/math.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/sh/math-emu/math.c b/arch/sh/math-emu/math.c index d6c15cae0912..1fcdb1220975 100644 --- a/arch/sh/math-emu/math.c +++ b/arch/sh/math-emu/math.c | |||
@@ -471,10 +471,10 @@ static int fpu_emulate(u16 code, struct sh_fpu_soft_struct *fregs, struct pt_reg | |||
471 | * denormal_to_double - Given denormalized float number, | 471 | * denormal_to_double - Given denormalized float number, |
472 | * store double float | 472 | * store double float |
473 | * | 473 | * |
474 | * @fpu: Pointer to sh_fpu_hard structure | 474 | * @fpu: Pointer to sh_fpu_soft structure |
475 | * @n: Index to FP register | 475 | * @n: Index to FP register |
476 | */ | 476 | */ |
477 | static void denormal_to_double(struct sh_fpu_hard_struct *fpu, int n) | 477 | static void denormal_to_double(struct sh_fpu_soft_struct *fpu, int n) |
478 | { | 478 | { |
479 | unsigned long du, dl; | 479 | unsigned long du, dl; |
480 | unsigned long x = fpu->fpul; | 480 | unsigned long x = fpu->fpul; |
@@ -552,11 +552,11 @@ static int ieee_fpe_handler(struct pt_regs *regs) | |||
552 | if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */ | 552 | if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */ |
553 | struct task_struct *tsk = current; | 553 | struct task_struct *tsk = current; |
554 | 554 | ||
555 | if ((tsk->thread.fpu.hard.fpscr & (1 << 17))) { | 555 | if ((tsk->thread.xstate->softfpu.fpscr & (1 << 17))) { |
556 | /* FPU error */ | 556 | /* FPU error */ |
557 | denormal_to_double (&tsk->thread.fpu.hard, | 557 | denormal_to_double (&tsk->thread.xstate->softfpu, |
558 | (finsn >> 8) & 0xf); | 558 | (finsn >> 8) & 0xf); |
559 | tsk->thread.fpu.hard.fpscr &= | 559 | tsk->thread.xstate->softfpu.fpscr &= |
560 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); | 560 | ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); |
561 | task_thread_info(tsk)->status |= TS_USEDFPU; | 561 | task_thread_info(tsk)->status |= TS_USEDFPU; |
562 | } else { | 562 | } else { |
@@ -617,7 +617,7 @@ static void fpu_init(struct sh_fpu_soft_struct *fpu) | |||
617 | int do_fpu_inst(unsigned short inst, struct pt_regs *regs) | 617 | int do_fpu_inst(unsigned short inst, struct pt_regs *regs) |
618 | { | 618 | { |
619 | struct task_struct *tsk = current; | 619 | struct task_struct *tsk = current; |
620 | struct sh_fpu_soft_struct *fpu = &(tsk->thread.fpu.soft); | 620 | struct sh_fpu_soft_struct *fpu = &(tsk->thread.xstate->softfpu); |
621 | 621 | ||
622 | if (!(task_thread_info(tsk)->status & TS_USEDFPU)) { | 622 | if (!(task_thread_info(tsk)->status & TS_USEDFPU)) { |
623 | /* initialize once. */ | 623 | /* initialize once. */ |