entry.S revision 0d1cdd7ab6e0e7ccaf9f3b1d2afa0ddeead23ccc
1/* 2 * File: arch/blackfin/mach-common/entry.S 3 * Based on: 4 * Author: Linus Torvalds 5 * 6 * Created: ? 7 * Description: contains the system-call and fault low-level handling routines. 8 * This also contains the timer-interrupt handler, as well as all 9 * interrupts and faults that can result in a task-switch. 10 * 11 * Modified: 12 * Copyright 2004-2006 Analog Devices Inc. 13 * 14 * Bugs: Enter bugs at http://blackfin.uclinux.org/ 15 * 16 * This program is free software; you can redistribute it and/or modify 17 * it under the terms of the GNU General Public License as published by 18 * the Free Software Foundation; either version 2 of the License, or 19 * (at your option) any later version. 20 * 21 * This program is distributed in the hope that it will be useful, 22 * but WITHOUT ANY WARRANTY; without even the implied warranty of 23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24 * GNU General Public License for more details. 25 * 26 * You should have received a copy of the GNU General Public License 27 * along with this program; if not, see the file COPYING, or write 28 * to the Free Software Foundation, Inc., 29 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 30 */ 31 32/* NOTE: This code handles signal-recognition, which happens every time 33 * after a timer-interrupt and after each system call. 34 */ 35 36#include <linux/init.h> 37#include <linux/linkage.h> 38#include <linux/unistd.h> 39#include <asm/blackfin.h> 40#include <asm/errno.h> 41#include <asm/fixed_code.h> 42#include <asm/thread_info.h> /* TIF_NEED_RESCHED */ 43#include <asm/asm-offsets.h> 44#include <asm/trace.h> 45 46#include <asm/mach-common/context.S> 47 48#if defined(CONFIG_BFIN_SCRATCH_REG_RETN) 49# define EX_SCRATCH_REG RETN 50#elif defined(CONFIG_BFIN_SCRATCH_REG_RETE) 51# define EX_SCRATCH_REG RETE 52#else 53# define EX_SCRATCH_REG CYCLES 54#endif 55 56#ifdef CONFIG_EXCPT_IRQ_SYSC_L1 57.section .l1.text 58#else 59.text 60#endif 61 62/* Slightly simplified and streamlined entry point for CPLB misses. 63 * This one does not lower the level to IRQ5, and thus can be used to 64 * patch up CPLB misses on the kernel stack. 65 */ 66#if ANOMALY_05000261 67#define _ex_dviol _ex_workaround_261 68#define _ex_dmiss _ex_workaround_261 69#define _ex_dmult _ex_workaround_261 70 71ENTRY(_ex_workaround_261) 72 /* 73 * Work around an anomaly: if we see a new DCPLB fault, return 74 * without doing anything. Then, if we get the same fault again, 75 * handle it. 76 */ 77 P4 = R7; /* Store EXCAUSE */ 78 p5.l = _last_cplb_fault_retx; 79 p5.h = _last_cplb_fault_retx; 80 r7 = [p5]; 81 r6 = retx; 82 [p5] = r6; 83 cc = r6 == r7; 84 if !cc jump _bfin_return_from_exception; 85 /* fall through */ 86 R7 = P4; 87 R6 = 0x26; /* Data CPLB Miss */ 88 cc = R6 == R7; 89 if cc jump _ex_dcplb_miss (BP); 90 R6 = 0x23; /* Data CPLB Miss */ 91 cc = R6 == R7; 92 if cc jump _ex_dcplb_viol (BP); 93 /* Handle 0x23 Data CPLB Protection Violation 94 * and Data CPLB Multiple Hits - Linux Trap Zero 95 */ 96 jump _ex_trap_c; 97ENDPROC(_ex_workaround_261) 98 99#else 100#ifdef CONFIG_MPU 101#define _ex_dviol _ex_dcplb_viol 102#else 103#define _ex_dviol _ex_trap_c 104#endif 105#define _ex_dmiss _ex_dcplb_miss 106#define _ex_dmult _ex_trap_c 107#endif 108 109 110ENTRY(_ex_dcplb_viol) 111ENTRY(_ex_dcplb_miss) 112ENTRY(_ex_icplb_miss) 113 (R7:6,P5:4) = [sp++]; 114 ASTAT = [sp++]; 115 SAVE_ALL_SYS 116#ifdef CONFIG_MPU 117 /* We must load R1 here, _before_ DEBUG_HWTRACE_SAVE, since that 118 * will change the stack pointer. */ 119 R0 = SEQSTAT; 120 R1 = SP; 121#endif 122 DEBUG_HWTRACE_SAVE(p5, r7) 123#ifdef CONFIG_MPU 124 sp += -12; 125 call _cplb_hdr; 126 sp += 12; 127 CC = R0 == 0; 128 IF !CC JUMP _handle_bad_cplb; 129#else 130 call __cplb_hdr; 131#endif 132 DEBUG_HWTRACE_RESTORE(p5, r7) 133 RESTORE_ALL_SYS 134 SP = EX_SCRATCH_REG; 135 rtx; 136ENDPROC(_ex_icplb_miss) 137 138ENTRY(_ex_syscall) 139 (R7:6,P5:4) = [sp++]; 140 ASTAT = [sp++]; 141 raise 15; /* invoked by TRAP #0, for sys call */ 142 sp = EX_SCRATCH_REG; 143 rtx 144ENDPROC(_ex_syscall) 145 146ENTRY(_ex_soft_bp) 147 r7 = retx; 148 r7 += -2; 149 retx = r7; 150 jump.s _ex_trap_c; 151ENDPROC(_ex_soft_bp) 152 153ENTRY(_ex_single_step) 154 /* If we just returned from an interrupt, the single step event is 155 for the RTI instruction. */ 156 r7 = retx; 157 r6 = reti; 158 cc = r7 == r6; 159 if cc jump _bfin_return_from_exception; 160 161 /* Don't do single step in hardware exception handler */ 162 p5.l = lo(IPEND); 163 p5.h = hi(IPEND); 164 r6 = [p5]; 165 cc = bittst(r6, 5); 166 if cc jump _bfin_return_from_exception; 167 168#ifdef CONFIG_KGDB 169 /* skip single step if current interrupt priority is higher than 170 * that of the first instruction, from which gdb starts single step */ 171 r6 >>= 6; 172 r7 = 10; 173.Lfind_priority_start: 174 cc = bittst(r6, 0); 175 if cc jump .Lfind_priority_done; 176 r6 >>= 1; 177 r7 += -1; 178 cc = r7 == 0; 179 if cc jump .Lfind_priority_done; 180 jump.s .Lfind_priority_start; 181.Lfind_priority_done: 182 p4.l = _debugger_step; 183 p4.h = _debugger_step; 184 r6 = [p4]; 185 cc = r6 == 0; 186 if cc jump .Ldo_single_step; 187 r6 += -1; 188 cc = r6 < r7; 189 if cc jump _bfin_return_from_exception; 190.Ldo_single_step: 191#endif 192 193 /* If we were in user mode, do the single step normally. */ 194 r6 = [p5]; 195 r7 = 0xffe0 (z); 196 r7 = r7 & r6; 197 cc = r7 == 0; 198 if cc jump 1f; 199 200 /* 201 * We were in an interrupt handler. By convention, all of them save 202 * SYSCFG with their first instruction, so by checking whether our 203 * RETX points at the entry point, we can determine whether to allow 204 * a single step, or whether to clear SYSCFG. 205 * 206 * First, find out the interrupt level and the event vector for it. 207 */ 208 p5.l = lo(EVT0); 209 p5.h = hi(EVT0); 210 p5 += -4; 2112: 212 r7 = rot r7 by -1; 213 p5 += 4; 214 if !cc jump 2b; 215 216 /* What we actually do is test for the _second_ instruction in the 217 * IRQ handler. That way, if there are insns following the restore 218 * of SYSCFG after leaving the handler, we will not turn off SYSCFG 219 * for them. */ 220 221 r7 = [p5]; 222 r7 += 2; 223 r6 = RETX; 224 cc = R7 == R6; 225 if !cc jump _bfin_return_from_exception; 226 2271: 228 /* Single stepping only a single instruction, so clear the trace 229 * bit here. */ 230 r7 = syscfg; 231 bitclr (r7, 0); 232 syscfg = R7; 233 234 jump _ex_trap_c; 235 236ENDPROC(_ex_single_step) 237 238ENTRY(_bfin_return_from_exception) 239#if ANOMALY_05000257 240 R7=LC0; 241 LC0=R7; 242 R7=LC1; 243 LC1=R7; 244#endif 245 (R7:6,P5:4) = [sp++]; 246 ASTAT = [sp++]; 247 sp = EX_SCRATCH_REG; 248 rtx; 249ENDPROC(_bfin_return_from_exception) 250 251ENTRY(_handle_bad_cplb) 252 DEBUG_HWTRACE_RESTORE(p5, r7) 253 /* To get here, we just tried and failed to change a CPLB 254 * so, handle things in trap_c (C code), by lowering to 255 * IRQ5, just like we normally do. Since this is not a 256 * "normal" return path, we have a do alot of stuff to 257 * the stack to get ready so, we can fall through - we 258 * need to make a CPLB exception look like a normal exception 259 */ 260 261 RESTORE_ALL_SYS 262 [--sp] = ASTAT; 263 [--sp] = (R7:6,P5:4); 264 265ENTRY(_ex_replaceable) 266 nop; 267 268ENTRY(_ex_trap_c) 269 /* Make sure we are not in a double fault */ 270 p4.l = lo(IPEND); 271 p4.h = hi(IPEND); 272 r7 = [p4]; 273 CC = BITTST (r7, 5); 274 if CC jump _double_fault; 275 276 /* Call C code (trap_c) to handle the exception, which most 277 * likely involves sending a signal to the current process. 278 * To avoid double faults, lower our priority to IRQ5 first. 279 */ 280 P5.h = _exception_to_level5; 281 P5.l = _exception_to_level5; 282 p4.l = lo(EVT5); 283 p4.h = hi(EVT5); 284 [p4] = p5; 285 csync; 286 287 p4.l = lo(DCPLB_FAULT_ADDR); 288 p4.h = hi(DCPLB_FAULT_ADDR); 289 r7 = [p4]; 290 p5.h = _saved_dcplb_fault_addr; 291 p5.l = _saved_dcplb_fault_addr; 292 [p5] = r7; 293 294 r7 = [p4 + (ICPLB_FAULT_ADDR - DCPLB_FAULT_ADDR)]; 295 p5.h = _saved_icplb_fault_addr; 296 p5.l = _saved_icplb_fault_addr; 297 [p5] = r7; 298 299 p4.l = _excpt_saved_stuff; 300 p4.h = _excpt_saved_stuff; 301 302 r6 = retx; 303 [p4] = r6; 304 305 r6 = SYSCFG; 306 [p4 + 4] = r6; 307 BITCLR(r6, 0); 308 SYSCFG = r6; 309 310 /* Disable all interrupts, but make sure level 5 is enabled so 311 * we can switch to that level. Save the old mask. */ 312 cli r6; 313 [p4 + 8] = r6; 314 315 p4.l = lo(SAFE_USER_INSTRUCTION); 316 p4.h = hi(SAFE_USER_INSTRUCTION); 317 retx = p4; 318 319 r6 = 0x3f; 320 sti r6; 321 322 (R7:6,P5:4) = [sp++]; 323 ASTAT = [sp++]; 324 SP = EX_SCRATCH_REG; 325 raise 5; 326 rtx; 327ENDPROC(_ex_trap_c) 328 329/* We just realized we got an exception, while we were processing a different 330 * exception. This is a unrecoverable event, so crash 331 */ 332ENTRY(_double_fault) 333 /* Turn caches & protection off, to ensure we don't get any more 334 * double exceptions 335 */ 336 337 P4.L = LO(IMEM_CONTROL); 338 P4.H = HI(IMEM_CONTROL); 339 340 R5 = [P4]; /* Control Register*/ 341 BITCLR(R5,ENICPLB_P); 342 SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */ 343 .align 8; 344 [P4] = R5; 345 SSYNC; 346 347 P4.L = LO(DMEM_CONTROL); 348 P4.H = HI(DMEM_CONTROL); 349 R5 = [P4]; 350 BITCLR(R5,ENDCPLB_P); 351 SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */ 352 .align 8; 353 [P4] = R5; 354 SSYNC; 355 356 /* Fix up the stack */ 357 (R7:6,P5:4) = [sp++]; 358 ASTAT = [sp++]; 359 SP = EX_SCRATCH_REG; 360 361 /* We should be out of the exception stack, and back down into 362 * kernel or user space stack 363 */ 364 SAVE_ALL_SYS 365 366 /* The dumping functions expect the return address in the RETI 367 * slot. */ 368 r6 = retx; 369 [sp + PT_PC] = r6; 370 371 r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */ 372 SP += -12; 373 call _double_fault_c; 374 SP += 12; 375.L_double_fault_panic: 376 JUMP .L_double_fault_panic 377 378ENDPROC(_double_fault) 379 380ENTRY(_exception_to_level5) 381 SAVE_ALL_SYS 382 383 p4.l = _excpt_saved_stuff; 384 p4.h = _excpt_saved_stuff; 385 r6 = [p4]; 386 [sp + PT_PC] = r6; 387 388 r6 = [p4 + 4]; 389 [sp + PT_SYSCFG] = r6; 390 391 /* Restore interrupt mask. We haven't pushed RETI, so this 392 * doesn't enable interrupts until we return from this handler. */ 393 r6 = [p4 + 8]; 394 sti r6; 395 396 /* Restore the hardware error vector. */ 397 P5.h = _evt_ivhw; 398 P5.l = _evt_ivhw; 399 p4.l = lo(EVT5); 400 p4.h = hi(EVT5); 401 [p4] = p5; 402 csync; 403 404 p2.l = lo(IPEND); 405 p2.h = hi(IPEND); 406 csync; 407 r0 = [p2]; /* Read current IPEND */ 408 [sp + PT_IPEND] = r0; /* Store IPEND */ 409 410 r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */ 411 SP += -12; 412 call _trap_c; 413 SP += 12; 414 415 call _ret_from_exception; 416 RESTORE_ALL_SYS 417 rti; 418ENDPROC(_exception_to_level5) 419 420ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/ 421 /* Since the kernel stack can be anywhere, it's not guaranteed to be 422 * covered by a CPLB. Switch to an exception stack; use RETN as a 423 * scratch register (for want of a better option). 424 */ 425 EX_SCRATCH_REG = sp; 426 sp.l = _exception_stack_top; 427 sp.h = _exception_stack_top; 428 /* Try to deal with syscalls quickly. */ 429 [--sp] = ASTAT; 430 [--sp] = (R7:6,P5:4); 431 r7 = SEQSTAT; /* reason code is in bit 5:0 */ 432 r6.l = lo(SEQSTAT_EXCAUSE); 433 r6.h = hi(SEQSTAT_EXCAUSE); 434 r7 = r7 & r6; 435 p5.h = _ex_table; 436 p5.l = _ex_table; 437 p4 = r7; 438 p5 = p5 + (p4 << 2); 439 p4 = [p5]; 440 jump (p4); 441 442.Lbadsys: 443 r7 = -ENOSYS; /* signextending enough */ 444 [sp + PT_R0] = r7; /* return value from system call */ 445 jump .Lsyscall_really_exit; 446ENDPROC(_trap) 447 448ENTRY(_kernel_execve) 449 link SIZEOF_PTREGS; 450 p0 = sp; 451 r3 = SIZEOF_PTREGS / 4; 452 r4 = 0(x); 4530: 454 [p0++] = r4; 455 r3 += -1; 456 cc = r3 == 0; 457 if !cc jump 0b (bp); 458 459 p0 = sp; 460 sp += -16; 461 [sp + 12] = p0; 462 call _do_execve; 463 SP += 16; 464 cc = r0 == 0; 465 if ! cc jump 1f; 466 /* Success. Copy our temporary pt_regs to the top of the kernel 467 * stack and do a normal exception return. 468 */ 469 r1 = sp; 470 r0 = (-KERNEL_STACK_SIZE) (x); 471 r1 = r1 & r0; 472 p2 = r1; 473 p3 = [p2]; 474 r0 = KERNEL_STACK_SIZE - 4 (z); 475 p1 = r0; 476 p1 = p1 + p2; 477 478 p0 = fp; 479 r4 = [p0--]; 480 r3 = SIZEOF_PTREGS / 4; 4810: 482 r4 = [p0--]; 483 [p1--] = r4; 484 r3 += -1; 485 cc = r3 == 0; 486 if ! cc jump 0b (bp); 487 488 r0 = (KERNEL_STACK_SIZE - SIZEOF_PTREGS) (z); 489 p1 = r0; 490 p1 = p1 + p2; 491 sp = p1; 492 r0 = syscfg; 493 [SP + PT_SYSCFG] = r0; 494 [p3 + (TASK_THREAD + THREAD_KSP)] = sp; 495 496 RESTORE_CONTEXT; 497 rti; 4981: 499 unlink; 500 rts; 501ENDPROC(_kernel_execve) 502 503ENTRY(_system_call) 504 /* Store IPEND */ 505 p2.l = lo(IPEND); 506 p2.h = hi(IPEND); 507 csync; 508 r0 = [p2]; 509 [sp + PT_IPEND] = r0; 510 511 /* Store RETS for now */ 512 r0 = rets; 513 [sp + PT_RESERVED] = r0; 514 /* Set the stack for the current process */ 515 r7 = sp; 516 r6.l = lo(ALIGN_PAGE_MASK); 517 r6.h = hi(ALIGN_PAGE_MASK); 518 r7 = r7 & r6; /* thread_info */ 519 p2 = r7; 520 p2 = [p2]; 521 522 [p2+(TASK_THREAD+THREAD_KSP)] = sp; 523 524 /* Check the System Call */ 525 r7 = __NR_syscall; 526 /* System call number is passed in P0 */ 527 r6 = p0; 528 cc = r6 < r7; 529 if ! cc jump .Lbadsys; 530 531 /* are we tracing syscalls?*/ 532 r7 = sp; 533 r6.l = lo(ALIGN_PAGE_MASK); 534 r6.h = hi(ALIGN_PAGE_MASK); 535 r7 = r7 & r6; 536 p2 = r7; 537 r7 = [p2+TI_FLAGS]; 538 CC = BITTST(r7,TIF_SYSCALL_TRACE); 539 if CC JUMP _sys_trace; 540 541 /* Execute the appropriate system call */ 542 543 p4 = p0; 544 p5.l = _sys_call_table; 545 p5.h = _sys_call_table; 546 p5 = p5 + (p4 << 2); 547 r0 = [sp + PT_R0]; 548 r1 = [sp + PT_R1]; 549 r2 = [sp + PT_R2]; 550 p5 = [p5]; 551 552 [--sp] = r5; 553 [--sp] = r4; 554 [--sp] = r3; 555 SP += -12; 556 call (p5); 557 SP += 24; 558 [sp + PT_R0] = r0; 559 560.Lresume_userspace: 561 r7 = sp; 562 r4.l = lo(ALIGN_PAGE_MASK); 563 r4.h = hi(ALIGN_PAGE_MASK); 564 r7 = r7 & r4; /* thread_info->flags */ 565 p5 = r7; 566.Lresume_userspace_1: 567 /* Disable interrupts. */ 568 [--sp] = reti; 569 reti = [sp++]; 570 571 r7 = [p5 + TI_FLAGS]; 572 r4.l = lo(_TIF_WORK_MASK); 573 r4.h = hi(_TIF_WORK_MASK); 574 r7 = r7 & r4; 575 576.Lsyscall_resched: 577 cc = BITTST(r7, TIF_NEED_RESCHED); 578 if !cc jump .Lsyscall_sigpending; 579 580 /* Reenable interrupts. */ 581 [--sp] = reti; 582 r0 = [sp++]; 583 584 SP += -12; 585 call _schedule; 586 SP += 12; 587 588 jump .Lresume_userspace_1; 589 590.Lsyscall_sigpending: 591 cc = BITTST(r7, TIF_RESTORE_SIGMASK); 592 if cc jump .Lsyscall_do_signals; 593 cc = BITTST(r7, TIF_SIGPENDING); 594 if !cc jump .Lsyscall_really_exit; 595.Lsyscall_do_signals: 596 /* Reenable interrupts. */ 597 [--sp] = reti; 598 r0 = [sp++]; 599 600 r0 = sp; 601 SP += -12; 602 call _do_signal; 603 SP += 12; 604 605.Lsyscall_really_exit: 606 r5 = [sp + PT_RESERVED]; 607 rets = r5; 608 rts; 609ENDPROC(_system_call) 610 611_sys_trace: 612 call _syscall_trace; 613 614 /* Execute the appropriate system call */ 615 616 p4 = [SP + PT_P0]; 617 p5.l = _sys_call_table; 618 p5.h = _sys_call_table; 619 p5 = p5 + (p4 << 2); 620 r0 = [sp + PT_R0]; 621 r1 = [sp + PT_R1]; 622 r2 = [sp + PT_R2]; 623 r3 = [sp + PT_R3]; 624 r4 = [sp + PT_R4]; 625 r5 = [sp + PT_R5]; 626 p5 = [p5]; 627 628 [--sp] = r5; 629 [--sp] = r4; 630 [--sp] = r3; 631 SP += -12; 632 call (p5); 633 SP += 24; 634 [sp + PT_R0] = r0; 635 636 call _syscall_trace; 637 jump .Lresume_userspace; 638ENDPROC(_sys_trace) 639 640ENTRY(_resume) 641 /* 642 * Beware - when entering resume, prev (the current task) is 643 * in r0, next (the new task) is in r1. 644 */ 645 p0 = r0; 646 p1 = r1; 647 [--sp] = rets; 648 [--sp] = fp; 649 [--sp] = (r7:4, p5:3); 650 651 /* save usp */ 652 p2 = usp; 653 [p0+(TASK_THREAD+THREAD_USP)] = p2; 654 655 /* save current kernel stack pointer */ 656 [p0+(TASK_THREAD+THREAD_KSP)] = sp; 657 658 /* save program counter */ 659 r1.l = _new_old_task; 660 r1.h = _new_old_task; 661 [p0+(TASK_THREAD+THREAD_PC)] = r1; 662 663 /* restore the kernel stack pointer */ 664 sp = [p1+(TASK_THREAD+THREAD_KSP)]; 665 666 /* restore user stack pointer */ 667 p0 = [p1+(TASK_THREAD+THREAD_USP)]; 668 usp = p0; 669 670 /* restore pc */ 671 p0 = [p1+(TASK_THREAD+THREAD_PC)]; 672 jump (p0); 673 674 /* 675 * Following code actually lands up in a new (old) task. 676 */ 677 678_new_old_task: 679 (r7:4, p5:3) = [sp++]; 680 fp = [sp++]; 681 rets = [sp++]; 682 683 /* 684 * When we come out of resume, r0 carries "old" task, becuase we are 685 * in "new" task. 686 */ 687 rts; 688ENDPROC(_resume) 689 690ENTRY(_ret_from_exception) 691 p2.l = lo(IPEND); 692 p2.h = hi(IPEND); 693 694 csync; 695 r0 = [p2]; 696 [sp + PT_IPEND] = r0; 697 6981: 699 r2 = LO(~0x37) (Z); 700 r0 = r2 & r0; 701 cc = r0 == 0; 702 if !cc jump 4f; /* if not return to user mode, get out */ 703 704 /* Make sure any pending system call or deferred exception 705 * return in ILAT for this process to get executed, otherwise 706 * in case context switch happens, system call of 707 * first process (i.e in ILAT) will be carried 708 * forward to the switched process 709 */ 710 711 p2.l = lo(ILAT); 712 p2.h = hi(ILAT); 713 r0 = [p2]; 714 r1 = (EVT_IVG14 | EVT_IVG15) (z); 715 r0 = r0 & r1; 716 cc = r0 == 0; 717 if !cc jump 5f; 718 719 /* Set the stack for the current process */ 720 r7 = sp; 721 r4.l = lo(ALIGN_PAGE_MASK); 722 r4.h = hi(ALIGN_PAGE_MASK); 723 r7 = r7 & r4; /* thread_info->flags */ 724 p5 = r7; 725 r7 = [p5 + TI_FLAGS]; 726 r4.l = lo(_TIF_WORK_MASK); 727 r4.h = hi(_TIF_WORK_MASK); 728 r7 = r7 & r4; 729 cc = r7 == 0; 730 if cc jump 4f; 731 732 p0.l = lo(EVT15); 733 p0.h = hi(EVT15); 734 p1.l = _schedule_and_signal; 735 p1.h = _schedule_and_signal; 736 [p0] = p1; 737 csync; 738 raise 15; /* raise evt14 to do signal or reschedule */ 7394: 740 r0 = syscfg; 741 bitclr(r0, 0); 742 syscfg = r0; 7435: 744 rts; 745ENDPROC(_ret_from_exception) 746 747ENTRY(_return_from_int) 748 /* If someone else already raised IRQ 15, do nothing. */ 749 csync; 750 p2.l = lo(ILAT); 751 p2.h = hi(ILAT); 752 r0 = [p2]; 753 cc = bittst (r0, EVT_IVG15_P); 754 if cc jump 2f; 755 756 /* if not return to user mode, get out */ 757 p2.l = lo(IPEND); 758 p2.h = hi(IPEND); 759 r0 = [p2]; 760 r1 = 0x17(Z); 761 r2 = ~r1; 762 r2.h = 0; 763 r0 = r2 & r0; 764 r1 = 1; 765 r1 = r0 - r1; 766 r2 = r0 & r1; 767 cc = r2 == 0; 768 if !cc jump 2f; 769 770 /* Lower the interrupt level to 15. */ 771 p0.l = lo(EVT15); 772 p0.h = hi(EVT15); 773 p1.l = _schedule_and_signal_from_int; 774 p1.h = _schedule_and_signal_from_int; 775 [p0] = p1; 776 csync; 777#if ANOMALY_05000281 778 r0.l = lo(SAFE_USER_INSTRUCTION); 779 r0.h = hi(SAFE_USER_INSTRUCTION); 780 reti = r0; 781#endif 782 r0 = 0x801f (z); 783 STI r0; 784 raise 15; /* raise evt15 to do signal or reschedule */ 785 rti; 7862: 787 rts; 788ENDPROC(_return_from_int) 789 790ENTRY(_lower_to_irq14) 791#if ANOMALY_05000281 792 r0.l = lo(SAFE_USER_INSTRUCTION); 793 r0.h = hi(SAFE_USER_INSTRUCTION); 794 reti = r0; 795#endif 796 r0 = 0x401f; 797 sti r0; 798 raise 14; 799 rti; 800ENTRY(_evt14_softirq) 801#ifdef CONFIG_DEBUG_HWERR 802 r0 = 0x3f; 803 sti r0; 804#else 805 cli r0; 806#endif 807 [--sp] = RETI; 808 SP += 4; 809 rts; 810 811_schedule_and_signal_from_int: 812 /* To end up here, vector 15 was changed - so we have to change it 813 * back. 814 */ 815 p0.l = lo(EVT15); 816 p0.h = hi(EVT15); 817 p1.l = _evt_system_call; 818 p1.h = _evt_system_call; 819 [p0] = p1; 820 csync; 821 822 /* Set orig_p0 to -1 to indicate this isn't the end of a syscall. */ 823 r0 = -1 (x); 824 [sp + PT_ORIG_P0] = r0; 825 826 p1 = rets; 827 [sp + PT_RESERVED] = p1; 828 829 p0.l = _irq_flags; 830 p0.h = _irq_flags; 831 r0 = [p0]; 832 sti r0; 833 834 r0 = sp; 835 sp += -12; 836 call _finish_atomic_sections; 837 sp += 12; 838 jump.s .Lresume_userspace; 839 840_schedule_and_signal: 841 SAVE_CONTEXT_SYSCALL 842 /* To end up here, vector 15 was changed - so we have to change it 843 * back. 844 */ 845 p0.l = lo(EVT15); 846 p0.h = hi(EVT15); 847 p1.l = _evt_system_call; 848 p1.h = _evt_system_call; 849 [p0] = p1; 850 csync; 851 p0.l = 1f; 852 p0.h = 1f; 853 [sp + PT_RESERVED] = P0; 854 call .Lresume_userspace; 8551: 856 RESTORE_CONTEXT 857 rti; 858ENDPROC(_lower_to_irq14) 859 860/* We handle this 100% in exception space - to reduce overhead 861 * Only potiential problem is if the software buffer gets swapped out of the 862 * CPLB table - then double fault. - so we don't let this happen in other places 863 */ 864#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND 865ENTRY(_ex_trace_buff_full) 866 [--sp] = P3; 867 [--sp] = P2; 868 [--sp] = LC0; 869 [--sp] = LT0; 870 [--sp] = LB0; 871 P5.L = _trace_buff_offset; 872 P5.H = _trace_buff_offset; 873 P3 = [P5]; /* trace_buff_offset */ 874 P5.L = lo(TBUFSTAT); 875 P5.H = hi(TBUFSTAT); 876 R7 = [P5]; 877 R7 <<= 1; /* double, since we need to read twice */ 878 LC0 = R7; 879 R7 <<= 2; /* need to shift over again, 880 * to get the number of bytes */ 881 P5.L = lo(TBUF); 882 P5.H = hi(TBUF); 883 R6 = ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN)*1024) - 1; 884 885 P2 = R7; 886 P3 = P3 + P2; 887 R7 = P3; 888 R7 = R7 & R6; 889 P3 = R7; 890 P2.L = _trace_buff_offset; 891 P2.H = _trace_buff_offset; 892 [P2] = P3; 893 894 P2.L = _software_trace_buff; 895 P2.H = _software_trace_buff; 896 897 LSETUP (.Lstart, .Lend) LC0; 898.Lstart: 899 R7 = [P5]; /* read TBUF */ 900 P4 = P3 + P2; 901 [P4] = R7; 902 P3 += -4; 903 R7 = P3; 904 R7 = R7 & R6; 905.Lend: 906 P3 = R7; 907 908 LB0 = [sp++]; 909 LT0 = [sp++]; 910 LC0 = [sp++]; 911 P2 = [sp++]; 912 P3 = [sp++]; 913 jump _bfin_return_from_exception; 914ENDPROC(_ex_trace_buff_full) 915 916#if CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN == 4 917.data 918#else 919.section .l1.data.B 920#endif /* CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN */ 921ENTRY(_trace_buff_offset) 922 .long 0; 923ALIGN 924ENTRY(_software_trace_buff) 925 .rept ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN)*256); 926 .long 0 927 .endr 928#endif /* CONFIG_DEBUG_BFIN_HWTRACE_EXPAND */ 929 930#if CONFIG_EARLY_PRINTK 931__INIT 932ENTRY(_early_trap) 933 SAVE_ALL_SYS 934 trace_buffer_stop(p0,r0); 935 936 /* Turn caches off, to ensure we don't get double exceptions */ 937 938 P4.L = LO(IMEM_CONTROL); 939 P4.H = HI(IMEM_CONTROL); 940 941 R5 = [P4]; /* Control Register*/ 942 BITCLR(R5,ENICPLB_P); 943 CLI R1; 944 SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */ 945 .align 8; 946 [P4] = R5; 947 SSYNC; 948 949 P4.L = LO(DMEM_CONTROL); 950 P4.H = HI(DMEM_CONTROL); 951 R5 = [P4]; 952 BITCLR(R5,ENDCPLB_P); 953 SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */ 954 .align 8; 955 [P4] = R5; 956 SSYNC; 957 STI R1; 958 959 r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */ 960 r1 = RETX; 961 962 SP += -12; 963 call _early_trap_c; 964 SP += 12; 965ENDPROC(_early_trap) 966__FINIT 967#endif /* CONFIG_EARLY_PRINTK */ 968 969/* 970 * Put these in the kernel data section - that should always be covered by 971 * a CPLB. This is needed to ensure we don't get double fault conditions 972 */ 973 974#ifdef CONFIG_SYSCALL_TAB_L1 975.section .l1.data 976#else 977.data 978#endif 979 980ENTRY(_ex_table) 981 /* entry for each EXCAUSE[5:0] 982 * This table must be in sync with the table in ./kernel/traps.c 983 * EXCPT instruction can provide 4 bits of EXCAUSE, allowing 16 to be user defined 984 */ 985 .long _ex_syscall /* 0x00 - User Defined - Linux Syscall */ 986 .long _ex_soft_bp /* 0x01 - User Defined - Software breakpoint */ 987 .long _ex_replaceable /* 0x02 - User Defined */ 988 .long _ex_trap_c /* 0x03 - User Defined - userspace stack overflow */ 989 .long _ex_trap_c /* 0x04 - User Defined - dump trace buffer */ 990 .long _ex_replaceable /* 0x05 - User Defined */ 991 .long _ex_replaceable /* 0x06 - User Defined */ 992 .long _ex_replaceable /* 0x07 - User Defined */ 993 .long _ex_replaceable /* 0x08 - User Defined */ 994 .long _ex_replaceable /* 0x09 - User Defined */ 995 .long _ex_replaceable /* 0x0A - User Defined */ 996 .long _ex_replaceable /* 0x0B - User Defined */ 997 .long _ex_replaceable /* 0x0C - User Defined */ 998 .long _ex_replaceable /* 0x0D - User Defined */ 999 .long _ex_replaceable /* 0x0E - User Defined */ 1000 .long _ex_replaceable /* 0x0F - User Defined */ 1001 .long _ex_single_step /* 0x10 - HW Single step */ 1002#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND 1003 .long _ex_trace_buff_full /* 0x11 - Trace Buffer Full */ 1004#else 1005 .long _ex_trap_c /* 0x11 - Trace Buffer Full */ 1006#endif 1007 .long _ex_trap_c /* 0x12 - Reserved */ 1008 .long _ex_trap_c /* 0x13 - Reserved */ 1009 .long _ex_trap_c /* 0x14 - Reserved */ 1010 .long _ex_trap_c /* 0x15 - Reserved */ 1011 .long _ex_trap_c /* 0x16 - Reserved */ 1012 .long _ex_trap_c /* 0x17 - Reserved */ 1013 .long _ex_trap_c /* 0x18 - Reserved */ 1014 .long _ex_trap_c /* 0x19 - Reserved */ 1015 .long _ex_trap_c /* 0x1A - Reserved */ 1016 .long _ex_trap_c /* 0x1B - Reserved */ 1017 .long _ex_trap_c /* 0x1C - Reserved */ 1018 .long _ex_trap_c /* 0x1D - Reserved */ 1019 .long _ex_trap_c /* 0x1E - Reserved */ 1020 .long _ex_trap_c /* 0x1F - Reserved */ 1021 .long _ex_trap_c /* 0x20 - Reserved */ 1022 .long _ex_trap_c /* 0x21 - Undefined Instruction */ 1023 .long _ex_trap_c /* 0x22 - Illegal Instruction Combination */ 1024 .long _ex_dviol /* 0x23 - Data CPLB Protection Violation */ 1025 .long _ex_trap_c /* 0x24 - Data access misaligned */ 1026 .long _ex_trap_c /* 0x25 - Unrecoverable Event */ 1027 .long _ex_dmiss /* 0x26 - Data CPLB Miss */ 1028 .long _ex_dmult /* 0x27 - Data CPLB Multiple Hits - Linux Trap Zero */ 1029 .long _ex_trap_c /* 0x28 - Emulation Watchpoint */ 1030 .long _ex_trap_c /* 0x29 - Instruction fetch access error (535 only) */ 1031 .long _ex_trap_c /* 0x2A - Instruction fetch misaligned */ 1032 .long _ex_trap_c /* 0x2B - Instruction CPLB protection Violation */ 1033 .long _ex_icplb_miss /* 0x2C - Instruction CPLB miss */ 1034 .long _ex_trap_c /* 0x2D - Instruction CPLB Multiple Hits */ 1035 .long _ex_trap_c /* 0x2E - Illegal use of Supervisor Resource */ 1036 .long _ex_trap_c /* 0x2E - Illegal use of Supervisor Resource */ 1037 .long _ex_trap_c /* 0x2F - Reserved */ 1038 .long _ex_trap_c /* 0x30 - Reserved */ 1039 .long _ex_trap_c /* 0x31 - Reserved */ 1040 .long _ex_trap_c /* 0x32 - Reserved */ 1041 .long _ex_trap_c /* 0x33 - Reserved */ 1042 .long _ex_trap_c /* 0x34 - Reserved */ 1043 .long _ex_trap_c /* 0x35 - Reserved */ 1044 .long _ex_trap_c /* 0x36 - Reserved */ 1045 .long _ex_trap_c /* 0x37 - Reserved */ 1046 .long _ex_trap_c /* 0x38 - Reserved */ 1047 .long _ex_trap_c /* 0x39 - Reserved */ 1048 .long _ex_trap_c /* 0x3A - Reserved */ 1049 .long _ex_trap_c /* 0x3B - Reserved */ 1050 .long _ex_trap_c /* 0x3C - Reserved */ 1051 .long _ex_trap_c /* 0x3D - Reserved */ 1052 .long _ex_trap_c /* 0x3E - Reserved */ 1053 .long _ex_trap_c /* 0x3F - Reserved */ 1054END(_ex_table) 1055 1056ENTRY(_sys_call_table) 1057 .long _sys_restart_syscall /* 0 */ 1058 .long _sys_exit 1059 .long _sys_fork 1060 .long _sys_read 1061 .long _sys_write 1062 .long _sys_open /* 5 */ 1063 .long _sys_close 1064 .long _sys_ni_syscall /* old waitpid */ 1065 .long _sys_creat 1066 .long _sys_link 1067 .long _sys_unlink /* 10 */ 1068 .long _sys_execve 1069 .long _sys_chdir 1070 .long _sys_time 1071 .long _sys_mknod 1072 .long _sys_chmod /* 15 */ 1073 .long _sys_chown /* chown16 */ 1074 .long _sys_ni_syscall /* old break syscall holder */ 1075 .long _sys_ni_syscall /* old stat */ 1076 .long _sys_lseek 1077 .long _sys_getpid /* 20 */ 1078 .long _sys_mount 1079 .long _sys_ni_syscall /* old umount */ 1080 .long _sys_setuid 1081 .long _sys_getuid 1082 .long _sys_stime /* 25 */ 1083 .long _sys_ptrace 1084 .long _sys_alarm 1085 .long _sys_ni_syscall /* old fstat */ 1086 .long _sys_pause 1087 .long _sys_ni_syscall /* old utime */ /* 30 */ 1088 .long _sys_ni_syscall /* old stty syscall holder */ 1089 .long _sys_ni_syscall /* old gtty syscall holder */ 1090 .long _sys_access 1091 .long _sys_nice 1092 .long _sys_ni_syscall /* 35 */ /* old ftime syscall holder */ 1093 .long _sys_sync 1094 .long _sys_kill 1095 .long _sys_rename 1096 .long _sys_mkdir 1097 .long _sys_rmdir /* 40 */ 1098 .long _sys_dup 1099 .long _sys_pipe 1100 .long _sys_times 1101 .long _sys_ni_syscall /* old prof syscall holder */ 1102 .long _sys_brk /* 45 */ 1103 .long _sys_setgid 1104 .long _sys_getgid 1105 .long _sys_ni_syscall /* old sys_signal */ 1106 .long _sys_geteuid /* geteuid16 */ 1107 .long _sys_getegid /* getegid16 */ /* 50 */ 1108 .long _sys_acct 1109 .long _sys_umount /* recycled never used phys() */ 1110 .long _sys_ni_syscall /* old lock syscall holder */ 1111 .long _sys_ioctl 1112 .long _sys_fcntl /* 55 */ 1113 .long _sys_ni_syscall /* old mpx syscall holder */ 1114 .long _sys_setpgid 1115 .long _sys_ni_syscall /* old ulimit syscall holder */ 1116 .long _sys_ni_syscall /* old old uname */ 1117 .long _sys_umask /* 60 */ 1118 .long _sys_chroot 1119 .long _sys_ustat 1120 .long _sys_dup2 1121 .long _sys_getppid 1122 .long _sys_getpgrp /* 65 */ 1123 .long _sys_setsid 1124 .long _sys_ni_syscall /* old sys_sigaction */ 1125 .long _sys_sgetmask 1126 .long _sys_ssetmask 1127 .long _sys_setreuid /* setreuid16 */ /* 70 */ 1128 .long _sys_setregid /* setregid16 */ 1129 .long _sys_ni_syscall /* old sys_sigsuspend */ 1130 .long _sys_ni_syscall /* old sys_sigpending */ 1131 .long _sys_sethostname 1132 .long _sys_setrlimit /* 75 */ 1133 .long _sys_ni_syscall /* old getrlimit */ 1134 .long _sys_getrusage 1135 .long _sys_gettimeofday 1136 .long _sys_settimeofday 1137 .long _sys_getgroups /* getgroups16 */ /* 80 */ 1138 .long _sys_setgroups /* setgroups16 */ 1139 .long _sys_ni_syscall /* old_select */ 1140 .long _sys_symlink 1141 .long _sys_ni_syscall /* old lstat */ 1142 .long _sys_readlink /* 85 */ 1143 .long _sys_uselib 1144 .long _sys_ni_syscall /* sys_swapon */ 1145 .long _sys_reboot 1146 .long _sys_ni_syscall /* old_readdir */ 1147 .long _sys_ni_syscall /* sys_mmap */ /* 90 */ 1148 .long _sys_munmap 1149 .long _sys_truncate 1150 .long _sys_ftruncate 1151 .long _sys_fchmod 1152 .long _sys_fchown /* fchown16 */ /* 95 */ 1153 .long _sys_getpriority 1154 .long _sys_setpriority 1155 .long _sys_ni_syscall /* old profil syscall holder */ 1156 .long _sys_statfs 1157 .long _sys_fstatfs /* 100 */ 1158 .long _sys_ni_syscall 1159 .long _sys_ni_syscall /* old sys_socketcall */ 1160 .long _sys_syslog 1161 .long _sys_setitimer 1162 .long _sys_getitimer /* 105 */ 1163 .long _sys_newstat 1164 .long _sys_newlstat 1165 .long _sys_newfstat 1166 .long _sys_ni_syscall /* old uname */ 1167 .long _sys_ni_syscall /* iopl for i386 */ /* 110 */ 1168 .long _sys_vhangup 1169 .long _sys_ni_syscall /* obsolete idle() syscall */ 1170 .long _sys_ni_syscall /* vm86old for i386 */ 1171 .long _sys_wait4 1172 .long _sys_ni_syscall /* 115 */ /* sys_swapoff */ 1173 .long _sys_sysinfo 1174 .long _sys_ni_syscall /* old sys_ipc */ 1175 .long _sys_fsync 1176 .long _sys_ni_syscall /* old sys_sigreturn */ 1177 .long _sys_clone /* 120 */ 1178 .long _sys_setdomainname 1179 .long _sys_newuname 1180 .long _sys_ni_syscall /* old sys_modify_ldt */ 1181 .long _sys_adjtimex 1182 .long _sys_ni_syscall /* 125 */ /* sys_mprotect */ 1183 .long _sys_ni_syscall /* old sys_sigprocmask */ 1184 .long _sys_ni_syscall /* old "creat_module" */ 1185 .long _sys_init_module 1186 .long _sys_delete_module 1187 .long _sys_ni_syscall /* 130: old "get_kernel_syms" */ 1188 .long _sys_quotactl 1189 .long _sys_getpgid 1190 .long _sys_fchdir 1191 .long _sys_bdflush 1192 .long _sys_ni_syscall /* 135 */ /* sys_sysfs */ 1193 .long _sys_personality 1194 .long _sys_ni_syscall /* for afs_syscall */ 1195 .long _sys_setfsuid /* setfsuid16 */ 1196 .long _sys_setfsgid /* setfsgid16 */ 1197 .long _sys_llseek /* 140 */ 1198 .long _sys_getdents 1199 .long _sys_ni_syscall /* sys_select */ 1200 .long _sys_flock 1201 .long _sys_ni_syscall /* sys_msync */ 1202 .long _sys_readv /* 145 */ 1203 .long _sys_writev 1204 .long _sys_getsid 1205 .long _sys_fdatasync 1206 .long _sys_sysctl 1207 .long _sys_ni_syscall /* 150 */ /* sys_mlock */ 1208 .long _sys_ni_syscall /* sys_munlock */ 1209 .long _sys_ni_syscall /* sys_mlockall */ 1210 .long _sys_ni_syscall /* sys_munlockall */ 1211 .long _sys_sched_setparam 1212 .long _sys_sched_getparam /* 155 */ 1213 .long _sys_sched_setscheduler 1214 .long _sys_sched_getscheduler 1215 .long _sys_sched_yield 1216 .long _sys_sched_get_priority_max 1217 .long _sys_sched_get_priority_min /* 160 */ 1218 .long _sys_sched_rr_get_interval 1219 .long _sys_nanosleep 1220 .long _sys_mremap 1221 .long _sys_setresuid /* setresuid16 */ 1222 .long _sys_getresuid /* getresuid16 */ /* 165 */ 1223 .long _sys_ni_syscall /* for vm86 */ 1224 .long _sys_ni_syscall /* old "query_module" */ 1225 .long _sys_ni_syscall /* sys_poll */ 1226 .long _sys_nfsservctl 1227 .long _sys_setresgid /* setresgid16 */ /* 170 */ 1228 .long _sys_getresgid /* getresgid16 */ 1229 .long _sys_prctl 1230 .long _sys_rt_sigreturn 1231 .long _sys_rt_sigaction 1232 .long _sys_rt_sigprocmask /* 175 */ 1233 .long _sys_rt_sigpending 1234 .long _sys_rt_sigtimedwait 1235 .long _sys_rt_sigqueueinfo 1236 .long _sys_rt_sigsuspend 1237 .long _sys_pread64 /* 180 */ 1238 .long _sys_pwrite64 1239 .long _sys_lchown /* lchown16 */ 1240 .long _sys_getcwd 1241 .long _sys_capget 1242 .long _sys_capset /* 185 */ 1243 .long _sys_sigaltstack 1244 .long _sys_sendfile 1245 .long _sys_ni_syscall /* streams1 */ 1246 .long _sys_ni_syscall /* streams2 */ 1247 .long _sys_vfork /* 190 */ 1248 .long _sys_getrlimit 1249 .long _sys_mmap2 1250 .long _sys_truncate64 1251 .long _sys_ftruncate64 1252 .long _sys_stat64 /* 195 */ 1253 .long _sys_lstat64 1254 .long _sys_fstat64 1255 .long _sys_chown 1256 .long _sys_getuid 1257 .long _sys_getgid /* 200 */ 1258 .long _sys_geteuid 1259 .long _sys_getegid 1260 .long _sys_setreuid 1261 .long _sys_setregid 1262 .long _sys_getgroups /* 205 */ 1263 .long _sys_setgroups 1264 .long _sys_fchown 1265 .long _sys_setresuid 1266 .long _sys_getresuid 1267 .long _sys_setresgid /* 210 */ 1268 .long _sys_getresgid 1269 .long _sys_lchown 1270 .long _sys_setuid 1271 .long _sys_setgid 1272 .long _sys_setfsuid /* 215 */ 1273 .long _sys_setfsgid 1274 .long _sys_pivot_root 1275 .long _sys_ni_syscall /* sys_mincore */ 1276 .long _sys_ni_syscall /* sys_madvise */ 1277 .long _sys_getdents64 /* 220 */ 1278 .long _sys_fcntl64 1279 .long _sys_ni_syscall /* reserved for TUX */ 1280 .long _sys_ni_syscall 1281 .long _sys_gettid 1282 .long _sys_readahead /* 225 */ 1283 .long _sys_setxattr 1284 .long _sys_lsetxattr 1285 .long _sys_fsetxattr 1286 .long _sys_getxattr 1287 .long _sys_lgetxattr /* 230 */ 1288 .long _sys_fgetxattr 1289 .long _sys_listxattr 1290 .long _sys_llistxattr 1291 .long _sys_flistxattr 1292 .long _sys_removexattr /* 235 */ 1293 .long _sys_lremovexattr 1294 .long _sys_fremovexattr 1295 .long _sys_tkill 1296 .long _sys_sendfile64 1297 .long _sys_futex /* 240 */ 1298 .long _sys_sched_setaffinity 1299 .long _sys_sched_getaffinity 1300 .long _sys_ni_syscall /* sys_set_thread_area */ 1301 .long _sys_ni_syscall /* sys_get_thread_area */ 1302 .long _sys_io_setup /* 245 */ 1303 .long _sys_io_destroy 1304 .long _sys_io_getevents 1305 .long _sys_io_submit 1306 .long _sys_io_cancel 1307 .long _sys_ni_syscall /* 250 */ /* sys_alloc_hugepages */ 1308 .long _sys_ni_syscall /* sys_freec_hugepages */ 1309 .long _sys_exit_group 1310 .long _sys_lookup_dcookie 1311 .long _sys_bfin_spinlock 1312 .long _sys_epoll_create /* 255 */ 1313 .long _sys_epoll_ctl 1314 .long _sys_epoll_wait 1315 .long _sys_ni_syscall /* remap_file_pages */ 1316 .long _sys_set_tid_address 1317 .long _sys_timer_create /* 260 */ 1318 .long _sys_timer_settime 1319 .long _sys_timer_gettime 1320 .long _sys_timer_getoverrun 1321 .long _sys_timer_delete 1322 .long _sys_clock_settime /* 265 */ 1323 .long _sys_clock_gettime 1324 .long _sys_clock_getres 1325 .long _sys_clock_nanosleep 1326 .long _sys_statfs64 1327 .long _sys_fstatfs64 /* 270 */ 1328 .long _sys_tgkill 1329 .long _sys_utimes 1330 .long _sys_fadvise64_64 1331 .long _sys_ni_syscall /* vserver */ 1332 .long _sys_ni_syscall /* 275, mbind */ 1333 .long _sys_ni_syscall /* get_mempolicy */ 1334 .long _sys_ni_syscall /* set_mempolicy */ 1335 .long _sys_mq_open 1336 .long _sys_mq_unlink 1337 .long _sys_mq_timedsend /* 280 */ 1338 .long _sys_mq_timedreceive 1339 .long _sys_mq_notify 1340 .long _sys_mq_getsetattr 1341 .long _sys_ni_syscall /* kexec_load */ 1342 .long _sys_waitid /* 285 */ 1343 .long _sys_add_key 1344 .long _sys_request_key 1345 .long _sys_keyctl 1346 .long _sys_ioprio_set 1347 .long _sys_ioprio_get /* 290 */ 1348 .long _sys_inotify_init 1349 .long _sys_inotify_add_watch 1350 .long _sys_inotify_rm_watch 1351 .long _sys_ni_syscall /* migrate_pages */ 1352 .long _sys_openat /* 295 */ 1353 .long _sys_mkdirat 1354 .long _sys_mknodat 1355 .long _sys_fchownat 1356 .long _sys_futimesat 1357 .long _sys_fstatat64 /* 300 */ 1358 .long _sys_unlinkat 1359 .long _sys_renameat 1360 .long _sys_linkat 1361 .long _sys_symlinkat 1362 .long _sys_readlinkat /* 305 */ 1363 .long _sys_fchmodat 1364 .long _sys_faccessat 1365 .long _sys_pselect6 1366 .long _sys_ppoll 1367 .long _sys_unshare /* 310 */ 1368 .long _sys_sram_alloc 1369 .long _sys_sram_free 1370 .long _sys_dma_memcpy 1371 .long _sys_accept 1372 .long _sys_bind /* 315 */ 1373 .long _sys_connect 1374 .long _sys_getpeername 1375 .long _sys_getsockname 1376 .long _sys_getsockopt 1377 .long _sys_listen /* 320 */ 1378 .long _sys_recv 1379 .long _sys_recvfrom 1380 .long _sys_recvmsg 1381 .long _sys_send 1382 .long _sys_sendmsg /* 325 */ 1383 .long _sys_sendto 1384 .long _sys_setsockopt 1385 .long _sys_shutdown 1386 .long _sys_socket 1387 .long _sys_socketpair /* 330 */ 1388 .long _sys_semctl 1389 .long _sys_semget 1390 .long _sys_semop 1391 .long _sys_msgctl 1392 .long _sys_msgget /* 335 */ 1393 .long _sys_msgrcv 1394 .long _sys_msgsnd 1395 .long _sys_shmat 1396 .long _sys_shmctl 1397 .long _sys_shmdt /* 340 */ 1398 .long _sys_shmget 1399 .long _sys_splice 1400 .long _sys_sync_file_range 1401 .long _sys_tee 1402 .long _sys_vmsplice /* 345 */ 1403 .long _sys_epoll_pwait 1404 .long _sys_utimensat 1405 .long _sys_signalfd 1406 .long _sys_timerfd_create 1407 .long _sys_eventfd /* 350 */ 1408 .long _sys_pread64 1409 .long _sys_pwrite64 1410 .long _sys_fadvise64 1411 .long _sys_set_robust_list 1412 .long _sys_get_robust_list /* 355 */ 1413 .long _sys_fallocate 1414 .long _sys_semtimedop 1415 .long _sys_timerfd_settime 1416 .long _sys_timerfd_gettime 1417 1418 .rept NR_syscalls-(.-_sys_call_table)/4 1419 .long _sys_ni_syscall 1420 .endr 1421 1422 /* 1423 * Used to save the real RETX, IMASK and SYSCFG when temporarily 1424 * storing safe values across the transition from exception to IRQ5. 1425 */ 1426_excpt_saved_stuff: 1427 .long 0; 1428 .long 0; 1429 .long 0; 1430 1431_exception_stack: 1432 .rept 1024 1433 .long 0; 1434 .endr 1435_exception_stack_top: 1436 1437#if ANOMALY_05000261 1438/* Used by the assembly entry point to work around an anomaly. */ 1439_last_cplb_fault_retx: 1440 .long 0; 1441#endif 1442