linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / m32r / kernel / entry.S
index 5b01fd2..3871b65 100644 (file)
  * Stack layout in 'ret_from_system_call':
  *     ptrace needs to have all regs on the stack.
  *     if the order here is changed, it needs to be
- *     updated in fork.c:copy_thread, signal.c:do_signal,
+ *     updated in fork.c:copy_process, signal.c:do_signal,
  *     ptrace.c and ptrace.h
  *
- * M32R/M32Rx/M32R2
- *       @(sp)      - r4
- *       @(0x04,sp) - r5
- *       @(0x08,sp) - r6
- *       @(0x0c,sp) - *pt_regs
- *       @(0x10,sp) - r0
- *       @(0x14,sp) - r1
- *       @(0x18,sp) - r2
- *       @(0x1c,sp) - r3
- *       @(0x20,sp) - r7
- *       @(0x24,sp) - r8
- *       @(0x28,sp) - r9
- *       @(0x2c,sp) - r10
- *       @(0x30,sp) - r11
- *       @(0x34,sp) - r12
- *       @(0x38,sp) - syscall_nr
- *       @(0x3c,sp) - acc0h
- *       @(0x40,sp) - acc0l
- *       @(0x44,sp) - acc1h            ; ISA_DSP_LEVEL2 only
- *       @(0x48,sp) - acc1l            ; ISA_DSP_LEVEL2 only
- *       @(0x4c,sp) - psw
- *       @(0x50,sp) - bpc
- *       @(0x54,sp) - bbpsw
- *       @(0x58,sp) - bbpc
- *       @(0x5c,sp) - spu (cr3)
- *       @(0x60,sp) - fp (r13)
- *       @(0x64,sp) - lr (r14)
+ * M32Rx/M32R2                         M32R
+ *       @(sp)      - r4               ditto
+ *       @(0x04,sp) - r5               ditto
+ *       @(0x08,sp) - r6               ditto
+ *       @(0x0c,sp) - *pt_regs         ditto
+ *       @(0x10,sp) - r0               ditto
+ *       @(0x14,sp) - r1               ditto
+ *       @(0x18,sp) - r2               ditto
+ *       @(0x1c,sp) - r3               ditto
+ *       @(0x20,sp) - r7               ditto
+ *       @(0x24,sp) - r8               ditto
+ *       @(0x28,sp) - r9               ditto
+ *       @(0x2c,sp) - r10              ditto
+ *       @(0x30,sp) - r11              ditto
+ *       @(0x34,sp) - r12              ditto
+ *       @(0x38,sp) - syscall_nr       ditto
+ *       @(0x3c,sp) - acc0h            @(0x3c,sp) - acch
+ *       @(0x40,sp) - acc0l            @(0x40,sp) - accl
+ *       @(0x44,sp) - acc1h            @(0x44,sp) - psw
+ *       @(0x48,sp) - acc1l            @(0x48,sp) - bpc
+ *       @(0x4c,sp) - psw              @(0x4c,sp) - bbpsw
+ *       @(0x50,sp) - bpc              @(0x50,sp) - bbpc
+ *       @(0x54,sp) - bbpsw            @(0x54,sp) - spu (cr3)
+ *       @(0x58,sp) - bbpc             @(0x58,sp) - fp (r13)
+ *       @(0x5c,sp) - spu (cr3)                @(0x5c,sp) - lr (r14)
+ *       @(0x60,sp) - fp (r13)         @(0x60,sp) - spi (cr12)
+ *       @(0x64,sp) - lr (r14)         @(0x64,sp) - orig_r0
  *       @(0x68,sp) - spi (cr2)
  *       @(0x6c,sp) - orig_r0
+ *
  */
 
+#include <linux/config.h>
 #include <linux/linkage.h>
 #include <asm/irq.h>
 #include <asm/unistd.h>
@@ -95,6 +97,7 @@
 #define R11(reg)               @(0x30,reg)
 #define R12(reg)               @(0x34,reg)
 #define SYSCALL_NR(reg)                @(0x38,reg)
+#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
 #define ACC0H(reg)             @(0x3C,reg)
 #define ACC0L(reg)             @(0x40,reg)
 #define ACC1H(reg)             @(0x44,reg)
 #define LR(reg)                        @(0x64,reg)
 #define SP(reg)                        @(0x68,reg)
 #define ORIG_R0(reg)           @(0x6C,reg)
+#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
+#define ACCH(reg)              @(0x3C,reg)
+#define ACCL(reg)              @(0x40,reg)
+#define PSW(reg)               @(0x44,reg)
+#define BPC(reg)               @(0x48,reg)
+#define BBPSW(reg)             @(0x4C,reg)
+#define BBPC(reg)              @(0x50,reg)
+#define SPU(reg)               @(0x54,reg)
+#define FP(reg)                        @(0x58,reg)  /* FP = R13 */
+#define LR(reg)                        @(0x5C,reg)
+#define SP(reg)                        @(0x60,reg)
+#define ORIG_R0(reg)           @(0x64,reg)
+#else
+#error unknown isa configuration
+#endif
 
 CF_MASK                = 0x00000001
 TF_MASK                = 0x00000100
@@ -124,7 +142,7 @@ VM_MASK             = 0x00020000
 #endif
 
 ENTRY(ret_from_fork)
-       pop     r0
+       ld      r0, @sp+
        bl      schedule_tail
        GET_THREAD_INFO(r8)
        bra     syscall_exit
@@ -213,7 +231,7 @@ restore_all:
        RESTORE_ALL
 
        # perform work that needs to be done immediately before resumption
-       # r9 : flags
+       # r9 : frags
        ALIGN
 work_pending:
        and3    r4, r9, #_TIF_NEED_RESCHED
@@ -302,7 +320,7 @@ ENTRY(ei_handler)
 ;    GET_ICU_STATUS;
        seth    r0, #shigh(M32R_ICU_ISTS_ADDR)
        ld      r0, @(low(M32R_ICU_ISTS_ADDR),r0)
-       push    r0
+       st      r0, @-sp
 #if defined(CONFIG_SMP)
        /*
         * If IRQ == 0      --> Nothing to do,  Not write IMASK
@@ -539,7 +557,7 @@ check_end:
 #endif  /* CONFIG_PLAT_M32104UT */
        bl      do_IRQ
 #endif  /* CONFIG_SMP */
-       pop     r14
+       ld      r14, @sp+
        seth    r0, #shigh(M32R_ICU_IMASK_ADDR)
        st      r14, @(low(M32R_ICU_IMASK_ADDR),r0)
 #else
@@ -997,3 +1015,4 @@ ENTRY(sys_call_table)
        .long sys_waitid
 
 syscall_table_size=(.-sys_call_table)
+