You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
5.1 KiB
258 lines
5.1 KiB
/* MN10300 Low level FPU management operations |
|
* |
|
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. |
|
* Written by David Howells (dhowells@redhat.com) |
|
* |
|
* This program is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU General Public Licence |
|
* as published by the Free Software Foundation; either version |
|
* 2 of the Licence, or (at your option) any later version. |
|
*/ |
|
#include <linux/linkage.h> |
|
#include <asm/cpu-regs.h> |
|
#include <asm/smp.h> |
|
#include <asm/thread_info.h> |
|
#include <asm/asm-offsets.h> |
|
#include <asm/frame.inc> |
|
|
|
.macro FPU_INIT_STATE_ALL |
|
fmov 0,fs0 |
|
fmov fs0,fs1 |
|
fmov fs0,fs2 |
|
fmov fs0,fs3 |
|
fmov fs0,fs4 |
|
fmov fs0,fs5 |
|
fmov fs0,fs6 |
|
fmov fs0,fs7 |
|
fmov fs0,fs8 |
|
fmov fs0,fs9 |
|
fmov fs0,fs10 |
|
fmov fs0,fs11 |
|
fmov fs0,fs12 |
|
fmov fs0,fs13 |
|
fmov fs0,fs14 |
|
fmov fs0,fs15 |
|
fmov fs0,fs16 |
|
fmov fs0,fs17 |
|
fmov fs0,fs18 |
|
fmov fs0,fs19 |
|
fmov fs0,fs20 |
|
fmov fs0,fs21 |
|
fmov fs0,fs22 |
|
fmov fs0,fs23 |
|
fmov fs0,fs24 |
|
fmov fs0,fs25 |
|
fmov fs0,fs26 |
|
fmov fs0,fs27 |
|
fmov fs0,fs28 |
|
fmov fs0,fs29 |
|
fmov fs0,fs30 |
|
fmov fs0,fs31 |
|
fmov FPCR_INIT,fpcr |
|
.endm |
|
|
|
.macro FPU_SAVE_ALL areg,dreg |
|
fmov fs0,(\areg+) |
|
fmov fs1,(\areg+) |
|
fmov fs2,(\areg+) |
|
fmov fs3,(\areg+) |
|
fmov fs4,(\areg+) |
|
fmov fs5,(\areg+) |
|
fmov fs6,(\areg+) |
|
fmov fs7,(\areg+) |
|
fmov fs8,(\areg+) |
|
fmov fs9,(\areg+) |
|
fmov fs10,(\areg+) |
|
fmov fs11,(\areg+) |
|
fmov fs12,(\areg+) |
|
fmov fs13,(\areg+) |
|
fmov fs14,(\areg+) |
|
fmov fs15,(\areg+) |
|
fmov fs16,(\areg+) |
|
fmov fs17,(\areg+) |
|
fmov fs18,(\areg+) |
|
fmov fs19,(\areg+) |
|
fmov fs20,(\areg+) |
|
fmov fs21,(\areg+) |
|
fmov fs22,(\areg+) |
|
fmov fs23,(\areg+) |
|
fmov fs24,(\areg+) |
|
fmov fs25,(\areg+) |
|
fmov fs26,(\areg+) |
|
fmov fs27,(\areg+) |
|
fmov fs28,(\areg+) |
|
fmov fs29,(\areg+) |
|
fmov fs30,(\areg+) |
|
fmov fs31,(\areg+) |
|
fmov fpcr,\dreg |
|
mov \dreg,(\areg) |
|
.endm |
|
|
|
.macro FPU_RESTORE_ALL areg,dreg |
|
fmov (\areg+),fs0 |
|
fmov (\areg+),fs1 |
|
fmov (\areg+),fs2 |
|
fmov (\areg+),fs3 |
|
fmov (\areg+),fs4 |
|
fmov (\areg+),fs5 |
|
fmov (\areg+),fs6 |
|
fmov (\areg+),fs7 |
|
fmov (\areg+),fs8 |
|
fmov (\areg+),fs9 |
|
fmov (\areg+),fs10 |
|
fmov (\areg+),fs11 |
|
fmov (\areg+),fs12 |
|
fmov (\areg+),fs13 |
|
fmov (\areg+),fs14 |
|
fmov (\areg+),fs15 |
|
fmov (\areg+),fs16 |
|
fmov (\areg+),fs17 |
|
fmov (\areg+),fs18 |
|
fmov (\areg+),fs19 |
|
fmov (\areg+),fs20 |
|
fmov (\areg+),fs21 |
|
fmov (\areg+),fs22 |
|
fmov (\areg+),fs23 |
|
fmov (\areg+),fs24 |
|
fmov (\areg+),fs25 |
|
fmov (\areg+),fs26 |
|
fmov (\areg+),fs27 |
|
fmov (\areg+),fs28 |
|
fmov (\areg+),fs29 |
|
fmov (\areg+),fs30 |
|
fmov (\areg+),fs31 |
|
mov (\areg),\dreg |
|
fmov \dreg,fpcr |
|
.endm |
|
|
|
############################################################################### |
|
# |
|
# void fpu_init_state(void) |
|
# - initialise the FPU |
|
# |
|
############################################################################### |
|
.globl fpu_init_state |
|
.type fpu_init_state,@function |
|
fpu_init_state: |
|
mov epsw,d0 |
|
or EPSW_FE,epsw |
|
|
|
#ifdef CONFIG_MN10300_PROC_MN103E010 |
|
nop |
|
nop |
|
nop |
|
#endif |
|
FPU_INIT_STATE_ALL |
|
#ifdef CONFIG_MN10300_PROC_MN103E010 |
|
nop |
|
nop |
|
nop |
|
#endif |
|
mov d0,epsw |
|
ret [],0 |
|
|
|
.size fpu_init_state,.-fpu_init_state |
|
|
|
############################################################################### |
|
# |
|
# void fpu_save(struct fpu_state_struct *) |
|
# - save the fpu state |
|
# - note that an FPU Operational exception might occur during this process |
|
# |
|
############################################################################### |
|
.globl fpu_save |
|
.type fpu_save,@function |
|
fpu_save: |
|
mov epsw,d1 |
|
or EPSW_FE,epsw /* enable the FPU so we can access it */ |
|
|
|
#ifdef CONFIG_MN10300_PROC_MN103E010 |
|
nop |
|
nop |
|
#endif |
|
mov d0,a0 |
|
FPU_SAVE_ALL a0,d0 |
|
#ifdef CONFIG_MN10300_PROC_MN103E010 |
|
nop |
|
nop |
|
#endif |
|
|
|
mov d1,epsw |
|
ret [],0 |
|
|
|
.size fpu_save,.-fpu_save |
|
|
|
############################################################################### |
|
# |
|
# void fpu_disabled(void) |
|
# - handle an exception due to the FPU being disabled |
|
# when CONFIG_FPU is enabled |
|
# |
|
############################################################################### |
|
.type fpu_disabled,@function |
|
.globl fpu_disabled |
|
fpu_disabled: |
|
or EPSW_nAR|EPSW_FE,epsw |
|
nop |
|
nop |
|
nop |
|
|
|
mov sp,a1 |
|
mov (a1),d1 /* get epsw of user context */ |
|
and ~(THREAD_SIZE-1),a1 /* a1: (thread_info *ti) */ |
|
mov (TI_task,a1),a2 /* a2: (task_struct *tsk) */ |
|
btst EPSW_nSL,d1 |
|
beq fpu_used_in_kernel |
|
|
|
or EPSW_FE,d1 |
|
mov d1,(sp) |
|
mov (TASK_THREAD+THREAD_FPU_FLAGS,a2),d1 |
|
#ifndef CONFIG_LAZY_SAVE_FPU |
|
or __THREAD_HAS_FPU,d1 |
|
mov d1,(TASK_THREAD+THREAD_FPU_FLAGS,a2) |
|
#else /* !CONFIG_LAZY_SAVE_FPU */ |
|
mov (fpu_state_owner),a0 |
|
cmp 0,a0 |
|
beq fpu_regs_save_end |
|
|
|
mov (TASK_THREAD+THREAD_UREGS,a0),a1 |
|
add TASK_THREAD+THREAD_FPU_STATE,a0 |
|
FPU_SAVE_ALL a0,d0 |
|
|
|
mov (REG_EPSW,a1),d0 |
|
and ~EPSW_FE,d0 |
|
mov d0,(REG_EPSW,a1) |
|
|
|
fpu_regs_save_end: |
|
mov a2,(fpu_state_owner) |
|
#endif /* !CONFIG_LAZY_SAVE_FPU */ |
|
|
|
btst __THREAD_USING_FPU,d1 |
|
beq fpu_regs_init |
|
add TASK_THREAD+THREAD_FPU_STATE,a2 |
|
FPU_RESTORE_ALL a2,d0 |
|
rti |
|
|
|
fpu_regs_init: |
|
FPU_INIT_STATE_ALL |
|
add TASK_THREAD+THREAD_FPU_FLAGS,a2 |
|
bset __THREAD_USING_FPU,(0,a2) |
|
rti |
|
|
|
fpu_used_in_kernel: |
|
and ~(EPSW_nAR|EPSW_FE),epsw |
|
nop |
|
nop |
|
|
|
add -4,sp |
|
SAVE_ALL |
|
mov -1,d0 |
|
mov d0,(REG_ORIG_D0,fp) |
|
|
|
and ~EPSW_NMID,epsw |
|
|
|
mov fp,d0 |
|
call fpu_disabled_in_kernel[],0 |
|
jmp ret_from_exception |
|
|
|
.size fpu_disabled,.-fpu_disabled
|
|
|