1/* MN10300 Microcontroller core system register definitions -*- asm -*- 2 * 3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public Licence 8 * as published by the Free Software Foundation; either version 9 * 2 of the Licence, or (at your option) any later version. 10 */ 11#ifndef _ASM_FRAME_INC 12#define _ASM_FRAME_INC 13 14#ifndef __ASSEMBLY__ 15#error not for use in C files 16#endif 17 18#ifndef __ASM_OFFSETS_H__ 19#include <asm/asm-offsets.h> 20#endif 21#include <asm/thread_info.h> 22 23#define pi break 24 25#define fp a3 26 27############################################################################### 28# 29# build a stack frame from the registers 30# - the caller has subtracted 4 from SP before coming here 31# 32############################################################################### 33.macro SAVE_ALL 34 add -4,sp # next exception frame ptr save area 35 movm [other],(sp) 36 mov usp,a1 37 mov a1,(sp) # USP in MOVM[other] dummy slot 38 movm [d2,d3,a2,a3,exreg0,exreg1,exother],(sp) 39 mov sp,fp # FRAME pointer in A3 40 add -12,sp # allow for calls to be made 41 42 # push the exception frame onto the front of the list 43 GET_THREAD_INFO a1 44 mov (TI_frame,a1),a0 45 mov a0,(REG_NEXT,fp) 46 mov fp,(TI_frame,a1) 47 48 # disable the FPU inside the kernel 49 and ~EPSW_FE,epsw 50 51 # we may be holding current in E2 52#ifdef CONFIG_MN10300_CURRENT_IN_E2 53 mov (__current),e2 54#endif 55.endm 56 57############################################################################### 58# 59# restore the registers from a stack frame 60# 61############################################################################### 62.macro RESTORE_ALL 63 # peel back the stack to the calling frame 64 # - we need that when returning from interrupts to kernel mode 65 GET_THREAD_INFO a0 66 mov (TI_frame,a0),fp 67 mov fp,sp 68 mov (REG_NEXT,fp),d0 69 mov d0,(TI_frame,a0) # userspace has regs->next == 0 70 71#ifndef CONFIG_MN10300_USING_JTAG 72 mov (REG_EPSW,fp),d0 73 btst EPSW_T,d0 74 beq 99f 75 76 or EPSW_NMID,epsw 77 movhu (DCR),d1 78 or 0x0001, d1 79 movhu d1,(DCR) 80 8199: 82#endif 83 movm (sp),[d2,d3,a2,a3,exreg0,exreg1,exother] 84 85 # must restore usp even if returning to kernel space, 86 # when CONFIG_PREEMPT is enabled. 87 mov (sp),a1 # USP in MOVM[other] dummy slot 88 mov a1,usp 89 90 movm (sp),[other] 91 add 8,sp 92 rti 93 94.endm 95 96 97#endif /* _ASM_FRAME_INC */ 98