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

TOMOYO Linux Cross Reference
Linux/arch/openrisc/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/openrisc/kernel/entry.S (Version linux-6.12-rc7) and /arch/i386/kernel/entry.S (Version linux-2.6.0)


  1 /* SPDX-License-Identifier: GPL-2.0-or-later * << 
  2 /*                                                  1 /*
  3  * OpenRISC entry.S                            !!   2  *  linux/arch/i386/entry.S
  4  *                                                  3  *
  5  * Linux architectural port borrowing liberall !!   4  *  Copyright (C) 1991, 1992  Linus Torvalds
  6  * others.  All original copyrights apply as p !!   5  */
  7  * declaration.                                !!   6 
                                                   >>   7 /*
                                                   >>   8  * entry.S contains the system-call and fault low-level handling routines.
                                                   >>   9  * This also contains the timer-interrupt handler, as well as all interrupts
                                                   >>  10  * and faults that can result in a task-switch.
                                                   >>  11  *
                                                   >>  12  * NOTE: This code handles signal-recognition, which happens every time
                                                   >>  13  * after a timer-interrupt and after each system call.
                                                   >>  14  *
                                                   >>  15  * I changed all the .align's to 4 (16 byte alignment), as that's faster
                                                   >>  16  * on a 486.
  8  *                                                 17  *
  9  * Modifications for the OpenRISC architecture !!  18  * Stack layout in 'ret_from_system_call':
 10  * Copyright (C) 2003 Matjaz Breskvar <phoenix@ !!  19  *      ptrace needs to have all regs on the stack.
 11  * Copyright (C) 2005 Gyorgy Jeney <nog@bsemi.c !!  20  *      if the order here is changed, it needs to be
 12  * Copyright (C) 2010-2011 Jonas Bonn <jonas@so !!  21  *      updated in fork.c:copy_process, signal.c:do_signal,
                                                   >>  22  *      ptrace.c and ptrace.h
                                                   >>  23  *
                                                   >>  24  *       0(%esp) - %ebx
                                                   >>  25  *       4(%esp) - %ecx
                                                   >>  26  *       8(%esp) - %edx
                                                   >>  27  *       C(%esp) - %esi
                                                   >>  28  *      10(%esp) - %edi
                                                   >>  29  *      14(%esp) - %ebp
                                                   >>  30  *      18(%esp) - %eax
                                                   >>  31  *      1C(%esp) - %ds
                                                   >>  32  *      20(%esp) - %es
                                                   >>  33  *      24(%esp) - orig_eax
                                                   >>  34  *      28(%esp) - %eip
                                                   >>  35  *      2C(%esp) - %cs
                                                   >>  36  *      30(%esp) - %eflags
                                                   >>  37  *      34(%esp) - %oldesp
                                                   >>  38  *      38(%esp) - %oldss
                                                   >>  39  *
                                                   >>  40  * "current" is in register %ebx during any slow entries.
 13  */                                                41  */
 14                                                    42 
                                                   >>  43 #include <linux/config.h>
 15 #include <linux/linkage.h>                         44 #include <linux/linkage.h>
 16 #include <linux/pgtable.h>                     << 
 17                                                << 
 18 #include <asm/processor.h>                     << 
 19 #include <asm/unistd.h>                        << 
 20 #include <asm/thread_info.h>                       45 #include <asm/thread_info.h>
 21 #include <asm/errno.h>                             46 #include <asm/errno.h>
 22 #include <asm/spr_defs.h>                      !!  47 #include <asm/segment.h>
                                                   >>  48 #include <asm/smp.h>
 23 #include <asm/page.h>                              49 #include <asm/page.h>
 24 #include <asm/mmu.h>                           !!  50 #include "irq_vectors.h"
 25 #include <asm/asm-offsets.h>                   << 
 26                                                << 
 27 #define DISABLE_INTERRUPTS(t1,t2)              << 
 28         l.mfspr t2,r0,SPR_SR                   << 
 29         l.movhi t1,hi(~(SPR_SR_IEE|SPR_SR_TEE) << 
 30         l.ori   t1,t1,lo(~(SPR_SR_IEE|SPR_SR_T << 
 31         l.and   t2,t2,t1                       << 
 32         l.mtspr r0,t2,SPR_SR                   << 
 33                                                << 
 34 #define ENABLE_INTERRUPTS(t1)                  << 
 35         l.mfspr t1,r0,SPR_SR                   << 
 36         l.ori   t1,t1,lo(SPR_SR_IEE|SPR_SR_TEE << 
 37         l.mtspr r0,t1,SPR_SR                   << 
 38                                                    51 
 39 /* =========================================== !!  52 #define nr_syscalls ((syscall_table_size)/4)
 40                                                    53 
 41 #ifdef CONFIG_TRACE_IRQFLAGS                   !!  54 EBX             = 0x00
 42 /*                                             !!  55 ECX             = 0x04
 43  * Trace irq on/off creating a stack frame.    !!  56 EDX             = 0x08
 44  */                                            !!  57 ESI             = 0x0C
 45 #define TRACE_IRQS_OP(trace_op)                !!  58 EDI             = 0x10
 46         l.sw    -8(r1),r2       /* store frame !!  59 EBP             = 0x14
 47         l.sw    -4(r1),r9       /* store retur !!  60 EAX             = 0x18
 48         l.addi  r2,r1,0         /* move sp to  !!  61 DS              = 0x1C
 49         l.jal   trace_op                       !!  62 ES              = 0x20
 50          l.addi r1,r1,-8                       !!  63 ORIG_EAX        = 0x24
 51         l.ori   r1,r2,0         /* restore sp  !!  64 EIP             = 0x28
 52         l.lwz   r9,-4(r1)       /* restore ret !!  65 CS              = 0x2C
 53         l.lwz   r2,-8(r1)       /* restore fp  !!  66 EFLAGS          = 0x30
 54 /*                                             !!  67 OLDESP          = 0x34
 55  * Trace irq on/off and save registers we need !!  68 OLDSS           = 0x38
 56  * clobbered.                                  !!  69 
 57  */                                            !!  70 CF_MASK         = 0x00000001
 58 #define TRACE_IRQS_SAVE(t1,trace_op)           !!  71 TF_MASK         = 0x00000100
 59         l.sw    -12(r1),t1      /* save extra  !!  72 IF_MASK         = 0x00000200
 60         l.sw    -8(r1),r2       /* store frame !!  73 DF_MASK         = 0x00000400 
 61         l.sw    -4(r1),r9       /* store retur !!  74 NT_MASK         = 0x00004000
 62         l.addi  r2,r1,0         /* move sp to  !!  75 VM_MASK         = 0x00020000
 63         l.jal   trace_op                       << 
 64          l.addi r1,r1,-12                      << 
 65         l.ori   r1,r2,0         /* restore sp  << 
 66         l.lwz   r9,-4(r1)       /* restore ret << 
 67         l.lwz   r2,-8(r1)       /* restore fp  << 
 68         l.lwz   t1,-12(r1)      /* restore ext << 
 69                                                << 
 70 #define TRACE_IRQS_OFF  TRACE_IRQS_OP(trace_ha << 
 71 #define TRACE_IRQS_ON   TRACE_IRQS_OP(trace_ha << 
 72 #define TRACE_IRQS_ON_SYSCALL                  << 
 73         TRACE_IRQS_SAVE(r10,trace_hardirqs_on) << 
 74         l.lwz   r3,PT_GPR3(r1)                 << 
 75         l.lwz   r4,PT_GPR4(r1)                 << 
 76         l.lwz   r5,PT_GPR5(r1)                 << 
 77         l.lwz   r6,PT_GPR6(r1)                 << 
 78         l.lwz   r7,PT_GPR7(r1)                 << 
 79         l.lwz   r8,PT_GPR8(r1)                 << 
 80         l.lwz   r11,PT_GPR11(r1)               << 
 81 #define TRACE_IRQS_OFF_ENTRY                   << 
 82         l.lwz   r5,PT_SR(r1)                   << 
 83         l.andi  r3,r5,(SPR_SR_IEE|SPR_SR_TEE)  << 
 84         l.sfeq  r5,r0           /* skip trace  << 
 85         l.bf    1f                             << 
 86          l.nop                                 << 
 87         TRACE_IRQS_SAVE(r4,trace_hardirqs_off) << 
 88 1:                                             << 
 89 #else                                          << 
 90 #define TRACE_IRQS_OFF                         << 
 91 #define TRACE_IRQS_ON                          << 
 92 #define TRACE_IRQS_OFF_ENTRY                   << 
 93 #define TRACE_IRQS_ON_SYSCALL                  << 
 94 #endif                                         << 
 95                                                << 
 96 /*                                             << 
 97  * We need to disable interrupts at beginning  << 
 98  * since interrupt might come in after we've l << 
 99  * and overwrite EPC with address somewhere in << 
100  * which is of course wrong!                   << 
101  */                                            << 
102                                                    76 
103 #define RESTORE_ALL                            << 
104         DISABLE_INTERRUPTS(r3,r4)              << 
105         l.lwz   r3,PT_PC(r1)                   << 
106         l.mtspr r0,r3,SPR_EPCR_BASE            << 
107         l.lwz   r3,PT_SR(r1)                   << 
108         l.mtspr r0,r3,SPR_ESR_BASE             << 
109         l.lwz   r2,PT_GPR2(r1)                 << 
110         l.lwz   r3,PT_GPR3(r1)                 << 
111         l.lwz   r4,PT_GPR4(r1)                 << 
112         l.lwz   r5,PT_GPR5(r1)                 << 
113         l.lwz   r6,PT_GPR6(r1)                 << 
114         l.lwz   r7,PT_GPR7(r1)                 << 
115         l.lwz   r8,PT_GPR8(r1)                 << 
116         l.lwz   r9,PT_GPR9(r1)                 << 
117         l.lwz   r10,PT_GPR10(r1)               << 
118         l.lwz   r11,PT_GPR11(r1)               << 
119         l.lwz   r12,PT_GPR12(r1)               << 
120         l.lwz   r13,PT_GPR13(r1)               << 
121         l.lwz   r14,PT_GPR14(r1)               << 
122         l.lwz   r15,PT_GPR15(r1)               << 
123         l.lwz   r16,PT_GPR16(r1)               << 
124         l.lwz   r17,PT_GPR17(r1)               << 
125         l.lwz   r18,PT_GPR18(r1)               << 
126         l.lwz   r19,PT_GPR19(r1)               << 
127         l.lwz   r20,PT_GPR20(r1)               << 
128         l.lwz   r21,PT_GPR21(r1)               << 
129         l.lwz   r22,PT_GPR22(r1)               << 
130         l.lwz   r23,PT_GPR23(r1)               << 
131         l.lwz   r24,PT_GPR24(r1)               << 
132         l.lwz   r25,PT_GPR25(r1)               << 
133         l.lwz   r26,PT_GPR26(r1)               << 
134         l.lwz   r27,PT_GPR27(r1)               << 
135         l.lwz   r28,PT_GPR28(r1)               << 
136         l.lwz   r29,PT_GPR29(r1)               << 
137         l.lwz   r30,PT_GPR30(r1)               << 
138         l.lwz   r31,PT_GPR31(r1)               << 
139         l.lwz   r1,PT_SP(r1)                   << 
140         l.rfe                                  << 
141                                                << 
142                                                << 
143 #define EXCEPTION_ENTRY(handler)               << 
144         .global handler                        << 
145 handler:                                       << 
146         /* r1, EPCR, ESR a already saved */    << 
147         l.sw    PT_GPR2(r1),r2                 << 
148         l.sw    PT_GPR3(r1),r3                 << 
149         /* r4 already save */                  << 
150         l.sw    PT_GPR5(r1),r5                 << 
151         l.sw    PT_GPR6(r1),r6                 << 
152         l.sw    PT_GPR7(r1),r7                 << 
153         l.sw    PT_GPR8(r1),r8                 << 
154         l.sw    PT_GPR9(r1),r9                 << 
155         /* r10 already saved */                << 
156         l.sw    PT_GPR11(r1),r11               << 
157         /* r12 already saved */                << 
158         l.sw    PT_GPR13(r1),r13               << 
159         l.sw    PT_GPR14(r1),r14               << 
160         l.sw    PT_GPR15(r1),r15               << 
161         l.sw    PT_GPR16(r1),r16               << 
162         l.sw    PT_GPR17(r1),r17               << 
163         l.sw    PT_GPR18(r1),r18               << 
164         l.sw    PT_GPR19(r1),r19               << 
165         l.sw    PT_GPR20(r1),r20               << 
166         l.sw    PT_GPR21(r1),r21               << 
167         l.sw    PT_GPR22(r1),r22               << 
168         l.sw    PT_GPR23(r1),r23               << 
169         l.sw    PT_GPR24(r1),r24               << 
170         l.sw    PT_GPR25(r1),r25               << 
171         l.sw    PT_GPR26(r1),r26               << 
172         l.sw    PT_GPR27(r1),r27               << 
173         l.sw    PT_GPR28(r1),r28               << 
174         l.sw    PT_GPR29(r1),r29               << 
175         /* r30 already save */                 << 
176         l.sw    PT_GPR31(r1),r31               << 
177         TRACE_IRQS_OFF_ENTRY                   << 
178         /* Store -1 in orig_gpr11 for non-sysc << 
179         l.addi  r30,r0,-1                      << 
180         l.sw    PT_ORIG_GPR11(r1),r30          << 
181                                                << 
182 #define UNHANDLED_EXCEPTION(handler,vector)    << 
183         .global handler                        << 
184 handler:                                       << 
185         /* r1, EPCR, ESR already saved */      << 
186         l.sw    PT_GPR2(r1),r2                 << 
187         l.sw    PT_GPR3(r1),r3                 << 
188         l.sw    PT_GPR5(r1),r5                 << 
189         l.sw    PT_GPR6(r1),r6                 << 
190         l.sw    PT_GPR7(r1),r7                 << 
191         l.sw    PT_GPR8(r1),r8                 << 
192         l.sw    PT_GPR9(r1),r9                 << 
193         /* r10 already saved */                << 
194         l.sw    PT_GPR11(r1),r11               << 
195         /* r12 already saved */                << 
196         l.sw    PT_GPR13(r1),r13               << 
197         l.sw    PT_GPR14(r1),r14               << 
198         l.sw    PT_GPR15(r1),r15               << 
199         l.sw    PT_GPR16(r1),r16               << 
200         l.sw    PT_GPR17(r1),r17               << 
201         l.sw    PT_GPR18(r1),r18               << 
202         l.sw    PT_GPR19(r1),r19               << 
203         l.sw    PT_GPR20(r1),r20               << 
204         l.sw    PT_GPR21(r1),r21               << 
205         l.sw    PT_GPR22(r1),r22               << 
206         l.sw    PT_GPR23(r1),r23               << 
207         l.sw    PT_GPR24(r1),r24               << 
208         l.sw    PT_GPR25(r1),r25               << 
209         l.sw    PT_GPR26(r1),r26               << 
210         l.sw    PT_GPR27(r1),r27               << 
211         l.sw    PT_GPR28(r1),r28               << 
212         l.sw    PT_GPR29(r1),r29               << 
213         /* r30 already saved */                << 
214         l.sw    PT_GPR31(r1),r31               << 
215         /* Store -1 in orig_gpr11 for non-sysc << 
216         l.addi  r30,r0,-1                      << 
217         l.sw    PT_ORIG_GPR11(r1),r30          << 
218         l.addi  r3,r1,0                        << 
219         /* r4 is exception EA */               << 
220         l.addi  r5,r0,vector                   << 
221         l.jal   unhandled_exception            << 
222          l.nop                                 << 
223         l.j     _ret_from_exception            << 
224          l.nop                                 << 
225                                                << 
226 /* clobbers 'reg' */                           << 
227 #define CLEAR_LWA_FLAG(reg)             \      << 
228         l.movhi reg,hi(lwa_flag)        ;\     << 
229         l.ori   reg,reg,lo(lwa_flag)    ;\     << 
230         l.sw    0(reg),r0                      << 
231 /*                                                 77 /*
232  * NOTE: one should never assume that SPR_EPC, !!  78  * ESP0 is at offset 4. 0x200 is the size of the TSS, and
233  *       contain the same values as when excep !!  79  * also thus the top-of-stack pointer offset of SYSENTER_ESP
234  *       occured. in fact they never do. if yo << 
235  *       values saved on stack (for SPR_EPC, S << 
236  *       of r4 (for SPR_EEAR). for details loo << 
237  *       in 'arch/openrisc/kernel/head.S'      << 
238  */                                                80  */
                                                   >>  81 TSS_ESP0_OFFSET = (4 - 0x200)
239                                                    82 
240 /* =========================================== !!  83 #ifdef CONFIG_PREEMPT
241                                                !!  84 #define preempt_stop            cli
242 /* ---[ 0x100: RESET exception ]-------------- << 
243                                                << 
244 EXCEPTION_ENTRY(_tng_kernel_start)             << 
245         l.jal   _start                         << 
246          l.andi r0,r0,0                        << 
247                                                << 
248 /* ---[ 0x200: BUS exception ]---------------- << 
249                                                << 
250 EXCEPTION_ENTRY(_bus_fault_handler)            << 
251         CLEAR_LWA_FLAG(r3)                     << 
252         /* r4: EA of fault (set by EXCEPTION_H << 
253         l.jal   do_bus_fault                   << 
254          l.addi  r3,r1,0 /* pt_regs */         << 
255                                                << 
256         l.j     _ret_from_exception            << 
257          l.nop                                 << 
258                                                << 
259 /* ---[ 0x300: Data Page Fault exception ]---- << 
260 EXCEPTION_ENTRY(_dtlb_miss_page_fault_handler) << 
261         CLEAR_LWA_FLAG(r3)                     << 
262         l.and   r5,r5,r0                       << 
263         l.j     1f                             << 
264          l.nop                                 << 
265                                                << 
266 EXCEPTION_ENTRY(_data_page_fault_handler)      << 
267         CLEAR_LWA_FLAG(r3)                     << 
268         /* set up parameters for do_page_fault << 
269         l.ori   r5,r0,0x300                //  << 
270 1:                                             << 
271         l.addi  r3,r1,0                    //  << 
272         /* r4 set be EXCEPTION_HANDLE */   //  << 
273                                                << 
274 #ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX           << 
275         l.lwz   r6,PT_PC(r3)               //  << 
276         l.lwz   r6,0(r6)                   //  << 
277                                                << 
278         l.srli  r6,r6,26                   //  << 
279         l.sfeqi r6,0                       //  << 
280         l.bf    8f                             << 
281         l.sfeqi r6,1                       //  << 
282         l.bf    8f                             << 
283         l.sfeqi r6,3                       //  << 
284         l.bf    8f                             << 
285         l.sfeqi r6,4                       //  << 
286         l.bf    8f                             << 
287         l.sfeqi r6,0x11                    //  << 
288         l.bf    8f                             << 
289         l.sfeqi r6,0x12                    //  << 
290         l.bf    8f                             << 
291          l.nop                                 << 
292                                                << 
293         l.j     9f                             << 
294          l.nop                                 << 
295                                                << 
296 8: // offending insn is in delay slot          << 
297         l.lwz   r6,PT_PC(r3)               //  << 
298         l.addi  r6,r6,4                        << 
299         l.lwz   r6,0(r6)                   //  << 
300         l.srli  r6,r6,26                   //  << 
301 9: // offending instruction opcode loaded in r << 
302                                                << 
303 #else                                              85 #else
304                                                !!  86 #define preempt_stop
305         l.mfspr r6,r0,SPR_SR               //  !!  87 #define resume_kernel           restore_all
306         l.andi  r6,r6,SPR_SR_DSX           //  << 
307         l.sfne  r6,r0                      //  << 
308         l.bnf   7f                             << 
309          l.lwz  r6,PT_PC(r3)               //  << 
310                                                << 
311         l.addi  r6,r6,4                    //  << 
312 7:                                             << 
313         l.lwz   r6,0(r6)                   //  << 
314         l.srli  r6,r6,26                   //  << 
315 #endif                                             88 #endif
316                                                    89 
317         l.sfgeui r6,0x33                   //  !!  90 #define SAVE_ALL \
318         l.bnf   1f                             !!  91         cld; \
319         l.sfleui r6,0x37                       !!  92         pushl %es; \
320         l.bnf   1f                             !!  93         pushl %ds; \
321         l.ori   r6,r0,0x1                  //  !!  94         pushl %eax; \
322         l.j     2f                             !!  95         pushl %ebp; \
323          l.nop                                 !!  96         pushl %edi; \
324 1:      l.ori   r6,r0,0x0                  //  !!  97         pushl %esi; \
325 2:                                             !!  98         pushl %edx; \
326                                                !!  99         pushl %ecx; \
327         /* call fault.c handler in openrisc/mm !! 100         pushl %ebx; \
328         l.jal   do_page_fault                  !! 101         movl $(__USER_DS), %edx; \
329          l.nop                                 !! 102         movl %edx, %ds; \
330         l.j     _ret_from_exception            !! 103         movl %edx, %es;
331          l.nop                                 !! 104 
332                                                !! 105 #define RESTORE_INT_REGS \
333 /* ---[ 0x400: Insn Page Fault exception ]---- !! 106         popl %ebx;      \
334 EXCEPTION_ENTRY(_itlb_miss_page_fault_handler) !! 107         popl %ecx;      \
335         CLEAR_LWA_FLAG(r3)                     !! 108         popl %edx;      \
336         l.and   r5,r5,r0                       !! 109         popl %esi;      \
337         l.j     1f                             !! 110         popl %edi;      \
338          l.nop                                 !! 111         popl %ebp;      \
339                                                !! 112         popl %eax
340 EXCEPTION_ENTRY(_insn_page_fault_handler)      !! 113 
341         CLEAR_LWA_FLAG(r3)                     !! 114 #define RESTORE_REGS    \
342         /* set up parameters for do_page_fault !! 115         RESTORE_INT_REGS; \
343         l.ori   r5,r0,0x400                //  !! 116 1:      popl %ds;       \
344 1:                                             !! 117 2:      popl %es;       \
345         l.addi  r3,r1,0                    //  !! 118 .section .fixup,"ax";   \
346         /* r4 set be EXCEPTION_HANDLE */   //  !! 119 3:      movl $0,(%esp); \
347         l.ori   r6,r0,0x0                  //  !! 120         jmp 1b;         \
348                                                !! 121 4:      movl $0,(%esp); \
349         /* call fault.c handler in openrisc/mm !! 122         jmp 2b;         \
350         l.jal   do_page_fault                  !! 123 .previous;              \
351          l.nop                                 !! 124 .section __ex_table,"a";\
352         l.j     _ret_from_exception            !! 125         .align 4;       \
353          l.nop                                 !! 126         .long 1b,3b;    \
354                                                !! 127         .long 2b,4b;    \
355                                                !! 128 .previous
356 /* ---[ 0x500: Timer exception ]-------------- !! 129 
357                                                !! 130 
358 EXCEPTION_ENTRY(_timer_handler)                !! 131 #define RESTORE_ALL     \
359         CLEAR_LWA_FLAG(r3)                     !! 132         RESTORE_REGS    \
360         l.jal   timer_interrupt                !! 133         addl $4, %esp;  \
361          l.addi r3,r1,0 /* pt_regs */          !! 134 1:      iret;           \
362                                                !! 135 .section .fixup,"ax";   \
363         l.j    _ret_from_intr                  !! 136 2:      sti;            \
364          l.nop                                 !! 137         movl $(__USER_DS), %edx; \
365                                                !! 138         movl %edx, %ds; \
366 /* ---[ 0x600: Alignment exception ]---------- !! 139         movl %edx, %es; \
367                                                !! 140         pushl $11;      \
368 EXCEPTION_ENTRY(_alignment_handler)            !! 141         call do_exit;   \
369         CLEAR_LWA_FLAG(r3)                     !! 142 .previous;              \
370         /* r4: EA of fault (set by EXCEPTION_H !! 143 .section __ex_table,"a";\
371         l.jal   do_unaligned_access            !! 144         .align 4;       \
372          l.addi  r3,r1,0 /* pt_regs */         !! 145         .long 1b,2b;    \
373                                                !! 146 .previous
374         l.j     _ret_from_exception            !! 147 
375          l.nop                                 !! 148 
376                                                !! 149 
377 #if 0                                          !! 150 ENTRY(lcall7)
378 EXCEPTION_ENTRY(_alignment_handler)            !! 151         pushfl                  # We get a different stack layout with call
379 //        l.mfspr r2,r0,SPR_EEAR_BASE     /* L !! 152                                 # gates, which has to be cleaned up later..
380         l.addi  r2,r4,0                        !! 153         pushl %eax
381 //        l.mfspr r5,r0,SPR_EPCR_BASE     /* L !! 154         SAVE_ALL
382         l.lwz   r5,PT_PC(r1)                   !! 155         movl %esp, %ebp
383                                                !! 156         pushl %ebp
384         l.lwz   r3,0(r5)                /* Loa !! 157         pushl $0x7
385         l.srli  r4,r3,26                /* Shi !! 158 do_lcall:
386                                                !! 159         movl EIP(%ebp), %eax    # due to call gates, this is eflags, not eip..
387         l.sfeqi r4,0x00                 /* Che !! 160         movl CS(%ebp), %edx     # this is eip..
388         l.bf    jmp                            !! 161         movl EFLAGS(%ebp), %ecx # and this is cs..
389         l.sfeqi r4,0x01                        !! 162         movl %eax,EFLAGS(%ebp)  #
390         l.bf    jmp                            !! 163         movl %edx,EIP(%ebp)     # Now we move them to their "normal" places
391         l.sfeqi r4,0x03                        !! 164         movl %ecx,CS(%ebp)      #
392         l.bf    jmp                            !! 165         andl $-8192, %ebp       # GET_THREAD_INFO
393         l.sfeqi r4,0x04                        !! 166         movl TI_EXEC_DOMAIN(%ebp), %edx # Get the execution domain
394         l.bf    jmp                            !! 167         call *4(%edx)           # Call the lcall7 handler for the domain
395         l.sfeqi r4,0x11                        !! 168         addl $4, %esp
396         l.bf    jr                             !! 169         popl %eax
397         l.sfeqi r4,0x12                        !! 170         jmp resume_userspace
398         l.bf    jr                             !! 171 
399         l.nop                                  !! 172 ENTRY(lcall27)
400         l.j     1f                             !! 173         pushfl                  # We get a different stack layout with call
401         l.addi  r5,r5,4                 /* Inc !! 174                                 # gates, which has to be cleaned up later..
402                                                !! 175         pushl %eax
403 jmp:                                           !! 176         SAVE_ALL
404         l.slli  r4,r3,6                 /* Get !! 177         movl %esp, %ebp
405         l.srai  r4,r4,4                        !! 178         pushl %ebp
406                                                !! 179         pushl $0x27
407         l.lwz   r3,4(r5)                /* Loa !! 180         jmp do_lcall
408                                                << 
409         l.add   r5,r5,r4                /* Cal << 
410                                                << 
411         l.j     1f                             << 
412         l.srli  r4,r3,26                /* Shi << 
413                                                << 
414 jr:                                            << 
415         l.slli  r4,r3,9                 /* Shi << 
416         l.andi  r4,r4,0x7c                     << 
417                                                << 
418         l.lwz   r3,4(r5)                /* Loa << 
419                                                << 
420         l.add   r4,r4,r1                /* Loa << 
421         l.lwz   r5,0(r4)                       << 
422                                                << 
423         l.srli  r4,r3,26                /* Shi << 
424                                                << 
425                                                << 
426 1:                                             << 
427 //        l.mtspr r0,r5,SPR_EPCR_BASE          << 
428         l.sw    PT_PC(r1),r5                   << 
429                                                << 
430         l.sfeqi r4,0x26                        << 
431         l.bf    lhs                            << 
432         l.sfeqi r4,0x25                        << 
433         l.bf    lhz                            << 
434         l.sfeqi r4,0x22                        << 
435         l.bf    lws                            << 
436         l.sfeqi r4,0x21                        << 
437         l.bf    lwz                            << 
438         l.sfeqi r4,0x37                        << 
439         l.bf    sh                             << 
440         l.sfeqi r4,0x35                        << 
441         l.bf    sw                             << 
442         l.nop                                  << 
443                                                << 
444 1:      l.j     1b                      /* I d << 
445         l.nop                                  << 
446                                                << 
447 lhs:    l.lbs   r5,0(r2)                       << 
448         l.slli  r5,r5,8                        << 
449         l.lbz   r6,1(r2)                       << 
450         l.or    r5,r5,r6                       << 
451         l.srli  r4,r3,19                       << 
452         l.andi  r4,r4,0x7c                     << 
453         l.add   r4,r4,r1                       << 
454         l.j     align_end                      << 
455         l.sw    0(r4),r5                       << 
456                                                << 
457 lhz:    l.lbz   r5,0(r2)                       << 
458         l.slli  r5,r5,8                        << 
459         l.lbz   r6,1(r2)                       << 
460         l.or    r5,r5,r6                       << 
461         l.srli  r4,r3,19                       << 
462         l.andi  r4,r4,0x7c                     << 
463         l.add   r4,r4,r1                       << 
464         l.j     align_end                      << 
465         l.sw    0(r4),r5                       << 
466                                                << 
467 lws:    l.lbs   r5,0(r2)                       << 
468         l.slli  r5,r5,24                       << 
469         l.lbz   r6,1(r2)                       << 
470         l.slli  r6,r6,16                       << 
471         l.or    r5,r5,r6                       << 
472         l.lbz   r6,2(r2)                       << 
473         l.slli  r6,r6,8                        << 
474         l.or    r5,r5,r6                       << 
475         l.lbz   r6,3(r2)                       << 
476         l.or    r5,r5,r6                       << 
477         l.srli  r4,r3,19                       << 
478         l.andi  r4,r4,0x7c                     << 
479         l.add   r4,r4,r1                       << 
480         l.j     align_end                      << 
481         l.sw    0(r4),r5                       << 
482                                                << 
483 lwz:    l.lbz   r5,0(r2)                       << 
484         l.slli  r5,r5,24                       << 
485         l.lbz   r6,1(r2)                       << 
486         l.slli  r6,r6,16                       << 
487         l.or    r5,r5,r6                       << 
488         l.lbz   r6,2(r2)                       << 
489         l.slli  r6,r6,8                        << 
490         l.or    r5,r5,r6                       << 
491         l.lbz   r6,3(r2)                       << 
492         l.or    r5,r5,r6                       << 
493         l.srli  r4,r3,19                       << 
494         l.andi  r4,r4,0x7c                     << 
495         l.add   r4,r4,r1                       << 
496         l.j     align_end                      << 
497         l.sw    0(r4),r5                       << 
498                                                << 
499 sh:                                            << 
500         l.srli  r4,r3,9                        << 
501         l.andi  r4,r4,0x7c                     << 
502         l.add   r4,r4,r1                       << 
503         l.lwz   r5,0(r4)                       << 
504         l.sb    1(r2),r5                       << 
505         l.srli  r5,r5,8                        << 
506         l.j     align_end                      << 
507         l.sb    0(r2),r5                       << 
508                                                << 
509 sw:                                            << 
510         l.srli  r4,r3,9                        << 
511         l.andi  r4,r4,0x7c                     << 
512         l.add   r4,r4,r1                       << 
513         l.lwz   r5,0(r4)                       << 
514         l.sb    3(r2),r5                       << 
515         l.srli  r5,r5,8                        << 
516         l.sb    2(r2),r5                       << 
517         l.srli  r5,r5,8                        << 
518         l.sb    1(r2),r5                       << 
519         l.srli  r5,r5,8                        << 
520         l.j     align_end                      << 
521         l.sb    0(r2),r5                       << 
522                                                << 
523 align_end:                                     << 
524         l.j    _ret_from_intr                  << 
525         l.nop                                  << 
526 #endif                                         << 
527                                                   181 
528 /* ---[ 0x700: Illegal insn exception ]------- << 
529                                                   182 
530 EXCEPTION_ENTRY(_illegal_instruction_handler)  !! 183 ENTRY(ret_from_fork)
531         /* r4: EA of fault (set by EXCEPTION_H !! 184         pushl %eax
532         l.jal   do_illegal_instruction         !! 185         call schedule_tail
533          l.addi  r3,r1,0 /* pt_regs */         !! 186         GET_THREAD_INFO(%ebp)
534                                                !! 187         popl %eax
535         l.j     _ret_from_exception            !! 188         jmp syscall_exit
536          l.nop                                 << 
537                                                << 
538 /* ---[ 0x800: External interrupt exception ]- << 
539                                                << 
540 EXCEPTION_ENTRY(_external_irq_handler)         << 
541 #ifdef CONFIG_OPENRISC_ESR_EXCEPTION_BUG_CHECK << 
542         l.lwz   r4,PT_SR(r1)            // wer << 
543         l.andi  r4,r4,SPR_SR_IEE               << 
544         l.sfeqi r4,0                           << 
545         l.bnf   1f                      // ext << 
546         l.nop                                  << 
547                                                << 
548 #ifdef CONFIG_PRINTK                           << 
549         l.addi  r1,r1,-0x8                     << 
550         l.movhi r3,hi(42f)                     << 
551         l.ori   r3,r3,lo(42f)                  << 
552         l.sw    0x0(r1),r3                     << 
553         l.jal   _printk                        << 
554         l.sw    0x4(r1),r4                     << 
555         l.addi  r1,r1,0x8                      << 
556                                                << 
557         .section .rodata, "a"                  << 
558 42:                                            << 
559                 .string "\n\rESR interrupt bug << 
560                 .align 4                       << 
561         .previous                              << 
562 #endif                                         << 
563                                                   189 
564         l.ori   r4,r4,SPR_SR_IEE        // fix !! 190 /*
565 //      l.sw    PT_SR(r1),r4                   !! 191  * Return to user mode is not as complex as all this looks,
566 1:                                             !! 192  * but we want the default path for a system call return to
                                                   >> 193  * go as quickly as possible which is why some of this is
                                                   >> 194  * less clear than it otherwise should be.
                                                   >> 195  */
                                                   >> 196 
                                                   >> 197         # userspace resumption stub bypassing syscall exit tracing
                                                   >> 198         ALIGN
                                                   >> 199 ret_from_exception:
                                                   >> 200         preempt_stop
                                                   >> 201 ret_from_intr:
                                                   >> 202         GET_THREAD_INFO(%ebp)
                                                   >> 203         movl EFLAGS(%esp), %eax         # mix EFLAGS and CS
                                                   >> 204         movb CS(%esp), %al
                                                   >> 205         testl $(VM_MASK | 3), %eax
                                                   >> 206         jz resume_kernel                # returning to kernel or vm86-space
                                                   >> 207 ENTRY(resume_userspace)
                                                   >> 208         cli                             # make sure we don't miss an interrupt
                                                   >> 209                                         # setting need_resched or sigpending
                                                   >> 210                                         # between sampling and the iret
                                                   >> 211         movl TI_FLAGS(%ebp), %ecx
                                                   >> 212         andl $_TIF_WORK_MASK, %ecx      # is there any work to be done on
                                                   >> 213                                         # int/exception return?
                                                   >> 214         jne work_pending
                                                   >> 215         jmp restore_all
                                                   >> 216 
                                                   >> 217 #ifdef CONFIG_PREEMPT
                                                   >> 218 ENTRY(resume_kernel)
                                                   >> 219         cmpl $0,TI_PRE_COUNT(%ebp)      # non-zero preempt_count ?
                                                   >> 220         jnz restore_all
                                                   >> 221 need_resched:
                                                   >> 222         movl TI_FLAGS(%ebp), %ecx       # need_resched set ?
                                                   >> 223         testb $_TIF_NEED_RESCHED, %cl
                                                   >> 224         jz restore_all
                                                   >> 225         testl $IF_MASK,EFLAGS(%esp)     # interrupts off (exception path) ?
                                                   >> 226         jz restore_all
                                                   >> 227         movl $PREEMPT_ACTIVE,TI_PRE_COUNT(%ebp)
                                                   >> 228         sti
                                                   >> 229         call schedule
                                                   >> 230         movl $0,TI_PRE_COUNT(%ebp)
                                                   >> 231         cli
                                                   >> 232         jmp need_resched
567 #endif                                            233 #endif
568         CLEAR_LWA_FLAG(r3)                     << 
569         l.addi  r3,r1,0                        << 
570         l.movhi r8,hi(generic_handle_arch_irq) << 
571         l.ori   r8,r8,lo(generic_handle_arch_i << 
572         l.jalr r8                              << 
573         l.nop                                  << 
574         l.j    _ret_from_intr                  << 
575         l.nop                                  << 
576                                                   234 
577 /* ---[ 0x900: DTLB miss exception ]---------- !! 235 /* SYSENTER_RETURN points to after the "sysenter" instruction in
                                                   >> 236    the vsyscall page.  See vsyscall-sysentry.S, which defines the symbol.  */
578                                                   237 
579                                                !! 238         # sysenter call handler stub
580 /* ---[ 0xa00: ITLB miss exception ]---------- !! 239 ENTRY(sysenter_entry)
581                                                !! 240         movl TSS_ESP0_OFFSET(%esp),%esp
582                                                !! 241 sysenter_past_esp:
583 /* ---[ 0xb00: Range exception ]-------------- !! 242         sti
584                                                !! 243         pushl $(__USER_DS)
585 UNHANDLED_EXCEPTION(_vector_0xb00,0xb00)       !! 244         pushl %ebp
586                                                !! 245         pushfl
587 /* ---[ 0xc00: Syscall exception ]------------ !! 246         pushl $(__USER_CS)
                                                   >> 247         pushl $SYSENTER_RETURN
588                                                   248 
589 /*                                                249 /*
590  * Syscalls are a special type of exception in !! 250  * Load the potential sixth argument from user stack.
591  * _explicitly_ invoked by userspace and can t !! 251  * Careful about security.
592  * held to conform to the same ABI as normal f << 
593  * respect to whether registers are preserved  << 
594  * or not.                                     << 
595  */                                            << 
596                                                << 
597 /* Upon syscall entry we just save the callee- << 
598  * and not the call-clobbered ones.            << 
599  */                                               252  */
600                                                !! 253         cmpl $__PAGE_OFFSET-3,%ebp
601 _string_syscall_return:                        !! 254         jae syscall_fault
602         .string "syscall r9:0x%08x -> syscall( !! 255 1:      movl (%ebp),%ebp
                                                   >> 256 .section __ex_table,"a"
603         .align 4                                  257         .align 4
                                                   >> 258         .long 1b,syscall_fault
                                                   >> 259 .previous
604                                                   260 
605 ENTRY(_sys_call_handler)                       !! 261         pushl %eax
606         /* r1, EPCR, ESR a already saved */    !! 262         SAVE_ALL
607         l.sw    PT_GPR2(r1),r2                 !! 263         GET_THREAD_INFO(%ebp)
608         /* r3-r8 must be saved because syscall !! 264         cmpl $(nr_syscalls), %eax
609          * on us being able to restart the sys !! 265         jae syscall_badsys
610          * they should be clobbered, otherwise !! 266 
611          */                                    !! 267         testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
612         l.sw    PT_GPR3(r1),r3                 !! 268         jnz syscall_trace_entry
613         /*                                     !! 269         call *sys_call_table(,%eax,4)
614          * r4 already saved                    !! 270         movl %eax,EAX(%esp)
615          * r4 holds the EEAR address of the fa !! 271         cli
616          * then load the original r4           !! 272         movl TI_FLAGS(%ebp), %ecx
617          */                                    !! 273         testw $_TIF_ALLWORK_MASK, %cx
618         CLEAR_LWA_FLAG(r4)                     !! 274         jne syscall_exit_work
619         l.lwz   r4,PT_GPR4(r1)                 !! 275 /* if something modifies registers it must also disable sysexit */
620         l.sw    PT_GPR5(r1),r5                 !! 276         movl EIP(%esp), %edx
621         l.sw    PT_GPR6(r1),r6                 !! 277         movl OLDESP(%esp), %ecx
622         l.sw    PT_GPR7(r1),r7                 !! 278         sti
623         l.sw    PT_GPR8(r1),r8                 !! 279         sysexit
624         l.sw    PT_GPR9(r1),r9                 !! 280 
625         /* r10 already saved */                !! 281 
626         l.sw    PT_GPR11(r1),r11               !! 282         # system call handler stub
627         /* orig_gpr11 must be set for syscalls !! 283 ENTRY(system_call)
628         l.sw    PT_ORIG_GPR11(r1),r11          !! 284         pushl %eax                      # save orig_eax
629         /* r12,r13 already saved */            !! 285         SAVE_ALL
630                                                !! 286         GET_THREAD_INFO(%ebp)
631         /* r14-r28 (even) aren't touched by th !! 287         cmpl $(nr_syscalls), %eax
632          * so we don't need to save them.  How !! 288         jae syscall_badsys
633          * to userspace via a call to switch() !! 289                                         # system call tracing in operation
634          * switch() effectively clobbers them. !! 290         testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
635          * such functions is handled in their  !! 291         jnz syscall_trace_entry
636          * and clone, below).                  !! 292 syscall_call:
637                                                !! 293         call *sys_call_table(,%eax,4)
638         /* r30 is the only register we clobber !! 294         movl %eax,EAX(%esp)             # store the return value
639         /* r30 already saved */                !! 295 syscall_exit:
640 /*      l.sw    PT_GPR30(r1),r30 */            !! 296         cli                             # make sure we don't miss an interrupt
641                                                !! 297                                         # setting need_resched or sigpending
642 _syscall_check_trace_enter:                    !! 298                                         # between sampling and the iret
643         /* syscalls run with interrupts enable !! 299         movl TI_FLAGS(%ebp), %ecx
644         TRACE_IRQS_ON_SYSCALL                  !! 300         testw $_TIF_ALLWORK_MASK, %cx   # current->work
645         ENABLE_INTERRUPTS(r29)          // ena !! 301         jne syscall_exit_work
646                                                !! 302 restore_all:
647         /* If TIF_SYSCALL_TRACE is set, then w << 
648         l.lwz   r30,TI_FLAGS(r10)              << 
649         l.andi  r30,r30,_TIF_SYSCALL_TRACE     << 
650         l.sfne  r30,r0                         << 
651         l.bf    _syscall_trace_enter           << 
652          l.nop                                 << 
653                                                << 
654 _syscall_check:                                << 
655         /* Ensure that the syscall number is r << 
656         l.sfgeui r11,__NR_syscalls             << 
657         l.bf    _syscall_badsys                << 
658          l.nop                                 << 
659                                                << 
660 _syscall_call:                                 << 
661         l.movhi r29,hi(sys_call_table)         << 
662         l.ori   r29,r29,lo(sys_call_table)     << 
663         l.slli  r11,r11,2                      << 
664         l.add   r29,r29,r11                    << 
665         l.lwz   r29,0(r29)                     << 
666                                                << 
667         l.jalr  r29                            << 
668          l.nop                                 << 
669                                                << 
670 _syscall_return:                               << 
671         /* All syscalls return here... just pa << 
672          * which does it in a round-about way. << 
673          */                                    << 
674         l.sw    PT_GPR11(r1),r11           //  << 
675                                                << 
676 #if 0                                          << 
677 _syscall_debug:                                << 
678         l.movhi r3,hi(_string_syscall_return)  << 
679         l.ori   r3,r3,lo(_string_syscall_retur << 
680         l.ori   r27,r0,2                       << 
681         l.sw    -4(r1),r27                     << 
682         l.sw    -8(r1),r11                     << 
683         l.lwz   r29,PT_ORIG_GPR11(r1)          << 
684         l.sw    -12(r1),r29                    << 
685         l.lwz   r29,PT_GPR9(r1)                << 
686         l.sw    -16(r1),r29                    << 
687         l.movhi r27,hi(_printk)                << 
688         l.ori   r27,r27,lo(_printk)            << 
689         l.jalr  r27                            << 
690          l.addi  r1,r1,-16                     << 
691         l.addi  r1,r1,16                       << 
692 #endif                                         << 
693 #if 0                                          << 
694 _syscall_show_regs:                            << 
695         l.movhi r27,hi(show_registers)         << 
696         l.ori   r27,r27,lo(show_registers)     << 
697         l.jalr  r27                            << 
698          l.or   r3,r1,r1                       << 
699 #endif                                         << 
700                                                << 
701 _syscall_check_trace_leave:                    << 
702         /* r30 is a callee-saved register so t << 
703          * _TIF_SYSCALL_TRACE flag from _sysca << 
704          * _syscall_trace_leave expects syscal << 
705          */                                    << 
706         l.sfne  r30,r0                         << 
707         l.bf    _syscall_trace_leave           << 
708          l.nop                                 << 
709                                                << 
710 /* This is where the exception-return code beg << 
711  * disabled the rest of the way here because w << 
712  * interrupts that set NEED_RESCHED or SIGNALP << 
713                                                << 
714 _syscall_check_work:                           << 
715         /* Here we need to disable interrupts  << 
716         DISABLE_INTERRUPTS(r27,r29)            << 
717         TRACE_IRQS_OFF                         << 
718         l.lwz   r30,TI_FLAGS(r10)              << 
719         l.andi  r30,r30,_TIF_WORK_MASK         << 
720         l.sfne  r30,r0                         << 
721                                                << 
722         l.bnf   _syscall_resume_userspace      << 
723          l.nop                                 << 
724                                                << 
725         /* Work pending follows a different re << 
726          * make sure that all the call-saved r << 
727          * before branching...                 << 
728          */                                    << 
729         l.sw    PT_GPR14(r1),r14               << 
730         l.sw    PT_GPR16(r1),r16               << 
731         l.sw    PT_GPR18(r1),r18               << 
732         l.sw    PT_GPR20(r1),r20               << 
733         l.sw    PT_GPR22(r1),r22               << 
734         l.sw    PT_GPR24(r1),r24               << 
735         l.sw    PT_GPR26(r1),r26               << 
736         l.sw    PT_GPR28(r1),r28               << 
737                                                << 
738         /* _work_pending needs to be called wi << 
739         l.j     _work_pending                  << 
740          l.nop                                 << 
741                                                << 
742 _syscall_resume_userspace:                     << 
743 //      ENABLE_INTERRUPTS(r29)                 << 
744                                                << 
745                                                << 
746 /* This is the hot path for returning to users << 
747  * work to be done and the branch to _work_pen << 
748  * return to userspace will be done via the no << 
749  * that path restores _all_ registers and will << 
750  * registers with whatever garbage is in pt_re << 
751  * registers are clobbered anyway and because  << 
752  * in the context of the extra work that _work << 
753                                                << 
754 /* Once again, syscalls are special and only g << 
755  * same registers as a normal function call */ << 
756                                                << 
757 /* The assumption here is that the registers r << 
758  * don't need to be restored... be sure that t << 
759  */                                            << 
760                                                << 
761 /* This is still too much... we should only be << 
762  * clobbered... we should even be using 'scrat << 
763  * we don't need to restore anything, hardly.. << 
764  */                                            << 
765                                                << 
766         l.lwz   r2,PT_GPR2(r1)                 << 
767                                                << 
768         /* Restore args */                     << 
769         /* r3-r8 are technically clobbered, bu << 
770          * to be restored...                   << 
771          */                                    << 
772         l.lwz   r3,PT_GPR3(r1)                 << 
773         l.lwz   r4,PT_GPR4(r1)                 << 
774         l.lwz   r5,PT_GPR5(r1)                 << 
775         l.lwz   r6,PT_GPR6(r1)                 << 
776         l.lwz   r7,PT_GPR7(r1)                 << 
777         l.lwz   r8,PT_GPR8(r1)                 << 
778                                                << 
779         l.lwz   r9,PT_GPR9(r1)                 << 
780         l.lwz   r10,PT_GPR10(r1)               << 
781         l.lwz   r11,PT_GPR11(r1)               << 
782                                                << 
783         /* r30 is the only register we clobber << 
784         l.lwz   r30,PT_GPR30(r1)               << 
785                                                << 
786         /* Here we use r13-r19 (odd) as scratc << 
787         l.lwz   r13,PT_PC(r1)                  << 
788         l.lwz   r15,PT_SR(r1)                  << 
789         l.lwz   r1,PT_SP(r1)                   << 
790         /* Interrupts need to be disabled for  << 
791          * so that another interrupt doesn't c << 
792          * them before we can use them for our << 
793         DISABLE_INTERRUPTS(r17,r19)            << 
794         l.mtspr r0,r13,SPR_EPCR_BASE           << 
795         l.mtspr r0,r15,SPR_ESR_BASE            << 
796         l.rfe                                  << 
797                                                << 
798 /* End of hot path!                            << 
799  * Keep the below tracing and error handling o << 
800 */                                             << 
801                                                << 
802 _syscall_trace_enter:                          << 
803         /* Here we pass pt_regs to do_syscall_ << 
804          * that function is really getting all << 
805          * pt_regs isn't a complete set of use << 
806          * ones relevant to the syscall...     << 
807          *                                     << 
808          * Note use of delay slot for setting  << 
809          */                                    << 
810         l.jal   do_syscall_trace_enter         << 
811          l.addi r3,r1,0                        << 
812                                                << 
813         /* Restore arguments (not preserved ac << 
814          * so that we can do the syscall for r << 
815          * hot path.                           << 
816          */                                    << 
817         l.lwz   r11,PT_GPR11(r1)               << 
818         l.lwz   r3,PT_GPR3(r1)                 << 
819         l.lwz   r4,PT_GPR4(r1)                 << 
820         l.lwz   r5,PT_GPR5(r1)                 << 
821         l.lwz   r6,PT_GPR6(r1)                 << 
822         l.lwz   r7,PT_GPR7(r1)                 << 
823                                                << 
824         l.j     _syscall_check                 << 
825          l.lwz  r8,PT_GPR8(r1)                 << 
826                                                << 
827 _syscall_trace_leave:                          << 
828         l.jal   do_syscall_trace_leave         << 
829          l.addi r3,r1,0                        << 
830                                                << 
831         l.j     _syscall_check_work            << 
832          l.nop                                 << 
833                                                << 
834 _syscall_badsys:                               << 
835         /* Here we effectively pretend to have << 
836          * syscall that returns -ENOSYS and th << 
837          * syscall hot path.                   << 
838          * Note that "return value" is set in  << 
839          */                                    << 
840         l.j     _syscall_return                << 
841          l.addi r11,r0,-ENOSYS                 << 
842                                                << 
843 /******* END SYSCALL HANDLING *******/         << 
844                                                << 
845 /* ---[ 0xd00: Floating Point exception ]----- << 
846                                                << 
847 EXCEPTION_ENTRY(_fpe_trap_handler)             << 
848         CLEAR_LWA_FLAG(r3)                     << 
849                                                << 
850         /* r4: EA of fault (set by EXCEPTION_H << 
851         l.jal   do_fpe_trap                    << 
852          l.addi  r3,r1,0 /* pt_regs */         << 
853                                                << 
854         l.j     _ret_from_exception            << 
855          l.nop                                 << 
856                                                << 
857 /* ---[ 0xe00: Trap exception ]--------------- << 
858                                                << 
859 EXCEPTION_ENTRY(_trap_handler)                 << 
860         CLEAR_LWA_FLAG(r3)                     << 
861         /* r4: EA of fault (set by EXCEPTION_H << 
862         l.jal   do_trap                        << 
863          l.addi  r3,r1,0 /* pt_regs */         << 
864                                                << 
865         l.j     _ret_from_exception            << 
866          l.nop                                 << 
867                                                << 
868 /* ---[ 0xf00: Reserved exception ]----------- << 
869                                                << 
870 UNHANDLED_EXCEPTION(_vector_0xf00,0xf00)       << 
871                                                << 
872 /* ---[ 0x1000: Reserved exception ]---------- << 
873                                                << 
874 UNHANDLED_EXCEPTION(_vector_0x1000,0x1000)     << 
875                                                << 
876 /* ---[ 0x1100: Reserved exception ]---------- << 
877                                                << 
878 UNHANDLED_EXCEPTION(_vector_0x1100,0x1100)     << 
879                                                << 
880 /* ---[ 0x1200: Reserved exception ]---------- << 
881                                                << 
882 UNHANDLED_EXCEPTION(_vector_0x1200,0x1200)     << 
883                                                << 
884 /* ---[ 0x1300: Reserved exception ]---------- << 
885                                                << 
886 UNHANDLED_EXCEPTION(_vector_0x1300,0x1300)     << 
887                                                << 
888 /* ---[ 0x1400: Reserved exception ]---------- << 
889                                                << 
890 UNHANDLED_EXCEPTION(_vector_0x1400,0x1400)     << 
891                                                << 
892 /* ---[ 0x1500: Reserved exception ]---------- << 
893                                                << 
894 UNHANDLED_EXCEPTION(_vector_0x1500,0x1500)     << 
895                                                << 
896 /* ---[ 0x1600: Reserved exception ]---------- << 
897                                                << 
898 UNHANDLED_EXCEPTION(_vector_0x1600,0x1600)     << 
899                                                << 
900 /* ---[ 0x1700: Reserved exception ]---------- << 
901                                                << 
902 UNHANDLED_EXCEPTION(_vector_0x1700,0x1700)     << 
903                                                << 
904 /* ---[ 0x1800: Reserved exception ]---------- << 
905                                                << 
906 UNHANDLED_EXCEPTION(_vector_0x1800,0x1800)     << 
907                                                << 
908 /* ---[ 0x1900: Reserved exception ]---------- << 
909                                                << 
910 UNHANDLED_EXCEPTION(_vector_0x1900,0x1900)     << 
911                                                << 
912 /* ---[ 0x1a00: Reserved exception ]---------- << 
913                                                << 
914 UNHANDLED_EXCEPTION(_vector_0x1a00,0x1a00)     << 
915                                                << 
916 /* ---[ 0x1b00: Reserved exception ]---------- << 
917                                                << 
918 UNHANDLED_EXCEPTION(_vector_0x1b00,0x1b00)     << 
919                                                << 
920 /* ---[ 0x1c00: Reserved exception ]---------- << 
921                                                << 
922 UNHANDLED_EXCEPTION(_vector_0x1c00,0x1c00)     << 
923                                                << 
924 /* ---[ 0x1d00: Reserved exception ]---------- << 
925                                                << 
926 UNHANDLED_EXCEPTION(_vector_0x1d00,0x1d00)     << 
927                                                << 
928 /* ---[ 0x1e00: Reserved exception ]---------- << 
929                                                << 
930 UNHANDLED_EXCEPTION(_vector_0x1e00,0x1e00)     << 
931                                                << 
932 /* ---[ 0x1f00: Reserved exception ]---------- << 
933                                                << 
934 UNHANDLED_EXCEPTION(_vector_0x1f00,0x1f00)     << 
935                                                << 
936 /* =========================================== << 
937                                                << 
938 _resume_userspace:                             << 
939         DISABLE_INTERRUPTS(r3,r4)              << 
940         TRACE_IRQS_OFF                         << 
941         l.lwz   r4,TI_FLAGS(r10)               << 
942         l.andi  r13,r4,_TIF_WORK_MASK          << 
943         l.sfeqi r13,0                          << 
944         l.bf    _restore_all                   << 
945          l.nop                                 << 
946                                                << 
947 _work_pending:                                 << 
948         l.lwz   r5,PT_ORIG_GPR11(r1)           << 
949         l.sfltsi r5,0                          << 
950         l.bnf   1f                             << 
951          l.nop                                 << 
952         l.andi  r5,r5,0                        << 
953 1:                                             << 
954         l.jal   do_work_pending                << 
955          l.ori  r3,r1,0                 /* pt_ << 
956                                                << 
957         l.sfeqi r11,0                          << 
958         l.bf    _restore_all                   << 
959          l.nop                                 << 
960         l.sfltsi r11,0                         << 
961         l.bnf   1f                             << 
962          l.nop                                 << 
963         l.and   r11,r11,r0                     << 
964         l.ori   r11,r11,__NR_restart_syscall   << 
965         l.j     _syscall_check_trace_enter     << 
966          l.nop                                 << 
967 1:                                             << 
968         l.lwz   r11,PT_ORIG_GPR11(r1)          << 
969         /* Restore arg registers */            << 
970         l.lwz   r3,PT_GPR3(r1)                 << 
971         l.lwz   r4,PT_GPR4(r1)                 << 
972         l.lwz   r5,PT_GPR5(r1)                 << 
973         l.lwz   r6,PT_GPR6(r1)                 << 
974         l.lwz   r7,PT_GPR7(r1)                 << 
975         l.j     _syscall_check_trace_enter     << 
976          l.lwz  r8,PT_GPR8(r1)                 << 
977                                                << 
978 _restore_all:                                  << 
979 #ifdef CONFIG_TRACE_IRQFLAGS                   << 
980         l.lwz   r4,PT_SR(r1)                   << 
981         l.andi  r3,r4,(SPR_SR_IEE|SPR_SR_TEE)  << 
982         l.sfeq  r3,r0           /* skip trace  << 
983         l.bf    skip_hardirqs_on               << 
984          l.nop                                 << 
985         TRACE_IRQS_ON                          << 
986 skip_hardirqs_on:                              << 
987 #endif                                         << 
988         RESTORE_ALL                               303         RESTORE_ALL
989         /* This returns to userspace code */   << 
990                                                << 
991                                                << 
992 ENTRY(_ret_from_intr)                          << 
993 ENTRY(_ret_from_exception)                     << 
994         l.lwz   r4,PT_SR(r1)                   << 
995         l.andi  r3,r4,SPR_SR_SM                << 
996         l.sfeqi r3,0                           << 
997         l.bnf   _restore_all                   << 
998          l.nop                                 << 
999         l.j     _resume_userspace              << 
1000          l.nop                                << 
1001                                               << 
1002 ENTRY(ret_from_fork)                          << 
1003         l.jal   schedule_tail                 << 
1004          l.nop                                << 
1005                                               << 
1006         /* Check if we are a kernel thread */ << 
1007         l.sfeqi r20,0                         << 
1008         l.bf    1f                            << 
1009          l.nop                                << 
1010                                               << 
1011         /* ...we are a kernel thread so invok << 
1012         l.jalr  r20                           << 
1013          l.or   r3,r22,r0                     << 
1014                                               << 
1015 1:                                            << 
1016         /* _syscall_returns expect r11 to con << 
1017         l.lwz   r11,PT_GPR11(r1)              << 
1018                                               << 
1019         /* The syscall fast path return expec << 
1020          * r14-r28 to be untouched, so we res << 
1021          * will have been effectively clobber << 
1022          * via the call to switch()           << 
1023          */                                   << 
1024         l.lwz   r14,PT_GPR14(r1)              << 
1025         l.lwz   r16,PT_GPR16(r1)              << 
1026         l.lwz   r18,PT_GPR18(r1)              << 
1027         l.lwz   r20,PT_GPR20(r1)              << 
1028         l.lwz   r22,PT_GPR22(r1)              << 
1029         l.lwz   r24,PT_GPR24(r1)              << 
1030         l.lwz   r26,PT_GPR26(r1)              << 
1031         l.lwz   r28,PT_GPR28(r1)              << 
1032                                                  304 
1033         l.j     _syscall_return               !! 305         # perform work that needs to be done immediately before resumption
1034          l.nop                                !! 306         ALIGN
1035                                               !! 307 work_pending:
1036 /* ========================================== !! 308         testb $_TIF_NEED_RESCHED, %cl
                                                   >> 309         jz work_notifysig
                                                   >> 310 work_resched:
                                                   >> 311         call schedule
                                                   >> 312         cli                             # make sure we don't miss an interrupt
                                                   >> 313                                         # setting need_resched or sigpending
                                                   >> 314                                         # between sampling and the iret
                                                   >> 315         movl TI_FLAGS(%ebp), %ecx
                                                   >> 316         andl $_TIF_WORK_MASK, %ecx      # is there any work to be done other
                                                   >> 317                                         # than syscall tracing?
                                                   >> 318         jz restore_all
                                                   >> 319         testb $_TIF_NEED_RESCHED, %cl
                                                   >> 320         jnz work_resched
                                                   >> 321 
                                                   >> 322 work_notifysig:                         # deal with pending signals and
                                                   >> 323                                         # notify-resume requests
                                                   >> 324         testl $VM_MASK, EFLAGS(%esp)
                                                   >> 325         movl %esp, %eax
                                                   >> 326         jne work_notifysig_v86          # returning to kernel-space or
                                                   >> 327                                         # vm86-space
                                                   >> 328         xorl %edx, %edx
                                                   >> 329         call do_notify_resume
                                                   >> 330         jmp restore_all
                                                   >> 331 
                                                   >> 332         ALIGN
                                                   >> 333 work_notifysig_v86:
                                                   >> 334         pushl %ecx
                                                   >> 335         call save_v86_state
                                                   >> 336         popl %ecx
                                                   >> 337         movl %eax, %esp
                                                   >> 338         xorl %edx, %edx
                                                   >> 339         call do_notify_resume
                                                   >> 340         jmp restore_all
                                                   >> 341 
                                                   >> 342         # perform syscall exit tracing
                                                   >> 343         ALIGN
                                                   >> 344 syscall_trace_entry:
                                                   >> 345         movl $-ENOSYS,EAX(%esp)
                                                   >> 346         movl %esp, %eax
                                                   >> 347         xorl %edx,%edx
                                                   >> 348         call do_syscall_trace
                                                   >> 349         movl ORIG_EAX(%esp), %eax
                                                   >> 350         cmpl $(nr_syscalls), %eax
                                                   >> 351         jnae syscall_call
                                                   >> 352         jmp syscall_exit
                                                   >> 353 
                                                   >> 354         # perform syscall exit tracing
                                                   >> 355         ALIGN
                                                   >> 356 syscall_exit_work:
                                                   >> 357         testb $_TIF_SYSCALL_TRACE, %cl
                                                   >> 358         jz work_pending
                                                   >> 359         sti                             # could let do_syscall_trace() call
                                                   >> 360                                         # schedule() instead
                                                   >> 361         movl %esp, %eax
                                                   >> 362         movl $1, %edx
                                                   >> 363         call do_syscall_trace
                                                   >> 364         jmp resume_userspace
                                                   >> 365 
                                                   >> 366         ALIGN
                                                   >> 367 syscall_fault:
                                                   >> 368         pushl %eax                      # save orig_eax
                                                   >> 369         SAVE_ALL
                                                   >> 370         GET_THREAD_INFO(%ebp)
                                                   >> 371         movl $-EFAULT,EAX(%esp)
                                                   >> 372         jmp resume_userspace
                                                   >> 373 
                                                   >> 374         ALIGN
                                                   >> 375 syscall_badsys:
                                                   >> 376         movl $-ENOSYS,EAX(%esp)
                                                   >> 377         jmp resume_userspace
1037                                                  378 
1038 /*                                               379 /*
1039  * This routine switches between two differen !! 380  * Build the entry stubs and pointer table with
1040  * state of one is saved on its kernel stack. !! 381  * some assembler magic.
1041  * of the other is restored from its kernel s << 
1042  * management hardware is updated to the seco << 
1043  * Finally, we can return to the second proce << 
1044  *                                            << 
1045  * Note: there are two ways to get to the "go << 
1046  * of this code; either by coming in via the  << 
1047  * or via "fork" which must set up an environ << 
1048  * to the "_switch" path.  If you change this << 
1049  * SAVE_REGS macro), you'll have to change th << 
1050  */                                              382  */
                                                   >> 383 .data
                                                   >> 384 ENTRY(interrupt)
                                                   >> 385 .text
                                                   >> 386 
                                                   >> 387 vector=0
                                                   >> 388 ENTRY(irq_entries_start)
                                                   >> 389 .rept NR_IRQS
                                                   >> 390         ALIGN
                                                   >> 391 1:      pushl $vector-256
                                                   >> 392         jmp common_interrupt
                                                   >> 393 .data
                                                   >> 394         .long 1b
                                                   >> 395 .text
                                                   >> 396 vector=vector+1
                                                   >> 397 .endr
                                                   >> 398 
                                                   >> 399         ALIGN
                                                   >> 400 common_interrupt:
                                                   >> 401         SAVE_ALL
                                                   >> 402         call do_IRQ
                                                   >> 403         jmp ret_from_intr
                                                   >> 404 
                                                   >> 405 #define BUILD_INTERRUPT(name, nr)       \
                                                   >> 406 ENTRY(name)                             \
                                                   >> 407         pushl $nr-256;                  \
                                                   >> 408         SAVE_ALL                        \
                                                   >> 409         call smp_/**/name;      \
                                                   >> 410         jmp ret_from_intr;
                                                   >> 411 
                                                   >> 412 /* The include is where all of the SMP etc. interrupts come from */
                                                   >> 413 #include "entry_arch.h"
                                                   >> 414 
                                                   >> 415 ENTRY(divide_error)
                                                   >> 416         pushl $0                        # no error code
                                                   >> 417         pushl $do_divide_error
                                                   >> 418         ALIGN
                                                   >> 419 error_code:
                                                   >> 420         pushl %ds
                                                   >> 421         pushl %eax
                                                   >> 422         xorl %eax, %eax
                                                   >> 423         pushl %ebp
                                                   >> 424         pushl %edi
                                                   >> 425         pushl %esi
                                                   >> 426         pushl %edx
                                                   >> 427         decl %eax                       # eax = -1
                                                   >> 428         pushl %ecx
                                                   >> 429         pushl %ebx
                                                   >> 430         cld
                                                   >> 431         movl %es, %ecx
                                                   >> 432         movl ORIG_EAX(%esp), %esi       # get the error code
                                                   >> 433         movl ES(%esp), %edi             # get the function address
                                                   >> 434         movl %eax, ORIG_EAX(%esp)
                                                   >> 435         movl %ecx, ES(%esp)
                                                   >> 436         movl %esp, %edx
                                                   >> 437         pushl %esi                      # push the error code
                                                   >> 438         pushl %edx                      # push the pt_regs pointer
                                                   >> 439         movl $(__USER_DS), %edx
                                                   >> 440         movl %edx, %ds
                                                   >> 441         movl %edx, %es
                                                   >> 442         call *%edi
                                                   >> 443         addl $8, %esp
                                                   >> 444         jmp ret_from_exception
                                                   >> 445 
                                                   >> 446 ENTRY(coprocessor_error)
                                                   >> 447         pushl $0
                                                   >> 448         pushl $do_coprocessor_error
                                                   >> 449         jmp error_code
                                                   >> 450 
                                                   >> 451 ENTRY(simd_coprocessor_error)
                                                   >> 452         pushl $0
                                                   >> 453         pushl $do_simd_coprocessor_error
                                                   >> 454         jmp error_code
                                                   >> 455 
                                                   >> 456 ENTRY(device_not_available)
                                                   >> 457         pushl $-1                       # mark this as an int
                                                   >> 458         SAVE_ALL
                                                   >> 459         movl %cr0, %eax
                                                   >> 460         testl $0x4, %eax                # EM (math emulation bit)
                                                   >> 461         jne device_not_available_emulate
                                                   >> 462         preempt_stop
                                                   >> 463         call math_state_restore
                                                   >> 464         jmp ret_from_exception
                                                   >> 465 device_not_available_emulate:
                                                   >> 466         pushl $0                        # temporary storage for ORIG_EIP
                                                   >> 467         call math_emulate
                                                   >> 468         addl $4, %esp
                                                   >> 469         jmp ret_from_exception
1051                                                  470 
1052                                               !! 471 /*
1053 /* _switch MUST never lay on page boundry, ca !! 472  * Debug traps and NMI can happen at the one SYSENTER instruction
1054  * effective addresses and beeing interrupted !! 473  * that sets up the real kernel stack. Check here, since we can't
1055  * dTLB miss seems to never accour in the bad !! 474  * allow the wrong stack to be used.
1056  * are from task structures which are always  << 
1057  *                                               475  *
1058  * The problem happens in RESTORE_ALL where w !! 476  * "TSS_ESP0_OFFSET+12" is because the NMI/debug handler will have
1059  * register, then load the previous register  !! 477  * already pushed 3 words if it hits on the sysenter instruction:
1060  * the l.rfe instruction. If get TLB miss in  !! 478  * eflags, cs and eip.
1061  * garbled and we end up calling l.rfe with t << 
1062  * holds for ESR)                             << 
1063  *                                               479  *
1064  * To avoid this problems it is sufficient to !! 480  * We just load the right stack, and push the three (known) values
1065  * some nice round number smaller than it's s !! 481  * by hand onto the new stack - while updating the return eip past
1066  */                                           !! 482  * the instruction that would have done it for sysenter.
1067                                               !! 483  */
1068 /* ABI rules apply here... we either enter _s !! 484 #define FIX_STACK(offset, ok, label)            \
1069  * an imaginary call to which we shall return !! 485         cmpw $__KERNEL_CS,4(%esp);              \
1070  * way, we are a function call and only need  !! 486         jne ok;                                 \
1071  * registers when we return.  As such, we don !! 487 label:                                          \
1072  * on the stack that we won't be returning as !! 488         movl TSS_ESP0_OFFSET+offset(%esp),%esp; \
1073  */                                           !! 489         pushfl;                                 \
                                                   >> 490         pushl $__KERNEL_CS;                     \
                                                   >> 491         pushl $sysenter_past_esp
                                                   >> 492 
                                                   >> 493 ENTRY(debug)
                                                   >> 494         cmpl $sysenter_entry,(%esp)
                                                   >> 495         jne debug_stack_correct
                                                   >> 496         FIX_STACK(12, debug_stack_correct, debug_esp_fix_insn)
                                                   >> 497 debug_stack_correct:
                                                   >> 498         pushl $0
                                                   >> 499         pushl $do_debug
                                                   >> 500         jmp error_code
1074                                                  501 
1075         .align 0x400                          !! 502 /*
1076 ENTRY(_switch)                                !! 503  * NMI is doubly nasty. It can happen _while_ we're handling
1077         /* We don't store SR as _switch only  !! 504  * a debug fault, and the debug fault hasn't yet been able to
1078          * the SR will be the same going in a !! 505  * clear up the stack. So we first check whether we got  an
1079                                               !! 506  * NMI on the sysenter entry path, but after that we need to
1080         /* Set up new pt_regs struct for savi !! 507  * check whether we got an NMI on the debug path where the debug
1081         l.addi  r1,r1,-(INT_FRAME_SIZE)       !! 508  * fault happened on the sysenter path.
1082                                               !! 509  */
1083         /* No need to store r1/PT_SP as it go !! 510 ENTRY(nmi)
1084         l.sw    PT_GPR2(r1),r2                !! 511         cmpl $sysenter_entry,(%esp)
1085         l.sw    PT_GPR9(r1),r9                !! 512         je nmi_stack_fixup
1086                                               !! 513         pushl %eax
1087         /* Save callee-saved registers to the !! 514         movl %esp,%eax
1088         l.sw    PT_GPR14(r1),r14              !! 515         /* Do not access memory above the end of our stack page,
1089         l.sw    PT_GPR16(r1),r16              !! 516          * it might not exist.
1090         l.sw    PT_GPR18(r1),r18              !! 517          */
1091         l.sw    PT_GPR20(r1),r20              !! 518         andl $0x1fff,%eax
1092         l.sw    PT_GPR22(r1),r22              !! 519         cmpl $0x1fec,%eax
1093         l.sw    PT_GPR24(r1),r24              !! 520         popl %eax
1094         l.sw    PT_GPR26(r1),r26              !! 521         jae nmi_stack_correct
1095         l.sw    PT_GPR28(r1),r28              !! 522         cmpl $sysenter_entry,12(%esp)
1096         l.sw    PT_GPR30(r1),r30              !! 523         je nmi_debug_stack_check
1097                                               !! 524 nmi_stack_correct:
1098         l.addi  r11,r10,0                     !! 525         pushl %eax
1099                                               !! 526         SAVE_ALL
1100         /* We use thread_info->ksp for storin !! 527         movl %esp, %edx
1101          * structure so that we can get back  !! 528         pushl $0
1102          * to lose the value of thread_info-> !! 529         pushl %edx
1103          * pt_regs->sp so that we can easily  !! 530         call do_nmi
1104          * live again...                      !! 531         addl $8, %esp
1105          */                                   !! 532         RESTORE_ALL
1106                                               << 
1107         /* Save the old value of thread_info- << 
1108         l.lwz   r29,TI_KSP(r10)               << 
1109         l.sw    PT_SP(r1),r29                 << 
1110                                               << 
1111         /* Swap kernel stack pointers */      << 
1112         l.sw    TI_KSP(r10),r1                << 
1113         l.or    r10,r4,r0                     << 
1114         l.lwz   r1,TI_KSP(r10)                << 
1115                                               << 
1116         /* Restore the old value of thread_in << 
1117         l.lwz   r29,PT_SP(r1)                 << 
1118         l.sw    TI_KSP(r10),r29               << 
1119                                               << 
1120         /* ...and restore the registers, exce << 
1121          * has already been set above.        << 
1122          */                                   << 
1123         l.lwz   r2,PT_GPR2(r1)                << 
1124         l.lwz   r9,PT_GPR9(r1)                << 
1125         /* No need to restore r10 */          << 
1126         /* ...and do not restore r11 */       << 
1127                                               << 
1128         /* Restore callee-saved registers */  << 
1129         l.lwz   r14,PT_GPR14(r1)              << 
1130         l.lwz   r16,PT_GPR16(r1)              << 
1131         l.lwz   r18,PT_GPR18(r1)              << 
1132         l.lwz   r20,PT_GPR20(r1)              << 
1133         l.lwz   r22,PT_GPR22(r1)              << 
1134         l.lwz   r24,PT_GPR24(r1)              << 
1135         l.lwz   r26,PT_GPR26(r1)              << 
1136         l.lwz   r28,PT_GPR28(r1)              << 
1137         l.lwz   r30,PT_GPR30(r1)              << 
1138                                               << 
1139         /* Unwind stack to pre-switch state * << 
1140         l.addi  r1,r1,(INT_FRAME_SIZE)        << 
1141                                               << 
1142         /* Return via the link-register back  << 
1143          * that may be either schedule(), ret << 
1144          * ret_from_kernel_thread().  If we a << 
1145          * we are expected to have set up the << 
1146          * hence we do so here unconditionall << 
1147          */                                   << 
1148         l.lwz   r3,TI_TASK(r3)          /* Lo << 
1149         l.jr    r9                            << 
1150          l.nop                                << 
1151                                               << 
1152 /* ========================================== << 
1153                                               << 
1154 /* These all use the delay slot for setting t << 
1155  * jump is always happening after the l.addi  << 
1156  *                                            << 
1157  * These are all just wrappers that don't tou << 
1158  * return from the "real" syscall function wi << 
1159  * code that did the l.jal that brought us he << 
1160  */                                           << 
1161                                               << 
1162 /* fork requires that we save all the callee- << 
1163  * are all effectively clobbered by the call  << 
1164  * all the registers that aren't touched by t << 
1165  * weren't saved there.                       << 
1166  */                                           << 
1167                                                  533 
1168 _fork_save_extra_regs_and_call:               !! 534 nmi_stack_fixup:
1169         l.sw    PT_GPR14(r1),r14              !! 535         FIX_STACK(12,nmi_stack_correct, 1)
1170         l.sw    PT_GPR16(r1),r16              !! 536         jmp nmi_stack_correct
1171         l.sw    PT_GPR18(r1),r18              !! 537 nmi_debug_stack_check:
1172         l.sw    PT_GPR20(r1),r20              !! 538         cmpw $__KERNEL_CS,16(%esp)
1173         l.sw    PT_GPR22(r1),r22              !! 539         jne nmi_stack_correct
1174         l.sw    PT_GPR24(r1),r24              !! 540         cmpl $debug - 1,(%esp)
1175         l.sw    PT_GPR26(r1),r26              !! 541         jle nmi_stack_correct
1176         l.jr    r29                           !! 542         cmpl $debug_esp_fix_insn,(%esp)
1177          l.sw    PT_GPR28(r1),r28             !! 543         jle nmi_debug_stack_fixup
1178                                               !! 544 nmi_debug_stack_fixup:
1179 ENTRY(__sys_clone)                            !! 545         FIX_STACK(24,nmi_stack_correct, 1)
1180         l.movhi r29,hi(sys_clone)             !! 546         jmp nmi_stack_correct
1181         l.j     _fork_save_extra_regs_and_cal !! 547 
1182          l.ori  r29,r29,lo(sys_clone)         !! 548 ENTRY(int3)
1183                                               !! 549         pushl $0
1184 ENTRY(__sys_clone3)                           !! 550         pushl $do_int3
1185         l.movhi r29,hi(sys_clone3)            !! 551         jmp error_code
1186         l.j     _fork_save_extra_regs_and_cal !! 552 
1187          l.ori  r29,r29,lo(sys_clone3)        !! 553 ENTRY(overflow)
1188                                               !! 554         pushl $0
1189 ENTRY(__sys_fork)                             !! 555         pushl $do_overflow
1190         l.movhi r29,hi(sys_fork)              !! 556         jmp error_code
1191         l.j     _fork_save_extra_regs_and_cal !! 557 
1192          l.ori  r29,r29,lo(sys_fork)          !! 558 ENTRY(bounds)
1193                                               !! 559         pushl $0
1194 ENTRY(sys_rt_sigreturn)                       !! 560         pushl $do_bounds
1195         l.jal   _sys_rt_sigreturn             !! 561         jmp error_code
1196          l.addi r3,r1,0                       !! 562 
1197         l.sfne  r30,r0                        !! 563 ENTRY(invalid_op)
1198         l.bnf   _no_syscall_trace             !! 564         pushl $0
1199          l.nop                                !! 565         pushl $do_invalid_op
1200         l.jal   do_syscall_trace_leave        !! 566         jmp error_code
1201          l.addi r3,r1,0                       !! 567 
1202 _no_syscall_trace:                            !! 568 ENTRY(coprocessor_segment_overrun)
1203         l.j     _resume_userspace             !! 569         pushl $0
1204          l.nop                                !! 570         pushl $do_coprocessor_segment_overrun
1205                                               !! 571         jmp error_code
1206 /* This is a catch-all syscall for atomic ins !! 572 
1207  * The functions takes a variable number of p !! 573 ENTRY(invalid_TSS)
1208  * particular flavour of atomic you want... p !! 574         pushl $do_invalid_TSS
1209  * the atomic in question.  Currently, this f !! 575         jmp error_code
1210  * following variants:                        !! 576 
1211  *                                            !! 577 ENTRY(segment_not_present)
1212  * XCHG:                                      !! 578         pushl $do_segment_not_present
1213  *  @flag: 1                                  !! 579         jmp error_code
1214  *  @ptr1:                                    !! 580 
1215  *  @ptr2:                                    !! 581 ENTRY(stack_segment)
1216  * Atomically exchange the values in pointers !! 582         pushl $do_stack_segment
1217  *                                            !! 583         jmp error_code
1218  */                                           !! 584 
                                                   >> 585 ENTRY(general_protection)
                                                   >> 586         pushl $do_general_protection
                                                   >> 587         jmp error_code
                                                   >> 588 
                                                   >> 589 ENTRY(alignment_check)
                                                   >> 590         pushl $do_alignment_check
                                                   >> 591         jmp error_code
                                                   >> 592 
                                                   >> 593 ENTRY(page_fault)
                                                   >> 594         pushl $do_page_fault
                                                   >> 595         jmp error_code
                                                   >> 596 
                                                   >> 597 #ifdef CONFIG_X86_MCE
                                                   >> 598 ENTRY(machine_check)
                                                   >> 599         pushl $0
                                                   >> 600         pushl machine_check_vector
                                                   >> 601         jmp error_code
                                                   >> 602 #endif
1219                                                  603 
1220 ENTRY(sys_or1k_atomic)                        !! 604 ENTRY(spurious_interrupt_bug)
1221         /* FIXME: This ignores r3 and always  !! 605         pushl $0
1222         DISABLE_INTERRUPTS(r17,r19)           !! 606         pushl $do_spurious_interrupt_bug
1223         l.lwz   r29,0(r4)                     !! 607         jmp error_code
1224         l.lwz   r27,0(r5)                     !! 608 
1225         l.sw    0(r4),r27                     !! 609 .data
1226         l.sw    0(r5),r29                     !! 610 ENTRY(sys_call_table)
1227         ENABLE_INTERRUPTS(r17)                !! 611         .long sys_restart_syscall       /* 0 - old "setup()" system call, used for restarting */
1228         l.jr    r9                            !! 612         .long sys_exit
1229          l.or   r11,r0,r0                     !! 613         .long sys_fork
                                                   >> 614         .long sys_read
                                                   >> 615         .long sys_write
                                                   >> 616         .long sys_open          /* 5 */
                                                   >> 617         .long sys_close
                                                   >> 618         .long sys_waitpid
                                                   >> 619         .long sys_creat
                                                   >> 620         .long sys_link
                                                   >> 621         .long sys_unlink        /* 10 */
                                                   >> 622         .long sys_execve
                                                   >> 623         .long sys_chdir
                                                   >> 624         .long sys_time
                                                   >> 625         .long sys_mknod
                                                   >> 626         .long sys_chmod         /* 15 */
                                                   >> 627         .long sys_lchown16
                                                   >> 628         .long sys_ni_syscall    /* old break syscall holder */
                                                   >> 629         .long sys_stat
                                                   >> 630         .long sys_lseek
                                                   >> 631         .long sys_getpid        /* 20 */
                                                   >> 632         .long sys_mount
                                                   >> 633         .long sys_oldumount
                                                   >> 634         .long sys_setuid16
                                                   >> 635         .long sys_getuid16
                                                   >> 636         .long sys_stime         /* 25 */
                                                   >> 637         .long sys_ptrace
                                                   >> 638         .long sys_alarm
                                                   >> 639         .long sys_fstat
                                                   >> 640         .long sys_pause
                                                   >> 641         .long sys_utime         /* 30 */
                                                   >> 642         .long sys_ni_syscall    /* old stty syscall holder */
                                                   >> 643         .long sys_ni_syscall    /* old gtty syscall holder */
                                                   >> 644         .long sys_access
                                                   >> 645         .long sys_nice
                                                   >> 646         .long sys_ni_syscall    /* 35 - old ftime syscall holder */
                                                   >> 647         .long sys_sync
                                                   >> 648         .long sys_kill
                                                   >> 649         .long sys_rename
                                                   >> 650         .long sys_mkdir
                                                   >> 651         .long sys_rmdir         /* 40 */
                                                   >> 652         .long sys_dup
                                                   >> 653         .long sys_pipe
                                                   >> 654         .long sys_times
                                                   >> 655         .long sys_ni_syscall    /* old prof syscall holder */
                                                   >> 656         .long sys_brk           /* 45 */
                                                   >> 657         .long sys_setgid16
                                                   >> 658         .long sys_getgid16
                                                   >> 659         .long sys_signal
                                                   >> 660         .long sys_geteuid16
                                                   >> 661         .long sys_getegid16     /* 50 */
                                                   >> 662         .long sys_acct
                                                   >> 663         .long sys_umount        /* recycled never used phys() */
                                                   >> 664         .long sys_ni_syscall    /* old lock syscall holder */
                                                   >> 665         .long sys_ioctl
                                                   >> 666         .long sys_fcntl         /* 55 */
                                                   >> 667         .long sys_ni_syscall    /* old mpx syscall holder */
                                                   >> 668         .long sys_setpgid
                                                   >> 669         .long sys_ni_syscall    /* old ulimit syscall holder */
                                                   >> 670         .long sys_olduname
                                                   >> 671         .long sys_umask         /* 60 */
                                                   >> 672         .long sys_chroot
                                                   >> 673         .long sys_ustat
                                                   >> 674         .long sys_dup2
                                                   >> 675         .long sys_getppid
                                                   >> 676         .long sys_getpgrp       /* 65 */
                                                   >> 677         .long sys_setsid
                                                   >> 678         .long sys_sigaction
                                                   >> 679         .long sys_sgetmask
                                                   >> 680         .long sys_ssetmask
                                                   >> 681         .long sys_setreuid16    /* 70 */
                                                   >> 682         .long sys_setregid16
                                                   >> 683         .long sys_sigsuspend
                                                   >> 684         .long sys_sigpending
                                                   >> 685         .long sys_sethostname
                                                   >> 686         .long sys_setrlimit     /* 75 */
                                                   >> 687         .long sys_old_getrlimit
                                                   >> 688         .long sys_getrusage
                                                   >> 689         .long sys_gettimeofday
                                                   >> 690         .long sys_settimeofday
                                                   >> 691         .long sys_getgroups16   /* 80 */
                                                   >> 692         .long sys_setgroups16
                                                   >> 693         .long old_select
                                                   >> 694         .long sys_symlink
                                                   >> 695         .long sys_lstat
                                                   >> 696         .long sys_readlink      /* 85 */
                                                   >> 697         .long sys_uselib
                                                   >> 698         .long sys_swapon
                                                   >> 699         .long sys_reboot
                                                   >> 700         .long old_readdir
                                                   >> 701         .long old_mmap          /* 90 */
                                                   >> 702         .long sys_munmap
                                                   >> 703         .long sys_truncate
                                                   >> 704         .long sys_ftruncate
                                                   >> 705         .long sys_fchmod
                                                   >> 706         .long sys_fchown16      /* 95 */
                                                   >> 707         .long sys_getpriority
                                                   >> 708         .long sys_setpriority
                                                   >> 709         .long sys_ni_syscall    /* old profil syscall holder */
                                                   >> 710         .long sys_statfs
                                                   >> 711         .long sys_fstatfs       /* 100 */
                                                   >> 712         .long sys_ioperm
                                                   >> 713         .long sys_socketcall
                                                   >> 714         .long sys_syslog
                                                   >> 715         .long sys_setitimer
                                                   >> 716         .long sys_getitimer     /* 105 */
                                                   >> 717         .long sys_newstat
                                                   >> 718         .long sys_newlstat
                                                   >> 719         .long sys_newfstat
                                                   >> 720         .long sys_uname
                                                   >> 721         .long sys_iopl          /* 110 */
                                                   >> 722         .long sys_vhangup
                                                   >> 723         .long sys_ni_syscall    /* old "idle" system call */
                                                   >> 724         .long sys_vm86old
                                                   >> 725         .long sys_wait4
                                                   >> 726         .long sys_swapoff       /* 115 */
                                                   >> 727         .long sys_sysinfo
                                                   >> 728         .long sys_ipc
                                                   >> 729         .long sys_fsync
                                                   >> 730         .long sys_sigreturn
                                                   >> 731         .long sys_clone         /* 120 */
                                                   >> 732         .long sys_setdomainname
                                                   >> 733         .long sys_newuname
                                                   >> 734         .long sys_modify_ldt
                                                   >> 735         .long sys_adjtimex
                                                   >> 736         .long sys_mprotect      /* 125 */
                                                   >> 737         .long sys_sigprocmask
                                                   >> 738         .long sys_ni_syscall    /* old "create_module" */ 
                                                   >> 739         .long sys_init_module
                                                   >> 740         .long sys_delete_module
                                                   >> 741         .long sys_ni_syscall    /* 130: old "get_kernel_syms" */
                                                   >> 742         .long sys_quotactl
                                                   >> 743         .long sys_getpgid
                                                   >> 744         .long sys_fchdir
                                                   >> 745         .long sys_bdflush
                                                   >> 746         .long sys_sysfs         /* 135 */
                                                   >> 747         .long sys_personality
                                                   >> 748         .long sys_ni_syscall    /* reserved for afs_syscall */
                                                   >> 749         .long sys_setfsuid16
                                                   >> 750         .long sys_setfsgid16
                                                   >> 751         .long sys_llseek        /* 140 */
                                                   >> 752         .long sys_getdents
                                                   >> 753         .long sys_select
                                                   >> 754         .long sys_flock
                                                   >> 755         .long sys_msync
                                                   >> 756         .long sys_readv         /* 145 */
                                                   >> 757         .long sys_writev
                                                   >> 758         .long sys_getsid
                                                   >> 759         .long sys_fdatasync
                                                   >> 760         .long sys_sysctl
                                                   >> 761         .long sys_mlock         /* 150 */
                                                   >> 762         .long sys_munlock
                                                   >> 763         .long sys_mlockall
                                                   >> 764         .long sys_munlockall
                                                   >> 765         .long sys_sched_setparam
                                                   >> 766         .long sys_sched_getparam   /* 155 */
                                                   >> 767         .long sys_sched_setscheduler
                                                   >> 768         .long sys_sched_getscheduler
                                                   >> 769         .long sys_sched_yield
                                                   >> 770         .long sys_sched_get_priority_max
                                                   >> 771         .long sys_sched_get_priority_min  /* 160 */
                                                   >> 772         .long sys_sched_rr_get_interval
                                                   >> 773         .long sys_nanosleep
                                                   >> 774         .long sys_mremap
                                                   >> 775         .long sys_setresuid16
                                                   >> 776         .long sys_getresuid16   /* 165 */
                                                   >> 777         .long sys_vm86
                                                   >> 778         .long sys_ni_syscall    /* Old sys_query_module */
                                                   >> 779         .long sys_poll
                                                   >> 780         .long sys_nfsservctl
                                                   >> 781         .long sys_setresgid16   /* 170 */
                                                   >> 782         .long sys_getresgid16
                                                   >> 783         .long sys_prctl
                                                   >> 784         .long sys_rt_sigreturn
                                                   >> 785         .long sys_rt_sigaction
                                                   >> 786         .long sys_rt_sigprocmask        /* 175 */
                                                   >> 787         .long sys_rt_sigpending
                                                   >> 788         .long sys_rt_sigtimedwait
                                                   >> 789         .long sys_rt_sigqueueinfo
                                                   >> 790         .long sys_rt_sigsuspend
                                                   >> 791         .long sys_pread64       /* 180 */
                                                   >> 792         .long sys_pwrite64
                                                   >> 793         .long sys_chown16
                                                   >> 794         .long sys_getcwd
                                                   >> 795         .long sys_capget
                                                   >> 796         .long sys_capset        /* 185 */
                                                   >> 797         .long sys_sigaltstack
                                                   >> 798         .long sys_sendfile
                                                   >> 799         .long sys_ni_syscall    /* reserved for streams1 */
                                                   >> 800         .long sys_ni_syscall    /* reserved for streams2 */
                                                   >> 801         .long sys_vfork         /* 190 */
                                                   >> 802         .long sys_getrlimit
                                                   >> 803         .long sys_mmap2
                                                   >> 804         .long sys_truncate64
                                                   >> 805         .long sys_ftruncate64
                                                   >> 806         .long sys_stat64        /* 195 */
                                                   >> 807         .long sys_lstat64
                                                   >> 808         .long sys_fstat64
                                                   >> 809         .long sys_lchown
                                                   >> 810         .long sys_getuid
                                                   >> 811         .long sys_getgid        /* 200 */
                                                   >> 812         .long sys_geteuid
                                                   >> 813         .long sys_getegid
                                                   >> 814         .long sys_setreuid
                                                   >> 815         .long sys_setregid
                                                   >> 816         .long sys_getgroups     /* 205 */
                                                   >> 817         .long sys_setgroups
                                                   >> 818         .long sys_fchown
                                                   >> 819         .long sys_setresuid
                                                   >> 820         .long sys_getresuid
                                                   >> 821         .long sys_setresgid     /* 210 */
                                                   >> 822         .long sys_getresgid
                                                   >> 823         .long sys_chown
                                                   >> 824         .long sys_setuid
                                                   >> 825         .long sys_setgid
                                                   >> 826         .long sys_setfsuid      /* 215 */
                                                   >> 827         .long sys_setfsgid
                                                   >> 828         .long sys_pivot_root
                                                   >> 829         .long sys_mincore
                                                   >> 830         .long sys_madvise
                                                   >> 831         .long sys_getdents64    /* 220 */
                                                   >> 832         .long sys_fcntl64
                                                   >> 833         .long sys_ni_syscall    /* reserved for TUX */
                                                   >> 834         .long sys_ni_syscall
                                                   >> 835         .long sys_gettid
                                                   >> 836         .long sys_readahead     /* 225 */
                                                   >> 837         .long sys_setxattr
                                                   >> 838         .long sys_lsetxattr
                                                   >> 839         .long sys_fsetxattr
                                                   >> 840         .long sys_getxattr
                                                   >> 841         .long sys_lgetxattr     /* 230 */
                                                   >> 842         .long sys_fgetxattr
                                                   >> 843         .long sys_listxattr
                                                   >> 844         .long sys_llistxattr
                                                   >> 845         .long sys_flistxattr
                                                   >> 846         .long sys_removexattr   /* 235 */
                                                   >> 847         .long sys_lremovexattr
                                                   >> 848         .long sys_fremovexattr
                                                   >> 849         .long sys_tkill
                                                   >> 850         .long sys_sendfile64
                                                   >> 851         .long sys_futex         /* 240 */
                                                   >> 852         .long sys_sched_setaffinity
                                                   >> 853         .long sys_sched_getaffinity
                                                   >> 854         .long sys_set_thread_area
                                                   >> 855         .long sys_get_thread_area
                                                   >> 856         .long sys_io_setup      /* 245 */
                                                   >> 857         .long sys_io_destroy
                                                   >> 858         .long sys_io_getevents
                                                   >> 859         .long sys_io_submit
                                                   >> 860         .long sys_io_cancel
                                                   >> 861         .long sys_fadvise64     /* 250 */
                                                   >> 862         .long sys_ni_syscall
                                                   >> 863         .long sys_exit_group
                                                   >> 864         .long sys_lookup_dcookie
                                                   >> 865         .long sys_epoll_create
                                                   >> 866         .long sys_epoll_ctl     /* 255 */
                                                   >> 867         .long sys_epoll_wait
                                                   >> 868         .long sys_remap_file_pages
                                                   >> 869         .long sys_set_tid_address
                                                   >> 870         .long sys_timer_create
                                                   >> 871         .long sys_timer_settime         /* 260 */
                                                   >> 872         .long sys_timer_gettime
                                                   >> 873         .long sys_timer_getoverrun
                                                   >> 874         .long sys_timer_delete
                                                   >> 875         .long sys_clock_settime
                                                   >> 876         .long sys_clock_gettime         /* 265 */
                                                   >> 877         .long sys_clock_getres
                                                   >> 878         .long sys_clock_nanosleep
                                                   >> 879         .long sys_statfs64
                                                   >> 880         .long sys_fstatfs64     
                                                   >> 881         .long sys_tgkill        /* 270 */
                                                   >> 882         .long sys_utimes
                                                   >> 883         .long sys_fadvise64_64
                                                   >> 884         .long sys_ni_syscall    /* sys_vserver */
1230                                                  885 
1231 /* ========================================== !! 886 syscall_table_size=(.-sys_call_table)
                                                      

~ [ 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