| /* 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 */ |