123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /* 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
- #ifdef CONFIG_SMP
- #include <proc/smp-regs.h>
- #endif
- #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
- #ifdef CONFIG_SMP
- #ifdef CONFIG_PREEMPT /* FIXME */
- mov epsw,d2
- and ~EPSW_IE,epsw
- #endif
- mov (CPUID),a0
- add a0,a0
- add a0,a0
- mov (___frame,a0),a1
- mov a1,(REG_NEXT,fp)
- mov fp,(___frame,a0)
- #ifdef CONFIG_PREEMPT /* FIXME */
- mov d2,epsw
- #endif
- #else /* CONFIG_SMP */
- mov (__frame),a1
- mov a1,(REG_NEXT,fp)
- mov fp,(__frame)
- #endif /* CONFIG_SMP */
- and ~EPSW_FE,epsw # disable the FPU inside the kernel
- # 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
- # - this permits execve() to discard extra frames due to kernel syscalls
- #ifdef CONFIG_SMP
- #ifdef CONFIG_PREEMPT /* FIXME */
- mov epsw,d2
- and ~EPSW_IE,epsw
- #endif
- mov (CPUID),a0
- add a0,a0
- add a0,a0
- mov (___frame,a0),fp
- mov fp,sp
- mov (REG_NEXT,fp),d0 # userspace has regs->next == 0
- mov d0,(___frame,a0)
- #ifdef CONFIG_PREEMPT /* FIXME */
- mov d2,epsw
- #endif
- #else /* CONFIG_SMP */
- mov (__frame),fp
- mov fp,sp
- mov (REG_NEXT,fp),d0 # userspace has regs->next == 0
- mov d0,(__frame)
- #endif /* CONFIG_SMP */
- #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 */
|