12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /* MN10300 Microcontroller core system register definitions -*- asm -*-
- *
- * 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.
- */
- #ifndef _ASM_FRAME_INC
- #define _ASM_FRAME_INC
- #ifndef __ASSEMBLY__
- #error not for use in C files
- #endif
- #ifndef __ASM_OFFSETS_H__
- #include <asm/asm-offsets.h>
- #endif
- #include <asm/thread_info.h>
- #define pi break
- #define fp a3
- ###############################################################################
- #
- # build a stack frame from the registers
- # - the caller has subtracted 4 from SP before coming here
- #
- ###############################################################################
- .macro SAVE_ALL
- add -4,sp # next exception frame ptr save area
- movm [other],(sp)
- mov usp,a1
- mov a1,(sp) # USP in MOVM[other] dummy slot
- movm [d2,d3,a2,a3,exreg0,exreg1,exother],(sp)
- mov sp,fp # FRAME pointer in A3
- add -12,sp # allow for calls to be made
- # push the exception frame onto the front of the list
- GET_THREAD_INFO a1
- mov (TI_frame,a1),a0
- mov a0,(REG_NEXT,fp)
- mov fp,(TI_frame,a1)
- # disable the FPU inside the kernel
- and ~EPSW_FE,epsw
- # we may be holding current in E2
- #ifdef CONFIG_MN10300_CURRENT_IN_E2
- mov (__current),e2
- #endif
- .endm
- ###############################################################################
- #
- # restore the registers from a stack frame
- #
- ###############################################################################
- .macro RESTORE_ALL
- # peel back the stack to the calling frame
- # - we need that when returning from interrupts to kernel mode
- GET_THREAD_INFO a0
- mov (TI_frame,a0),fp
- mov fp,sp
- mov (REG_NEXT,fp),d0
- mov d0,(TI_frame,a0) # userspace has regs->next == 0
- #ifndef CONFIG_MN10300_USING_JTAG
- mov (REG_EPSW,fp),d0
- btst EPSW_T,d0
- beq 99f
- or EPSW_NMID,epsw
- movhu (DCR),d1
- or 0x0001, d1
- movhu d1,(DCR)
- 99:
- #endif
- movm (sp),[d2,d3,a2,a3,exreg0,exreg1,exother]
- # must restore usp even if returning to kernel space,
- # when CONFIG_PREEMPT is enabled.
- mov (sp),a1 # USP in MOVM[other] dummy slot
- mov a1,usp
- movm (sp),[other]
- add 8,sp
- rti
- .endm
- #endif /* _ASM_FRAME_INC */
|