~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/nios2/kernel/entry.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/nios2/kernel/entry.S (Architecture i386) and /arch/alpha/kernel/entry.S (Architecture alpha)


                                                   >>   1 /* SPDX-License-Identifier: GPL-2.0 */
  1 /*                                                  2 /*
  2  * linux/arch/nios2/kernel/entry.S             !!   3  * arch/alpha/kernel/entry.S
  3  *                                                  4  *
  4  * Copyright (C) 2013-2014  Altera Corporation !!   5  * Kernel entry-points.
  5  * Copyright (C) 2009, Wind River Systems Inc  << 
  6  *                                             << 
  7  * Implemented by fredrik.markstrom@gmail.com  << 
  8  *                                             << 
  9  *  Copyright (C) 1999-2002, Greg Ungerer (ger << 
 10  *  Copyright (C) 1998  D. Jeff Dionne <jeff@li << 
 11  *                      Kenneth Albanowski <kja << 
 12  *  Copyright (C) 2000  Lineo Inc. (www.lineo. << 
 13  *  Copyright (C) 2004  Microtronix Datacom Lt << 
 14  *                                             << 
 15  * This file is subject to the terms and condi << 
 16  * License.  See the file "COPYING" in the mai << 
 17  * for more details.                           << 
 18  *                                             << 
 19  * Linux/m68k support by Hamish Macdonald      << 
 20  *                                             << 
 21  * 68060 fixes by Jesper Skov                  << 
 22  * ColdFire support by Greg Ungerer (gerg@snap << 
 23  * 5307 fixes by David W. Miller               << 
 24  * linux 2.4 support David McCullough <davidm@s << 
 25  */                                                 6  */
 26                                                     7 
 27 #include <linux/sys.h>                         << 
 28 #include <linux/linkage.h>                     << 
 29 #include <asm/asm-offsets.h>                        8 #include <asm/asm-offsets.h>
 30 #include <asm/asm-macros.h>                    << 
 31 #include <asm/thread_info.h>                        9 #include <asm/thread_info.h>
                                                   >>  10 #include <asm/pal.h>
 32 #include <asm/errno.h>                             11 #include <asm/errno.h>
 33 #include <asm/setup.h>                         << 
 34 #include <asm/entry.h>                         << 
 35 #include <asm/unistd.h>                            12 #include <asm/unistd.h>
 36 #include <asm/processor.h>                     << 
 37                                                    13 
 38 .macro GET_THREAD_INFO reg                     !!  14         .text
 39 .if THREAD_SIZE & 0xffff0000                   !!  15         .set noat
 40         andhi   \reg, sp, %hi(~(THREAD_SIZE-1) !!  16         .cfi_sections   .debug_frame
 41 .else                                          !!  17 
 42         addi    \reg, r0, %lo(~(THREAD_SIZE-1) !!  18 /* Stack offsets.  */
 43         and     \reg, \reg, sp                 !!  19 #define SP_OFF                  184
 44 .endif                                         !!  20 #define SWITCH_STACK_SIZE       64
                                                   >>  21 
                                                   >>  22 .macro  CFI_START_OSF_FRAME     func
                                                   >>  23         .align  4
                                                   >>  24         .globl  \func
                                                   >>  25         .type   \func,@function
                                                   >>  26 \func:
                                                   >>  27         .cfi_startproc simple
                                                   >>  28         .cfi_return_column 64
                                                   >>  29         .cfi_def_cfa    $sp, 48
                                                   >>  30         .cfi_rel_offset 64, 8
                                                   >>  31         .cfi_rel_offset $gp, 16
                                                   >>  32         .cfi_rel_offset $16, 24
                                                   >>  33         .cfi_rel_offset $17, 32
                                                   >>  34         .cfi_rel_offset $18, 40
 45 .endm                                              35 .endm
 46                                                    36 
 47 .macro  kuser_cmpxchg_check                    !!  37 .macro  CFI_END_OSF_FRAME       func
 48         /*                                     !!  38         .cfi_endproc
 49          * Make sure our user space atomic hel !!  39         .size   \func, . - \func
 50          * interrupted in a critical region.   << 
 51          * ea-4 = address of interrupted insn  << 
 52          * sp = saved regs.                    << 
 53          * cmpxchg_ldw = first critical insn,  << 
 54          * If ea <= cmpxchg_stw and ea > cmpxc << 
 55          * cmpxchg_ldw + 4.                    << 
 56         */                                     << 
 57         /* et = cmpxchg_stw + 4 */             << 
 58         movui   et, (KUSER_BASE + 4 + (cmpxchg << 
 59         bgtu    ea, et, 1f                     << 
 60                                                << 
 61         subi    et, et, (cmpxchg_stw - cmpxchg << 
 62         bltu    ea, et, 1f                     << 
 63         stw     et, PT_EA(sp)   /* fix up EA * << 
 64         mov     ea, et                         << 
 65 1:                                             << 
 66 .endm                                              40 .endm
 67                                                    41 
 68 .section .rodata                               !!  42 /*
 69 .align 4                                       !!  43  * This defines the normal kernel pt-regs layout.
 70 exception_table:                               !!  44  *
 71         .word unhandled_exception       /* 0 - !!  45  * regs 9-15 preserved by C code
 72         .word unhandled_exception       /* 1 - !!  46  * regs 16-18 saved by PAL-code
 73         .word external_interrupt        /* 2 - !!  47  * regs 29-30 saved and set up by PAL-code
 74         .word handle_trap               /* 3 - !!  48  * JRP - Save regs 16-18 in a special area of the stack, so that
 75                                                !!  49  * the palcode-provided values are available to the signal handler.
 76         .word instruction_trap          /* 4 - !!  50  */
 77         .word handle_illegal            /* 5 - !!  51 
 78         .word handle_unaligned          /* 6 - !!  52 .macro  SAVE_ALL
 79         .word handle_unaligned          /* 7 - !!  53         subq    $sp, SP_OFF, $sp
 80                                                !!  54         .cfi_adjust_cfa_offset  SP_OFF
 81         .word handle_diverror           /* 8 - !!  55         stq     $0, 0($sp)
 82         .word protection_exception_ba   /* 9 - !!  56         stq     $1, 8($sp)
 83         .word protection_exception_instr /* 10 !!  57         stq     $2, 16($sp)
 84         .word protection_exception_ba   /* 11  !!  58         stq     $3, 24($sp)
 85                                                !!  59         stq     $4, 32($sp)
 86         .word unhandled_exception       /* 12  !!  60         stq     $28, 144($sp)
 87         .word protection_exception_pte  /* 13  !!  61         .cfi_rel_offset $0, 0
 88         .word protection_exception_pte  /* 14  !!  62         .cfi_rel_offset $1, 8
 89         .word protection_exception_pte  /* 15  !!  63         .cfi_rel_offset $2, 16
 90                                                !!  64         .cfi_rel_offset $3, 24
 91         .word unhandled_exception       /* 16  !!  65         .cfi_rel_offset $4, 32
 92                                                !!  66         .cfi_rel_offset $28, 144
 93 trap_table:                                    !!  67         lda     $2, alpha_mv
 94         .word   handle_system_call      /* 0   !!  68         stq     $5, 40($sp)
 95         .word   handle_trap_1           /* 1   !!  69         stq     $6, 48($sp)
 96         .word   handle_trap_2           /* 2   !!  70         stq     $7, 56($sp)
 97         .word   handle_trap_3           /* 3   !!  71         stq     $8, 64($sp)
 98         .word   handle_trap_reserved    /* 4   !!  72         stq     $19, 72($sp)
 99         .word   handle_trap_reserved    /* 5   !!  73         stq     $20, 80($sp)
100         .word   handle_trap_reserved    /* 6   !!  74         stq     $21, 88($sp)
101         .word   handle_trap_reserved    /* 7   !!  75         ldq     $2, HAE_CACHE($2)
102         .word   handle_trap_reserved    /* 8   !!  76         stq     $22, 96($sp)
103         .word   handle_trap_reserved    /* 9   !!  77         stq     $23, 104($sp)
104         .word   handle_trap_reserved    /* 10  !!  78         stq     $24, 112($sp)
105         .word   handle_trap_reserved    /* 11  !!  79         stq     $25, 120($sp)
106         .word   handle_trap_reserved    /* 12  !!  80         stq     $26, 128($sp)
107         .word   handle_trap_reserved    /* 13  !!  81         stq     $27, 136($sp)
108         .word   handle_trap_reserved    /* 14  !!  82         stq     $2, 152($sp)
109         .word   handle_trap_reserved    /* 15  !!  83         stq     $16, 160($sp)
110         .word   handle_trap_reserved    /* 16  !!  84         stq     $17, 168($sp)
111         .word   handle_trap_reserved    /* 17  !!  85         stq     $18, 176($sp)
112         .word   handle_trap_reserved    /* 18  !!  86         .cfi_rel_offset $5, 40
113         .word   handle_trap_reserved    /* 19  !!  87         .cfi_rel_offset $6, 48
114         .word   handle_trap_reserved    /* 20  !!  88         .cfi_rel_offset $7, 56
115         .word   handle_trap_reserved    /* 21  !!  89         .cfi_rel_offset $8, 64
116         .word   handle_trap_reserved    /* 22  !!  90         .cfi_rel_offset $19, 72
117         .word   handle_trap_reserved    /* 23  !!  91         .cfi_rel_offset $20, 80
118         .word   handle_trap_reserved    /* 24  !!  92         .cfi_rel_offset $21, 88
119         .word   handle_trap_reserved    /* 25  !!  93         .cfi_rel_offset $22, 96
120         .word   handle_trap_reserved    /* 26  !!  94         .cfi_rel_offset $23, 104
121         .word   handle_trap_reserved    /* 27  !!  95         .cfi_rel_offset $24, 112
122         .word   handle_trap_reserved    /* 28  !!  96         .cfi_rel_offset $25, 120
123         .word   handle_trap_reserved    /* 29  !!  97         .cfi_rel_offset $26, 128
124 #ifdef CONFIG_KGDB                             !!  98         .cfi_rel_offset $27, 136
125         .word   handle_kgdb_breakpoint  /* 30  !!  99 .endm
126 #else                                          !! 100 
127         .word   instruction_trap               !! 101 .macro  RESTORE_ALL
128 #endif                                         !! 102         lda     $19, alpha_mv
129         .word   handle_breakpoint       /* 31  !! 103         ldq     $0, 0($sp)
                                                   >> 104         ldq     $1, 8($sp)
                                                   >> 105         ldq     $2, 16($sp)
                                                   >> 106         ldq     $3, 24($sp)
                                                   >> 107         ldq     $21, 152($sp)
                                                   >> 108         ldq     $20, HAE_CACHE($19)
                                                   >> 109         ldq     $4, 32($sp)
                                                   >> 110         ldq     $5, 40($sp)
                                                   >> 111         ldq     $6, 48($sp)
                                                   >> 112         ldq     $7, 56($sp)
                                                   >> 113         subq    $20, $21, $20
                                                   >> 114         ldq     $8, 64($sp)
                                                   >> 115         beq     $20, 99f
                                                   >> 116         ldq     $20, HAE_REG($19)
                                                   >> 117         stq     $21, HAE_CACHE($19)
                                                   >> 118         stq     $21, 0($20)
                                                   >> 119 99:     ldq     $19, 72($sp)
                                                   >> 120         ldq     $20, 80($sp)
                                                   >> 121         ldq     $21, 88($sp)
                                                   >> 122         ldq     $22, 96($sp)
                                                   >> 123         ldq     $23, 104($sp)
                                                   >> 124         ldq     $24, 112($sp)
                                                   >> 125         ldq     $25, 120($sp)
                                                   >> 126         ldq     $26, 128($sp)
                                                   >> 127         ldq     $27, 136($sp)
                                                   >> 128         ldq     $28, 144($sp)
                                                   >> 129         addq    $sp, SP_OFF, $sp
                                                   >> 130         .cfi_restore    $0
                                                   >> 131         .cfi_restore    $1
                                                   >> 132         .cfi_restore    $2
                                                   >> 133         .cfi_restore    $3
                                                   >> 134         .cfi_restore    $4
                                                   >> 135         .cfi_restore    $5
                                                   >> 136         .cfi_restore    $6
                                                   >> 137         .cfi_restore    $7
                                                   >> 138         .cfi_restore    $8
                                                   >> 139         .cfi_restore    $19
                                                   >> 140         .cfi_restore    $20
                                                   >> 141         .cfi_restore    $21
                                                   >> 142         .cfi_restore    $22
                                                   >> 143         .cfi_restore    $23
                                                   >> 144         .cfi_restore    $24
                                                   >> 145         .cfi_restore    $25
                                                   >> 146         .cfi_restore    $26
                                                   >> 147         .cfi_restore    $27
                                                   >> 148         .cfi_restore    $28
                                                   >> 149         .cfi_adjust_cfa_offset  -SP_OFF
                                                   >> 150 .endm
                                                   >> 151 
                                                   >> 152 .macro  DO_SWITCH_STACK
                                                   >> 153         bsr     $1, do_switch_stack
                                                   >> 154         .cfi_adjust_cfa_offset  SWITCH_STACK_SIZE
                                                   >> 155         .cfi_rel_offset $9, 0
                                                   >> 156         .cfi_rel_offset $10, 8
                                                   >> 157         .cfi_rel_offset $11, 16
                                                   >> 158         .cfi_rel_offset $12, 24
                                                   >> 159         .cfi_rel_offset $13, 32
                                                   >> 160         .cfi_rel_offset $14, 40
                                                   >> 161         .cfi_rel_offset $15, 48
                                                   >> 162 .endm
                                                   >> 163 
                                                   >> 164 .macro  UNDO_SWITCH_STACK
                                                   >> 165         bsr     $1, undo_switch_stack
                                                   >> 166         .cfi_restore    $9
                                                   >> 167         .cfi_restore    $10
                                                   >> 168         .cfi_restore    $11
                                                   >> 169         .cfi_restore    $12
                                                   >> 170         .cfi_restore    $13
                                                   >> 171         .cfi_restore    $14
                                                   >> 172         .cfi_restore    $15
                                                   >> 173         .cfi_adjust_cfa_offset  -SWITCH_STACK_SIZE
                                                   >> 174 .endm
130                                                   175 
131 .text                                          !! 176 /*
132 .set noat                                      !! 177  * Non-syscall kernel entry points.
133 .set nobreak                                   !! 178  */
134                                                   179 
135 ENTRY(inthandler)                              !! 180 CFI_START_OSF_FRAME entInt
136         SAVE_ALL                                  181         SAVE_ALL
                                                   >> 182         lda     $8, 0x3fff
                                                   >> 183         lda     $26, ret_from_sys_call
                                                   >> 184         bic     $sp, $8, $8
                                                   >> 185         mov     $sp, $19
                                                   >> 186         jsr     $31, do_entInt
                                                   >> 187 CFI_END_OSF_FRAME entInt
137                                                   188 
138         kuser_cmpxchg_check                    !! 189 CFI_START_OSF_FRAME entArith
                                                   >> 190         SAVE_ALL
                                                   >> 191         lda     $8, 0x3fff
                                                   >> 192         lda     $26, ret_from_sys_call
                                                   >> 193         bic     $sp, $8, $8
                                                   >> 194         mov     $sp, $18
                                                   >> 195         jsr     $31, do_entArith
                                                   >> 196 CFI_END_OSF_FRAME entArith
139                                                   197 
140         /* Clear EH bit before we get a new ex !! 198 CFI_START_OSF_FRAME entMM
141          * and after we have saved it to the e !! 199         SAVE_ALL
142          * whether it's trap, tlb-miss or inte !! 200 /* save $9 - $15 so the inline exception code can manipulate them.  */
143          * estatus is not updated the next exc !! 201         subq    $sp, 56, $sp
144          */                                    !! 202         .cfi_adjust_cfa_offset  56
145         rdctl   r24, status                    !! 203         stq     $9, 0($sp)
146         movi    r9, %lo(~STATUS_EH)            !! 204         stq     $10, 8($sp)
147         and     r24, r24, r9                   !! 205         stq     $11, 16($sp)
148         wrctl   status, r24                    !! 206         stq     $12, 24($sp)
149                                                !! 207         stq     $13, 32($sp)
150         /* Read cause and vector and branch to !! 208         stq     $14, 40($sp)
151         mov     r4, sp                         !! 209         stq     $15, 48($sp)
152         rdctl   r5, exception                  !! 210         .cfi_rel_offset $9, 0
153         movia   r9, exception_table            !! 211         .cfi_rel_offset $10, 8
154         add     r24, r9, r5                    !! 212         .cfi_rel_offset $11, 16
155         ldw     r24, 0(r24)                    !! 213         .cfi_rel_offset $12, 24
156         jmp     r24                            !! 214         .cfi_rel_offset $13, 32
157                                                !! 215         .cfi_rel_offset $14, 40
158                                                !! 216         .cfi_rel_offset $15, 48
159 /********************************************* !! 217         addq    $sp, 56, $19
160  * Handle traps                                !! 218 /* handle the fault */
161  ********************************************* !! 219         lda     $8, 0x3fff
162  */                                            !! 220         bic     $sp, $8, $8
163 ENTRY(handle_trap)                             !! 221         jsr     $26, do_page_fault
164         ldwio   r24, -4(ea)     /* instruction !! 222 /* reload the registers after the exception code played.  */
165         srli    r24, r24, 4                    !! 223         ldq     $9, 0($sp)
166         andi    r24, r24, 0x7c                 !! 224         ldq     $10, 8($sp)
167         movia   r9,trap_table                  !! 225         ldq     $11, 16($sp)
168         add     r24, r24, r9                   !! 226         ldq     $12, 24($sp)
169         ldw     r24, 0(r24)                    !! 227         ldq     $13, 32($sp)
170         jmp     r24                            !! 228         ldq     $14, 40($sp)
171                                                !! 229         ldq     $15, 48($sp)
172                                                !! 230         addq    $sp, 56, $sp
173 /********************************************* !! 231         .cfi_restore    $9
174  * Handle system calls                         !! 232         .cfi_restore    $10
175  ********************************************* !! 233         .cfi_restore    $11
176  */                                            !! 234         .cfi_restore    $12
177 ENTRY(handle_system_call)                      !! 235         .cfi_restore    $13
178         /* Enable interrupts */                !! 236         .cfi_restore    $14
179         rdctl   r10, status                    !! 237         .cfi_restore    $15
180         ori     r10, r10, STATUS_PIE           !! 238         .cfi_adjust_cfa_offset  -56
181         wrctl   status, r10                    !! 239 /* finish up the syscall as normal.  */
182                                                !! 240         br      ret_from_sys_call
183         /* Reload registers destroyed by commo !! 241 CFI_END_OSF_FRAME entMM
184         ldw     r4, PT_R4(sp)                  << 
185         ldw     r5, PT_R5(sp)                  << 
186                                                << 
187 local_restart:                                 << 
188         stw     r2, PT_ORIG_R2(sp)             << 
189         /* Check that the requested system cal << 
190         movui   r1, __NR_syscalls              << 
191         bgeu    r2, r1, ret_invsyscall         << 
192         slli    r1, r2, 2                      << 
193         movhi   r11, %hiadj(sys_call_table)    << 
194         add     r1, r1, r11                    << 
195         ldw     r1, %lo(sys_call_table)(r1)    << 
196                                                << 
197         /* Check if we are being traced */     << 
198         GET_THREAD_INFO r11                    << 
199         ldw     r11,TI_FLAGS(r11)              << 
200         BTBNZ   r11,r11,TIF_SYSCALL_TRACE,trac << 
201                                                << 
202         /* Execute the system call */          << 
203         callr   r1                             << 
204                                                << 
205         /* If the syscall returns a negative r << 
206          *   Set r7 to 1 to indicate error,    << 
207          *   Negate r2 to get a positive error << 
208          * If the syscall returns zero or a po << 
209          *   Set r7 to 0.                      << 
210          * The sigreturn system calls will ski << 
211          * adding to register ra. To avoid des << 
212          */                                    << 
213 translate_rc_and_ret:                          << 
214         movi    r1, 0                          << 
215         bge     r2, zero, 3f                   << 
216         ldw     r1, PT_ORIG_R2(sp)             << 
217         addi    r1, r1, 1                      << 
218         beq     r1, zero, 3f                   << 
219         sub     r2, zero, r2                   << 
220         movi    r1, 1                          << 
221 3:                                             << 
222         stw     r2, PT_R2(sp)                  << 
223         stw     r1, PT_R7(sp)                  << 
224 end_translate_rc_and_ret:                      << 
225                                                << 
226 ret_from_exception:                            << 
227         ldw     r1, PT_ESTATUS(sp)             << 
228         /* if so, skip resched, signals */     << 
229         TSTBNZ  r1, r1, ESTATUS_EU, Luser_retu << 
230                                                   242 
                                                   >> 243 CFI_START_OSF_FRAME entIF
                                                   >> 244         SAVE_ALL
                                                   >> 245         lda     $8, 0x3fff
                                                   >> 246         lda     $26, ret_from_sys_call
                                                   >> 247         bic     $sp, $8, $8
                                                   >> 248         mov     $sp, $17
                                                   >> 249         jsr     $31, do_entIF
                                                   >> 250 CFI_END_OSF_FRAME entIF
                                                   >> 251 
                                                   >> 252 CFI_START_OSF_FRAME entUna
                                                   >> 253         lda     $sp, -256($sp)
                                                   >> 254         .cfi_adjust_cfa_offset  256
                                                   >> 255         stq     $0, 0($sp)
                                                   >> 256         .cfi_rel_offset $0, 0
                                                   >> 257         .cfi_remember_state
                                                   >> 258         ldq     $0, 256($sp)    /* get PS */
                                                   >> 259         stq     $1, 8($sp)
                                                   >> 260         stq     $2, 16($sp)
                                                   >> 261         stq     $3, 24($sp)
                                                   >> 262         and     $0, 8, $0               /* user mode? */
                                                   >> 263         stq     $4, 32($sp)
                                                   >> 264         bne     $0, entUnaUser  /* yup -> do user-level unaligned fault */
                                                   >> 265         stq     $5, 40($sp)
                                                   >> 266         stq     $6, 48($sp)
                                                   >> 267         stq     $7, 56($sp)
                                                   >> 268         stq     $8, 64($sp)
                                                   >> 269         stq     $9, 72($sp)
                                                   >> 270         stq     $10, 80($sp)
                                                   >> 271         stq     $11, 88($sp)
                                                   >> 272         stq     $12, 96($sp)
                                                   >> 273         stq     $13, 104($sp)
                                                   >> 274         stq     $14, 112($sp)
                                                   >> 275         stq     $15, 120($sp)
                                                   >> 276         /* 16-18 PAL-saved */
                                                   >> 277         stq     $19, 152($sp)
                                                   >> 278         stq     $20, 160($sp)
                                                   >> 279         stq     $21, 168($sp)
                                                   >> 280         stq     $22, 176($sp)
                                                   >> 281         stq     $23, 184($sp)
                                                   >> 282         stq     $24, 192($sp)
                                                   >> 283         stq     $25, 200($sp)
                                                   >> 284         stq     $26, 208($sp)
                                                   >> 285         stq     $27, 216($sp)
                                                   >> 286         stq     $28, 224($sp)
                                                   >> 287         mov     $sp, $19
                                                   >> 288         stq     $gp, 232($sp)
                                                   >> 289         .cfi_rel_offset $1, 1*8
                                                   >> 290         .cfi_rel_offset $2, 2*8
                                                   >> 291         .cfi_rel_offset $3, 3*8
                                                   >> 292         .cfi_rel_offset $4, 4*8
                                                   >> 293         .cfi_rel_offset $5, 5*8
                                                   >> 294         .cfi_rel_offset $6, 6*8
                                                   >> 295         .cfi_rel_offset $7, 7*8
                                                   >> 296         .cfi_rel_offset $8, 8*8
                                                   >> 297         .cfi_rel_offset $9, 9*8
                                                   >> 298         .cfi_rel_offset $10, 10*8
                                                   >> 299         .cfi_rel_offset $11, 11*8
                                                   >> 300         .cfi_rel_offset $12, 12*8
                                                   >> 301         .cfi_rel_offset $13, 13*8
                                                   >> 302         .cfi_rel_offset $14, 14*8
                                                   >> 303         .cfi_rel_offset $15, 15*8
                                                   >> 304         .cfi_rel_offset $19, 19*8
                                                   >> 305         .cfi_rel_offset $20, 20*8
                                                   >> 306         .cfi_rel_offset $21, 21*8
                                                   >> 307         .cfi_rel_offset $22, 22*8
                                                   >> 308         .cfi_rel_offset $23, 23*8
                                                   >> 309         .cfi_rel_offset $24, 24*8
                                                   >> 310         .cfi_rel_offset $25, 25*8
                                                   >> 311         .cfi_rel_offset $26, 26*8
                                                   >> 312         .cfi_rel_offset $27, 27*8
                                                   >> 313         .cfi_rel_offset $28, 28*8
                                                   >> 314         .cfi_rel_offset $29, 29*8
                                                   >> 315         lda     $8, 0x3fff
                                                   >> 316         stq     $31, 248($sp)
                                                   >> 317         bic     $sp, $8, $8
                                                   >> 318         jsr     $26, do_entUna
                                                   >> 319         ldq     $0, 0($sp)
                                                   >> 320         ldq     $1, 8($sp)
                                                   >> 321         ldq     $2, 16($sp)
                                                   >> 322         ldq     $3, 24($sp)
                                                   >> 323         ldq     $4, 32($sp)
                                                   >> 324         ldq     $5, 40($sp)
                                                   >> 325         ldq     $6, 48($sp)
                                                   >> 326         ldq     $7, 56($sp)
                                                   >> 327         ldq     $8, 64($sp)
                                                   >> 328         ldq     $9, 72($sp)
                                                   >> 329         ldq     $10, 80($sp)
                                                   >> 330         ldq     $11, 88($sp)
                                                   >> 331         ldq     $12, 96($sp)
                                                   >> 332         ldq     $13, 104($sp)
                                                   >> 333         ldq     $14, 112($sp)
                                                   >> 334         ldq     $15, 120($sp)
                                                   >> 335         /* 16-18 PAL-saved */
                                                   >> 336         ldq     $19, 152($sp)
                                                   >> 337         ldq     $20, 160($sp)
                                                   >> 338         ldq     $21, 168($sp)
                                                   >> 339         ldq     $22, 176($sp)
                                                   >> 340         ldq     $23, 184($sp)
                                                   >> 341         ldq     $24, 192($sp)
                                                   >> 342         ldq     $25, 200($sp)
                                                   >> 343         ldq     $26, 208($sp)
                                                   >> 344         ldq     $27, 216($sp)
                                                   >> 345         ldq     $28, 224($sp)
                                                   >> 346         ldq     $gp, 232($sp)
                                                   >> 347         lda     $sp, 256($sp)
                                                   >> 348         .cfi_restore    $1
                                                   >> 349         .cfi_restore    $2
                                                   >> 350         .cfi_restore    $3
                                                   >> 351         .cfi_restore    $4
                                                   >> 352         .cfi_restore    $5
                                                   >> 353         .cfi_restore    $6
                                                   >> 354         .cfi_restore    $7
                                                   >> 355         .cfi_restore    $8
                                                   >> 356         .cfi_restore    $9
                                                   >> 357         .cfi_restore    $10
                                                   >> 358         .cfi_restore    $11
                                                   >> 359         .cfi_restore    $12
                                                   >> 360         .cfi_restore    $13
                                                   >> 361         .cfi_restore    $14
                                                   >> 362         .cfi_restore    $15
                                                   >> 363         .cfi_restore    $19
                                                   >> 364         .cfi_restore    $20
                                                   >> 365         .cfi_restore    $21
                                                   >> 366         .cfi_restore    $22
                                                   >> 367         .cfi_restore    $23
                                                   >> 368         .cfi_restore    $24
                                                   >> 369         .cfi_restore    $25
                                                   >> 370         .cfi_restore    $26
                                                   >> 371         .cfi_restore    $27
                                                   >> 372         .cfi_restore    $28
                                                   >> 373         .cfi_restore    $29
                                                   >> 374         .cfi_adjust_cfa_offset  -256
                                                   >> 375         call_pal PAL_rti
                                                   >> 376 
                                                   >> 377         .align  4
                                                   >> 378 entUnaUser:
                                                   >> 379         .cfi_restore_state
                                                   >> 380         ldq     $0, 0($sp)      /* restore original $0 */
                                                   >> 381         lda     $sp, 256($sp)   /* pop entUna's stack frame */
                                                   >> 382         .cfi_restore    $0
                                                   >> 383         .cfi_adjust_cfa_offset  -256
                                                   >> 384         SAVE_ALL                /* setup normal kernel stack */
                                                   >> 385         lda     $sp, -56($sp)
                                                   >> 386         .cfi_adjust_cfa_offset  56
                                                   >> 387         stq     $9, 0($sp)
                                                   >> 388         stq     $10, 8($sp)
                                                   >> 389         stq     $11, 16($sp)
                                                   >> 390         stq     $12, 24($sp)
                                                   >> 391         stq     $13, 32($sp)
                                                   >> 392         stq     $14, 40($sp)
                                                   >> 393         stq     $15, 48($sp)
                                                   >> 394         .cfi_rel_offset $9, 0
                                                   >> 395         .cfi_rel_offset $10, 8
                                                   >> 396         .cfi_rel_offset $11, 16
                                                   >> 397         .cfi_rel_offset $12, 24
                                                   >> 398         .cfi_rel_offset $13, 32
                                                   >> 399         .cfi_rel_offset $14, 40
                                                   >> 400         .cfi_rel_offset $15, 48
                                                   >> 401         lda     $8, 0x3fff
                                                   >> 402         addq    $sp, 56, $19
                                                   >> 403         bic     $sp, $8, $8
                                                   >> 404         jsr     $26, do_entUnaUser
                                                   >> 405         ldq     $9, 0($sp)
                                                   >> 406         ldq     $10, 8($sp)
                                                   >> 407         ldq     $11, 16($sp)
                                                   >> 408         ldq     $12, 24($sp)
                                                   >> 409         ldq     $13, 32($sp)
                                                   >> 410         ldq     $14, 40($sp)
                                                   >> 411         ldq     $15, 48($sp)
                                                   >> 412         lda     $sp, 56($sp)
                                                   >> 413         .cfi_restore    $9
                                                   >> 414         .cfi_restore    $10
                                                   >> 415         .cfi_restore    $11
                                                   >> 416         .cfi_restore    $12
                                                   >> 417         .cfi_restore    $13
                                                   >> 418         .cfi_restore    $14
                                                   >> 419         .cfi_restore    $15
                                                   >> 420         .cfi_adjust_cfa_offset  -56
                                                   >> 421         br      ret_from_sys_call
                                                   >> 422 CFI_END_OSF_FRAME entUna
                                                   >> 423 
                                                   >> 424 CFI_START_OSF_FRAME entDbg
                                                   >> 425         SAVE_ALL
                                                   >> 426         lda     $8, 0x3fff
                                                   >> 427         lda     $26, ret_from_sys_call
                                                   >> 428         bic     $sp, $8, $8
                                                   >> 429         mov     $sp, $16
                                                   >> 430         jsr     $31, do_entDbg
                                                   >> 431 CFI_END_OSF_FRAME entDbg
                                                   >> 432 
                                                   >> 433 /*
                                                   >> 434  * The system call entry point is special.  Most importantly, it looks
                                                   >> 435  * like a function call to userspace as far as clobbered registers.  We
                                                   >> 436  * do preserve the argument registers (for syscall restarts) and $26
                                                   >> 437  * (for leaf syscall functions).
                                                   >> 438  *
                                                   >> 439  * So much for theory.  We don't take advantage of this yet.
                                                   >> 440  *
                                                   >> 441  * Note that a0-a2 are not saved by PALcode as with the other entry points.
                                                   >> 442  */
                                                   >> 443 
                                                   >> 444         .align  4
                                                   >> 445         .globl  entSys
                                                   >> 446         .type   entSys, @function
                                                   >> 447         .cfi_startproc simple
                                                   >> 448         .cfi_return_column 64
                                                   >> 449         .cfi_def_cfa    $sp, 48
                                                   >> 450         .cfi_rel_offset 64, 8
                                                   >> 451         .cfi_rel_offset $gp, 16
                                                   >> 452 entSys:
                                                   >> 453         SAVE_ALL
                                                   >> 454         lda     $8, 0x3fff
                                                   >> 455         bic     $sp, $8, $8
                                                   >> 456         lda     $4, NR_syscalls($31)
                                                   >> 457         stq     $16, SP_OFF+24($sp)
                                                   >> 458         lda     $5, sys_call_table
                                                   >> 459         lda     $27, sys_ni_syscall
                                                   >> 460         cmpult  $0, $4, $4
                                                   >> 461         ldl     $3, TI_FLAGS($8)
                                                   >> 462         stq     $17, SP_OFF+32($sp)
                                                   >> 463         s8addq  $0, $5, $5
                                                   >> 464         stq     $18, SP_OFF+40($sp)
                                                   >> 465         .cfi_rel_offset $16, SP_OFF+24
                                                   >> 466         .cfi_rel_offset $17, SP_OFF+32
                                                   >> 467         .cfi_rel_offset $18, SP_OFF+40
                                                   >> 468 #ifdef CONFIG_AUDITSYSCALL
                                                   >> 469         lda     $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
                                                   >> 470         and     $3, $6, $3
                                                   >> 471         bne     $3, strace
                                                   >> 472 #else
                                                   >> 473         blbs    $3, strace              /* check for SYSCALL_TRACE in disguise */
                                                   >> 474 #endif
                                                   >> 475         beq     $4, 1f
                                                   >> 476         ldq     $27, 0($5)
                                                   >> 477 1:      jsr     $26, ($27), sys_ni_syscall
                                                   >> 478         ldgp    $gp, 0($26)
                                                   >> 479         blt     $0, $syscall_error      /* the call failed */
                                                   >> 480 $ret_success:
                                                   >> 481         stq     $0, 0($sp)
                                                   >> 482         stq     $31, 72($sp)            /* a3=0 => no error */
                                                   >> 483 
                                                   >> 484         .align  4
                                                   >> 485         .globl  ret_from_sys_call
                                                   >> 486 ret_from_sys_call:
                                                   >> 487         cmovne  $26, 0, $18             /* $18 = 0 => non-restartable */
                                                   >> 488         ldq     $0, SP_OFF($sp)
                                                   >> 489         and     $0, 8, $0
                                                   >> 490         beq     $0, ret_to_kernel
                                                   >> 491 ret_to_user:
                                                   >> 492         /* Make sure need_resched and sigpending don't change between
                                                   >> 493                 sampling and the rti.  */
                                                   >> 494         lda     $16, 7
                                                   >> 495         call_pal PAL_swpipl
                                                   >> 496         ldl     $17, TI_FLAGS($8)
                                                   >> 497         and     $17, _TIF_WORK_MASK, $2
                                                   >> 498         bne     $2, work_pending
231 restore_all:                                      499 restore_all:
232         rdctl   r10, status                    !! 500         ldl     $2, TI_STATUS($8)
233         andi    r10, r10, %lo(~STATUS_PIE)     !! 501         and     $2, TS_SAVED_FP | TS_RESTORE_FP, $3
234         wrctl   status, r10                    !! 502         bne     $3, restore_fpu
                                                   >> 503 restore_other:
                                                   >> 504         .cfi_remember_state
235         RESTORE_ALL                               505         RESTORE_ALL
236         eret                                   !! 506         call_pal PAL_rti
237                                                   507 
238         /* If the syscall number was invalid r !! 508 ret_to_kernel:
239 ret_invsyscall:                                !! 509         .cfi_restore_state
240         movi    r2, -ENOSYS                    !! 510         lda     $16, 7
241         br      translate_rc_and_ret           !! 511         call_pal PAL_swpipl
242                                                !! 512         br restore_other
243         /* This implements the same as above,  << 
244          * do_syscall_trace_enter and do_sysca << 
245          * syscall in order for utilities like << 
246          */                                    << 
247 traced_system_call:                            << 
248         SAVE_SWITCH_STACK                      << 
249         call    do_syscall_trace_enter         << 
250         RESTORE_SWITCH_STACK                   << 
251                                                << 
252         /* Create system call register argumen << 
253            arguments on stack are already in p << 
254            of pt_regs. */                      << 
255         ldw     r2, PT_R2(sp)                  << 
256         ldw     r4, PT_R4(sp)                  << 
257         ldw     r5, PT_R5(sp)                  << 
258         ldw     r6, PT_R6(sp)                  << 
259         ldw     r7, PT_R7(sp)                  << 
260                                                << 
261         /* Fetch the syscall function. */      << 
262         movui   r1, __NR_syscalls              << 
263         bgeu    r2, r1, traced_invsyscall      << 
264         slli    r1, r2, 2                      << 
265         movhi   r11,%hiadj(sys_call_table)     << 
266         add     r1, r1, r11                    << 
267         ldw     r1, %lo(sys_call_table)(r1)    << 
268                                                << 
269         callr   r1                             << 
270                                                << 
271         /* If the syscall returns a negative r << 
272          *   Set r7 to 1 to indicate error,    << 
273          *   Negate r2 to get a positive error << 
274          * If the syscall returns zero or a po << 
275          *   Set r7 to 0.                      << 
276          * The sigreturn system calls will ski << 
277          * adding to register ra. To avoid des << 
278          */                                    << 
279 translate_rc_and_ret2:                         << 
280         movi    r1, 0                          << 
281         bge     r2, zero, 4f                   << 
282         ldw     r1, PT_ORIG_R2(sp)             << 
283         addi    r1, r1, 1                      << 
284         beq     r1, zero, 4f                   << 
285         sub     r2, zero, r2                   << 
286         movi    r1, 1                          << 
287 4:                                             << 
288         stw     r2, PT_R2(sp)                  << 
289         stw     r1, PT_R7(sp)                  << 
290 end_translate_rc_and_ret2:                     << 
291         SAVE_SWITCH_STACK                      << 
292         call    do_syscall_trace_exit          << 
293         RESTORE_SWITCH_STACK                   << 
294         br      ret_from_exception             << 
295                                                << 
296         /* If the syscall number was invalid r << 
297 traced_invsyscall:                             << 
298         movi    r2, -ENOSYS                    << 
299         br      translate_rc_and_ret2          << 
300                                                << 
301 Luser_return:                                  << 
302         GET_THREAD_INFO r11                    << 
303         ldw     r10, TI_FLAGS(r11)             << 
304         ANDI32  r11, r10, _TIF_WORK_MASK       << 
305         beq     r11, r0, restore_all           << 
306         BTBZ    r1, r10, TIF_NEED_RESCHED, Lsi << 
307                                                << 
308         /* Reschedule work */                  << 
309         call    schedule                       << 
310         br      ret_from_exception             << 
311                                                << 
312 Lsignal_return:                                << 
313         ANDI32  r1, r10, _TIF_SIGPENDING | _TI << 
314         beq     r1, r0, restore_all            << 
315         mov     r4, sp                  /* pt_ << 
316         SAVE_SWITCH_STACK                      << 
317         call    do_notify_resume               << 
318         beq     r2, r0, no_work_pending        << 
319         RESTORE_SWITCH_STACK                   << 
320         /* prepare restart syscall here withou << 
321         ldw     r2, PT_R2(sp)   /* reload sysc << 
322         ldw     r4, PT_R4(sp)   /* reload sysc << 
323         ldw     r5, PT_R5(sp)                  << 
324         ldw     r6, PT_R6(sp)                  << 
325         ldw     r7, PT_R7(sp)                  << 
326         ldw     r8, PT_R8(sp)                  << 
327         ldw     r9, PT_R9(sp)                  << 
328         br      local_restart   /* restart sys << 
329                                                << 
330 no_work_pending:                               << 
331         RESTORE_SWITCH_STACK                   << 
332         br      ret_from_exception             << 
333                                                << 
334 /********************************************* << 
335  * Handle external interrupts.                 << 
336  ********************************************* << 
337  */                                            << 
338 /*                                             << 
339  * This is the generic interrupt handler (for  << 
340  * sources). It figures out the vector number  << 
341  * interrupt service routine directly.         << 
342  */                                            << 
343 external_interrupt:                            << 
344         rdctl   r12, ipending                  << 
345         rdctl   r9, ienable                    << 
346         and     r12, r12, r9                   << 
347         /* skip if no interrupt is pending */  << 
348         beq     r12, r0, ret_from_interrupt    << 
349                                                   513 
                                                   >> 514         .align 3
                                                   >> 515 $syscall_error:
350         /*                                        516         /*
351          * Process an external hardware interr !! 517          * Some system calls (e.g., ptrace) can return arbitrary
                                                   >> 518          * values which might normally be mistaken as error numbers.
                                                   >> 519          * Those functions must zero $0 (v0) directly in the stack
                                                   >> 520          * frame to indicate that a negative return value wasn't an
                                                   >> 521          * error number..
352          */                                       522          */
                                                   >> 523         ldq     $18, 0($sp)     /* old syscall nr (zero if success) */
                                                   >> 524         beq     $18, $ret_success
353                                                   525 
354         addi    ea, ea, -4      /* re-issue th !! 526         ldq     $19, 72($sp)    /* .. and this a3 */
355         stw     ea, PT_EA(sp)                  !! 527         subq    $31, $0, $0     /* with error in v0 */
356 2:      movi    r4, %lo(-1)     /* Start from  !! 528         addq    $31, 1, $1      /* set a3 for errno return */
357                                         highes !! 529         stq     $0, 0($sp)
358                                 /* This is the !! 530         mov     $31, $26        /* tell "ret_from_sys_call" we can restart */
359 1:      andi    r10, r12, 1     /* Isolate bit !! 531         stq     $1, 72($sp)     /* a3 for return */
360         srli    r12, r12, 1     /* shift count !! 532         br      ret_from_sys_call
361                                         multip << 
362         addi    r4, r4, 1                      << 
363         beq     r10, r0, 1b                    << 
364         mov     r5, sp          /* Setup pt_re << 
365         call    do_IRQ                         << 
366         rdctl   r12, ipending   /* check again << 
367         rdctl   r9, ienable     /* Isolate pos << 
368         and     r12, r12, r9                   << 
369         bne     r12, r0, 2b                    << 
370         /* br   ret_from_interrupt */ /* fall  << 
371                                                << 
372 ENTRY(ret_from_interrupt)                      << 
373         ldw     r1, PT_ESTATUS(sp)      /* che << 
374         TSTBNZ  r1, r1, ESTATUS_EU, Luser_retu << 
375                                                << 
376 #ifdef CONFIG_PREEMPTION                       << 
377         GET_THREAD_INFO r1                     << 
378         ldw     r4, TI_PREEMPT_COUNT(r1)       << 
379         bne     r4, r0, restore_all            << 
380         ldw     r4, TI_FLAGS(r1)               << 
381         BTBZ    r10, r4, TIF_NEED_RESCHED, res << 
382         ldw     r4, PT_ESTATUS(sp)      /* ? I << 
383         andi    r10, r4, ESTATUS_EPIE          << 
384         beq     r10, r0, restore_all           << 
385         call    preempt_schedule_irq           << 
386 #endif                                         << 
387         br      restore_all                    << 
388                                                   533 
389 /********************************************* !! 534 /*
390  * A few syscall wrappers                      !! 535  * Do all cleanup when returning from all interrupts and system calls.
391  ********************************************* !! 536  *
392  */                                            !! 537  * Arguments:
393 /*                                             !! 538  *       $8: current.
394  * int clone(unsigned long clone_flags, unsign !! 539  *      $17: TI_FLAGS.
395  *              int __user * parent_tidptr, in !! 540  *      $18: The old syscall number, or zero if this is not a return
396  *              int tls_val)                   !! 541  *           from a syscall that errored and is possibly restartable.
397  */                                            !! 542  *      $19: The old a3 value
398 ENTRY(sys_clone)                               !! 543  */
399         SAVE_SWITCH_STACK                      << 
400         subi    sp, sp, 4 /* make space for tl << 
401         stw     r8, 0(sp) /* pass tls pointer  << 
402         call    nios2_clone                    << 
403         addi    sp, sp, 4                      << 
404         RESTORE_SWITCH_STACK                   << 
405         ret                                    << 
406                                                   544 
407 ENTRY(sys_rt_sigreturn)                        !! 545         .align  4
408         SAVE_SWITCH_STACK                      !! 546         .type   work_pending, @function
409         mov     r4, sp                         !! 547 work_pending:
410         call    do_rt_sigreturn                !! 548         and     $17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL, $2
411         RESTORE_SWITCH_STACK                   !! 549         bne     $2, $work_notifysig
412         addi    ra, ra, (end_translate_rc_and_ << 
413         ret                                    << 
414                                                   550 
415 /********************************************* !! 551 $work_resched:
416  * A few other wrappers and stubs              !! 552         /*
417  ********************************************* !! 553          * We can get here only if we returned from syscall without SIGPENDING
418  */                                            !! 554          * or got through work_notifysig already.  Either case means no syscall
419 protection_exception_pte:                      !! 555          * restarts for us, so let $18 and $19 burn.
420         rdctl   r6, pteaddr                    !! 556          */
421         slli    r6, r6, 10                     !! 557         jsr     $26, schedule
422         call    do_page_fault                  !! 558         mov     0, $18
423         br      ret_from_exception             !! 559         br      ret_to_user
424                                                !! 560 
425 protection_exception_ba:                       !! 561 $work_notifysig:
426         rdctl   r6, badaddr                    !! 562         mov     $sp, $16
427         call    do_page_fault                  !! 563         DO_SWITCH_STACK
428         br      ret_from_exception             !! 564         jsr     $26, do_work_pending
429                                                !! 565         UNDO_SWITCH_STACK
430 protection_exception_instr:                    !! 566         br      restore_all
431         call    handle_supervisor_instr        << 
432         br      ret_from_exception             << 
433                                                << 
434 handle_breakpoint:                             << 
435         call    breakpoint_c                   << 
436         br      ret_from_exception             << 
437                                                << 
438 #ifdef CONFIG_NIOS2_ALIGNMENT_TRAP             << 
439 handle_unaligned:                              << 
440         SAVE_SWITCH_STACK                      << 
441         call    handle_unaligned_c             << 
442         RESTORE_SWITCH_STACK                   << 
443         br      ret_from_exception             << 
444 #else                                          << 
445 handle_unaligned:                              << 
446         call    handle_unaligned_c             << 
447         br      ret_from_exception             << 
448 #endif                                         << 
449                                                   567 
450 handle_illegal:                                !! 568 /*
451         call    handle_illegal_c               !! 569  * PTRACE syscall handler
452         br      ret_from_exception             !! 570  */
453                                                << 
454 handle_diverror:                               << 
455         call    handle_diverror_c              << 
456         br      ret_from_exception             << 
457                                                << 
458 #ifdef CONFIG_KGDB                             << 
459 handle_kgdb_breakpoint:                        << 
460         call    kgdb_breakpoint_c              << 
461         br      ret_from_exception             << 
462 #endif                                         << 
463                                                   571 
464 handle_trap_1:                                 !! 572         .align  4
465         call    handle_trap_1_c                !! 573         .type   strace, @function
466         br      ret_from_exception             !! 574 strace:
467                                                !! 575         /* set up signal stack, call syscall_trace */
468 handle_trap_2:                                 !! 576         // NB: if anyone adds preemption, this block will need to be protected
469         call    handle_trap_2_c                !! 577         ldl     $1, TI_STATUS($8)
470         br      ret_from_exception             !! 578         and     $1, TS_SAVED_FP, $3
471                                                !! 579         or      $1, TS_SAVED_FP, $2
472 handle_trap_3:                                 !! 580         bne     $3, 1f
473 handle_trap_reserved:                          !! 581         stl     $2, TI_STATUS($8)
474         call    handle_trap_3_c                !! 582         bsr     $26, __save_fpu
475         br      ret_from_exception             !! 583 1:
476                                                !! 584         DO_SWITCH_STACK
477 /*                                             !! 585         jsr     $26, syscall_trace_enter /* returns the syscall number */
478  * Beware - when entering resume, prev (the cu !! 586         UNDO_SWITCH_STACK
479  * in r4, next (the new task) is in r5, don't  !! 587 
480  * registers.                                  !! 588         /* get the arguments back.. */
481  */                                            !! 589         ldq     $16, SP_OFF+24($sp)
482 ENTRY(resume)                                  !! 590         ldq     $17, SP_OFF+32($sp)
483                                                !! 591         ldq     $18, SP_OFF+40($sp)
484         rdctl   r7, status                     !! 592         ldq     $19, 72($sp)
485         stw     r7, TASK_THREAD + THREAD_KPSR( !! 593         ldq     $20, 80($sp)
486                                                !! 594         ldq     $21, 88($sp)
487         andi    r7, r7, %lo(~STATUS_PIE)       !! 595 
488         wrctl   status, r7                     !! 596         /* get the system call pointer.. */
489                                                !! 597         lda     $1, NR_syscalls($31)
490         SAVE_SWITCH_STACK                      !! 598         lda     $2, sys_call_table
491         stw     sp, TASK_THREAD + THREAD_KSP(r !! 599         lda     $27, sys_ni_syscall
492         ldw     sp, TASK_THREAD + THREAD_KSP(r !! 600         cmpult  $0, $1, $1
493         movia   r24, _current_thread           !! 601         s8addq  $0, $2, $2
494         GET_THREAD_INFO r1                     !! 602         beq     $1, 1f
495         stw     r1, 0(r24)                     !! 603         ldq     $27, 0($2)
496         RESTORE_SWITCH_STACK                   !! 604 1:      jsr     $26, ($27), sys_gettimeofday
                                                   >> 605 ret_from_straced:
                                                   >> 606         ldgp    $gp, 0($26)
                                                   >> 607 
                                                   >> 608         /* check return.. */
                                                   >> 609         blt     $0, $strace_error       /* the call failed */
                                                   >> 610 $strace_success:
                                                   >> 611         stq     $31, 72($sp)            /* a3=0 => no error */
                                                   >> 612         stq     $0, 0($sp)              /* save return value */
                                                   >> 613 
                                                   >> 614         DO_SWITCH_STACK
                                                   >> 615         jsr     $26, syscall_trace_leave
                                                   >> 616         UNDO_SWITCH_STACK
                                                   >> 617         br      $31, ret_from_sys_call
                                                   >> 618 
                                                   >> 619         .align  3
                                                   >> 620 $strace_error:
                                                   >> 621         ldq     $18, 0($sp)     /* old syscall nr (zero if success) */
                                                   >> 622         beq     $18, $strace_success
                                                   >> 623         ldq     $19, 72($sp)    /* .. and this a3 */
                                                   >> 624 
                                                   >> 625         subq    $31, $0, $0     /* with error in v0 */
                                                   >> 626         addq    $31, 1, $1      /* set a3 for errno return */
                                                   >> 627         stq     $0, 0($sp)
                                                   >> 628         stq     $1, 72($sp)     /* a3 for return */
                                                   >> 629 
                                                   >> 630         DO_SWITCH_STACK
                                                   >> 631         mov     $18, $9         /* save old syscall number */
                                                   >> 632         mov     $19, $10        /* save old a3 */
                                                   >> 633         jsr     $26, syscall_trace_leave
                                                   >> 634         mov     $9, $18
                                                   >> 635         mov     $10, $19
                                                   >> 636         UNDO_SWITCH_STACK
                                                   >> 637 
                                                   >> 638         mov     $31, $26        /* tell "ret_from_sys_call" we can restart */
                                                   >> 639         br      ret_from_sys_call
                                                   >> 640 CFI_END_OSF_FRAME entSys
                                                   >> 641 
                                                   >> 642 /*
                                                   >> 643  * Save and restore the switch stack -- aka the balance of the user context.
                                                   >> 644  */
497                                                   645 
498         ldw     r7, TASK_THREAD + THREAD_KPSR( !! 646         .align  4
499         wrctl   status, r7                     !! 647         .type   do_switch_stack, @function
                                                   >> 648         .cfi_startproc simple
                                                   >> 649         .cfi_return_column 64
                                                   >> 650         .cfi_def_cfa $sp, 0
                                                   >> 651         .cfi_register 64, $1
                                                   >> 652 do_switch_stack:
                                                   >> 653         lda     $sp, -SWITCH_STACK_SIZE($sp)
                                                   >> 654         .cfi_adjust_cfa_offset  SWITCH_STACK_SIZE
                                                   >> 655         stq     $9, 0($sp)
                                                   >> 656         stq     $10, 8($sp)
                                                   >> 657         stq     $11, 16($sp)
                                                   >> 658         stq     $12, 24($sp)
                                                   >> 659         stq     $13, 32($sp)
                                                   >> 660         stq     $14, 40($sp)
                                                   >> 661         stq     $15, 48($sp)
                                                   >> 662         stq     $26, 56($sp)
                                                   >> 663         ret     $31, ($1), 1
                                                   >> 664         .cfi_endproc
                                                   >> 665         .size   do_switch_stack, .-do_switch_stack
                                                   >> 666 
                                                   >> 667         .align  4
                                                   >> 668         .type   undo_switch_stack, @function
                                                   >> 669         .cfi_startproc simple
                                                   >> 670         .cfi_def_cfa $sp, 0
                                                   >> 671         .cfi_register 64, $1
                                                   >> 672 undo_switch_stack:
                                                   >> 673         ldq     $9, 0($sp)
                                                   >> 674         ldq     $10, 8($sp)
                                                   >> 675         ldq     $11, 16($sp)
                                                   >> 676         ldq     $12, 24($sp)
                                                   >> 677         ldq     $13, 32($sp)
                                                   >> 678         ldq     $14, 40($sp)
                                                   >> 679         ldq     $15, 48($sp)
                                                   >> 680         ldq     $26, 56($sp)
                                                   >> 681         lda     $sp, SWITCH_STACK_SIZE($sp)
                                                   >> 682         ret     $31, ($1), 1
                                                   >> 683         .cfi_endproc
                                                   >> 684         .size   undo_switch_stack, .-undo_switch_stack
                                                   >> 685 
                                                   >> 686 #define FR(n) n * 8 + TI_FP($8)
                                                   >> 687         .align  4
                                                   >> 688         .globl  __save_fpu
                                                   >> 689         .type   __save_fpu, @function
                                                   >> 690 __save_fpu:
                                                   >> 691 #define V(n) stt        $f##n, FR(n)
                                                   >> 692         V( 0); V( 1); V( 2); V( 3)
                                                   >> 693         V( 4); V( 5); V( 6); V( 7)
                                                   >> 694         V( 8); V( 9); V(10); V(11)
                                                   >> 695         V(12); V(13); V(14); V(15)
                                                   >> 696         V(16); V(17); V(18); V(19)
                                                   >> 697         V(20); V(21); V(22); V(23)
                                                   >> 698         V(24); V(25); V(26); V(27)
                                                   >> 699         mf_fpcr $f0             # get fpcr
                                                   >> 700         V(28); V(29); V(30)
                                                   >> 701         stt     $f0, FR(31)     # save fpcr in slot of $f31
                                                   >> 702         ldt     $f0, FR(0)      # don't let "__save_fpu" change fp state.
500         ret                                       703         ret
                                                   >> 704 #undef V
                                                   >> 705         .size   __save_fpu, .-__save_fpu
501                                                   706 
502 ENTRY(ret_from_fork)                           !! 707         .align  4
503         call    schedule_tail                  !! 708 restore_fpu:
504         br      ret_from_exception             !! 709         and     $3, TS_RESTORE_FP, $3
505                                                !! 710         bic     $2, TS_SAVED_FP | TS_RESTORE_FP, $2
506 ENTRY(ret_from_kernel_thread)                  !! 711         beq     $3, 1f
507         call    schedule_tail                  !! 712 #define V(n) ldt        $f##n, FR(n)
508         mov     r4,r17  /* arg */              !! 713         ldt     $f30, FR(31)    # get saved fpcr
509         callr   r16     /* function */         !! 714         V( 0); V( 1); V( 2); V( 3)
510         br      ret_from_exception             !! 715         mt_fpcr $f30            # install saved fpcr
                                                   >> 716         V( 4); V( 5); V( 6); V( 7)
                                                   >> 717         V( 8); V( 9); V(10); V(11)
                                                   >> 718         V(12); V(13); V(14); V(15)
                                                   >> 719         V(16); V(17); V(18); V(19)
                                                   >> 720         V(20); V(21); V(22); V(23)
                                                   >> 721         V(24); V(25); V(26); V(27)
                                                   >> 722         V(28); V(29); V(30)
                                                   >> 723 1:      stl $2, TI_STATUS($8)
                                                   >> 724         br restore_other
                                                   >> 725 #undef V
511                                                   726 
                                                   >> 727 
512 /*                                                728 /*
513  * Kernel user helpers.                        !! 729  * The meat of the context switch code.
514  *                                             << 
515  * Each segment is 64-byte aligned and will be << 
516  * New segments (if ever needed) must be added << 
517  * This mechanism should be used only for thin << 
518  * justified, and not be abused freely.        << 
519  *                                             << 
520  */                                               730  */
                                                   >> 731         .align  4
                                                   >> 732         .globl  alpha_switch_to
                                                   >> 733         .type   alpha_switch_to, @function
                                                   >> 734         .cfi_startproc
                                                   >> 735 alpha_switch_to:
                                                   >> 736         DO_SWITCH_STACK
                                                   >> 737         ldl     $1, TI_STATUS($8)
                                                   >> 738         and     $1, TS_RESTORE_FP, $3
                                                   >> 739         bne     $3, 1f
                                                   >> 740         or      $1, TS_RESTORE_FP | TS_SAVED_FP, $2
                                                   >> 741         and     $1, TS_SAVED_FP, $3
                                                   >> 742         stl     $2, TI_STATUS($8)
                                                   >> 743         bne     $3, 1f
                                                   >> 744         bsr     $26, __save_fpu
                                                   >> 745 1:
                                                   >> 746         call_pal PAL_swpctx
                                                   >> 747         lda     $8, 0x3fff
                                                   >> 748         UNDO_SWITCH_STACK
                                                   >> 749         bic     $sp, $8, $8
                                                   >> 750         mov     $17, $0
                                                   >> 751         ret
                                                   >> 752         .cfi_endproc
                                                   >> 753         .size   alpha_switch_to, .-alpha_switch_to
521                                                   754 
522  /* Filling pads with undefined instructions.  !! 755 /*
523 .macro  kuser_pad sym size                     !! 756  * New processes begin life here.
524         .if     ((. - \sym) & 3)               !! 757  */
525         .rept   (4 - (. - \sym) & 3)           << 
526         .byte   0                              << 
527         .endr                                  << 
528         .endif                                 << 
529         .rept   ((\size - (. - \sym)) / 4)     << 
530         .word   0xdeadbeef                     << 
531         .endr                                  << 
532 .endm                                          << 
533                                                   758 
534         .align  6                              !! 759         .globl  ret_from_fork
535         .globl  __kuser_helper_start           !! 760         .align  4
536 __kuser_helper_start:                          !! 761         .ent    ret_from_fork
                                                   >> 762 ret_from_fork:
                                                   >> 763         lda     $26, ret_to_user
                                                   >> 764         mov     $17, $16
                                                   >> 765         jmp     $31, schedule_tail
                                                   >> 766 .end ret_from_fork
537                                                   767 
538 __kuser_helper_version:                        !! 768 /*
539         .word   ((__kuser_helper_end - __kuser !! 769  * ... and new kernel threads - here
                                                   >> 770  */
                                                   >> 771         .align 4
                                                   >> 772         .globl  ret_from_kernel_thread
                                                   >> 773         .ent    ret_from_kernel_thread
                                                   >> 774 ret_from_kernel_thread:
                                                   >> 775         mov     $17, $16
                                                   >> 776         jsr     $26, schedule_tail
                                                   >> 777         mov     $9, $27
                                                   >> 778         mov     $10, $16
                                                   >> 779         jsr     $26, ($9)
                                                   >> 780         br      $31, ret_to_user
                                                   >> 781 .end ret_from_kernel_thread
540                                                   782 
541 __kuser_cmpxchg:                               !! 783 
542         /*                                     !! 784 /*
543          * r4 pointer to exchange variable     !! 785  * Special system calls.  Most of these are special in that they either
544          * r5 old value                        !! 786  * have to play switch_stack games.
545          * r6 new value                        !! 787  */
546          */                                    << 
547 cmpxchg_ldw:                                   << 
548         ldw     r2, 0(r4)                      << 
549         sub     r2, r2, r5                     << 
550         bne     r2, zero, cmpxchg_ret          << 
551                                                << 
552         /* We had a match, store the new value << 
553 cmpxchg_stw:                                   << 
554         stw     r6, 0(r4)                      << 
555 cmpxchg_ret:                                   << 
556         ret                                    << 
557                                                   788 
558         kuser_pad __kuser_cmpxchg, 64          !! 789 .macro  fork_like name
                                                   >> 790         .align  4
                                                   >> 791         .globl  alpha_\name
                                                   >> 792         .ent    alpha_\name
                                                   >> 793 alpha_\name:
                                                   >> 794         .prologue 0
                                                   >> 795         bsr     $1, do_switch_stack
                                                   >> 796         // NB: if anyone adds preemption, this block will need to be protected
                                                   >> 797         ldl     $1, TI_STATUS($8)
                                                   >> 798         and     $1, TS_SAVED_FP, $3
                                                   >> 799         or      $1, TS_SAVED_FP, $2
                                                   >> 800         bne     $3, 1f
                                                   >> 801         stl     $2, TI_STATUS($8)
                                                   >> 802         bsr     $26, __save_fpu
                                                   >> 803 1:
                                                   >> 804         jsr     $26, sys_\name
                                                   >> 805         ldq     $26, 56($sp)
                                                   >> 806         lda     $sp, SWITCH_STACK_SIZE($sp)
                                                   >> 807         ret
                                                   >> 808 .end    alpha_\name
                                                   >> 809 .endm
559                                                   810 
560         .globl  __kuser_sigtramp               !! 811 fork_like fork
561 __kuser_sigtramp:                              !! 812 fork_like vfork
562         movi    r2, __NR_rt_sigreturn          !! 813 fork_like clone
563         trap                                   !! 814 fork_like clone3
                                                   >> 815 
                                                   >> 816 .macro  sigreturn_like name
                                                   >> 817         .align  4
                                                   >> 818         .globl  sys_\name
                                                   >> 819         .ent    sys_\name
                                                   >> 820 sys_\name:
                                                   >> 821         .prologue 0
                                                   >> 822         lda     $9, ret_from_straced
                                                   >> 823         cmpult  $26, $9, $9
                                                   >> 824         lda     $sp, -SWITCH_STACK_SIZE($sp)
                                                   >> 825         jsr     $26, do_\name
                                                   >> 826         bne     $9, 1f
                                                   >> 827         jsr     $26, syscall_trace_leave
                                                   >> 828 1:      br      $1, undo_switch_stack
                                                   >> 829         br      ret_from_sys_call
                                                   >> 830 .end sys_\name
                                                   >> 831 .endm
564                                                   832 
565         kuser_pad __kuser_sigtramp, 64         !! 833 sigreturn_like sigreturn
                                                   >> 834 sigreturn_like rt_sigreturn
566                                                   835 
567         .globl  __kuser_helper_end             !! 836         .align  4
568 __kuser_helper_end:                            !! 837         .globl  alpha_syscall_zero
                                                   >> 838         .ent    alpha_syscall_zero
                                                   >> 839 alpha_syscall_zero:
                                                   >> 840         .prologue 0
                                                   >> 841         /* Special because it needs to do something opposite to
                                                   >> 842            force_successful_syscall_return().  We use the saved
                                                   >> 843            syscall number for that, zero meaning "not an error".
                                                   >> 844            That works nicely, but for real syscall 0 we need to
                                                   >> 845            make sure that this logics doesn't get confused.
                                                   >> 846            Store a non-zero there - -ENOSYS we need in register
                                                   >> 847            for our return value will do just fine.
                                                   >> 848           */
                                                   >> 849         lda     $0, -ENOSYS
                                                   >> 850         unop
                                                   >> 851         stq     $0, 0($sp)
                                                   >> 852         ret
                                                   >> 853 .end alpha_syscall_zero
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php