~ [ 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 (Version linux-6.12-rc7) and /arch/alpha/kernel/entry.S (Version linux-5.0.21)


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