1 /* SPDX-License-Identifier: GPL-2.0 */ !! 1 /* 2 /* arch/sparc/kernel/entry.S: Sparc trap low- !! 2 * linux/arch/i386/entry.S 3 * 3 * 4 * Copyright (C) 1995, 2007 David S. Miller (d !! 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 * Copyright (C) 1996 Eddie C. Dost (ecd@sky << 6 * Copyright (C) 1996 Miguel de Icaza (miguel@ << 7 * Copyright (C) 1996-1999 Jakub Jelinek (jj << 8 * Copyright (C) 1997 Anton Blanchard (anton@p << 9 */ 5 */ 10 6 11 #include <linux/export.h> !! 7 /* 12 #include <linux/linkage.h> !! 8 * entry.S contains the system-call and fault low-level handling routines. 13 #include <linux/errno.h> !! 9 * This also contains the timer-interrupt handler, as well as all interrupts 14 #include <linux/pgtable.h> !! 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. >> 17 * >> 18 * Stack layout in 'ret_from_system_call': >> 19 * ptrace needs to have all regs on the stack. >> 20 * if the order here is changed, it needs to be >> 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. >> 41 */ 15 42 16 #include <asm/head.h> !! 43 #include <linux/config.h> 17 #include <asm/asi.h> !! 44 #include <linux/linkage.h> >> 45 #include <asm/thread_info.h> >> 46 #include <asm/errno.h> >> 47 #include <asm/segment.h> 18 #include <asm/smp.h> 48 #include <asm/smp.h> 19 #include <asm/contregs.h> << 20 #include <asm/ptrace.h> << 21 #include <asm/asm-offsets.h> << 22 #include <asm/psr.h> << 23 #include <asm/vaddrs.h> << 24 #include <asm/page.h> 49 #include <asm/page.h> 25 #include <asm/winmacro.h> !! 50 #include "irq_vectors.h" 26 #include <asm/signal.h> << 27 #include <asm/obio.h> << 28 #include <asm/mxcc.h> << 29 #include <asm/thread_info.h> << 30 #include <asm/param.h> << 31 #include <asm/unistd.h> << 32 51 33 #include <asm/asmmacro.h> !! 52 #define nr_syscalls ((syscall_table_size)/4) 34 53 35 #define curptr g6 !! 54 EBX = 0x00 >> 55 ECX = 0x04 >> 56 EDX = 0x08 >> 57 ESI = 0x0C >> 58 EDI = 0x10 >> 59 EBP = 0x14 >> 60 EAX = 0x18 >> 61 DS = 0x1C >> 62 ES = 0x20 >> 63 ORIG_EAX = 0x24 >> 64 EIP = 0x28 >> 65 CS = 0x2C >> 66 EFLAGS = 0x30 >> 67 OLDESP = 0x34 >> 68 OLDSS = 0x38 >> 69 >> 70 CF_MASK = 0x00000001 >> 71 TF_MASK = 0x00000100 >> 72 IF_MASK = 0x00000200 >> 73 DF_MASK = 0x00000400 >> 74 NT_MASK = 0x00004000 >> 75 VM_MASK = 0x00020000 >> 76 >> 77 /* >> 78 * ESP0 is at offset 4. 0x200 is the size of the TSS, and >> 79 * also thus the top-of-stack pointer offset of SYSENTER_ESP >> 80 */ >> 81 TSS_ESP0_OFFSET = (4 - 0x200) 36 82 37 /* These are just handy. */ !! 83 #ifdef CONFIG_PREEMPT 38 #define _SV save %sp, -STACKFRAME_SZ, % !! 84 #define preempt_stop cli 39 #define _RS restore !! 85 #else 40 !! 86 #define preempt_stop 41 #define FLUSH_ALL_KERNEL_WINDOWS \ !! 87 #define resume_kernel restore_all 42 _SV; _SV; _SV; _SV; _SV; _SV; _SV; \ << 43 _RS; _RS; _RS; _RS; _RS; _RS; _RS; << 44 << 45 .text << 46 << 47 #ifdef CONFIG_KGDB << 48 .align 4 << 49 .globl arch_kgdb_breakpoint << 50 .type arch_kgdb_breakpoint,# << 51 arch_kgdb_breakpoint: << 52 ta 0x7d << 53 retl << 54 nop << 55 .size arch_kgdb_breakpoint,. << 56 #endif 88 #endif 57 89 58 #if defined(CONFIG_BLK_DEV_FD) || defined(CONF !! 90 #define SAVE_ALL \ 59 .align 4 !! 91 cld; \ 60 .globl floppy_hardint !! 92 pushl %es; \ 61 floppy_hardint: !! 93 pushl %ds; \ 62 /* !! 94 pushl %eax; \ 63 * This code cannot touch registers %l !! 95 pushl %ebp; \ 64 * because SAVE_ALL depends on their v !! 96 pushl %edi; \ 65 * on %l3 also, but we regenerate it b !! 97 pushl %esi; \ 66 * Other registers are: !! 98 pushl %edx; \ 67 * %l3 -- base address of fdc register !! 99 pushl %ecx; \ 68 * %l4 -- pdma_vaddr !! 100 pushl %ebx; \ 69 * %l5 -- scratch for ld/st address !! 101 movl $(__USER_DS), %edx; \ 70 * %l6 -- pdma_size !! 102 movl %edx, %ds; \ 71 * %l7 -- scratch [floppy byte, ld/st !! 103 movl %edx, %es; 72 */ !! 104 73 !! 105 #define RESTORE_INT_REGS \ 74 /* Do we have work to do? */ !! 106 popl %ebx; \ 75 sethi %hi(doing_pdma), %l7 !! 107 popl %ecx; \ 76 ld [%l7 + %lo(doing_pdma)], %l7 !! 108 popl %edx; \ 77 cmp %l7, 0 !! 109 popl %esi; \ 78 be floppy_dosoftint !! 110 popl %edi; \ 79 nop !! 111 popl %ebp; \ 80 !! 112 popl %eax 81 /* Load fdc register base */ !! 113 82 sethi %hi(fdc_status), %l3 !! 114 #define RESTORE_REGS \ 83 ld [%l3 + %lo(fdc_status)], %l3 !! 115 RESTORE_INT_REGS; \ 84 !! 116 1: popl %ds; \ 85 /* Setup register addresses */ !! 117 2: popl %es; \ 86 sethi %hi(pdma_vaddr), %l5 ! tran !! 118 .section .fixup,"ax"; \ 87 ld [%l5 + %lo(pdma_vaddr)], %l4 !! 119 3: movl $0,(%esp); \ 88 sethi %hi(pdma_size), %l5 ! byte !! 120 jmp 1b; \ 89 ld [%l5 + %lo(pdma_size)], %l6 !! 121 4: movl $0,(%esp); \ 90 next_byte: !! 122 jmp 2b; \ 91 ldub [%l3], %l7 !! 123 .previous; \ 92 !! 124 .section __ex_table,"a";\ 93 andcc %l7, 0x80, %g0 ! Does !! 125 .align 4; \ 94 bz floppy_fifo_emptied ! fifo !! 126 .long 1b,3b; \ 95 andcc %l7, 0x20, %g0 ! in n !! 127 .long 2b,4b; \ 96 bz floppy_overrun ! nope !! 128 .previous 97 andcc %l7, 0x40, %g0 ! 0=wr !! 129 98 bz floppy_write !! 130 99 sub %l6, 0x1, %l6 !! 131 #define RESTORE_ALL \ 100 !! 132 RESTORE_REGS \ 101 /* Ok, actually read this byte */ !! 133 addl $4, %esp; \ 102 ldub [%l3 + 1], %l7 !! 134 1: iret; \ 103 orcc %g0, %l6, %g0 !! 135 .section .fixup,"ax"; \ 104 stb %l7, [%l4] !! 136 2: sti; \ 105 bne next_byte !! 137 movl $(__USER_DS), %edx; \ 106 add %l4, 0x1, %l4 !! 138 movl %edx, %ds; \ 107 !! 139 movl %edx, %es; \ 108 b floppy_tdone !! 140 pushl $11; \ 109 nop !! 141 call do_exit; \ 110 !! 142 .previous; \ 111 floppy_write: !! 143 .section __ex_table,"a";\ 112 /* Ok, actually write this byte */ !! 144 .align 4; \ 113 ldub [%l4], %l7 !! 145 .long 1b,2b; \ 114 orcc %g0, %l6, %g0 !! 146 .previous 115 stb %l7, [%l3 + 1] !! 147 116 bne next_byte !! 148 117 add %l4, 0x1, %l4 !! 149 118 !! 150 ENTRY(lcall7) 119 /* fall through... */ !! 151 pushfl # We get a different stack layout with call 120 floppy_tdone: !! 152 # gates, which has to be cleaned up later.. 121 sethi %hi(pdma_vaddr), %l5 !! 153 pushl %eax 122 st %l4, [%l5 + %lo(pdma_vaddr)] !! 154 SAVE_ALL 123 sethi %hi(pdma_size), %l5 !! 155 movl %esp, %ebp 124 st %l6, [%l5 + %lo(pdma_size)] !! 156 pushl %ebp 125 /* Flip terminal count pin */ !! 157 pushl $0x7 126 set auxio_register, %l7 !! 158 do_lcall: 127 ld [%l7], %l7 !! 159 movl EIP(%ebp), %eax # due to call gates, this is eflags, not eip.. 128 !! 160 movl CS(%ebp), %edx # this is eip.. 129 ldub [%l7], %l5 !! 161 movl EFLAGS(%ebp), %ecx # and this is cs.. 130 !! 162 movl %eax,EFLAGS(%ebp) # 131 or %l5, 0xc2, %l5 !! 163 movl %edx,EIP(%ebp) # Now we move them to their "normal" places 132 stb %l5, [%l7] !! 164 movl %ecx,CS(%ebp) # 133 andn %l5, 0x02, %l5 !! 165 andl $-8192, %ebp # GET_THREAD_INFO 134 !! 166 movl TI_EXEC_DOMAIN(%ebp), %edx # Get the execution domain 135 2: !! 167 call *4(%edx) # Call the lcall7 handler for the domain 136 /* Kill some time so the bits set */ !! 168 addl $4, %esp 137 WRITE_PAUSE !! 169 popl %eax 138 WRITE_PAUSE !! 170 jmp resume_userspace 139 !! 171 140 stb %l5, [%l7] !! 172 ENTRY(lcall27) 141 !! 173 pushfl # We get a different stack layout with call 142 /* Prevent recursion */ !! 174 # gates, which has to be cleaned up later.. 143 sethi %hi(doing_pdma), %l7 !! 175 pushl %eax 144 b floppy_dosoftint !! 176 SAVE_ALL 145 st %g0, [%l7 + %lo(doing_pdma)] !! 177 movl %esp, %ebp 146 !! 178 pushl %ebp 147 /* We emptied the FIFO, but we haven't !! 179 pushl $0x27 148 * as of yet. Store the current trans !! 180 jmp do_lcall 149 * bytes left to read so we can contin !! 181 150 * fast IRQ comes in. !! 182 151 */ !! 183 ENTRY(ret_from_fork) 152 floppy_fifo_emptied: !! 184 pushl %eax 153 sethi %hi(pdma_vaddr), %l5 !! 185 call schedule_tail 154 st %l4, [%l5 + %lo(pdma_vaddr)] !! 186 GET_THREAD_INFO(%ebp) 155 sethi %hi(pdma_size), %l7 !! 187 popl %eax 156 st %l6, [%l7 + %lo(pdma_size)] !! 188 jmp syscall_exit 157 !! 189 158 /* Restore condition codes */ !! 190 /* 159 wr %l0, 0x0, %psr !! 191 * Return to user mode is not as complex as all this looks, 160 WRITE_PAUSE !! 192 * but we want the default path for a system call return to 161 !! 193 * go as quickly as possible which is why some of this is 162 jmp %l1 !! 194 * less clear than it otherwise should be. 163 rett %l2 << 164 << 165 floppy_overrun: << 166 sethi %hi(pdma_vaddr), %l5 << 167 st %l4, [%l5 + %lo(pdma_vaddr)] << 168 sethi %hi(pdma_size), %l5 << 169 st %l6, [%l5 + %lo(pdma_size)] << 170 /* Prevent recursion */ << 171 sethi %hi(doing_pdma), %l7 << 172 st %g0, [%l7 + %lo(doing_pdma)] << 173 << 174 /* fall through... */ << 175 floppy_dosoftint: << 176 rd %wim, %l3 << 177 SAVE_ALL << 178 << 179 /* Set all IRQs off. */ << 180 or %l0, PSR_PIL, %l4 << 181 wr %l4, 0x0, %psr << 182 WRITE_PAUSE << 183 wr %l4, PSR_ET, %psr << 184 WRITE_PAUSE << 185 << 186 mov 11, %o0 ! flop << 187 mov %g0, %o1 ! devi << 188 call sparc_floppy_irq << 189 add %sp, STACKFRAME_SZ, %o2 ! stru << 190 << 191 RESTORE_ALL << 192 << 193 #endif /* (CONFIG_BLK_DEV_FD) */ << 194 << 195 /* Bad trap handler */ << 196 .globl bad_trap_handler << 197 bad_trap_handler: << 198 SAVE_ALL << 199 << 200 wr %l0, PSR_ET, %psr << 201 WRITE_PAUSE << 202 << 203 add %sp, STACKFRAME_SZ, %o0 ! pt_r << 204 call do_hw_interrupt << 205 mov %l7, %o1 ! trap << 206 << 207 RESTORE_ALL << 208 << 209 /* For now all IRQ's not registered get sent h << 210 * see if a routine is registered to handle th << 211 * it will say so on the console. << 212 */ 195 */ 213 196 214 .align 4 !! 197 # userspace resumption stub bypassing syscall exit tracing 215 .globl real_irq_entry, patch_handler_ !! 198 ALIGN 216 real_irq_entry: !! 199 ret_from_exception: 217 SAVE_ALL !! 200 preempt_stop 218 !! 201 ret_from_intr: 219 #ifdef CONFIG_SMP !! 202 GET_THREAD_INFO(%ebp) 220 .globl patchme_maybe_smp_msg !! 203 movl EFLAGS(%esp), %eax # mix EFLAGS and CS 221 !! 204 movb CS(%esp), %al 222 cmp %l7, 11 !! 205 testl $(VM_MASK | 3), %eax 223 patchme_maybe_smp_msg: !! 206 jz resume_kernel # returning to kernel or vm86-space 224 bgu maybe_smp4m_msg !! 207 ENTRY(resume_userspace) 225 nop !! 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 226 #endif 233 #endif 227 234 228 real_irq_continue: !! 235 /* SYSENTER_RETURN points to after the "sysenter" instruction in 229 or %l0, PSR_PIL, %g2 !! 236 the vsyscall page. See vsyscall-sysentry.S, which defines the symbol. */ 230 wr %g2, 0x0, %psr << 231 WRITE_PAUSE << 232 wr %g2, PSR_ET, %psr << 233 WRITE_PAUSE << 234 mov %l7, %o0 ! irq << 235 patch_handler_irq: << 236 call handler_irq << 237 add %sp, STACKFRAME_SZ, %o1 ! pt_r << 238 or %l0, PSR_PIL, %g2 ! rest << 239 wr %g2, PSR_ET, %psr ! keep << 240 WRITE_PAUSE << 241 << 242 RESTORE_ALL << 243 << 244 #ifdef CONFIG_SMP << 245 /* SMP per-cpu ticker interrupts are h << 246 smp4m_ticker: << 247 bne real_irq_continue+4 << 248 or %l0, PSR_PIL, %g2 << 249 wr %g2, 0x0, %psr << 250 WRITE_PAUSE << 251 wr %g2, PSR_ET, %psr << 252 WRITE_PAUSE << 253 call smp4m_percpu_timer_interrupt << 254 add %sp, STACKFRAME_SZ, %o0 << 255 wr %l0, PSR_ET, %psr << 256 WRITE_PAUSE << 257 RESTORE_ALL << 258 << 259 #define GET_PROCESSOR4M_ID(reg) \ << 260 rd %tbr, %reg; \ << 261 srl %reg, 12, %reg; \ << 262 and %reg, 3, %reg; << 263 << 264 /* Here is where we check for possible << 265 * on some level other than 15 which i << 266 * for cross calls. That has a separa << 267 * << 268 * IPIs are sent on Level 12, 13 and 1 << 269 */ << 270 maybe_smp4m_msg: << 271 GET_PROCESSOR4M_ID(o3) << 272 sethi %hi(sun4m_irq_percpu), %l5 << 273 sll %o3, 2, %o3 << 274 or %l5, %lo(sun4m_irq_percpu), %o << 275 sethi %hi(0x70000000), %o2 ! Chec << 276 ld [%o5 + %o3], %o1 << 277 ld [%o1 + 0x00], %o3 ! sun4 << 278 andcc %o3, %o2, %g0 << 279 be,a smp4m_ticker << 280 cmp %l7, 14 << 281 /* Soft-IRQ IPI */ << 282 st %o2, [%o1 + 0x04] ! sun4 << 283 WRITE_PAUSE << 284 ld [%o1 + 0x00], %g0 ! sun4 << 285 WRITE_PAUSE << 286 or %l0, PSR_PIL, %l4 << 287 wr %l4, 0x0, %psr << 288 WRITE_PAUSE << 289 wr %l4, PSR_ET, %psr << 290 WRITE_PAUSE << 291 srl %o3, 28, %o2 ! shif << 292 maybe_smp4m_msg_check_single: << 293 andcc %o2, 0x1, %g0 << 294 beq,a maybe_smp4m_msg_check_mask << 295 andcc %o2, 0x2, %g0 << 296 call smp_call_function_single_inter << 297 nop << 298 andcc %o2, 0x2, %g0 << 299 maybe_smp4m_msg_check_mask: << 300 beq,a maybe_smp4m_msg_check_resched << 301 andcc %o2, 0x4, %g0 << 302 call smp_call_function_interrupt << 303 nop << 304 andcc %o2, 0x4, %g0 << 305 maybe_smp4m_msg_check_resched: << 306 /* rescheduling is done in RESTORE_ALL << 307 beq,a maybe_smp4m_msg_out << 308 nop << 309 call smp_resched_interrupt << 310 nop << 311 maybe_smp4m_msg_out: << 312 RESTORE_ALL << 313 << 314 .align 4 << 315 .globl linux_trap_ipi15_sun4m << 316 linux_trap_ipi15_sun4m: << 317 SAVE_ALL << 318 sethi %hi(0x80000000), %o2 << 319 GET_PROCESSOR4M_ID(o0) << 320 sethi %hi(sun4m_irq_percpu), %l5 << 321 or %l5, %lo(sun4m_irq_percpu), %o << 322 sll %o0, 2, %o0 << 323 ld [%o5 + %o0], %o5 << 324 ld [%o5 + 0x00], %o3 ! sun4 << 325 andcc %o3, %o2, %g0 << 326 be sun4m_nmi_error ! Must << 327 st %o2, [%o5 + 0x04] ! sun4 << 328 WRITE_PAUSE << 329 ld [%o5 + 0x00], %g0 ! sun4 << 330 WRITE_PAUSE << 331 or %l0, PSR_PIL, %l4 << 332 wr %l4, 0x0, %psr << 333 WRITE_PAUSE << 334 wr %l4, PSR_ET, %psr << 335 WRITE_PAUSE << 336 call smp4m_cross_call_irq << 337 nop << 338 b ret_trap_lockless_ipi << 339 clr %l6 << 340 << 341 .globl smp4d_ticker << 342 /* SMP per-cpu ticker interrupts are h << 343 smp4d_ticker: << 344 SAVE_ALL << 345 or %l0, PSR_PIL, %g2 << 346 sethi %hi(CC_ICLR), %o0 << 347 sethi %hi(1 << 14), %o1 << 348 or %o0, %lo(CC_ICLR), %o0 << 349 stha %o1, [%o0] ASI_M_MXCC /* Cle << 350 wr %g2, 0x0, %psr << 351 WRITE_PAUSE << 352 wr %g2, PSR_ET, %psr << 353 WRITE_PAUSE << 354 call smp4d_percpu_timer_interrupt << 355 add %sp, STACKFRAME_SZ, %o0 << 356 wr %l0, PSR_ET, %psr << 357 WRITE_PAUSE << 358 RESTORE_ALL << 359 << 360 .align 4 << 361 .globl linux_trap_ipi15_sun4d << 362 linux_trap_ipi15_sun4d: << 363 SAVE_ALL << 364 sethi %hi(CC_BASE), %o4 << 365 sethi %hi(MXCC_ERR_ME|MXCC_ERR_PEW|M << 366 or %o4, (CC_EREG - CC_BASE), %o0 << 367 ldda [%o0] ASI_M_MXCC, %o0 << 368 andcc %o0, %o2, %g0 << 369 bne 1f << 370 sethi %hi(BB_STAT2), %o2 << 371 lduba [%o2] ASI_M_CTL, %o2 << 372 andcc %o2, BB_STAT2_MASK, %g0 << 373 bne 2f << 374 or %o4, (CC_ICLR - CC_BASE), %o0 << 375 sethi %hi(1 << 15), %o1 << 376 stha %o1, [%o0] ASI_M_MXCC /* Cle << 377 or %l0, PSR_PIL, %l4 << 378 wr %l4, 0x0, %psr << 379 WRITE_PAUSE << 380 wr %l4, PSR_ET, %psr << 381 WRITE_PAUSE << 382 call smp4d_cross_call_irq << 383 nop << 384 b ret_trap_lockless_ipi << 385 clr %l6 << 386 << 387 1: /* MXCC error */ << 388 2: /* BB error */ << 389 /* Disable PIL 15 */ << 390 set CC_IMSK, %l4 << 391 lduha [%l4] ASI_M_MXCC, %l5 << 392 sethi %hi(1 << 15), %l7 << 393 or %l5, %l7, %l5 << 394 stha %l5, [%l4] ASI_M_MXCC << 395 /* FIXME */ << 396 1: b,a 1b << 397 << 398 .globl smpleon_ipi << 399 .extern leon_ipi_interrupt << 400 /* SMP per-cpu IPI interrupts are hand << 401 smpleon_ipi: << 402 SAVE_ALL << 403 or %l0, PSR_PIL, %g2 << 404 wr %g2, 0x0, %psr << 405 WRITE_PAUSE << 406 wr %g2, PSR_ET, %psr << 407 WRITE_PAUSE << 408 call leonsmp_ipi_interrupt << 409 add %sp, STACKFRAME_SZ, %o1 ! pt_r << 410 wr %l0, PSR_ET, %psr << 411 WRITE_PAUSE << 412 RESTORE_ALL << 413 << 414 .align 4 << 415 .globl linux_trap_ipi15_leon << 416 linux_trap_ipi15_leon: << 417 SAVE_ALL << 418 or %l0, PSR_PIL, %l4 << 419 wr %l4, 0x0, %psr << 420 WRITE_PAUSE << 421 wr %l4, PSR_ET, %psr << 422 WRITE_PAUSE << 423 call leon_cross_call_irq << 424 nop << 425 b ret_trap_lockless_ipi << 426 clr %l6 << 427 << 428 #endif /* CONFIG_SMP */ << 429 << 430 /* This routine handles illegal instru << 431 * instruction attempts from user code << 432 */ << 433 .align 4 << 434 .globl bad_instruction << 435 bad_instruction: << 436 sethi %hi(0xc1f80000), %l4 << 437 ld [%l1], %l5 << 438 sethi %hi(0x81d80000), %l7 << 439 and %l5, %l4, %l5 << 440 cmp %l5, %l7 << 441 be 1f << 442 SAVE_ALL << 443 << 444 wr %l0, PSR_ET, %psr << 445 WRITE_PAUSE << 446 << 447 add %sp, STACKFRAME_SZ, %o0 << 448 mov %l1, %o1 << 449 mov %l2, %o2 << 450 call do_illegal_instruction << 451 mov %l0, %o3 << 452 << 453 RESTORE_ALL << 454 << 455 1: /* unimplemented flush - just skip */ << 456 jmpl %l2, %g0 << 457 rett %l2 + 4 << 458 << 459 .align 4 << 460 .globl priv_instruction << 461 priv_instruction: << 462 SAVE_ALL << 463 << 464 wr %l0, PSR_ET, %psr << 465 WRITE_PAUSE << 466 << 467 add %sp, STACKFRAME_SZ, %o0 << 468 mov %l1, %o1 << 469 mov %l2, %o2 << 470 call do_priv_instruction << 471 mov %l0, %o3 << 472 << 473 RESTORE_ALL << 474 << 475 /* This routine handles unaligned data << 476 .align 4 << 477 .globl mna_handler << 478 mna_handler: << 479 andcc %l0, PSR_PS, %g0 << 480 be mna_fromuser << 481 nop << 482 << 483 SAVE_ALL << 484 << 485 wr %l0, PSR_ET, %psr << 486 WRITE_PAUSE << 487 << 488 ld [%l1], %o1 << 489 call kernel_unaligned_trap << 490 add %sp, STACKFRAME_SZ, %o0 << 491 << 492 RESTORE_ALL << 493 << 494 mna_fromuser: << 495 SAVE_ALL << 496 << 497 wr %l0, PSR_ET, %psr << 498 WRITE_PAUSE << 499 << 500 ld [%l1], %o1 << 501 call user_unaligned_trap << 502 add %sp, STACKFRAME_SZ, %o0 << 503 << 504 RESTORE_ALL << 505 << 506 /* This routine handles floating point << 507 .align 4 << 508 .globl fpd_trap_handler << 509 fpd_trap_handler: << 510 SAVE_ALL << 511 << 512 wr %l0, PSR_ET, %psr << 513 WRITE_PAUSE << 514 << 515 add %sp, STACKFRAME_SZ, %o0 << 516 mov %l1, %o1 << 517 mov %l2, %o2 << 518 call do_fpd_trap << 519 mov %l0, %o3 << 520 << 521 RESTORE_ALL << 522 << 523 /* This routine handles Floating Point << 524 .align 4 << 525 .globl fpe_trap_handler << 526 fpe_trap_handler: << 527 set fpsave_magic, %l5 << 528 cmp %l1, %l5 << 529 be 1f << 530 sethi %hi(fpsave), %l5 << 531 or %l5, %lo(fpsave), %l5 << 532 cmp %l1, %l5 << 533 bne 2f << 534 sethi %hi(fpsave_catch2), %l5 << 535 or %l5, %lo(fpsave_catch2), %l5 << 536 wr %l0, 0x0, %psr << 537 WRITE_PAUSE << 538 jmp %l5 << 539 rett %l5 + 4 << 540 1: << 541 sethi %hi(fpsave_catch), %l5 << 542 or %l5, %lo(fpsave_catch), %l5 << 543 wr %l0, 0x0, %psr << 544 WRITE_PAUSE << 545 jmp %l5 << 546 rett %l5 + 4 << 547 << 548 2: << 549 SAVE_ALL << 550 << 551 wr %l0, PSR_ET, %psr << 552 WRITE_PAUSE << 553 << 554 add %sp, STACKFRAME_SZ, %o0 << 555 mov %l1, %o1 << 556 mov %l2, %o2 << 557 call do_fpe_trap << 558 mov %l0, %o3 << 559 << 560 RESTORE_ALL << 561 << 562 /* This routine handles Tag Overflow E << 563 .align 4 << 564 .globl do_tag_overflow << 565 do_tag_overflow: << 566 SAVE_ALL << 567 << 568 wr %l0, PSR_ET, %psr << 569 WRITE_PAUSE << 570 << 571 add %sp, STACKFRAME_SZ, %o0 << 572 mov %l1, %o1 << 573 mov %l2, %o2 << 574 call handle_tag_overflow << 575 mov %l0, %o3 << 576 << 577 RESTORE_ALL << 578 << 579 /* This routine handles Watchpoint Exc << 580 .align 4 << 581 .globl do_watchpoint << 582 do_watchpoint: << 583 SAVE_ALL << 584 << 585 wr %l0, PSR_ET, %psr << 586 WRITE_PAUSE << 587 << 588 add %sp, STACKFRAME_SZ, %o0 << 589 mov %l1, %o1 << 590 mov %l2, %o2 << 591 call handle_watchpoint << 592 mov %l0, %o3 << 593 << 594 RESTORE_ALL << 595 << 596 /* This routine handles Register Acces << 597 .align 4 << 598 .globl do_reg_access << 599 do_reg_access: << 600 SAVE_ALL << 601 << 602 wr %l0, PSR_ET, %psr << 603 WRITE_PAUSE << 604 << 605 add %sp, STACKFRAME_SZ, %o0 << 606 mov %l1, %o1 << 607 mov %l2, %o2 << 608 call handle_reg_access << 609 mov %l0, %o3 << 610 << 611 RESTORE_ALL << 612 << 613 /* This routine handles Co-Processor D << 614 .align 4 << 615 .globl do_cp_disabled << 616 do_cp_disabled: << 617 SAVE_ALL << 618 << 619 wr %l0, PSR_ET, %psr << 620 WRITE_PAUSE << 621 << 622 add %sp, STACKFRAME_SZ, %o0 << 623 mov %l1, %o1 << 624 mov %l2, %o2 << 625 call handle_cp_disabled << 626 mov %l0, %o3 << 627 << 628 RESTORE_ALL << 629 << 630 /* This routine handles Co-Processor E << 631 .align 4 << 632 .globl do_cp_exception << 633 do_cp_exception: << 634 SAVE_ALL << 635 << 636 wr %l0, PSR_ET, %psr << 637 WRITE_PAUSE << 638 << 639 add %sp, STACKFRAME_SZ, %o0 << 640 mov %l1, %o1 << 641 mov %l2, %o2 << 642 call handle_cp_exception << 643 mov %l0, %o3 << 644 << 645 RESTORE_ALL << 646 << 647 /* This routine handles Hardware Divid << 648 .align 4 << 649 .globl do_hw_divzero << 650 do_hw_divzero: << 651 SAVE_ALL << 652 << 653 wr %l0, PSR_ET, %psr << 654 WRITE_PAUSE << 655 << 656 add %sp, STACKFRAME_SZ, %o0 << 657 mov %l1, %o1 << 658 mov %l2, %o2 << 659 call handle_hw_divzero << 660 mov %l0, %o3 << 661 << 662 RESTORE_ALL << 663 << 664 .align 4 << 665 .globl do_flush_windows << 666 do_flush_windows: << 667 SAVE_ALL << 668 << 669 wr %l0, PSR_ET, %psr << 670 WRITE_PAUSE << 671 << 672 andcc %l0, PSR_PS, %g0 << 673 bne dfw_kernel << 674 nop << 675 << 676 call flush_user_windows << 677 nop << 678 << 679 /* Advance over the trap instruction. << 680 ld [%sp + STACKFRAME_SZ + PT_NPC] << 681 add %l1, 0x4, %l2 << 682 st %l1, [%sp + STACKFRAME_SZ + PT << 683 st %l2, [%sp + STACKFRAME_SZ + PT << 684 << 685 RESTORE_ALL << 686 << 687 .globl flush_patch_one << 688 << 689 /* We get these for debugging routines << 690 dfw_kernel: << 691 flush_patch_one: << 692 FLUSH_ALL_KERNEL_WINDOWS << 693 << 694 /* Advance over the trap instruction. << 695 ld [%sp + STACKFRAME_SZ + PT_NPC] << 696 add %l1, 0x4, %l2 << 697 st %l1, [%sp + STACKFRAME_SZ + PT << 698 st %l2, [%sp + STACKFRAME_SZ + PT << 699 << 700 RESTORE_ALL << 701 << 702 /* The getcc software trap. The user << 703 * the %psr in register %g1. << 704 */ << 705 << 706 .align 4 << 707 .globl getcc_trap_handler << 708 getcc_trap_handler: << 709 srl %l0, 20, %g1 ! give user << 710 and %g1, 0xf, %g1 ! only ICC bit << 711 jmp %l2 ! advance over << 712 rett %l2 + 0x4 ! like this... << 713 << 714 /* The setcc software trap. The user << 715 * that it would like placed in the %p << 716 * any unintentional bits! << 717 */ << 718 << 719 .align 4 << 720 .globl setcc_trap_handler << 721 setcc_trap_handler: << 722 sll %g1, 0x14, %l4 << 723 set PSR_ICC, %l5 << 724 andn %l0, %l5, %l0 ! clear ICC bi << 725 and %l4, %l5, %l4 ! clear non-IC << 726 or %l4, %l0, %l4 ! or them in.. << 727 << 728 wr %l4, 0x0, %psr ! set new %psr << 729 WRITE_PAUSE ! TI scumbags. << 730 << 731 jmp %l2 ! advance over << 732 rett %l2 + 0x4 ! like this... << 733 << 734 sun4m_nmi_error: << 735 /* NMI async memory error handling. */ << 736 sethi %hi(0x80000000), %l4 << 737 sethi %hi(sun4m_irq_global), %o5 << 738 ld [%o5 + %lo(sun4m_irq_global)], << 739 st %l4, [%l5 + 0x0c] ! sun4 << 740 WRITE_PAUSE << 741 ld [%l5 + 0x00], %g0 ! sun4 << 742 WRITE_PAUSE << 743 or %l0, PSR_PIL, %l4 << 744 wr %l4, 0x0, %psr << 745 WRITE_PAUSE << 746 wr %l4, PSR_ET, %psr << 747 WRITE_PAUSE << 748 call sun4m_nmi << 749 nop << 750 st %l4, [%l5 + 0x08] ! sun4 << 751 WRITE_PAUSE << 752 ld [%l5 + 0x00], %g0 ! sun4 << 753 WRITE_PAUSE << 754 RESTORE_ALL << 755 << 756 #ifndef CONFIG_SMP << 757 .align 4 << 758 .globl linux_trap_ipi15_sun4m << 759 linux_trap_ipi15_sun4m: << 760 SAVE_ALL << 761 << 762 ba sun4m_nmi_error << 763 nop << 764 #endif /* CONFIG_SMP */ << 765 << 766 .align 4 << 767 .globl srmmu_fault << 768 srmmu_fault: << 769 mov 0x400, %l5 << 770 mov 0x300, %l4 << 771 << 772 LEON_PI(lda [%l5] ASI_LEON_MMUREGS, %l6) << 773 SUN_PI_(lda [%l5] ASI_M_MMUREGS, %l6) << 774 << 775 LEON_PI(lda [%l4] ASI_LEON_MMUREGS, %l5) << 776 SUN_PI_(lda [%l4] ASI_M_MMUREGS, %l5) << 777 237 778 andn %l6, 0xfff, %l6 !! 238 # sysenter call handler stub 779 srl %l5, 6, %l5 !! 239 ENTRY(sysenter_entry) 780 !! 240 movl TSS_ESP0_OFFSET(%esp),%esp 781 and %l5, 2, %l5 !! 241 sysenter_past_esp: 782 or %l5, %l6, %l6 !! 242 sti 783 !! 243 pushl $(__USER_DS) 784 or %l6, %l7, %l7 !! 244 pushl %ebp 785 !! 245 pushfl 786 SAVE_ALL !! 246 pushl $(__USER_CS) 787 !! 247 pushl $SYSENTER_RETURN 788 mov %l7, %o1 !! 248 789 mov %l7, %o2 !! 249 /* 790 and %o1, 1, %o1 ! arg2 !! 250 * Load the potential sixth argument from user stack. 791 mov %l7, %o3 !! 251 * Careful about security. 792 and %o2, 2, %o2 ! arg3 << 793 andn %o3, 0xfff, %o3 ! arg4 << 794 << 795 wr %l0, PSR_ET, %psr << 796 WRITE_PAUSE << 797 << 798 call do_sparc_fault << 799 add %sp, STACKFRAME_SZ, %o0 ! arg1 << 800 << 801 RESTORE_ALL << 802 << 803 .align 4 << 804 sunos_execv: << 805 .globl sunos_execv << 806 b sys_execve << 807 clr %i2 << 808 << 809 .align 4 << 810 .globl sys_sigstack << 811 sys_sigstack: << 812 mov %o7, %l5 << 813 mov %fp, %o2 << 814 call do_sys_sigstack << 815 mov %l5, %o7 << 816 << 817 .align 4 << 818 .globl sys_sigreturn << 819 sys_sigreturn: << 820 call do_sigreturn << 821 add %sp, STACKFRAME_SZ, %o0 << 822 << 823 ld [%curptr + TI_FLAGS], %l5 << 824 andcc %l5, _TIF_SYSCALL_TRACE, %g0 << 825 be 1f << 826 nop << 827 << 828 call syscall_trace << 829 mov 1, %o1 << 830 << 831 1: << 832 /* We don't want to muck with user reg << 833 * normal syscall, just return. << 834 */ << 835 RESTORE_ALL << 836 << 837 .align 4 << 838 .globl sys_rt_sigreturn << 839 sys_rt_sigreturn: << 840 call do_rt_sigreturn << 841 add %sp, STACKFRAME_SZ, %o0 << 842 << 843 ld [%curptr + TI_FLAGS], %l5 << 844 andcc %l5, _TIF_SYSCALL_TRACE, %g0 << 845 be 1f << 846 nop << 847 << 848 add %sp, STACKFRAME_SZ, %o0 << 849 call syscall_trace << 850 mov 1, %o1 << 851 << 852 1: << 853 /* We are returning to a signal handle << 854 RESTORE_ALL << 855 << 856 /* Now that we have a real sys_clone, << 857 * implemented in terms of it. Our _r << 858 * of SunOS vfork() will use sys_vfork << 859 * << 860 * XXX These three should be consolida << 861 * XXX code just like on sparc64... -D << 862 */ << 863 .align 4 << 864 .globl sys_fork, flush_patch_two << 865 sys_fork: << 866 mov %o7, %l5 << 867 flush_patch_two: << 868 FLUSH_ALL_KERNEL_WINDOWS; << 869 ld [%curptr + TI_TASK], %o4 << 870 rd %psr, %g4 << 871 WRITE_PAUSE << 872 rd %wim, %g5 << 873 WRITE_PAUSE << 874 std %g4, [%o4 + AOFF_task_thread + << 875 add %sp, STACKFRAME_SZ, %o0 << 876 call sparc_fork << 877 mov %l5, %o7 << 878 << 879 /* Whee, kernel threads! */ << 880 .globl sys_clone, flush_patch_three << 881 sys_clone: << 882 mov %o7, %l5 << 883 flush_patch_three: << 884 FLUSH_ALL_KERNEL_WINDOWS; << 885 ld [%curptr + TI_TASK], %o4 << 886 rd %psr, %g4 << 887 WRITE_PAUSE << 888 rd %wim, %g5 << 889 WRITE_PAUSE << 890 std %g4, [%o4 + AOFF_task_thread + << 891 add %sp, STACKFRAME_SZ, %o0 << 892 call sparc_clone << 893 mov %l5, %o7 << 894 << 895 /* Whee, real vfork! */ << 896 .globl sys_vfork, flush_patch_four << 897 sys_vfork: << 898 flush_patch_four: << 899 FLUSH_ALL_KERNEL_WINDOWS; << 900 ld [%curptr + TI_TASK], %o4 << 901 rd %psr, %g4 << 902 WRITE_PAUSE << 903 rd %wim, %g5 << 904 WRITE_PAUSE << 905 std %g4, [%o4 + AOFF_task_thread + << 906 sethi %hi(sparc_vfork), %l1 << 907 jmpl %l1 + %lo(sparc_vfork), %g0 << 908 add %sp, STACKFRAME_SZ, %o0 << 909 << 910 .align 4 << 911 linux_sparc_ni_syscall: << 912 sethi %hi(sys_ni_syscall), %l7 << 913 b do_syscall << 914 or %l7, %lo(sys_ni_syscall), %l7 << 915 << 916 linux_syscall_trace: << 917 add %sp, STACKFRAME_SZ, %o0 << 918 call syscall_trace << 919 mov 0, %o1 << 920 cmp %o0, 0 << 921 bne 3f << 922 mov -ENOSYS, %o0 << 923 << 924 /* Syscall tracing can modify the regi << 925 ld [%sp + STACKFRAME_SZ + PT_G1], << 926 sethi %hi(sys_call_table), %l7 << 927 ld [%sp + STACKFRAME_SZ + PT_I0], << 928 or %l7, %lo(sys_call_table), %l7 << 929 ld [%sp + STACKFRAME_SZ + PT_I1], << 930 ld [%sp + STACKFRAME_SZ + PT_I2], << 931 ld [%sp + STACKFRAME_SZ + PT_I3], << 932 ld [%sp + STACKFRAME_SZ + PT_I4], << 933 ld [%sp + STACKFRAME_SZ + PT_I5], << 934 cmp %g1, NR_syscalls << 935 bgeu 3f << 936 mov -ENOSYS, %o0 << 937 << 938 sll %g1, 2, %l4 << 939 mov %i0, %o0 << 940 ld [%l7 + %l4], %l7 << 941 mov %i1, %o1 << 942 mov %i2, %o2 << 943 mov %i3, %o3 << 944 b 2f << 945 mov %i4, %o4 << 946 << 947 .globl ret_from_fork << 948 ret_from_fork: << 949 call schedule_tail << 950 ld [%g3 + TI_TASK], %o0 << 951 b ret_sys_call << 952 ld [%sp + STACKFRAME_SZ + PT_I0], << 953 << 954 .globl ret_from_kernel_thread << 955 ret_from_kernel_thread: << 956 call schedule_tail << 957 ld [%g3 + TI_TASK], %o0 << 958 ld [%sp + STACKFRAME_SZ + PT_G1], << 959 call %l0 << 960 ld [%sp + STACKFRAME_SZ + PT_G2], << 961 rd %psr, %l1 << 962 ld [%sp + STACKFRAME_SZ + PT_PSR] << 963 andn %l0, PSR_CWP, %l0 << 964 nop << 965 and %l1, PSR_CWP, %l1 << 966 or %l0, %l1, %l0 << 967 st %l0, [%sp + STACKFRAME_SZ + PT << 968 b ret_sys_call << 969 mov 0, %o0 << 970 << 971 /* Linux native system calls enter her << 972 .align 4 << 973 .globl linux_sparc_syscall << 974 linux_sparc_syscall: << 975 sethi %hi(PSR_SYSCALL), %l4 << 976 or %l0, %l4, %l0 << 977 /* Direct access to user regs, must fa << 978 cmp %g1, NR_syscalls << 979 bgeu linux_sparc_ni_syscall << 980 sll %g1, 2, %l4 << 981 ld [%l7 + %l4], %l7 << 982 << 983 do_syscall: << 984 SAVE_ALL_HEAD << 985 rd %wim, %l3 << 986 << 987 wr %l0, PSR_ET, %psr << 988 mov %i0, %o0 << 989 mov %i1, %o1 << 990 mov %i2, %o2 << 991 << 992 ld [%curptr + TI_FLAGS], %l5 << 993 mov %i3, %o3 << 994 andcc %l5, _TIF_SYSCALL_TRACE, %g0 << 995 mov %i4, %o4 << 996 bne linux_syscall_trace << 997 mov %i0, %l6 << 998 2: << 999 call %l7 << 1000 mov %i5, %o5 << 1001 << 1002 3: << 1003 st %o0, [%sp + STACKFRAME_SZ + P << 1004 << 1005 ret_sys_call: << 1006 ld [%curptr + TI_FLAGS], %l5 << 1007 cmp %o0, -ERESTART_RESTARTBLOCK << 1008 ld [%sp + STACKFRAME_SZ + PT_PSR << 1009 set PSR_C, %g2 << 1010 bgeu 1f << 1011 andcc %l5, _TIF_SYSCALL_TRACE, %g0 << 1012 << 1013 /* System call success, clear Carry c << 1014 andn %g3, %g2, %g3 << 1015 st %g3, [%sp + STACKFRAME_SZ + P << 1016 bne linux_syscall_trace2 << 1017 ld [%sp + STACKFRAME_SZ + PT_NPC << 1018 add %l1, 0x4, %l2 << 1019 st %l1, [%sp + STACKFRAME_SZ + P << 1020 b ret_trap_entry << 1021 st %l2, [%sp + STACKFRAME_SZ + P << 1022 1: << 1023 /* System call failure, set Carry con << 1024 * Also, get abs(errno) to return to << 1025 */ << 1026 sub %g0, %o0, %o0 << 1027 or %g3, %g2, %g3 << 1028 st %o0, [%sp + STACKFRAME_SZ + P << 1029 st %g3, [%sp + STACKFRAME_SZ + P << 1030 bne linux_syscall_trace2 << 1031 ld [%sp + STACKFRAME_SZ + PT_NPC << 1032 add %l1, 0x4, %l2 << 1033 st %l1, [%sp + STACKFRAME_SZ + P << 1034 b ret_trap_entry << 1035 st %l2, [%sp + STACKFRAME_SZ + P << 1036 << 1037 linux_syscall_trace2: << 1038 add %sp, STACKFRAME_SZ, %o0 << 1039 mov 1, %o1 << 1040 call syscall_trace << 1041 add %l1, 0x4, %l2 << 1042 st %l1, [%sp + STACKFRAME_SZ + P << 1043 b ret_trap_entry << 1044 st %l2, [%sp + STACKFRAME_SZ + P << 1045 << 1046 << 1047 /* Saving and restoring the FPU state is best << 1048 * << 1049 * void fpsave(unsigned long *fpregs, unsigne << 1050 * void *fpqueue, unsigned long * << 1051 */ 252 */ 1052 !! 253 cmpl $__PAGE_OFFSET-3,%ebp 1053 .globl fpsave !! 254 jae syscall_fault 1054 fpsave: !! 255 1: movl (%ebp),%ebp 1055 st %fsr, [%o1] ! this can tr !! 256 .section __ex_table,"a" 1056 ld [%o1], %g1 << 1057 set 0x2000, %g4 << 1058 andcc %g1, %g4, %g0 << 1059 be 2f << 1060 mov 0, %g2 << 1061 << 1062 /* We have an fpqueue to save. */ << 1063 1: << 1064 std %fq, [%o2] << 1065 fpsave_magic: << 1066 st %fsr, [%o1] << 1067 ld [%o1], %g3 << 1068 andcc %g3, %g4, %g0 << 1069 add %g2, 1, %g2 << 1070 bne 1b << 1071 add %o2, 8, %o2 << 1072 << 1073 2: << 1074 st %g2, [%o3] << 1075 << 1076 std %f0, [%o0 + 0x00] << 1077 std %f2, [%o0 + 0x08] << 1078 std %f4, [%o0 + 0x10] << 1079 std %f6, [%o0 + 0x18] << 1080 std %f8, [%o0 + 0x20] << 1081 std %f10, [%o0 + 0x28] << 1082 std %f12, [%o0 + 0x30] << 1083 std %f14, [%o0 + 0x38] << 1084 std %f16, [%o0 + 0x40] << 1085 std %f18, [%o0 + 0x48] << 1086 std %f20, [%o0 + 0x50] << 1087 std %f22, [%o0 + 0x58] << 1088 std %f24, [%o0 + 0x60] << 1089 std %f26, [%o0 + 0x68] << 1090 std %f28, [%o0 + 0x70] << 1091 retl << 1092 std %f30, [%o0 + 0x78] << 1093 << 1094 /* Thanks for Theo Deraadt and the au << 1095 * code for pointing out this possibl << 1096 * above we could trap on the fsr sto << 1097 * code has to know how to deal with << 1098 */ << 1099 fpsave_catch: << 1100 b fpsave_magic + 4 << 1101 st %fsr, [%o1] << 1102 << 1103 fpsave_catch2: << 1104 b fpsave + 4 << 1105 st %fsr, [%o1] << 1106 << 1107 /* void fpload(unsigned long *fpregs, << 1108 << 1109 .globl fpload << 1110 fpload: << 1111 ldd [%o0 + 0x00], %f0 << 1112 ldd [%o0 + 0x08], %f2 << 1113 ldd [%o0 + 0x10], %f4 << 1114 ldd [%o0 + 0x18], %f6 << 1115 ldd [%o0 + 0x20], %f8 << 1116 ldd [%o0 + 0x28], %f10 << 1117 ldd [%o0 + 0x30], %f12 << 1118 ldd [%o0 + 0x38], %f14 << 1119 ldd [%o0 + 0x40], %f16 << 1120 ldd [%o0 + 0x48], %f18 << 1121 ldd [%o0 + 0x50], %f20 << 1122 ldd [%o0 + 0x58], %f22 << 1123 ldd [%o0 + 0x60], %f24 << 1124 ldd [%o0 + 0x68], %f26 << 1125 ldd [%o0 + 0x70], %f28 << 1126 ldd [%o0 + 0x78], %f30 << 1127 ld [%o1], %fsr << 1128 retl << 1129 nop << 1130 << 1131 /* __ndelay and __udelay take two arg << 1132 * 0 - nsecs or usecs to delay << 1133 * 1 - per_cpu udelay_val (loops per << 1134 * << 1135 * Note that ndelay gives HZ times hi << 1136 * limit. udelay can handle up to 1s << 1137 */ << 1138 .globl __ndelay << 1139 __ndelay: << 1140 save %sp, -STACKFRAME_SZ, %sp << 1141 mov %i0, %o0 ! rou << 1142 mov 0x1ae, %o1 ! 2** << 1143 umul %o0, %o1, %o0 << 1144 rd %y, %o1 << 1145 mov %i1, %o1 ! ude << 1146 umul %o0, %o1, %o0 << 1147 rd %y, %o1 << 1148 ba delay_continue << 1149 mov %o1, %o0 ! >>3 << 1150 << 1151 .globl __udelay << 1152 __udelay: << 1153 save %sp, -STACKFRAME_SZ, %sp << 1154 mov %i0, %o0 << 1155 sethi %hi(0x10c7), %o1 ! rou << 1156 or %o1, %lo(0x10c7), %o1 ! 2** << 1157 umul %o0, %o1, %o0 << 1158 rd %y, %o1 << 1159 mov %i1, %o1 ! ude << 1160 umul %o0, %o1, %o0 << 1161 rd %y, %o1 << 1162 sethi %hi(0x028f4b62), %l0 ! Add << 1163 or %g0, %lo(0x028f4b62), %l0 << 1164 addcc %o0, %l0, %o0 ! 2** << 1165 bcs,a 3f << 1166 add %o1, 0x01, %o1 << 1167 3: << 1168 mov HZ, %o0 ! >>3 << 1169 umul %o0, %o1, %o0 << 1170 rd %y, %o1 << 1171 << 1172 delay_continue: << 1173 cmp %o0, 0x0 << 1174 1: << 1175 bne 1b << 1176 subcc %o0, 1, %o0 << 1177 << 1178 ret << 1179 restore << 1180 EXPORT_SYMBOL(__udelay) << 1181 EXPORT_SYMBOL(__ndelay) << 1182 << 1183 /* Handle a software breakpoint */ << 1184 /* We have to inform parent that chil << 1185 .align 4 257 .align 4 1186 .globl breakpoint_trap !! 258 .long 1b,syscall_fault 1187 breakpoint_trap: !! 259 .previous 1188 rd %wim,%l3 << 1189 SAVE_ALL << 1190 wr %l0, PSR_ET, %psr << 1191 WRITE_PAUSE << 1192 << 1193 st %i0, [%sp + STACKFRAME_SZ + P << 1194 call sparc_breakpoint << 1195 add %sp, STACKFRAME_SZ, %o0 << 1196 260 1197 RESTORE_ALL !! 261 pushl %eax 1198 << 1199 #ifdef CONFIG_KGDB << 1200 ENTRY(kgdb_trap_low) << 1201 rd %wim,%l3 << 1202 SAVE_ALL 262 SAVE_ALL 1203 wr %l0, PSR_ET, %psr !! 263 GET_THREAD_INFO(%ebp) 1204 WRITE_PAUSE !! 264 cmpl $(nr_syscalls), %eax 1205 !! 265 jae syscall_badsys 1206 mov %l7, %o0 ! tra !! 266 1207 call kgdb_trap !! 267 testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp) 1208 add %sp, STACKFRAME_SZ, %o1 ! str !! 268 jnz syscall_trace_entry 1209 !! 269 call *sys_call_table(,%eax,4) 1210 RESTORE_ALL !! 270 movl %eax,EAX(%esp) 1211 ENDPROC(kgdb_trap_low) !! 271 cli >> 272 movl TI_FLAGS(%ebp), %ecx >> 273 testw $_TIF_ALLWORK_MASK, %cx >> 274 jne syscall_exit_work >> 275 /* if something modifies registers it must also disable sysexit */ >> 276 movl EIP(%esp), %edx >> 277 movl OLDESP(%esp), %ecx >> 278 sti >> 279 sysexit >> 280 >> 281 >> 282 # system call handler stub >> 283 ENTRY(system_call) >> 284 pushl %eax # save orig_eax >> 285 SAVE_ALL >> 286 GET_THREAD_INFO(%ebp) >> 287 cmpl $(nr_syscalls), %eax >> 288 jae syscall_badsys >> 289 # system call tracing in operation >> 290 testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp) >> 291 jnz syscall_trace_entry >> 292 syscall_call: >> 293 call *sys_call_table(,%eax,4) >> 294 movl %eax,EAX(%esp) # store the return value >> 295 syscall_exit: >> 296 cli # make sure we don't miss an interrupt >> 297 # setting need_resched or sigpending >> 298 # between sampling and the iret >> 299 movl TI_FLAGS(%ebp), %ecx >> 300 testw $_TIF_ALLWORK_MASK, %cx # current->work >> 301 jne syscall_exit_work >> 302 restore_all: >> 303 RESTORE_ALL >> 304 >> 305 # perform work that needs to be done immediately before resumption >> 306 ALIGN >> 307 work_pending: >> 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 >> 378 >> 379 /* >> 380 * Build the entry stubs and pointer table with >> 381 * some assembler magic. >> 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 >> 470 >> 471 /* >> 472 * Debug traps and NMI can happen at the one SYSENTER instruction >> 473 * that sets up the real kernel stack. Check here, since we can't >> 474 * allow the wrong stack to be used. >> 475 * >> 476 * "TSS_ESP0_OFFSET+12" is because the NMI/debug handler will have >> 477 * already pushed 3 words if it hits on the sysenter instruction: >> 478 * eflags, cs and eip. >> 479 * >> 480 * We just load the right stack, and push the three (known) values >> 481 * by hand onto the new stack - while updating the return eip past >> 482 * the instruction that would have done it for sysenter. >> 483 */ >> 484 #define FIX_STACK(offset, ok, label) \ >> 485 cmpw $__KERNEL_CS,4(%esp); \ >> 486 jne ok; \ >> 487 label: \ >> 488 movl TSS_ESP0_OFFSET+offset(%esp),%esp; \ >> 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 >> 501 >> 502 /* >> 503 * NMI is doubly nasty. It can happen _while_ we're handling >> 504 * a debug fault, and the debug fault hasn't yet been able to >> 505 * clear up the stack. So we first check whether we got an >> 506 * NMI on the sysenter entry path, but after that we need to >> 507 * check whether we got an NMI on the debug path where the debug >> 508 * fault happened on the sysenter path. >> 509 */ >> 510 ENTRY(nmi) >> 511 cmpl $sysenter_entry,(%esp) >> 512 je nmi_stack_fixup >> 513 pushl %eax >> 514 movl %esp,%eax >> 515 /* Do not access memory above the end of our stack page, >> 516 * it might not exist. >> 517 */ >> 518 andl $0x1fff,%eax >> 519 cmpl $0x1fec,%eax >> 520 popl %eax >> 521 jae nmi_stack_correct >> 522 cmpl $sysenter_entry,12(%esp) >> 523 je nmi_debug_stack_check >> 524 nmi_stack_correct: >> 525 pushl %eax >> 526 SAVE_ALL >> 527 movl %esp, %edx >> 528 pushl $0 >> 529 pushl %edx >> 530 call do_nmi >> 531 addl $8, %esp >> 532 RESTORE_ALL >> 533 >> 534 nmi_stack_fixup: >> 535 FIX_STACK(12,nmi_stack_correct, 1) >> 536 jmp nmi_stack_correct >> 537 nmi_debug_stack_check: >> 538 cmpw $__KERNEL_CS,16(%esp) >> 539 jne nmi_stack_correct >> 540 cmpl $debug - 1,(%esp) >> 541 jle nmi_stack_correct >> 542 cmpl $debug_esp_fix_insn,(%esp) >> 543 jle nmi_debug_stack_fixup >> 544 nmi_debug_stack_fixup: >> 545 FIX_STACK(24,nmi_stack_correct, 1) >> 546 jmp nmi_stack_correct >> 547 >> 548 ENTRY(int3) >> 549 pushl $0 >> 550 pushl $do_int3 >> 551 jmp error_code >> 552 >> 553 ENTRY(overflow) >> 554 pushl $0 >> 555 pushl $do_overflow >> 556 jmp error_code >> 557 >> 558 ENTRY(bounds) >> 559 pushl $0 >> 560 pushl $do_bounds >> 561 jmp error_code >> 562 >> 563 ENTRY(invalid_op) >> 564 pushl $0 >> 565 pushl $do_invalid_op >> 566 jmp error_code >> 567 >> 568 ENTRY(coprocessor_segment_overrun) >> 569 pushl $0 >> 570 pushl $do_coprocessor_segment_overrun >> 571 jmp error_code >> 572 >> 573 ENTRY(invalid_TSS) >> 574 pushl $do_invalid_TSS >> 575 jmp error_code >> 576 >> 577 ENTRY(segment_not_present) >> 578 pushl $do_segment_not_present >> 579 jmp error_code >> 580 >> 581 ENTRY(stack_segment) >> 582 pushl $do_stack_segment >> 583 jmp error_code >> 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 1212 #endif 602 #endif 1213 603 1214 .align 4 !! 604 ENTRY(spurious_interrupt_bug) 1215 .globl flush_patch_exception !! 605 pushl $0 1216 flush_patch_exception: !! 606 pushl $do_spurious_interrupt_bug 1217 FLUSH_ALL_KERNEL_WINDOWS; !! 607 jmp error_code 1218 ldd [%o0], %o6 !! 608 1219 jmpl %o7 + 0xc, %g0 !! 609 .data 1220 mov 1, %g1 !! 610 ENTRY(sys_call_table) 1221 !! 611 .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ 1222 .align 4 !! 612 .long sys_exit 1223 .globl kill_user_windows, kuw_patch1 !! 613 .long sys_fork 1224 .globl kuw_patch1 !! 614 .long sys_read 1225 kuw_patch1_7win: sll %o3, 6, %o3 !! 615 .long sys_write 1226 !! 616 .long sys_open /* 5 */ 1227 /* No matter how much overhead this r !! 617 .long sys_close 1228 * case scenario, it is several times !! 618 .long sys_waitpid 1229 * traps with the old method of just !! 619 .long sys_creat 1230 */ !! 620 .long sys_link 1231 kill_user_windows: !! 621 .long sys_unlink /* 10 */ 1232 ld [%g6 + TI_UWINMASK], %o0 !! 622 .long sys_execve 1233 orcc %g0, %o0, %g0 !! 623 .long sys_chdir 1234 be 3f !! 624 .long sys_time 1235 rd %psr, %o5 !! 625 .long sys_mknod 1236 or %o5, PSR_PIL, %o4 !! 626 .long sys_chmod /* 15 */ 1237 wr %o4, 0x0, %psr !! 627 .long sys_lchown16 1238 WRITE_PAUSE !! 628 .long sys_ni_syscall /* old break syscall holder */ 1239 1: !! 629 .long sys_stat 1240 ld [%g6 + TI_UWINMASK], %o0 !! 630 .long sys_lseek 1241 orcc %g0, %o0, %g0 !! 631 .long sys_getpid /* 20 */ 1242 be 4f !! 632 .long sys_mount 1243 rd %wim, %o3 !! 633 .long sys_oldumount 1244 srl %o3, 1, %o4 !! 634 .long sys_setuid16 1245 kuw_patch1: !! 635 .long sys_getuid16 1246 sll %o3, 7, %o3 !! 636 .long sys_stime /* 25 */ 1247 or %o4, %o3, %o3 !! 637 .long sys_ptrace 1248 andncc %o0, %o3, %o0 !! 638 .long sys_alarm 1249 bne kuw_patch1 !! 639 .long sys_fstat 1250 srl %o3, 1, %o4 !! 640 .long sys_pause 1251 wr %o3, 0x0, %wim !! 641 .long sys_utime /* 30 */ 1252 st %g0, [%g6 + TI_UWINMASK] !! 642 .long sys_ni_syscall /* old stty syscall holder */ 1253 4: !! 643 .long sys_ni_syscall /* old gtty syscall holder */ 1254 wr %o5, 0x0, %psr !! 644 .long sys_access 1255 WRITE_PAUSE !! 645 .long sys_nice 1256 3: !! 646 .long sys_ni_syscall /* 35 - old ftime syscall holder */ 1257 retl !! 647 .long sys_sync 1258 st %g0, [%g6 + TI_W_SAVED] !! 648 .long sys_kill 1259 !! 649 .long sys_rename 1260 .align 4 !! 650 .long sys_mkdir 1261 .globl restore_current !! 651 .long sys_rmdir /* 40 */ 1262 restore_current: !! 652 .long sys_dup 1263 LOAD_CURRENT(g6, o0) !! 653 .long sys_pipe 1264 retl !! 654 .long sys_times 1265 nop !! 655 .long sys_ni_syscall /* old prof syscall holder */ 1266 !! 656 .long sys_brk /* 45 */ 1267 #ifdef CONFIG_PCIC_PCI !! 657 .long sys_setgid16 1268 #include <asm/pcic.h> !! 658 .long sys_getgid16 1269 !! 659 .long sys_signal 1270 .align 4 !! 660 .long sys_geteuid16 1271 .globl linux_trap_ipi15_pcic !! 661 .long sys_getegid16 /* 50 */ 1272 linux_trap_ipi15_pcic: !! 662 .long sys_acct 1273 rd %wim, %l3 !! 663 .long sys_umount /* recycled never used phys() */ 1274 SAVE_ALL !! 664 .long sys_ni_syscall /* old lock syscall holder */ 1275 !! 665 .long sys_ioctl 1276 /* !! 666 .long sys_fcntl /* 55 */ 1277 * First deactivate NMI !! 667 .long sys_ni_syscall /* old mpx syscall holder */ 1278 * or we cannot drop ET, cannot get w !! 668 .long sys_setpgid 1279 * The busy loop is necessary because !! 669 .long sys_ni_syscall /* old ulimit syscall holder */ 1280 * sometimes does not go away quickly !! 670 .long sys_olduname 1281 */ !! 671 .long sys_umask /* 60 */ 1282 sethi %hi(pcic_regs), %o1 !! 672 .long sys_chroot 1283 ld [%o1 + %lo(pcic_regs)], %o2 !! 673 .long sys_ustat 1284 !! 674 .long sys_dup2 1285 ! Get pending status for printouts la !! 675 .long sys_getppid 1286 ld [%o2 + PCI_SYS_INT_PENDING], !! 676 .long sys_getpgrp /* 65 */ 1287 !! 677 .long sys_setsid 1288 mov PCI_SYS_INT_PENDING_CLEAR_ALL !! 678 .long sys_sigaction 1289 stb %o1, [%o2 + PCI_SYS_INT_PENDI !! 679 .long sys_sgetmask 1290 1: !! 680 .long sys_ssetmask 1291 ld [%o2 + PCI_SYS_INT_PENDING], !! 681 .long sys_setreuid16 /* 70 */ 1292 andcc %o1, ((PCI_SYS_INT_PENDING_PI !! 682 .long sys_setregid16 1293 bne 1b !! 683 .long sys_sigsuspend 1294 nop !! 684 .long sys_sigpending 1295 !! 685 .long sys_sethostname 1296 or %l0, PSR_PIL, %l4 !! 686 .long sys_setrlimit /* 75 */ 1297 wr %l4, 0x0, %psr !! 687 .long sys_old_getrlimit 1298 WRITE_PAUSE !! 688 .long sys_getrusage 1299 wr %l4, PSR_ET, %psr !! 689 .long sys_gettimeofday 1300 WRITE_PAUSE !! 690 .long sys_settimeofday 1301 !! 691 .long sys_getgroups16 /* 80 */ 1302 call pcic_nmi !! 692 .long sys_setgroups16 1303 add %sp, STACKFRAME_SZ, %o1 ! str !! 693 .long old_select 1304 RESTORE_ALL !! 694 .long sys_symlink 1305 !! 695 .long sys_lstat 1306 .globl pcic_nmi_trap_patch !! 696 .long sys_readlink /* 85 */ 1307 pcic_nmi_trap_patch: !! 697 .long sys_uselib 1308 sethi %hi(linux_trap_ipi15_pcic), % !! 698 .long sys_swapon 1309 jmpl %l3 + %lo(linux_trap_ipi15_pc !! 699 .long sys_reboot 1310 rd %psr, %l0 !! 700 .long old_readdir 1311 .word 0 !! 701 .long old_mmap /* 90 */ 1312 !! 702 .long sys_munmap 1313 #endif /* CONFIG_PCIC_PCI */ !! 703 .long sys_truncate 1314 !! 704 .long sys_ftruncate 1315 .globl flushw_all !! 705 .long sys_fchmod 1316 flushw_all: !! 706 .long sys_fchown16 /* 95 */ 1317 save %sp, -0x40, %sp !! 707 .long sys_getpriority 1318 save %sp, -0x40, %sp !! 708 .long sys_setpriority 1319 save %sp, -0x40, %sp !! 709 .long sys_ni_syscall /* old profil syscall holder */ 1320 save %sp, -0x40, %sp !! 710 .long sys_statfs 1321 save %sp, -0x40, %sp !! 711 .long sys_fstatfs /* 100 */ 1322 save %sp, -0x40, %sp !! 712 .long sys_ioperm 1323 save %sp, -0x40, %sp !! 713 .long sys_socketcall 1324 restore !! 714 .long sys_syslog 1325 restore !! 715 .long sys_setitimer 1326 restore !! 716 .long sys_getitimer /* 105 */ 1327 restore !! 717 .long sys_newstat 1328 restore !! 718 .long sys_newlstat 1329 restore !! 719 .long sys_newfstat 1330 ret !! 720 .long sys_uname 1331 restore !! 721 .long sys_iopl /* 110 */ 1332 !! 722 .long sys_vhangup 1333 #ifdef CONFIG_SMP !! 723 .long sys_ni_syscall /* old "idle" system call */ 1334 ENTRY(hard_smp_processor_id) !! 724 .long sys_vm86old 1335 661: rd %tbr, %g1 !! 725 .long sys_wait4 1336 srl %g1, 12, %o0 !! 726 .long sys_swapoff /* 115 */ 1337 and %o0, 3, %o0 !! 727 .long sys_sysinfo 1338 .section .cpuid_patch, "ax" !! 728 .long sys_ipc 1339 /* Instruction location. */ !! 729 .long sys_fsync 1340 .word 661b !! 730 .long sys_sigreturn 1341 /* SUN4D implementation. */ !! 731 .long sys_clone /* 120 */ 1342 lda [%g0] ASI_M_VIKING_TM !! 732 .long sys_setdomainname 1343 nop !! 733 .long sys_newuname 1344 nop !! 734 .long sys_modify_ldt 1345 /* LEON implementation. */ !! 735 .long sys_adjtimex 1346 rd %asr17, %o0 !! 736 .long sys_mprotect /* 125 */ 1347 srl %o0, 0x1c, %o0 !! 737 .long sys_sigprocmask 1348 nop !! 738 .long sys_ni_syscall /* old "create_module" */ 1349 .previous !! 739 .long sys_init_module 1350 retl !! 740 .long sys_delete_module 1351 nop !! 741 .long sys_ni_syscall /* 130: old "get_kernel_syms" */ 1352 ENDPROC(hard_smp_processor_id) !! 742 .long sys_quotactl 1353 #endif !! 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 */ 1354 885 1355 /* End of entry.S */ !! 886 syscall_table_size=(.-sys_call_table)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.