~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to arch/m68k/platform/coldfire/entry.S

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  linux/arch/m68knommu/platform/5307/entry.S
 
3
 *
 
4
 *  Copyright (C) 1999-2007, Greg Ungerer (gerg@snapgear.com)
 
5
 *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
 
6
 *                      Kenneth Albanowski <kjahds@kjahds.com>,
 
7
 *  Copyright (C) 2000  Lineo Inc. (www.lineo.com)
 
8
 *  Copyright (C) 2004-2006  Macq Electronique SA. (www.macqel.com)
 
9
 *
 
10
 * Based on:
 
11
 *
 
12
 *  linux/arch/m68k/kernel/entry.S
 
13
 *
 
14
 *  Copyright (C) 1991, 1992  Linus Torvalds
 
15
 *
 
16
 * This file is subject to the terms and conditions of the GNU General Public
 
17
 * License.  See the file README.legal in the main directory of this archive
 
18
 * for more details.
 
19
 *
 
20
 * Linux/m68k support by Hamish Macdonald
 
21
 *
 
22
 * 68060 fixes by Jesper Skov
 
23
 * ColdFire support by Greg Ungerer (gerg@snapgear.com)
 
24
 * 5307 fixes by David W. Miller
 
25
 * linux 2.4 support David McCullough <davidm@snapgear.com>
 
26
 * Bug, speed and maintainability fixes by Philippe De Muyter <phdm@macqel.be>
 
27
 */
 
28
 
 
29
#include <linux/linkage.h>
 
30
#include <asm/unistd.h>
 
31
#include <asm/thread_info.h>
 
32
#include <asm/errno.h>
 
33
#include <asm/setup.h>
 
34
#include <asm/segment.h>
 
35
#include <asm/asm-offsets.h>
 
36
#include <asm/entry.h>
 
37
 
 
38
#ifdef CONFIG_COLDFIRE_SW_A7
 
39
/*
 
40
 *      Define software copies of the supervisor and user stack pointers.
 
41
 */
 
42
.bss
 
43
sw_ksp:
 
44
.long   0
 
45
sw_usp:
 
46
.long   0
 
47
#endif /* CONFIG_COLDFIRE_SW_A7 */
 
48
 
 
49
.text
 
50
 
 
51
.globl system_call
 
52
.globl resume
 
53
.globl ret_from_exception
 
54
.globl ret_from_signal
 
55
.globl sys_call_table
 
56
.globl inthandler
 
57
.globl fasthandler
 
58
 
 
59
enosys:
 
60
        mov.l   #sys_ni_syscall,%d3
 
61
        bra     1f
 
62
 
 
63
ENTRY(system_call)
 
64
        SAVE_ALL
 
65
        move    #0x2000,%sr             /* enable intrs again */
 
66
 
 
67
        cmpl    #NR_syscalls,%d0
 
68
        jcc     enosys
 
69
        lea     sys_call_table,%a0
 
70
        lsll    #2,%d0                  /* movel %a0@(%d0:l:4),%d3 */
 
71
        movel   %a0@(%d0),%d3
 
72
        jeq     enosys
 
73
 
 
74
1:
 
75
        movel   %sp,%d2                 /* get thread_info pointer */
 
76
        andl    #-THREAD_SIZE,%d2       /* at start of kernel stack */
 
77
        movel   %d2,%a0
 
78
        movel   %a0@,%a1                /* save top of frame */
 
79
        movel   %sp,%a1@(TASK_THREAD+THREAD_ESP0)
 
80
        btst    #(TIF_SYSCALL_TRACE%8),%a0@(TINFO_FLAGS+(31-TIF_SYSCALL_TRACE)/8)
 
81
        bnes    1f
 
82
 
 
83
        movel   %d3,%a0
 
84
        jbsr    %a0@
 
85
        movel   %d0,%sp@(PT_OFF_D0)     /* save the return value */
 
86
        jra     ret_from_exception
 
87
1:
 
88
        movel   #-ENOSYS,%d2            /* strace needs -ENOSYS in PT_OFF_D0 */
 
89
        movel   %d2,PT_OFF_D0(%sp)      /* on syscall entry */
 
90
        subql   #4,%sp
 
91
        SAVE_SWITCH_STACK
 
92
        jbsr    syscall_trace_enter
 
93
        RESTORE_SWITCH_STACK
 
94
        addql   #4,%sp
 
95
        movel   %d3,%a0
 
96
        jbsr    %a0@
 
97
        movel   %d0,%sp@(PT_OFF_D0)             /* save the return value */
 
98
        subql   #4,%sp                  /* dummy return address */
 
99
        SAVE_SWITCH_STACK
 
100
        jbsr    syscall_trace_leave
 
101
 
 
102
ret_from_signal:
 
103
        RESTORE_SWITCH_STACK
 
104
        addql   #4,%sp
 
105
 
 
106
ret_from_exception:
 
107
        move    #0x2700,%sr             /* disable intrs */
 
108
        btst    #5,%sp@(PT_OFF_SR)      /* check if returning to kernel */
 
109
        jeq     Luser_return            /* if so, skip resched, signals */
 
110
 
 
111
#ifdef CONFIG_PREEMPT
 
112
        movel   %sp,%d1                 /* get thread_info pointer */
 
113
        andl    #-THREAD_SIZE,%d1       /* at base of kernel stack */
 
114
        movel   %d1,%a0
 
115
        movel   %a0@(TINFO_FLAGS),%d1   /* get thread_info->flags */
 
116
        andl    #(1<<TIF_NEED_RESCHED),%d1
 
117
        jeq     Lkernel_return
 
118
 
 
119
        movel   %a0@(TINFO_PREEMPT),%d1
 
120
        cmpl    #0,%d1
 
121
        jne     Lkernel_return
 
122
 
 
123
        pea     Lkernel_return
 
124
        jmp     preempt_schedule_irq    /* preempt the kernel */
 
125
#endif
 
126
 
 
127
Lkernel_return:
 
128
        moveml  %sp@,%d1-%d5/%a0-%a2
 
129
        lea     %sp@(32),%sp            /* space for 8 regs */
 
130
        movel   %sp@+,%d0
 
131
        addql   #4,%sp                  /* orig d0 */
 
132
        addl    %sp@+,%sp               /* stk adj */
 
133
        rte
 
134
 
 
135
Luser_return:
 
136
        movel   %sp,%d1                 /* get thread_info pointer */
 
137
        andl    #-THREAD_SIZE,%d1       /* at base of kernel stack */
 
138
        movel   %d1,%a0
 
139
        movel   %a0@(TINFO_FLAGS),%d1   /* get thread_info->flags */
 
140
        jne     Lwork_to_do             /* still work to do */
 
141
 
 
142
Lreturn:
 
143
        RESTORE_USER
 
144
 
 
145
Lwork_to_do:
 
146
        movel   %a0@(TINFO_FLAGS),%d1   /* get thread_info->flags */
 
147
        move    #0x2000,%sr             /* enable intrs again */
 
148
        btst    #TIF_NEED_RESCHED,%d1
 
149
        jne     reschedule
 
150
 
 
151
        /* GERG: do we need something here for TRACEing?? */
 
152
 
 
153
Lsignal_return:
 
154
        subql   #4,%sp                  /* dummy return address */
 
155
        SAVE_SWITCH_STACK
 
156
        pea     %sp@(SWITCH_STACK_SIZE)
 
157
        jsr     do_signal
 
158
        addql   #4,%sp
 
159
        RESTORE_SWITCH_STACK
 
160
        addql   #4,%sp
 
161
        jmp     Luser_return
 
162
 
 
163
/*
 
164
 * This is the generic interrupt handler (for all hardware interrupt
 
165
 * sources). Calls up to high level code to do all the work.
 
166
 */
 
167
ENTRY(inthandler)
 
168
        SAVE_ALL
 
169
        moveq   #-1,%d0
 
170
        movel   %d0,%sp@(PT_OFF_ORIG_D0)
 
171
 
 
172
        movew   %sp@(PT_OFF_FORMATVEC),%d0 /* put exception # in d0 */
 
173
        andl    #0x03fc,%d0             /* mask out vector only */
 
174
 
 
175
        movel   %sp,%sp@-               /* push regs arg */
 
176
        lsrl    #2,%d0                  /* calculate real vector # */
 
177
        movel   %d0,%sp@-               /* push vector number */
 
178
        jbsr    do_IRQ                  /* call high level irq handler */
 
179
        lea     %sp@(8),%sp             /* pop args off stack */
 
180
 
 
181
        bra     ret_from_exception
 
182
 
 
183
/*
 
184
 * Beware - when entering resume, prev (the current task) is
 
185
 * in a0, next (the new task) is in a1,so don't change these
 
186
 * registers until their contents are no longer needed.
 
187
 * This is always called in supervisor mode, so don't bother to save
 
188
 * and restore sr; user's process sr is actually in the stack.
 
189
 */
 
190
ENTRY(resume)
 
191
        movel   %a0, %d1                        /* get prev thread in d1 */
 
192
        RDUSP
 
193
        movel   %a2,%a0@(TASK_THREAD+THREAD_USP)
 
194
 
 
195
        SAVE_SWITCH_STACK
 
196
        movel   %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */
 
197
        movel   %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */
 
198
        RESTORE_SWITCH_STACK
 
199
 
 
200
        movel   %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore thread user stack */
 
201
        WRUSP
 
202
        rts