Commit aec917cc authored by Greg Ungerer's avatar Greg Ungerer Committed by Linus Torvalds

[PATCH] remove common code from m68knommu/68328 entry.S

This converts the current m68knommu/68328 entry.S file to use the new
entry.h, and also removes all the common entry.S code that is now in the
common m68knommu/kernel/entry.S.
parent 3adb2fe2
/* -*- mode: asm -*- /*
* * linux/arch/m68knommu/platform/68328/entry.S
* linux/arch/m68k/kernel/entry.S
* *
* Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1991, 1992 Linus Torvalds
* *
...@@ -9,87 +8,35 @@ ...@@ -9,87 +8,35 @@
* for more details. * for more details.
* *
* Linux/m68k support by Hamish Macdonald * Linux/m68k support by Hamish Macdonald
*
*/
/*
* entry.S contains the system-call and fault low-level handling routines.
* This also contains the timer-interrupt handler, as well as all interrupts
* and faults that can result in a task-switch.
*
* NOTE: This code handles signal-recognition, which happens every time
* after a timer-interrupt and after each system call.
*
*/
/*
* 12/03/96 Jes: Currently we only support m68k single-cpu systems, so
* all pointers that used to be 'current' are now entry
* number 0 in the 'current_set' list.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/sys.h> #include <linux/sys.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/entry.h>
#include <asm/errno.h> #include <asm/errno.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/segment.h> #include <asm/segment.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/entry.h>
#define IMMED # .text
#define DBG_PUTC(x) moveb IMMED x,0xfffff907; \
moveb IMMED '\r',0xfffff907; \
moveb IMMED '\n',0xfffff907
.globl system_call, buserr, trap .globl system_call
.globl resume, ret_from_exception .globl resume
.globl ret_from_exception
.globl ret_from_signal .globl ret_from_signal
.globl sys_call_table .globl sys_call_table
.globl sys_fork, sys_clone, sys_vfork .globl ret_from_interrupt
.globl ret_from_interrupt, bad_interrupt .globl bad_interrupt
.globl inthandler1, inthandler2, inthandler3, inthandler4 .globl inthandler1
.globl inthandler5, inthandler6, inthandler7 .globl inthandler2
.globl inthandler3
.text .globl inthandler4
ENTRY(buserr) .globl inthandler5
SAVE_ALL_INT .globl inthandler6
GET_CURRENT(%d0) .globl inthandler7
movel %sp,%sp@- /* stack frame pointer argument*/
bsrw buserr_c
addql #4,%sp
jra ret_from_exception
ENTRY(trap)
SAVE_ALL_INT
GET_CURRENT(%d0)
movel %sp,%sp@- /* stack frame pointer argument*/
bsrw trap_c
addql #4,%sp
jra ret_from_exception
ENTRY(reschedule)
/* save top of frame*/
pea %sp@
jbsr set_esp0
addql #4,%sp
pea ret_from_exception
jmp schedule
/* After a fork we jump here directly from resume,*/
/* so that %d1 contains the previous task*/
/* Theoretically only needed on SMP, but let's watch*/
/* what happens in schedule_tail() in future...*/
ENTRY(ret_from_fork)
#ifdef CONFIG_SMP
movel %d1,%sp@-
jsr schedule_tail
addql #4,%sp
#endif
jra ret_from_exception
badsys: badsys:
movel #-ENOSYS,%sp@(PT_D0) movel #-ENOSYS,%sp@(PT_D0)
...@@ -110,8 +57,8 @@ do_trace: ...@@ -110,8 +57,8 @@ do_trace:
lea sys_call_table, %a0 lea sys_call_table, %a0
jbsr %a0@(%d1) jbsr %a0@(%d1)
1: movel %d0,%sp@(PT_D0) /* save the return value*/ 1: movel %d0,%sp@(PT_D0) /* save the return value */
subql #4,%sp /* dummy return address*/ subql #4,%sp /* dummy return address */
SAVE_SWITCH_STACK SAVE_SWITCH_STACK
jbsr syscall_trace jbsr syscall_trace
...@@ -121,9 +68,8 @@ ret_from_signal: ...@@ -121,9 +68,8 @@ ret_from_signal:
jra ret_from_exception jra ret_from_exception
ENTRY(system_call) ENTRY(system_call)
SAVE_ALL_SYS SAVE_ALL
GET_CURRENT(%d1)
/* save top of frame*/ /* save top of frame*/
pea %sp@ pea %sp@
jbsr set_esp0 jbsr set_esp0
...@@ -178,13 +124,11 @@ Lreturn: ...@@ -178,13 +124,11 @@ Lreturn:
RESTORE_ALL RESTORE_ALL
/* /*
** This is the main interrupt handler, responsible for calling process_int() * This is the main interrupt handler, responsible for calling process_int()
*/ */
inthandler1: inthandler1:
SAVE_ALL_INT SAVE_ALL
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/ addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0 movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0 and #0x3ff, %d0
...@@ -195,10 +139,8 @@ inthandler1: ...@@ -195,10 +139,8 @@ inthandler1:
bra ret_from_interrupt bra ret_from_interrupt
inthandler2: inthandler2:
SAVE_ALL_INT SAVE_ALL
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/ addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0 movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0 and #0x3ff, %d0
...@@ -209,10 +151,8 @@ inthandler2: ...@@ -209,10 +151,8 @@ inthandler2:
bra ret_from_interrupt bra ret_from_interrupt
inthandler3: inthandler3:
SAVE_ALL_INT SAVE_ALL
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/ addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0 movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0 and #0x3ff, %d0
...@@ -223,10 +163,8 @@ inthandler3: ...@@ -223,10 +163,8 @@ inthandler3:
bra ret_from_interrupt bra ret_from_interrupt
inthandler4: inthandler4:
SAVE_ALL_INT SAVE_ALL
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/ addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0 movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0 and #0x3ff, %d0
...@@ -237,10 +175,8 @@ inthandler4: ...@@ -237,10 +175,8 @@ inthandler4:
bra ret_from_interrupt bra ret_from_interrupt
inthandler5: inthandler5:
SAVE_ALL_INT SAVE_ALL
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/ addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0 movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0 and #0x3ff, %d0
...@@ -251,10 +187,8 @@ inthandler5: ...@@ -251,10 +187,8 @@ inthandler5:
bra ret_from_interrupt bra ret_from_interrupt
inthandler6: inthandler6:
SAVE_ALL_INT SAVE_ALL
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/ addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0 movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0 and #0x3ff, %d0
...@@ -265,10 +199,8 @@ inthandler6: ...@@ -265,10 +199,8 @@ inthandler6:
bra ret_from_interrupt bra ret_from_interrupt
inthandler7: inthandler7:
SAVE_ALL_INT SAVE_ALL
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/ addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0 movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0 and #0x3ff, %d0
...@@ -278,67 +210,9 @@ inthandler7: ...@@ -278,67 +210,9 @@ inthandler7:
3: addql #8,%sp /* pop parameters off stack*/ 3: addql #8,%sp /* pop parameters off stack*/
bra ret_from_interrupt bra ret_from_interrupt
inthandler8:
SAVE_ALL_INT
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0
movel %sp,%sp@-
movel #72,%sp@- /* put vector # on stack*/
jbsr process_int /* process the IRQ*/
3: addql #8,%sp /* pop parameters off stack*/
bra ret_from_interrupt
timerhandler:
SAVE_ALL_INT
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0
movel %sp,%sp@-
movel #0x40,%sp@- /* put vector # on stack*/
jbsr process_int /* process the IRQ*/
3: addql #8,%sp /* pop parameters off stack*/
bra ret_from_interrupt
serialhandler:
SAVE_ALL_INT
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0
movel %sp,%sp@-
movel #0x42,%sp@- /* put vector # on stack*/
jbsr process_int /* process the IRQ*/
3: addql #8,%sp /* pop parameters off stack*/
bra ret_from_interrupt
inthandler_wrap:
SAVE_ALL_INT
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0
movel %sp,%sp@-
movel %d0,%sp@- /* put vector # on stack*/
jbsr process_int /* process the IRQ*/
3: addql #8,%sp /* pop parameters off stack*/
bra ret_from_interrupt
inthandler: inthandler:
SAVE_ALL_INT SAVE_ALL
GET_CURRENT(%d0)
addql #1,local_irq_count /* put exception # in d0*/ addql #1,local_irq_count /* put exception # in d0*/
/* bfextu %sp@(PT_VECTOR){#4,#10},%d0 */
movew %sp@(PT_VECTOR), %d0 movew %sp@(PT_VECTOR), %d0
and #0x3ff, %d0 and #0x3ff, %d0
...@@ -354,18 +228,11 @@ ret_from_interrupt: ...@@ -354,18 +228,11 @@ ret_from_interrupt:
2: 2:
RESTORE_ALL RESTORE_ALL
1: 1:
#if 1
/* bfextu %sp@(PT_SR){#5,#3},%d0 */ /* Check for nested interrupt.*/
moveb %sp@(PT_SR), %d0 moveb %sp@(PT_SR), %d0
and #7, %d0 and #7, %d0
#if MAX_NOINT_IPL > 0
cmpiw #MAX_NOINT_IPL,%d0
#endif
jhi 2b jhi 2b
#endif
/* check if we need to do software interrupts */
/* check if we need to do software interrupts */
movel local_irq_count,%d0 movel local_irq_count,%d0
jeq ret_from_exception jeq ret_from_exception
...@@ -373,111 +240,31 @@ ret_from_interrupt: ...@@ -373,111 +240,31 @@ ret_from_interrupt:
jra do_softirq jra do_softirq
/* Handler for uninitialized and spurious interrupts */ /*
* Handler for uninitialized and spurious interrupts.
bad_interrupt: */
ENTRY(bad_interrupt)
addql #1,num_spurious addql #1,num_spurious
rte rte
ENTRY(sys_fork) /*
SAVE_SWITCH_STACK * Beware - when entering resume, prev (the current task) is
pea %sp@(SWITCH_STACK_SIZE) * in a0, next (the new task) is in a1,so don't change these
jbsr m68k_fork * registers until their contents are no longer needed.
addql #4,%sp */
RESTORE_SWITCH_STACK ENTRY(resume)
rts movel %a0,%d1 /* save prev thread in d1 */
movew %sr,%a0@(TASK_THREAD+THREAD_SR) /* save sr */
ENTRY(sys_clone) movel %usp,%a2 /* save usp */
SAVE_SWITCH_STACK
pea %sp@(SWITCH_STACK_SIZE)
jbsr m68k_clone
addql #4,%sp
RESTORE_SWITCH_STACK
rts
ENTRY(sys_vfork)
SAVE_SWITCH_STACK
pea %sp@(SWITCH_STACK_SIZE)
jbsr m68k_vfork
addql #4,%sp
RESTORE_SWITCH_STACK
rts
ENTRY(sys_sigsuspend)
SAVE_SWITCH_STACK
pea %sp@(SWITCH_STACK_SIZE)
jbsr do_sigsuspend
addql #4,%sp
RESTORE_SWITCH_STACK
rts
ENTRY(sys_rt_sigsuspend)
SAVE_SWITCH_STACK
pea %sp@(SWITCH_STACK_SIZE)
jbsr do_rt_sigsuspend
addql #4,%sp
RESTORE_SWITCH_STACK
rts
ENTRY(sys_sigreturn)
SAVE_SWITCH_STACK
jbsr do_sigreturn
RESTORE_SWITCH_STACK
rts
ENTRY(sys_rt_sigreturn)
SAVE_SWITCH_STACK
jbsr do_rt_sigreturn
RESTORE_SWITCH_STACK
rts
resume:
/*
* Beware - when entering resume, prev (the current task) is
* in a0, next (the new task) is in a1,so don't change these
* registers until their contents are no longer needed.
*/
/* save prev thread in d1 */
movel %a0,%d1
/* save sr */
movew %sr,%a0@(TASK_THREAD+THREAD_SR)
#ifdef USE_SFC_DFC
/* save fs (sfc,%dfc) (may be pointing to kernel memory) */
movec %sfc,%d0
movew %d0,%a0@(TASK_THREAD+THREAD_FS)
#endif
/* save non-scratch registers on stack */
SAVE_SWITCH_STACK
/* save usp */
/* it is better to use a movel here instead of a movew 8*) */
movel %usp,%a2
movel %a2,%a0@(TASK_THREAD+THREAD_USP) movel %a2,%a0@(TASK_THREAD+THREAD_USP)
/* save current kernel stack pointer */ SAVE_SWITCH_STACK
movel %sp,%a0@(TASK_THREAD+THREAD_KSP) movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */
movel %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */
/* restore the kernel stack pointer */
movel %a1@(TASK_THREAD+THREAD_KSP),%sp
/* restore non-scratch registers */
RESTORE_SWITCH_STACK RESTORE_SWITCH_STACK
/* restore user stack pointer */ movel %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore user stack */
movel %a1@(TASK_THREAD+THREAD_USP),%a0
movel %a0,%usp movel %a0,%usp
movew %a1@(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */
#ifdef USE_SFC_DFC
/* restore fs (sfc,%dfc) */
movew %a1@(TASK_THREAD+THREAD_FS),%a0
movec %a0,%sfc
movec %a0,%dfc
#endif
/* restore status register */
movew %a1@(TASK_THREAD+THREAD_SR),%sr
rts rts
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment