1 /* !! 1 /* -*- mode: asm -*- 2 * Low-level system-call handling, trap handle << 3 * 2 * 4 * Copyright (C) 2008-2009 Michal Simek <monstr !! 3 * linux/arch/m68k/kernel/entry.S 5 * Copyright (C) 2008-2009 PetaLogix << 6 * Copyright (C) 2003 John Williams < << 7 * Copyright (C) 2001,2002 NEC Corporatio << 8 * Copyright (C) 2001,2002 Miles Bader <mi << 9 * 4 * 10 * This file is subject to the terms and condi !! 5 * Copyright (C) 1991, 1992 Linus Torvalds 11 * Public License. See the file COPYING in the << 12 * archive for more details. << 13 * 6 * 14 * Written by Miles Bader <miles@gnu.org> !! 7 * This file is subject to the terms and conditions of the GNU General Public 15 * Heavily modified by John Williams for Micro !! 8 * License. See the file README.legal in the main directory of this archive 16 */ !! 9 * for more details. 17 << 18 #include <linux/sys.h> << 19 #include <linux/linkage.h> << 20 << 21 #include <asm/entry.h> << 22 #include <asm/current.h> << 23 #include <asm/processor.h> << 24 #include <asm/exceptions.h> << 25 #include <asm/asm-offsets.h> << 26 #include <asm/thread_info.h> << 27 << 28 #include <asm/page.h> << 29 #include <asm/unistd.h> << 30 #include <asm/xilinx_mb_manager.h> << 31 << 32 #include <linux/errno.h> << 33 #include <asm/signal.h> << 34 #include <asm/mmu.h> << 35 << 36 #undef DEBUG << 37 << 38 #ifdef DEBUG << 39 /* Create space for syscalls counting. */ << 40 .section .data << 41 .global syscall_debug_table << 42 .align 4 << 43 syscall_debug_table: << 44 .space (__NR_syscalls * 4) << 45 #endif /* DEBUG */ << 46 << 47 #define C_ENTRY(name) .globl name; .align 4; << 48 << 49 /* << 50 * Various ways of setting and clearing BIP in << 51 * This is mucky, but necessary using microbla << 52 * allows msr ops to write to BIP << 53 */ << 54 #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR << 55 .macro clear_bip << 56 msrclr r0, MSR_BIP << 57 .endm << 58 << 59 .macro set_bip << 60 msrset r0, MSR_BIP << 61 .endm << 62 << 63 .macro clear_eip << 64 msrclr r0, MSR_EIP << 65 .endm << 66 << 67 .macro set_ee << 68 msrset r0, MSR_EE << 69 .endm << 70 << 71 .macro disable_irq << 72 msrclr r0, MSR_IE << 73 .endm << 74 << 75 .macro enable_irq << 76 msrset r0, MSR_IE << 77 .endm << 78 << 79 .macro set_ums << 80 msrset r0, MSR_UMS << 81 msrclr r0, MSR_VMS << 82 .endm << 83 << 84 .macro set_vms << 85 msrclr r0, MSR_UMS << 86 msrset r0, MSR_VMS << 87 .endm << 88 << 89 .macro clear_ums << 90 msrclr r0, MSR_UMS << 91 .endm << 92 << 93 .macro clear_vms_ums << 94 msrclr r0, MSR_VMS | MSR_UMS << 95 .endm << 96 #else << 97 .macro clear_bip << 98 mfs r11, rmsr << 99 andi r11, r11, ~MSR_BIP << 100 mts rmsr, r11 << 101 .endm << 102 << 103 .macro set_bip << 104 mfs r11, rmsr << 105 ori r11, r11, MSR_BIP << 106 mts rmsr, r11 << 107 .endm << 108 << 109 .macro clear_eip << 110 mfs r11, rmsr << 111 andi r11, r11, ~MSR_EIP << 112 mts rmsr, r11 << 113 .endm << 114 << 115 .macro set_ee << 116 mfs r11, rmsr << 117 ori r11, r11, MSR_EE << 118 mts rmsr, r11 << 119 .endm << 120 << 121 .macro disable_irq << 122 mfs r11, rmsr << 123 andi r11, r11, ~MSR_IE << 124 mts rmsr, r11 << 125 .endm << 126 << 127 .macro enable_irq << 128 mfs r11, rmsr << 129 ori r11, r11, MSR_IE << 130 mts rmsr, r11 << 131 .endm << 132 << 133 .macro set_ums << 134 mfs r11, rmsr << 135 ori r11, r11, MSR_VMS << 136 andni r11, r11, MSR_UMS << 137 mts rmsr, r11 << 138 .endm << 139 << 140 .macro set_vms << 141 mfs r11, rmsr << 142 ori r11, r11, MSR_VMS << 143 andni r11, r11, MSR_UMS << 144 mts rmsr, r11 << 145 .endm << 146 << 147 .macro clear_ums << 148 mfs r11, rmsr << 149 andni r11, r11, MSR_UMS << 150 mts rmsr,r11 << 151 .endm << 152 << 153 .macro clear_vms_ums << 154 mfs r11, rmsr << 155 andni r11, r11, (MSR_VMS|MSR_UMS) << 156 mts rmsr,r11 << 157 .endm << 158 #endif << 159 << 160 /* Define how to call high-level functions. Wi << 161 * enabled when calling the high-level functio << 162 * VM_ON, VM_OFF, DO_JUMP_BIPCLR, DO_CALL << 163 */ << 164 << 165 /* turn on virtual protected mode save */ << 166 #define VM_ON \ << 167 set_ums; \ << 168 rted r0, 2f; \ << 169 nop; \ << 170 2: << 171 << 172 /* turn off virtual protected mode save and us << 173 #define VM_OFF \ << 174 clear_vms_ums; \ << 175 rted r0, TOPHYS(1f); \ << 176 nop; \ << 177 1: << 178 << 179 #define SAVE_REGS \ << 180 swi r2, r1, PT_R2; /* Save SDA */ << 181 swi r3, r1, PT_R3; << 182 swi r4, r1, PT_R4; << 183 swi r5, r1, PT_R5; << 184 swi r6, r1, PT_R6; << 185 swi r7, r1, PT_R7; << 186 swi r8, r1, PT_R8; << 187 swi r9, r1, PT_R9; << 188 swi r10, r1, PT_R10; << 189 swi r11, r1, PT_R11; /* sav << 190 swi r12, r1, PT_R12; << 191 swi r13, r1, PT_R13; /* Sav << 192 swi r14, r1, PT_PC; /* PC, before << 193 swi r15, r1, PT_R15; /* Sav << 194 swi r16, r1, PT_R16; << 195 swi r17, r1, PT_R17; << 196 swi r18, r1, PT_R18; /* Sav << 197 swi r19, r1, PT_R19; << 198 swi r20, r1, PT_R20; << 199 swi r21, r1, PT_R21; << 200 swi r22, r1, PT_R22; << 201 swi r23, r1, PT_R23; << 202 swi r24, r1, PT_R24; << 203 swi r25, r1, PT_R25; << 204 swi r26, r1, PT_R26; << 205 swi r27, r1, PT_R27; << 206 swi r28, r1, PT_R28; << 207 swi r29, r1, PT_R29; << 208 swi r30, r1, PT_R30; << 209 swi r31, r1, PT_R31; /* Sav << 210 mfs r11, rmsr; /* sav << 211 swi r11, r1, PT_MSR; << 212 << 213 #define RESTORE_REGS_GP \ << 214 lwi r2, r1, PT_R2; /* restore SDA << 215 lwi r3, r1, PT_R3; << 216 lwi r4, r1, PT_R4; << 217 lwi r5, r1, PT_R5; << 218 lwi r6, r1, PT_R6; << 219 lwi r7, r1, PT_R7; << 220 lwi r8, r1, PT_R8; << 221 lwi r9, r1, PT_R9; << 222 lwi r10, r1, PT_R10; << 223 lwi r11, r1, PT_R11; /* res << 224 lwi r12, r1, PT_R12; << 225 lwi r13, r1, PT_R13; /* res << 226 lwi r14, r1, PT_PC; /* RESTORE_LIN << 227 lwi r15, r1, PT_R15; /* res << 228 lwi r16, r1, PT_R16; << 229 lwi r17, r1, PT_R17; << 230 lwi r18, r1, PT_R18; /* res << 231 lwi r19, r1, PT_R19; << 232 lwi r20, r1, PT_R20; << 233 lwi r21, r1, PT_R21; << 234 lwi r22, r1, PT_R22; << 235 lwi r23, r1, PT_R23; << 236 lwi r24, r1, PT_R24; << 237 lwi r25, r1, PT_R25; << 238 lwi r26, r1, PT_R26; << 239 lwi r27, r1, PT_R27; << 240 lwi r28, r1, PT_R28; << 241 lwi r29, r1, PT_R29; << 242 lwi r30, r1, PT_R30; << 243 lwi r31, r1, PT_R31; /* Res << 244 << 245 #define RESTORE_REGS \ << 246 lwi r11, r1, PT_MSR; << 247 mts rmsr , r11; << 248 RESTORE_REGS_GP << 249 << 250 #define RESTORE_REGS_RTBD \ << 251 lwi r11, r1, PT_MSR; << 252 andni r11, r11, MSR_EIP; /* << 253 ori r11, r11, MSR_EE | MSR_BIP; /* << 254 mts rmsr , r11; << 255 RESTORE_REGS_GP << 256 << 257 #define SAVE_STATE \ << 258 swi r1, r0, TOPHYS(PER_CPU(ENTRY_S << 259 /* See if already in kernel mode.*/ << 260 mfs r1, rmsr; << 261 andi r1, r1, MSR_UMS; << 262 bnei r1, 1f; << 263 /* Kernel-mode state save. */ << 264 /* Reload kernel stack-ptr. */ << 265 lwi r1, r0, TOPHYS(PER_CPU(ENTRY_S << 266 /* FIXME: I can add these two lines to << 267 /* tophys(r1,r1); */ << 268 /* addik r1, r1, -PT_SIZE; */ << 269 addik r1, r1, CONFIG_KERNEL_BASE_ADD << 270 SAVE_REGS << 271 brid 2f; << 272 swi r1, r1, PT_MODE; << 273 1: /* User-mode state save. */ << 274 lwi r1, r0, TOPHYS(PER_CPU(CURRENT << 275 tophys(r1,r1); << 276 lwi r1, r1, TS_THREAD_INFO; /* get << 277 /* MS these three instructions can be << 278 /* addik r1, r1, THREAD_SIZE; * << 279 /* tophys(r1,r1); */ << 280 /* addik r1, r1, -PT_SIZE; */ << 281 addik r1, r1, THREAD_SIZE + CONFIG_KER << 282 SAVE_REGS << 283 lwi r11, r0, TOPHYS(PER_CPU(ENTRY_ << 284 swi r11, r1, PT_R1; /* Store user << 285 swi r0, r1, PT_MODE; /* Was in use << 286 /* MS: I am clearing UMS even in case << 287 clear_ums; << 288 2: lwi CURRENT_TASK, r0, TOPHYS(PER_C << 289 << 290 .text << 291 << 292 .extern cpuinfo << 293 << 294 C_ENTRY(mb_flush_dcache): << 295 addik r1, r1, -PT_SIZE << 296 SAVE_REGS << 297 << 298 addik r3, r0, cpuinfo << 299 lwi r7, r3, CI_DCS << 300 lwi r8, r3, CI_DCL << 301 sub r9, r7, r8 << 302 1: << 303 wdc.flush r9, r0 << 304 bgtid r9, 1b << 305 addk r9, r9, r8 << 306 << 307 RESTORE_REGS << 308 addik r1, r1, PT_SIZE << 309 rtsd r15, 8 << 310 nop << 311 << 312 C_ENTRY(mb_invalidate_icache): << 313 addik r1, r1, -PT_SIZE << 314 SAVE_REGS << 315 << 316 addik r3, r0, cpuinfo << 317 lwi r7, r3, CI_ICS << 318 lwi r8, r3, CI_ICL << 319 sub r9, r7, r8 << 320 1: << 321 wic r9, r0 << 322 bgtid r9, 1b << 323 addk r9, r9, r8 << 324 << 325 RESTORE_REGS << 326 addik r1, r1, PT_SIZE << 327 rtsd r15, 8 << 328 nop << 329 << 330 /* << 331 * User trap. << 332 * 10 * 333 * System calls are handled here. !! 11 * Linux/m68k support by Hamish Macdonald 334 * 12 * 335 * Syscall protocol: !! 13 * 68060 fixes by Jesper Skov 336 * Syscall number in r12, args in r5-r10 << 337 * Return value in r3 << 338 * 14 * 339 * Trap entered via brki instruction, so BIP b << 340 * are masked. This is nice, means we don't ha << 341 */ 15 */ 342 C_ENTRY(_user_exception): << 343 swi r1, r0, TOPHYS(PER_CPU(ENTRY_S << 344 addi r14, r14, 4 /* return addr << 345 << 346 lwi r1, r0, TOPHYS(PER_CPU(CURRENT << 347 tophys(r1,r1); << 348 lwi r1, r1, TS_THREAD_INFO; /* get << 349 /* calculate kernel stack pointer from task st << 350 addik r1, r1, THREAD_SIZE; << 351 tophys(r1,r1); << 352 << 353 addik r1, r1, -PT_SIZE; /* Make room << 354 SAVE_REGS << 355 swi r0, r1, PT_R3 << 356 swi r0, r1, PT_R4 << 357 << 358 swi r0, r1, PT_MODE; << 359 lwi r11, r0, TOPHYS(PER_CPU(ENTRY_ << 360 swi r11, r1, PT_R1; /* Sto << 361 clear_ums; << 362 2: lwi CURRENT_TASK, r0, TOPHYS(PER_C << 363 /* Save away the syscall number. */ << 364 swi r12, r1, PT_R0; << 365 tovirt(r1,r1) << 366 << 367 /* where the trap should return need -8 to adj << 368 /* Jump to the appropriate function for the sy << 369 * (r12 is not preserved), or return an error << 370 * register should point to the location where << 371 * the called function should return. [note t << 372 << 373 /* Step into virtual mode */ << 374 rtbd r0, 3f << 375 nop << 376 3: << 377 lwi r11, CURRENT_TASK, TS_THREAD_I << 378 lwi r11, r11, TI_FLAGS /* ge << 379 andi r11, r11, _TIF_WORK_SYSCALL_MA << 380 beqi r11, 4f << 381 << 382 addik r3, r0, -ENOSYS << 383 swi r3, r1, PT_R3 << 384 brlid r15, do_syscall_trace_enter << 385 addik r5, r1, PT_R0 << 386 << 387 # do_syscall_trace_enter returns the n << 388 addk r12, r0, r3 << 389 lwi r5, r1, PT_R5; << 390 lwi r6, r1, PT_R6; << 391 lwi r7, r1, PT_R7; << 392 lwi r8, r1, PT_R8; << 393 lwi r9, r1, PT_R9; << 394 lwi r10, r1, PT_R10; << 395 4: << 396 /* Jump to the appropriate function for the sy << 397 * (r12 is not preserved), or return an error << 398 * The LP register should point to the locatio << 399 * should return. [note that MAKE_SYS_CALL us << 400 /* See if the system call number is va << 401 blti r12, 5f << 402 addi r11, r12, -__NR_syscalls; << 403 bgei r11, 5f; << 404 /* Figure out which function to use fo << 405 /* Note Microblaze barrel shift is opt << 406 add r12, r12, r12; << 407 add r12, r12, r12; << 408 addi r30, r0, 1 << 409 << 410 #ifdef DEBUG << 411 /* Trac syscalls and stored them to sy << 412 /* The first syscall location stores t << 413 lwi r3, r0, syscall_debug_table << 414 addi r3, r3, 1 << 415 swi r3, r0, syscall_debug_table << 416 lwi r3, r12, syscall_debug_table << 417 addi r3, r3, 1 << 418 swi r3, r12, syscall_debug_table << 419 #endif << 420 << 421 # Find and jump into the syscall handl << 422 lwi r12, r12, sys_call_table << 423 /* where the trap should return need - << 424 addi r15, r0, ret_from_trap-8 << 425 bra r12 << 426 << 427 /* The syscall number is invalid, retu << 428 5: << 429 braid ret_from_trap << 430 addi r3, r0, -ENOSYS; << 431 << 432 /* Entry point used to return from a syscall/t << 433 /* We re-enable BIP bit before state restore * << 434 C_ENTRY(ret_from_trap): << 435 swi r3, r1, PT_R3 << 436 swi r4, r1, PT_R4 << 437 << 438 lwi r11, r1, PT_MODE; << 439 /* See if returning to kernel mode, if so, ski << 440 bnei r11, 2f; << 441 /* We're returning to user mode, so ch << 442 * trigger rescheduling. */ << 443 /* FIXME: Restructure all these flag c << 444 lwi r11, CURRENT_TASK, TS_THREAD_I << 445 lwi r11, r11, TI_FLAGS; << 446 andi r11, r11, _TIF_WORK_SYSCALL_MA << 447 beqi r11, 1f << 448 << 449 brlid r15, do_syscall_trace_leave << 450 addik r5, r1, PT_R0 << 451 1: << 452 /* We're returning to user mode, so ch << 453 * trigger rescheduling. */ << 454 /* get thread info from current task * << 455 lwi r11, CURRENT_TASK, TS_THREAD_I << 456 lwi r19, r11, TI_FLAGS; << 457 andi r11, r19, _TIF_NEED_RESCHED; << 458 beqi r11, 5f; << 459 << 460 bralid r15, schedule; /* Call schedu << 461 nop; /* del << 462 bri 1b << 463 << 464 /* Maybe handle a signal */ << 465 5: << 466 andi r11, r19, _TIF_SIGPENDING | _T << 467 beqi r11, 4f; /* Sig << 468 << 469 addik r5, r1, 0; /* Arg << 470 bralid r15, do_notify_resume; /* Han << 471 add r6, r30, r0; /* Arg << 472 add r30, r0, r0 /* no << 473 bri 1b << 474 << 475 /* Finally, return to user state. */ << 476 4: set_bip; /* In << 477 swi CURRENT_TASK, r0, PER_CPU(CURR << 478 VM_OFF; << 479 tophys(r1,r1); << 480 RESTORE_REGS_RTBD; << 481 addik r1, r1, PT_SIZE /* Cle << 482 lwi r1, r1, PT_R1 - PT_SIZE;/* Res << 483 bri 6f; << 484 << 485 /* Return to kernel state. */ << 486 2: set_bip; /* In << 487 VM_OFF; << 488 tophys(r1,r1); << 489 RESTORE_REGS_RTBD; << 490 addik r1, r1, PT_SIZE /* Cle << 491 tovirt(r1,r1); << 492 6: << 493 TRAP_return: /* Make global symbol << 494 rtbd r14, 0; /* Instructions to ret << 495 nop; << 496 << 497 << 498 /* This the initial entry point for a new chil << 499 stack in place that makes it look like the << 500 syscall. This function is actually `return << 501 (copy_thread makes ret_from_fork the return << 502 saved context). */ << 503 C_ENTRY(ret_from_fork): << 504 bralid r15, schedule_tail; /* ...whic << 505 add r5, r3, r0; /* switch_thre << 506 /* ( in the de << 507 brid ret_from_trap; /* Do normal t << 508 add r3, r0, r0; /* Child's for << 509 << 510 C_ENTRY(ret_from_kernel_thread): << 511 bralid r15, schedule_tail; /* ...whic << 512 add r5, r3, r0; /* switch_thre << 513 /* ( in the de << 514 brald r15, r20 /* fn was left << 515 addk r5, r0, r19 /* ... and arg << 516 brid ret_from_trap << 517 add r3, r0, r0 << 518 << 519 C_ENTRY(sys_rt_sigreturn_wrapper): << 520 addik r30, r0, 0 /* no << 521 brid sys_rt_sigreturn /* Do << 522 addik r5, r1, 0; /* add << 523 16 524 /* 17 /* 525 * HW EXCEPTION rutine start !! 18 * entry.S contains the system-call and fault low-level handling routines. 526 */ !! 19 * This also contains the timer-interrupt handler, as well as all interrupts 527 C_ENTRY(full_exception_trap): !! 20 * and faults that can result in a task-switch. 528 /* adjust exception address for privil << 529 * for finding where is it */ << 530 addik r17, r17, -4 << 531 SAVE_STATE /* Save registers */ << 532 /* PC, before IRQ/trap - this is one i << 533 swi r17, r1, PT_PC; << 534 tovirt(r1,r1) << 535 /* FIXME this can be store directly in << 536 * I tested it but there is a fault */ << 537 /* where the trap should return need - << 538 addik r15, r0, ret_from_exc - 8 << 539 mfs r6, resr << 540 mfs r7, rfsr; /* sav << 541 mts rfsr, r0; /* Clear stick << 542 rted r0, full_exception << 543 addik r5, r1, 0 /* pa << 544 << 545 /* << 546 * Unaligned data trap. << 547 * 21 * 548 * Unaligned data trap last on 4k page is hand !! 22 * NOTE: This code handles signal-recognition, which happens every time >> 23 * after a timer-interrupt and after each system call. 549 * 24 * 550 * Trap entered via exception, so EE bit is se << 551 * are masked. This is nice, means we don't h << 552 * << 553 * The assembler routine is in "arch/microblaz << 554 */ 25 */ 555 C_ENTRY(unaligned_data_trap): << 556 /* MS: I have to save r11 value and th << 557 * set_bit, clear_eip, set_ee use r11 << 558 * instructions are not used. We don't << 559 * are used and they use r0 instead of << 560 * I am using ENTRY_SP which should be << 561 * pointer saving. */ << 562 swi r11, r0, TOPHYS(PER_CPU(ENTRY_ << 563 set_bip; /* equalize initial st << 564 clear_eip; << 565 set_ee; << 566 lwi r11, r0, TOPHYS(PER_CPU(ENTRY_ << 567 SAVE_STATE /* Save regist << 568 /* PC, before IRQ/trap - this is one i << 569 swi r17, r1, PT_PC; << 570 tovirt(r1,r1) << 571 /* where the trap should return need - << 572 addik r15, r0, ret_from_exc-8 << 573 mfs r3, resr /* ESR << 574 mfs r4, rear /* EAR << 575 rtbd r0, _unaligned_data_exception << 576 addik r7, r1, 0 /* par << 577 26 578 /* 27 /* 579 * Page fault traps. !! 28 * 12/03/96 Jes: Currently we only support m68k single-cpu systems, so 580 * !! 29 * all pointers that used to be 'current' are now entry 581 * If the real exception handler (from hw_exce !! 30 * number 0 in the 'current_set' list. 582 * the mapping for the process, then we're thr << 583 * << 584 * Trap entered via exceptions, so EE bit is s << 585 * are masked. This is nice, means we don't h << 586 * 31 * 587 * Build a standard exception frame for TLB Ac !! 32 * 6/05/00 RZ: addedd writeback completion after return from sighandler 588 * will bail out to this point if they can't r !! 33 * for 68040 589 * << 590 * The C function called is in "arch/microblaz << 591 * void do_page_fault(struct pt_regs *regs, << 592 * unsigned long << 593 * unsigned long << 594 */ 34 */ 595 /* data and intruction trap - which is choose << 596 C_ENTRY(page_fault_data_trap): << 597 SAVE_STATE /* Save regist << 598 /* PC, before IRQ/trap - this is one i << 599 swi r17, r1, PT_PC; << 600 tovirt(r1,r1) << 601 /* where the trap should return need - << 602 addik r15, r0, ret_from_exc-8 << 603 mfs r6, rear /* par << 604 mfs r7, resr /* par << 605 rted r0, do_page_fault << 606 addik r5, r1, 0 /* par << 607 << 608 C_ENTRY(page_fault_instr_trap): << 609 SAVE_STATE /* Save regist << 610 /* PC, before IRQ/trap - this is one i << 611 swi r17, r1, PT_PC; << 612 tovirt(r1,r1) << 613 /* where the trap should return need - << 614 addik r15, r0, ret_from_exc-8 << 615 mfs r6, rear /* par << 616 ori r7, r0, 0 /* par << 617 rted r0, do_page_fault << 618 addik r5, r1, 0 /* par << 619 << 620 /* Entry point used to return from an exceptio << 621 C_ENTRY(ret_from_exc): << 622 lwi r11, r1, PT_MODE; << 623 bnei r11, 2f; /* See << 624 /* ... << 625 << 626 /* We're returning to user mode, so ch << 627 trigger rescheduling. */ << 628 1: << 629 lwi r11, CURRENT_TASK, TS_THREAD_I << 630 lwi r19, r11, TI_FLAGS; /* get << 631 andi r11, r19, _TIF_NEED_RESCHED; << 632 beqi r11, 5f; << 633 << 634 /* Call the scheduler before returning from a << 635 bralid r15, schedule; /* Call schedu << 636 nop; /* del << 637 bri 1b << 638 << 639 /* Maybe handle a signal */ << 640 5: andi r11, r19, _TIF_SIGPENDING | _T << 641 beqi r11, 4f; /* Sig << 642 35 643 /* !! 36 #include <linux/sys.h> 644 * Handle a signal return; Pending sig !! 37 #include <linux/config.h> 645 * !! 38 #include <linux/linkage.h> 646 * Not all registers are saved by the !! 39 #include <asm/entry.h> 647 * points (for instance, call-saved re !! 40 #include <asm/errno.h> 648 * C-compiler calling sequence in the !! 41 #include <asm/setup.h> 649 * preserved), and call-clobbered regi !! 42 #include <asm/segment.h> 650 * traps), but signal handlers may wan !! 43 #include <asm/traps.h> 651 * complete register state. Here we s !! 44 652 * the normal entry sequence, so that !! 45 #include "m68k_defs.h" 653 * (in a possibly modified form) after !! 46 654 addik r5, r1, 0; /* Arg !! 47 .globl SYMBOL_NAME(system_call), SYMBOL_NAME(buserr), SYMBOL_NAME(trap) 655 bralid r15, do_notify_resume; /* Han !! 48 .globl SYMBOL_NAME(resume), SYMBOL_NAME(ret_from_exception) 656 addi r6, r0, 0; /* Arg !! 49 .globl SYMBOL_NAME(ret_from_signal) 657 bri 1b !! 50 .globl SYMBOL_NAME(inthandler), SYMBOL_NAME(sys_call_table) 658 !! 51 .globl SYMBOL_NAME(sys_fork), SYMBOL_NAME(sys_clone), SYMBOL_NAME(sys_vfork) 659 /* Finally, return to user state. */ !! 52 .globl SYMBOL_NAME(ret_from_interrupt), SYMBOL_NAME(bad_interrupt) 660 4: set_bip; /* Int << 661 swi CURRENT_TASK, r0, PER_CPU(CURR << 662 VM_OFF; << 663 tophys(r1,r1); << 664 << 665 RESTORE_REGS_RTBD; << 666 addik r1, r1, PT_SIZE /* Cle << 667 << 668 lwi r1, r1, PT_R1 - PT_SIZE; /* Re << 669 bri 6f; << 670 /* Return to kernel state. */ << 671 2: set_bip; /* Int << 672 VM_OFF; << 673 tophys(r1,r1); << 674 RESTORE_REGS_RTBD; << 675 addik r1, r1, PT_SIZE /* Cle << 676 << 677 tovirt(r1,r1); << 678 6: << 679 EXC_return: /* Make global symbol << 680 rtbd r14, 0; /* Instructions to ret << 681 nop; << 682 53 683 /* !! 54 .text 684 * HW EXCEPTION rutine end !! 55 ENTRY(buserr) 685 */ !! 56 SAVE_ALL_INT >> 57 GET_CURRENT(%d0) >> 58 movel %sp,%sp@- | stack frame pointer argument >> 59 bsrl SYMBOL_NAME(buserr_c) >> 60 addql #4,%sp >> 61 jra SYMBOL_NAME(ret_from_exception) >> 62 >> 63 ENTRY(trap) >> 64 SAVE_ALL_INT >> 65 GET_CURRENT(%d0) >> 66 movel %sp,%sp@- | stack frame pointer argument >> 67 bsrl SYMBOL_NAME(trap_c) >> 68 addql #4,%sp >> 69 jra SYMBOL_NAME(ret_from_exception) >> 70 >> 71 ENTRY(reschedule) >> 72 | save top of frame >> 73 movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) >> 74 >> 75 pea SYMBOL_NAME(ret_from_exception) >> 76 jmp SYMBOL_NAME(schedule) >> 77 >> 78 | After a fork we jump here directly from resume, >> 79 | so that %d1 contains the previous task >> 80 | Theoretically only needed on SMP, but let's watch >> 81 | what happens in schedule_tail() in future... >> 82 ENTRY(ret_from_fork) >> 83 movel %d1,%sp@- >> 84 jsr SYMBOL_NAME(schedule_tail) >> 85 addql #4,%sp >> 86 jra SYMBOL_NAME(ret_from_exception) >> 87 >> 88 badsys: >> 89 movel #-ENOSYS,%sp@(PT_D0) >> 90 jra SYMBOL_NAME(ret_from_exception) >> 91 >> 92 do_trace: >> 93 movel #-ENOSYS,%sp@(PT_D0) | needed for strace >> 94 subql #4,%sp >> 95 SAVE_SWITCH_STACK >> 96 jbsr SYMBOL_NAME(syscall_trace) >> 97 RESTORE_SWITCH_STACK >> 98 addql #4,%sp >> 99 movel %sp@(PT_ORIG_D0),%d1 >> 100 movel #-ENOSYS,%d0 >> 101 cmpl #NR_syscalls,%d1 >> 102 jcc 1f >> 103 jbsr @(SYMBOL_NAME(sys_call_table),%d1:l:4)@(0) >> 104 1: movel %d0,%sp@(PT_D0) | save the return value >> 105 subql #4,%sp | dummy return address >> 106 SAVE_SWITCH_STACK >> 107 jbsr SYMBOL_NAME(syscall_trace) >> 108 >> 109 SYMBOL_NAME_LABEL(ret_from_signal) >> 110 RESTORE_SWITCH_STACK >> 111 addql #4,%sp >> 112 /* on 68040 complete pending writebacks if any */ >> 113 #ifdef CONFIG_M68040 >> 114 bfextu %sp@(PT_VECTOR){#0,#4},%d0 >> 115 subql #7,%d0 | bus error frame ? >> 116 jbne 1f >> 117 movel %sp,%sp@- >> 118 jbsr SYMBOL_NAME(berr_040cleanup) >> 119 addql #4,%sp >> 120 1: >> 121 #endif >> 122 jra SYMBOL_NAME(ret_from_exception) >> 123 >> 124 ENTRY(system_call) >> 125 SAVE_ALL_SYS >> 126 >> 127 GET_CURRENT(%d1) >> 128 | save top of frame >> 129 movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) >> 130 >> 131 btst #PT_TRACESYS_BIT,%curptr@(TASK_PTRACE+PT_TRACESYS_OFF) >> 132 jne do_trace >> 133 cmpl #NR_syscalls,%d0 >> 134 jcc badsys >> 135 jbsr @(SYMBOL_NAME(sys_call_table),%d0:l:4)@(0) >> 136 movel %d0,%sp@(PT_D0) | save the return value >> 137 >> 138 SYMBOL_NAME_LABEL(ret_from_exception) >> 139 btst #5,%sp@(PT_SR) | check if returning to kernel >> 140 bnes 2f | if so, skip resched, signals >> 141 | only allow interrupts when we are really the last one on the >> 142 | kernel stack, otherwise stack overflow can occur during >> 143 | heavy interrupt load >> 144 andw #ALLOWINT,%sr >> 145 tstl %curptr@(TASK_NEEDRESCHED) >> 146 jne SYMBOL_NAME(reschedule) >> 147 #if 0 >> 148 cmpl #SYMBOL_NAME(task),%curptr | task[0] cannot have signals >> 149 jeq 2f >> 150 #endif >> 151 | check for delayed trace >> 152 bclr #PT_DTRACE_BIT,%curptr@(TASK_PTRACE+PT_DTRACE_OFF) >> 153 jne do_delayed_trace >> 154 5: >> 155 tstl %curptr@(TASK_STATE) | state >> 156 jne SYMBOL_NAME(reschedule) 686 157 687 /* !! 158 tstl %curptr@(TASK_SIGPENDING) 688 * Hardware maskable interrupts. !! 159 jne Lsignal_return 689 * !! 160 2: RESTORE_ALL 690 * The stack-pointer (r1) should have already !! 161 691 * location PER_CPU(ENTRY_SP). !! 162 Lsignal_return: 692 */ !! 163 subql #4,%sp | dummy return address 693 C_ENTRY(_interrupt): !! 164 SAVE_SWITCH_STACK 694 /* MS: we are in physical address */ !! 165 pea %sp@(SWITCH_STACK_SIZE) 695 /* Save registers, switch to proper stack, con !! 166 clrl %sp@- 696 swi r1, r0, TOPHYS(PER_CPU(ENTRY_S !! 167 bsrl SYMBOL_NAME(do_signal) 697 /* MS: See if already in kernel mode. !! 168 addql #8,%sp 698 mfs r1, rmsr !! 169 RESTORE_SWITCH_STACK 699 nop !! 170 addql #4,%sp 700 andi r1, r1, MSR_UMS !! 171 RESTORE_ALL 701 bnei r1, 1f !! 172 702 !! 173 do_delayed_trace: 703 /* Kernel-mode state save. */ !! 174 bclr #7,%sp@(PT_SR) | clear trace bit in SR 704 lwi r1, r0, TOPHYS(PER_CPU(ENTRY_S !! 175 pea 1 | send SIGTRAP 705 tophys(r1,r1); /* MS: I have in r1 phy !! 176 movel %curptr,%sp@- 706 /* save registers */ !! 177 pea LSIGTRAP 707 /* MS: Make room on the stack -> activation re !! 178 jbsr SYMBOL_NAME(send_sig) 708 addik r1, r1, -PT_SIZE; !! 179 addql #8,%sp 709 SAVE_REGS !! 180 addql #4,%sp 710 brid 2f; !! 181 jra 5b 711 swi r1, r1, PT_MODE; /* 0 - user m !! 182 >> 183 >> 184 #if 0 >> 185 #if CONFIG_AMIGA >> 186 SYMBOL_NAME_LABEL(ami_inthandler) >> 187 addql #1,SYMBOL_NAME(irq_stat)+4 | local_irq_count >> 188 SAVE_ALL_INT >> 189 GET_CURRENT(%d0) >> 190 >> 191 bfextu %sp@(PT_VECTOR){#4,#12},%d0 >> 192 movel %d0,%a0 >> 193 addql #1,%a0@(SYMBOL_NAME(kstat)+STAT_IRQ-VECOFF(VEC_SPUR)) >> 194 movel %a0@(SYMBOL_NAME(autoirq_list)-VECOFF(VEC_SPUR)),%a0 >> 195 >> 196 | amiga vector int handler get the req mask instead of irq vector >> 197 lea CUSTOMBASE,%a1 >> 198 movew %a1@(C_INTREQR),%d0 >> 199 andw %a1@(C_INTENAR),%d0 >> 200 >> 201 | prepare stack (push frame pointer, dev_id & req mask) >> 202 pea %sp@ >> 203 movel %a0@(IRQ_DEVID),%sp@- >> 204 movel %d0,%sp@- >> 205 pea %pc@(SYMBOL_NAME(ret_from_interrupt):w) >> 206 jbra @(IRQ_HANDLER,%a0)@(0) >> 207 >> 208 ENTRY(nmi_handler) >> 209 rte >> 210 #endif >> 211 #endif >> 212 >> 213 /* >> 214 ** This is the main interrupt handler, responsible for calling process_int() >> 215 */ >> 216 SYMBOL_NAME_LABEL(inthandler) >> 217 SAVE_ALL_INT >> 218 GET_CURRENT(%d0) >> 219 addql #1,SYMBOL_NAME(irq_stat)+4 | local_irq_count >> 220 | put exception # in d0 >> 221 bfextu %sp@(PT_VECTOR){#4,#10},%d0 >> 222 >> 223 movel %sp,%sp@- >> 224 movel %d0,%sp@- | put vector # on stack >> 225 #if defined(MACH_Q40_ONLY) && defined(CONFIG_BLK_DEV_FD) >> 226 btstb #4,0xff000000 | Q40 floppy needs very special treatment ... >> 227 jbeq 1f >> 228 btstb #3,0xff000004 >> 229 jbeq 1f >> 230 jbsr SYMBOL_NAME(floppy_hardint) >> 231 jbra 3f 712 1: 232 1: 713 /* User-mode state save. */ !! 233 #endif 714 /* MS: get the saved current */ !! 234 jbsr SYMBOL_NAME(process_int)| process the IRQ 715 lwi r1, r0, TOPHYS(PER_CPU(CURRENT !! 235 3: addql #8,%sp | pop parameters off stack 716 tophys(r1,r1); !! 236 717 lwi r1, r1, TS_THREAD_INFO; !! 237 SYMBOL_NAME_LABEL(ret_from_interrupt) 718 addik r1, r1, THREAD_SIZE; !! 238 subql #1,SYMBOL_NAME(irq_stat)+4 | local_irq_count 719 tophys(r1,r1); !! 239 jeq 1f 720 /* save registers */ << 721 addik r1, r1, -PT_SIZE; << 722 SAVE_REGS << 723 /* calculate mode */ << 724 swi r0, r1, PT_MODE; << 725 lwi r11, r0, TOPHYS(PER_CPU(ENTRY_ << 726 swi r11, r1, PT_R1; << 727 clear_ums; << 728 2: 240 2: 729 lwi CURRENT_TASK, r0, TOPHYS(PER_C !! 241 RESTORE_ALL 730 tovirt(r1,r1) << 731 addik r15, r0, irq_call; << 732 irq_call:rtbd r0, do_IRQ; << 733 addik r5, r1, 0; << 734 << 735 /* MS: we are in virtual mode */ << 736 ret_from_irq: << 737 lwi r11, r1, PT_MODE; << 738 bnei r11, 2f; << 739 << 740 1: 242 1: 741 lwi r11, CURRENT_TASK, TS_THREAD_I !! 243 moveq #(~ALLOWINT>>8)&0xff,%d0 742 lwi r19, r11, TI_FLAGS; /* MS: get !! 244 andb %sp@(PT_SR),%d0 743 andi r11, r19, _TIF_NEED_RESCHED; !! 245 jne 2b 744 beqi r11, 5f !! 246 745 bralid r15, schedule; !! 247 /* check if we need to do software interrupts */ 746 nop; /* delay slot */ !! 248 tstl SYMBOL_NAME(irq_stat) | softirq_pending ? 747 bri 1b !! 249 jeq SYMBOL_NAME(ret_from_exception) 748 !! 250 pea SYMBOL_NAME(ret_from_exception) 749 /* Maybe handle a signal */ !! 251 jra SYMBOL_NAME(do_softirq) 750 5: andi r11, r19, _TIF_SIGPENDING | _T !! 252 751 beqid r11, no_intr_resched !! 253 752 /* Handle a signal return; Pending signals sho !! 254 /* Handler for uninitialized and spurious interrupts */ 753 addik r5, r1, 0; /* Arg 1: struct pt !! 255 754 bralid r15, do_notify_resume; /* Han !! 256 SYMBOL_NAME_LABEL(bad_interrupt) 755 addi r6, r0, 0; /* Arg 2: int in_sy !! 257 addql #1,SYMBOL_NAME(num_spurious) 756 bri 1b !! 258 rte 757 !! 259 758 /* Finally, return to user state. */ !! 260 ENTRY(sys_fork) 759 no_intr_resched: !! 261 SAVE_SWITCH_STACK 760 /* Disable interrupts, we are now committe !! 262 pea %sp@(SWITCH_STACK_SIZE) 761 disable_irq !! 263 jbsr SYMBOL_NAME(m68k_fork) 762 swi CURRENT_TASK, r0, PER_CPU(CURR !! 264 addql #4,%sp 763 VM_OFF; !! 265 RESTORE_SWITCH_STACK 764 tophys(r1,r1); !! 266 rts 765 RESTORE_REGS !! 267 766 addik r1, r1, PT_SIZE /* MS: Clean u !! 268 ENTRY(sys_clone) 767 lwi r1, r1, PT_R1 - PT_SIZE; !! 269 SAVE_SWITCH_STACK 768 bri 6f; !! 270 pea %sp@(SWITCH_STACK_SIZE) 769 /* MS: Return to kernel state. */ !! 271 jbsr SYMBOL_NAME(m68k_clone) 770 2: !! 272 addql #4,%sp 771 #ifdef CONFIG_PREEMPTION !! 273 RESTORE_SWITCH_STACK 772 lwi r11, CURRENT_TASK, TS_THREAD_I !! 274 rts 773 /* MS: get preempt_count from thread i !! 275 774 lwi r5, r11, TI_PREEMPT_COUNT; !! 276 ENTRY(sys_vfork) 775 bgti r5, restore; !! 277 SAVE_SWITCH_STACK 776 !! 278 pea %sp@(SWITCH_STACK_SIZE) 777 lwi r5, r11, TI_FLAGS; !! 279 jbsr SYMBOL_NAME(m68k_vfork) 778 andi r5, r5, _TIF_NEED_RESCHED; !! 280 addql #4,%sp 779 beqi r5, restore /* if zero jump ov !! 281 RESTORE_SWITCH_STACK 780 !! 282 rts 781 /* interrupts are off that's why I am !! 283 782 bralid r15, preempt_schedule_irq !! 284 ENTRY(sys_sigsuspend) 783 nop !! 285 SAVE_SWITCH_STACK 784 restore: !! 286 pea %sp@(SWITCH_STACK_SIZE) 785 #endif !! 287 jbsr SYMBOL_NAME(do_sigsuspend) 786 VM_OFF /* MS: turn off MMU */ !! 288 addql #4,%sp 787 tophys(r1,r1) !! 289 RESTORE_SWITCH_STACK 788 RESTORE_REGS !! 290 rts 789 addik r1, r1, PT_SIZE /* MS: Clean u !! 291 790 tovirt(r1,r1); !! 292 ENTRY(sys_rt_sigsuspend) 791 6: !! 293 SAVE_SWITCH_STACK 792 IRQ_return: /* MS: Make global symbol for debu !! 294 pea %sp@(SWITCH_STACK_SIZE) 793 rtid r14, 0 !! 295 jbsr SYMBOL_NAME(do_rt_sigsuspend) 794 nop !! 296 addql #4,%sp 795 !! 297 RESTORE_SWITCH_STACK 796 #ifdef CONFIG_MB_MANAGER !! 298 rts 797 !! 299 798 #define PT_PID PT_SIZE !! 300 ENTRY(sys_sigreturn) 799 #define PT_TLBI PT_SIZE + 4 !! 301 SAVE_SWITCH_STACK 800 #define PT_ZPR PT_SIZE + 8 !! 302 jbsr SYMBOL_NAME(do_sigreturn) 801 #define PT_TLBL0 PT_SIZE + 12 !! 303 RESTORE_SWITCH_STACK 802 #define PT_TLBH0 PT_SIZE + 16 !! 304 rts 803 !! 305 804 C_ENTRY(_xtmr_manager_reset): !! 306 ENTRY(sys_rt_sigreturn) 805 lwi r1, r0, xmb_manager_stackpoint !! 307 SAVE_SWITCH_STACK 806 !! 308 jbsr SYMBOL_NAME(do_rt_sigreturn) 807 /* Restore MSR */ !! 309 RESTORE_SWITCH_STACK 808 lwi r2, r1, PT_MSR !! 310 rts 809 mts rmsr, r2 << 810 bri 4 << 811 << 812 /* restore Special purpose registers * << 813 lwi r2, r1, PT_PID << 814 mts rpid, r2 << 815 << 816 lwi r2, r1, PT_TLBI << 817 mts rtlbx, r2 << 818 << 819 lwi r2, r1, PT_ZPR << 820 mts rzpr, r2 << 821 << 822 #if CONFIG_XILINX_MICROBLAZE0_USE_FPU << 823 lwi r2, r1, PT_FSR << 824 mts rfsr, r2 << 825 #endif << 826 << 827 /* restore all the tlb's */ << 828 addik r3, r0, TOPHYS(tlb_skip) << 829 addik r6, r0, PT_TLBL0 << 830 addik r7, r0, PT_TLBH0 << 831 restore_tlb: << 832 add r6, r6, r1 << 833 add r7, r7, r1 << 834 lwi r2, r6, 0 << 835 mts rtlblo, r2 << 836 lwi r2, r7, 0 << 837 mts rtlbhi, r2 << 838 addik r6, r6, 4 << 839 addik r7, r7, 4 << 840 bgtid r3, restore_tlb << 841 addik r3, r3, -1 << 842 << 843 lwi r5, r0, TOPHYS(xmb_manager_dev << 844 lwi r8, r0, TOPHYS(xmb_manager_res << 845 set_vms << 846 /* return from reset need -8 to adjust << 847 addik r15, r0, ret_from_reset - 8 << 848 rtbd r8, 0 << 849 nop << 850 << 851 ret_from_reset: << 852 set_bip /* Ints masked for state resto << 853 VM_OFF << 854 /* MS: Restore all regs */ << 855 RESTORE_REGS << 856 lwi r14, r1, PT_R14 << 857 lwi r16, r1, PT_PC << 858 addik r1, r1, PT_SIZE + 36 << 859 rtbd r16, 0 << 860 nop << 861 311 862 /* !! 312 SYMBOL_NAME_LABEL(resume) 863 * Break handler for MB Manager. Enter to _xmb << 864 * injecting fault in one of the TMR Microblaz << 865 * FIXME: This break handler supports getting << 866 * called from kernel space only. << 867 */ << 868 C_ENTRY(_xmb_manager_break): << 869 /* 313 /* 870 * Reserve memory in the stack for con !! 314 * Beware - when entering resume, prev (the current task) is 871 * (which includes memory for storing !! 315 * in a0, next (the new task) is in a1,so don't change these >> 316 * registers until their contents are no longer needed. 872 */ 317 */ 873 addik r1, r1, -PT_SIZE - 36 << 874 swi r1, r0, xmb_manager_stackpoint << 875 SAVE_REGS << 876 swi r14, r1, PT_R14 /* rewrite sav << 877 swi r16, r1, PT_PC; /* PC and r16 << 878 << 879 lwi r6, r0, TOPHYS(xmb_manager_bas << 880 lwi r7, r0, TOPHYS(xmb_manager_crv << 881 /* << 882 * When the break vector gets asserted << 883 * the break signal must be blocked be << 884 * break handler, below code configure << 885 * control register to block break sig << 886 */ << 887 swi r7, r6, 0 << 888 << 889 /* Save the special purpose registers << 890 mfs r2, rpid << 891 swi r2, r1, PT_PID << 892 << 893 mfs r2, rtlbx << 894 swi r2, r1, PT_TLBI << 895 318 896 mfs r2, rzpr !! 319 /* save sr */ 897 swi r2, r1, PT_ZPR !! 320 movew %sr,%a0@(TASK_THREAD+THREAD_SR) 898 << 899 #if CONFIG_XILINX_MICROBLAZE0_USE_FPU << 900 mfs r2, rfsr << 901 swi r2, r1, PT_FSR << 902 #endif << 903 mfs r2, rmsr << 904 swi r2, r1, PT_MSR << 905 << 906 /* Save all the tlb's */ << 907 addik r3, r0, TOPHYS(tlb_skip) << 908 addik r6, r0, PT_TLBL0 << 909 addik r7, r0, PT_TLBH0 << 910 save_tlb: << 911 add r6, r6, r1 << 912 add r7, r7, r1 << 913 mfs r2, rtlblo << 914 swi r2, r6, 0 << 915 mfs r2, rtlbhi << 916 swi r2, r7, 0 << 917 addik r6, r6, 4 << 918 addik r7, r7, 4 << 919 bgtid r3, save_tlb << 920 addik r3, r3, -1 << 921 << 922 lwi r5, r0, TOPHYS(xmb_manager_dev << 923 lwi r8, r0, TOPHYS(xmb_manager_cal << 924 /* return from break need -8 to adjust << 925 addik r15, r0, ret_from_break - 8 << 926 rtbd r8, 0 << 927 nop << 928 << 929 ret_from_break: << 930 /* flush the d-cache */ << 931 bralid r15, mb_flush_dcache << 932 nop << 933 << 934 /* << 935 * To make sure microblaze i-cache is << 936 * invalidate the i-cache. << 937 */ << 938 bralid r15, mb_invalidate_icache << 939 nop << 940 321 941 set_bip; /* Ints masked for state rest !! 322 /* save fs (sfc,%dfc) (may be pointing to kernel memory) */ 942 VM_OFF; !! 323 movec %sfc,%d0 943 mbar 1 !! 324 movew %d0,%a0@(TASK_THREAD+THREAD_FS) 944 mbar 2 !! 325 945 bri 4 !! 326 /* save usp */ 946 suspend !! 327 /* it is better to use a movel here instead of a movew 8*) */ 947 nop !! 328 movec %usp,%d0 >> 329 movel %d0,%a0@(TASK_THREAD+THREAD_USP) >> 330 >> 331 /* save non-scratch registers on stack */ >> 332 SAVE_SWITCH_STACK >> 333 >> 334 /* save current kernel stack pointer */ >> 335 movel %sp,%a0@(TASK_THREAD+THREAD_KSP) >> 336 >> 337 /* save floating point context */ >> 338 #ifndef CONFIG_M68KFPU_EMU_ONLY >> 339 #ifdef CONFIG_M68KFPU_EMU >> 340 tstl SYMBOL_NAME(m68k_fputype) >> 341 jeq 3f >> 342 #endif >> 343 fsave %a0@(TASK_THREAD+THREAD_FPSTATE) >> 344 >> 345 #if defined(CONFIG_M68060) >> 346 #if !defined(CPU_M68060_ONLY) >> 347 btst #3,SYMBOL_NAME(m68k_cputype)+3 >> 348 beqs 1f >> 349 #endif >> 350 /* The 060 FPU keeps status in bits 15-8 of the first longword */ >> 351 tstb %a0@(TASK_THREAD+THREAD_FPSTATE+2) >> 352 jeq 3f >> 353 #if !defined(CPU_M68060_ONLY) >> 354 jra 2f >> 355 #endif >> 356 #endif /* CONFIG_M68060 */ >> 357 #if !defined(CPU_M68060_ONLY) >> 358 1: tstb %a0@(TASK_THREAD+THREAD_FPSTATE) >> 359 jeq 3f 948 #endif 360 #endif >> 361 2: fmovemx %fp0-%fp7,%a0@(TASK_THREAD+THREAD_FPREG) >> 362 fmoveml %fpcr/%fpsr/%fpiar,%a0@(TASK_THREAD+THREAD_FPCNTL) >> 363 3: >> 364 #endif /* CONFIG_M68KFPU_EMU_ONLY */ >> 365 /* Return previous task in %d1 */ >> 366 movel %curptr,%d1 >> 367 >> 368 /* switch to new task (a1 contains new task) */ >> 369 movel %a1,%curptr >> 370 >> 371 /* restore floating point context */ >> 372 #ifndef CONFIG_M68KFPU_EMU_ONLY >> 373 #ifdef CONFIG_M68KFPU_EMU >> 374 tstl SYMBOL_NAME(m68k_fputype) >> 375 jeq 4f >> 376 #endif >> 377 #if defined(CONFIG_M68060) >> 378 #if !defined(CPU_M68060_ONLY) >> 379 btst #3,SYMBOL_NAME(m68k_cputype)+3 >> 380 beqs 1f >> 381 #endif >> 382 /* The 060 FPU keeps status in bits 15-8 of the first longword */ >> 383 tstb %a1@(TASK_THREAD+THREAD_FPSTATE+2) >> 384 jeq 3f >> 385 #if !defined(CPU_M68060_ONLY) >> 386 jra 2f >> 387 #endif >> 388 #endif /* CONFIG_M68060 */ >> 389 #if !defined(CPU_M68060_ONLY) >> 390 1: tstb %a1@(TASK_THREAD+THREAD_FPSTATE) >> 391 jeq 3f >> 392 #endif >> 393 2: fmovemx %a1@(TASK_THREAD+THREAD_FPREG),%fp0-%fp7 >> 394 fmoveml %a1@(TASK_THREAD+THREAD_FPCNTL),%fpcr/%fpsr/%fpiar >> 395 3: frestore %a1@(TASK_THREAD+THREAD_FPSTATE) >> 396 4: >> 397 #endif /* CONFIG_M68KFPU_EMU_ONLY */ 949 398 950 /* !! 399 /* restore the kernel stack pointer */ 951 * Debug trap for KGDB. Enter to _debug_except !! 400 movel %a1@(TASK_THREAD+THREAD_KSP),%sp 952 * and call handling function with saved pt_re << 953 */ << 954 C_ENTRY(_debug_exception): << 955 /* BIP bit is set on entry, no interru << 956 swi r1, r0, TOPHYS(PER_CPU(ENTRY_S << 957 << 958 mfs r1, rmsr << 959 nop << 960 andi r1, r1, MSR_UMS << 961 bnei r1, 1f << 962 /* MS: Kernel-mode state save - kgdb */ << 963 lwi r1, r0, TOPHYS(PER_CPU(ENTRY_S << 964 << 965 /* BIP bit is set on entry, no interru << 966 addik r1, r1, CONFIG_KERNEL_BASE_ADD << 967 SAVE_REGS; << 968 /* save all regs to pt_reg structure * << 969 swi r0, r1, PT_R0; /* R0 must be << 970 swi r14, r1, PT_R14 /* rewrite sav << 971 swi r16, r1, PT_PC; /* PC and r16 << 972 /* save special purpose registers to p << 973 mfs r11, rear; << 974 swi r11, r1, PT_EAR; << 975 mfs r11, resr; << 976 swi r11, r1, PT_ESR; << 977 mfs r11, rfsr; << 978 swi r11, r1, PT_FSR; << 979 << 980 /* stack pointer is in physical addres << 981 * by PT_SIZE but we need to get corre << 982 addik r11, r1, CONFIG_KERNEL_START - << 983 swi r11, r1, PT_R1 << 984 /* MS: r31 - current pointer isn't cha << 985 tovirt(r1,r1) << 986 #ifdef CONFIG_KGDB << 987 addi r5, r1, 0 /* pass pt_reg addre << 988 addik r15, r0, dbtrap_call; /* retur << 989 rtbd r0, microblaze_kgdb_break << 990 nop; << 991 #endif << 992 /* MS: Place handler for brki from ker << 993 * It is very unlikely that another br << 994 bri 0 << 995 << 996 /* MS: User-mode state save - gdb */ << 997 1: lwi r1, r0, TOPHYS(PER_CPU(CURRENT << 998 tophys(r1,r1); << 999 lwi r1, r1, TS_THREAD_INFO; /* get << 1000 addik r1, r1, THREAD_SIZE; /* ca << 1001 tophys(r1,r1); << 1002 << 1003 addik r1, r1, -PT_SIZE; /* Make roo << 1004 SAVE_REGS; << 1005 swi r16, r1, PT_PC; /* Save LP */ << 1006 swi r0, r1, PT_MODE; /* Was in us << 1007 lwi r11, r0, TOPHYS(PER_CPU(ENTRY << 1008 swi r11, r1, PT_R1; /* Store user << 1009 lwi CURRENT_TASK, r0, TOPHYS(PER_ << 1010 tovirt(r1,r1) << 1011 set_vms; << 1012 addik r5, r1, 0; << 1013 addik r15, r0, dbtrap_call; << 1014 dbtrap_call: /* Return point for kernel/user << 1015 rtbd r0, sw_exception << 1016 nop << 1017 << 1018 /* MS: The first instruction for the << 1019 set_bip; /* Ints masked for state res << 1020 lwi r11, r1, PT_MODE; << 1021 bnei r11, 2f; << 1022 /* MS: Return to user space - gdb */ << 1023 1: << 1024 /* Get current task ptr into r11 */ << 1025 lwi r11, CURRENT_TASK, TS_THREAD_ << 1026 lwi r19, r11, TI_FLAGS; /* ge << 1027 andi r11, r19, _TIF_NEED_RESCHED; << 1028 beqi r11, 5f; << 1029 << 1030 /* Call the scheduler before returnin << 1031 bralid r15, schedule; /* Call sched << 1032 nop; /* de << 1033 bri 1b << 1034 << 1035 /* Maybe handle a signal */ << 1036 5: andi r11, r19, _TIF_SIGPENDING | _ << 1037 beqi r11, 4f; /* Si << 1038 << 1039 addik r5, r1, 0; /* Ar << 1040 bralid r15, do_notify_resume; /* Ha << 1041 addi r6, r0, 0; /* Arg 2: int << 1042 bri 1b << 1043 << 1044 /* Finally, return to user state. */ << 1045 4: swi CURRENT_TASK, r0, PER_CPU(CUR << 1046 VM_OFF; << 1047 tophys(r1,r1); << 1048 /* MS: Restore all regs */ << 1049 RESTORE_REGS_RTBD << 1050 addik r1, r1, PT_SIZE /* Clean up << 1051 lwi r1, r1, PT_R1 - PT_SIZE; /* R << 1052 DBTRAP_return_user: /* MS: Make global symbol << 1053 rtbd r16, 0; /* MS: Instructions t << 1054 nop; << 1055 << 1056 /* MS: Return to kernel state - kgdb */ << 1057 2: VM_OFF; << 1058 tophys(r1,r1); << 1059 /* MS: Restore all regs */ << 1060 RESTORE_REGS_RTBD << 1061 lwi r14, r1, PT_R14; << 1062 lwi r16, r1, PT_PC; << 1063 addik r1, r1, PT_SIZE; /* MS: Clean << 1064 tovirt(r1,r1); << 1065 DBTRAP_return_kernel: /* MS: Make global symb << 1066 rtbd r16, 0; /* MS: Instructions t << 1067 nop; << 1068 << 1069 << 1070 ENTRY(_switch_to) << 1071 /* prepare return value */ << 1072 addk r3, r0, CURRENT_TASK << 1073 << 1074 /* save registers in cpu_context */ << 1075 /* use r11 and r12, volatile register << 1076 /* give start of cpu_context for prev << 1077 addik r11, r5, TI_CPU_CONTEXT << 1078 swi r1, r11, CC_R1 << 1079 swi r2, r11, CC_R2 << 1080 /* skip volatile registers. << 1081 * they are saved on stack when we ju << 1082 /* dedicated registers */ << 1083 swi r13, r11, CC_R13 << 1084 swi r14, r11, CC_R14 << 1085 swi r15, r11, CC_R15 << 1086 swi r16, r11, CC_R16 << 1087 swi r17, r11, CC_R17 << 1088 swi r18, r11, CC_R18 << 1089 /* save non-volatile registers */ << 1090 swi r19, r11, CC_R19 << 1091 swi r20, r11, CC_R20 << 1092 swi r21, r11, CC_R21 << 1093 swi r22, r11, CC_R22 << 1094 swi r23, r11, CC_R23 << 1095 swi r24, r11, CC_R24 << 1096 swi r25, r11, CC_R25 << 1097 swi r26, r11, CC_R26 << 1098 swi r27, r11, CC_R27 << 1099 swi r28, r11, CC_R28 << 1100 swi r29, r11, CC_R29 << 1101 swi r30, r11, CC_R30 << 1102 /* special purpose registers */ << 1103 mfs r12, rmsr << 1104 swi r12, r11, CC_MSR << 1105 mfs r12, rear << 1106 swi r12, r11, CC_EAR << 1107 mfs r12, resr << 1108 swi r12, r11, CC_ESR << 1109 mfs r12, rfsr << 1110 swi r12, r11, CC_FSR << 1111 << 1112 /* update r31, the current-give me po << 1113 lwi CURRENT_TASK, r6, TI_TASK << 1114 /* stored it to current_save too */ << 1115 swi CURRENT_TASK, r0, PER_CPU(CUR << 1116 << 1117 /* get new process' cpu context and r << 1118 /* give me start where start context << 1119 addik r11, r6, TI_CPU_CONTEXT << 1120 << 1121 /* non-volatile registers */ << 1122 lwi r30, r11, CC_R30 << 1123 lwi r29, r11, CC_R29 << 1124 lwi r28, r11, CC_R28 << 1125 lwi r27, r11, CC_R27 << 1126 lwi r26, r11, CC_R26 << 1127 lwi r25, r11, CC_R25 << 1128 lwi r24, r11, CC_R24 << 1129 lwi r23, r11, CC_R23 << 1130 lwi r22, r11, CC_R22 << 1131 lwi r21, r11, CC_R21 << 1132 lwi r20, r11, CC_R20 << 1133 lwi r19, r11, CC_R19 << 1134 /* dedicated registers */ << 1135 lwi r18, r11, CC_R18 << 1136 lwi r17, r11, CC_R17 << 1137 lwi r16, r11, CC_R16 << 1138 lwi r15, r11, CC_R15 << 1139 lwi r14, r11, CC_R14 << 1140 lwi r13, r11, CC_R13 << 1141 /* skip volatile registers */ << 1142 lwi r2, r11, CC_R2 << 1143 lwi r1, r11, CC_R1 << 1144 << 1145 /* special purpose registers */ << 1146 lwi r12, r11, CC_FSR << 1147 mts rfsr, r12 << 1148 lwi r12, r11, CC_MSR << 1149 mts rmsr, r12 << 1150 << 1151 rtsd r15, 8 << 1152 nop << 1153 << 1154 #ifdef CONFIG_MB_MANAGER << 1155 .global xmb_inject_err << 1156 .section .text << 1157 .align 2 << 1158 .ent xmb_inject_err << 1159 .type xmb_inject_err, @function << 1160 xmb_inject_err: << 1161 addik r1, r1, -PT_SIZE << 1162 SAVE_REGS << 1163 << 1164 /* Switch to real mode */ << 1165 VM_OFF; << 1166 set_bip; << 1167 mbar 1 << 1168 mbar 2 << 1169 bralid r15, XMB_INJECT_ERR_OFFSET << 1170 nop; << 1171 << 1172 /* enable virtual mode */ << 1173 set_vms; << 1174 /* barrier for instructions and data << 1175 mbar 1 << 1176 mbar 2 << 1177 /* << 1178 * Enable Interrupts, Virtual Protect << 1179 * initial state for all possible ent << 1180 */ << 1181 rtbd r0, 1f << 1182 nop; << 1183 1: << 1184 RESTORE_REGS << 1185 addik r1, r1, PT_SIZE << 1186 rtsd r15, 8; << 1187 nop; << 1188 .end xmb_inject_err << 1189 << 1190 .section .data << 1191 .global xmb_manager_dev << 1192 .global xmb_manager_baseaddr << 1193 .global xmb_manager_crval << 1194 .global xmb_manager_callback << 1195 .global xmb_manager_reset_callback << 1196 .global xmb_manager_stackpointer << 1197 .align 4 << 1198 xmb_manager_dev: << 1199 .long 0 << 1200 xmb_manager_baseaddr: << 1201 .long 0 << 1202 xmb_manager_crval: << 1203 .long 0 << 1204 xmb_manager_callback: << 1205 .long 0 << 1206 xmb_manager_reset_callback: << 1207 .long 0 << 1208 xmb_manager_stackpointer: << 1209 .long 0 << 1210 << 1211 /* << 1212 * When the break vector gets asserted becaus << 1213 * the break signal must be blocked before ex << 1214 * break handler, Below api updates the manag << 1215 * control register and error count callback << 1216 * which will be used by the break handler to << 1217 * break and call the callback function. << 1218 */ << 1219 .global xmb_manager_register << 1220 .section .text << 1221 .align 2 << 1222 .ent xmb_manager_register << 1223 .type xmb_manager_register, @function << 1224 xmb_manager_register: << 1225 swi r5, r0, xmb_manager_baseaddr << 1226 swi r6, r0, xmb_manager_crval << 1227 swi r7, r0, xmb_manager_callback << 1228 swi r8, r0, xmb_manager_dev << 1229 swi r9, r0, xmb_manager_reset_cal << 1230 << 1231 rtsd r15, 8; << 1232 nop; << 1233 .end xmb_manager_register << 1234 #endif << 1235 << 1236 ENTRY(_reset) << 1237 VM_OFF << 1238 brai 0; /* Jump to reset vector */ << 1239 << 1240 /* These are compiled and loaded into << 1241 * copied into place in mach_early_se << 1242 .section .init.ivt, "ax" << 1243 #if CONFIG_MANUAL_RESET_VECTOR && !defined(CO << 1244 .org 0x0 << 1245 brai CONFIG_MANUAL_RESET_VECTOR << 1246 #elif defined(CONFIG_MB_MANAGER) << 1247 .org 0x0 << 1248 brai TOPHYS(_xtmr_manager_reset); << 1249 #endif << 1250 .org 0x8 << 1251 brai TOPHYS(_user_exception); /* s << 1252 .org 0x10 << 1253 brai TOPHYS(_interrupt); /* In << 1254 #ifdef CONFIG_MB_MANAGER << 1255 .org 0x18 << 1256 brai TOPHYS(_xmb_manager_break); << 1257 #else << 1258 .org 0x18 << 1259 brai TOPHYS(_debug_exception); << 1260 #endif << 1261 .org 0x20 << 1262 brai TOPHYS(_hw_exception_handler) << 1263 << 1264 #ifdef CONFIG_MB_MANAGER << 1265 /* << 1266 * For TMR Inject API which injects t << 1267 * be executed from LMB. << 1268 * TMR Inject is programmed with addr << 1269 * when program counter matches with << 1270 * be injected. 0x200 is expected to << 1271 * offset, hence used for this api. << 1272 */ << 1273 .org XMB_INJECT_ERR_OFFSET << 1274 xmb_inject_error: << 1275 nop << 1276 rtsd r15, 8 << 1277 nop << 1278 #endif << 1279 << 1280 .section .rodata,"a" << 1281 #include "syscall_table.S" << 1282 << 1283 syscall_table_size=(.-sys_call_table) << 1284 << 1285 type_SYSCALL: << 1286 .ascii "SYSCALL\0" << 1287 type_IRQ: << 1288 .ascii "IRQ\0" << 1289 type_IRQ_PREEMPT: << 1290 .ascii "IRQ (PREEMPTED)\0" << 1291 type_SYSCALL_PREEMPT: << 1292 .ascii " SYSCALL (PREEMPTED)\0" << 1293 401 1294 /* !! 402 /* restore non-scratch registers */ 1295 * Trap decoding for stack unwinder !! 403 RESTORE_SWITCH_STACK 1296 * Tuples are (start addr, end addr, << 1297 * If return address lies on [start a << 1298 * unwinder displays 'string' << 1299 */ << 1300 404 1301 .align 4 !! 405 /* restore user stack pointer */ 1302 .global microblaze_trap_handlers !! 406 movel %a1@(TASK_THREAD+THREAD_USP),%a0 1303 microblaze_trap_handlers: !! 407 movel %a0,%usp 1304 /* Exact matches come first */ !! 408 1305 .word ret_from_trap; .word ret_from_t !! 409 /* restore fs (sfc,%dfc) */ 1306 .word ret_from_irq ; .word ret_from_i !! 410 movew %a1@(TASK_THREAD+THREAD_FS),%a0 1307 /* Fuzzy matches go here */ !! 411 movec %a0,%sfc 1308 .word ret_from_irq ; .word no_intr_re !! 412 movec %a0,%dfc 1309 .word ret_from_trap; .word TRAP_retur !! 413 1310 /* End of table */ !! 414 /* restore status register */ 1311 .word 0 ; .word 0 !! 415 movew %a1@(TASK_THREAD+THREAD_SR),%sr >> 416 >> 417 rts >> 418 >> 419 .data >> 420 ALIGN >> 421 SYMBOL_NAME_LABEL(sys_call_table) >> 422 .long SYMBOL_NAME(sys_ni_syscall) /* 0 - old "setup()" system call*/ >> 423 .long SYMBOL_NAME(sys_exit) >> 424 .long SYMBOL_NAME(sys_fork) >> 425 .long SYMBOL_NAME(sys_read) >> 426 .long SYMBOL_NAME(sys_write) >> 427 .long SYMBOL_NAME(sys_open) /* 5 */ >> 428 .long SYMBOL_NAME(sys_close) >> 429 .long SYMBOL_NAME(sys_waitpid) >> 430 .long SYMBOL_NAME(sys_creat) >> 431 .long SYMBOL_NAME(sys_link) >> 432 .long SYMBOL_NAME(sys_unlink) /* 10 */ >> 433 .long SYMBOL_NAME(sys_execve) >> 434 .long SYMBOL_NAME(sys_chdir) >> 435 .long SYMBOL_NAME(sys_time) >> 436 .long SYMBOL_NAME(sys_mknod) >> 437 .long SYMBOL_NAME(sys_chmod) /* 15 */ >> 438 .long SYMBOL_NAME(sys_chown16) >> 439 .long SYMBOL_NAME(sys_ni_syscall) /* old break syscall holder */ >> 440 .long SYMBOL_NAME(sys_stat) >> 441 .long SYMBOL_NAME(sys_lseek) >> 442 .long SYMBOL_NAME(sys_getpid) /* 20 */ >> 443 .long SYMBOL_NAME(sys_mount) >> 444 .long SYMBOL_NAME(sys_oldumount) >> 445 .long SYMBOL_NAME(sys_setuid16) >> 446 .long SYMBOL_NAME(sys_getuid16) >> 447 .long SYMBOL_NAME(sys_stime) /* 25 */ >> 448 .long SYMBOL_NAME(sys_ptrace) >> 449 .long SYMBOL_NAME(sys_alarm) >> 450 .long SYMBOL_NAME(sys_fstat) >> 451 .long SYMBOL_NAME(sys_pause) >> 452 .long SYMBOL_NAME(sys_utime) /* 30 */ >> 453 .long SYMBOL_NAME(sys_ni_syscall) /* old stty syscall holder */ >> 454 .long SYMBOL_NAME(sys_ni_syscall) /* old gtty syscall holder */ >> 455 .long SYMBOL_NAME(sys_access) >> 456 .long SYMBOL_NAME(sys_nice) >> 457 .long SYMBOL_NAME(sys_ni_syscall) /* 35 */ /* old ftime syscall holder */ >> 458 .long SYMBOL_NAME(sys_sync) >> 459 .long SYMBOL_NAME(sys_kill) >> 460 .long SYMBOL_NAME(sys_rename) >> 461 .long SYMBOL_NAME(sys_mkdir) >> 462 .long SYMBOL_NAME(sys_rmdir) /* 40 */ >> 463 .long SYMBOL_NAME(sys_dup) >> 464 .long SYMBOL_NAME(sys_pipe) >> 465 .long SYMBOL_NAME(sys_times) >> 466 .long SYMBOL_NAME(sys_ni_syscall) /* old prof syscall holder */ >> 467 .long SYMBOL_NAME(sys_brk) /* 45 */ >> 468 .long SYMBOL_NAME(sys_setgid16) >> 469 .long SYMBOL_NAME(sys_getgid16) >> 470 .long SYMBOL_NAME(sys_signal) >> 471 .long SYMBOL_NAME(sys_geteuid16) >> 472 .long SYMBOL_NAME(sys_getegid16) /* 50 */ >> 473 .long SYMBOL_NAME(sys_acct) >> 474 .long SYMBOL_NAME(sys_umount) /* recycled never used phys() */ >> 475 .long SYMBOL_NAME(sys_ni_syscall) /* old lock syscall holder */ >> 476 .long SYMBOL_NAME(sys_ioctl) >> 477 .long SYMBOL_NAME(sys_fcntl) /* 55 */ >> 478 .long SYMBOL_NAME(sys_ni_syscall) /* old mpx syscall holder */ >> 479 .long SYMBOL_NAME(sys_setpgid) >> 480 .long SYMBOL_NAME(sys_ni_syscall) /* old ulimit syscall holder */ >> 481 .long SYMBOL_NAME(sys_ni_syscall) >> 482 .long SYMBOL_NAME(sys_umask) /* 60 */ >> 483 .long SYMBOL_NAME(sys_chroot) >> 484 .long SYMBOL_NAME(sys_ustat) >> 485 .long SYMBOL_NAME(sys_dup2) >> 486 .long SYMBOL_NAME(sys_getppid) >> 487 .long SYMBOL_NAME(sys_getpgrp) /* 65 */ >> 488 .long SYMBOL_NAME(sys_setsid) >> 489 .long SYMBOL_NAME(sys_sigaction) >> 490 .long SYMBOL_NAME(sys_sgetmask) >> 491 .long SYMBOL_NAME(sys_ssetmask) >> 492 .long SYMBOL_NAME(sys_setreuid16) /* 70 */ >> 493 .long SYMBOL_NAME(sys_setregid16) >> 494 .long SYMBOL_NAME(sys_sigsuspend) >> 495 .long SYMBOL_NAME(sys_sigpending) >> 496 .long SYMBOL_NAME(sys_sethostname) >> 497 .long SYMBOL_NAME(sys_setrlimit) /* 75 */ >> 498 .long SYMBOL_NAME(sys_old_getrlimit) >> 499 .long SYMBOL_NAME(sys_getrusage) >> 500 .long SYMBOL_NAME(sys_gettimeofday) >> 501 .long SYMBOL_NAME(sys_settimeofday) >> 502 .long SYMBOL_NAME(sys_getgroups16) /* 80 */ >> 503 .long SYMBOL_NAME(sys_setgroups16) >> 504 .long SYMBOL_NAME(old_select) >> 505 .long SYMBOL_NAME(sys_symlink) >> 506 .long SYMBOL_NAME(sys_lstat) >> 507 .long SYMBOL_NAME(sys_readlink) /* 85 */ >> 508 .long SYMBOL_NAME(sys_uselib) >> 509 .long SYMBOL_NAME(sys_swapon) >> 510 .long SYMBOL_NAME(sys_reboot) >> 511 .long SYMBOL_NAME(old_readdir) >> 512 .long SYMBOL_NAME(old_mmap) /* 90 */ >> 513 .long SYMBOL_NAME(sys_munmap) >> 514 .long SYMBOL_NAME(sys_truncate) >> 515 .long SYMBOL_NAME(sys_ftruncate) >> 516 .long SYMBOL_NAME(sys_fchmod) >> 517 .long SYMBOL_NAME(sys_fchown16) /* 95 */ >> 518 .long SYMBOL_NAME(sys_getpriority) >> 519 .long SYMBOL_NAME(sys_setpriority) >> 520 .long SYMBOL_NAME(sys_ni_syscall) /* old profil syscall holder */ >> 521 .long SYMBOL_NAME(sys_statfs) >> 522 .long SYMBOL_NAME(sys_fstatfs) /* 100 */ >> 523 .long SYMBOL_NAME(sys_ioperm) >> 524 .long SYMBOL_NAME(sys_socketcall) >> 525 .long SYMBOL_NAME(sys_syslog) >> 526 .long SYMBOL_NAME(sys_setitimer) >> 527 .long SYMBOL_NAME(sys_getitimer) /* 105 */ >> 528 .long SYMBOL_NAME(sys_newstat) >> 529 .long SYMBOL_NAME(sys_newlstat) >> 530 .long SYMBOL_NAME(sys_newfstat) >> 531 .long SYMBOL_NAME(sys_ni_syscall) >> 532 .long SYMBOL_NAME(sys_ni_syscall) /* iopl for i386 */ /* 110 */ >> 533 .long SYMBOL_NAME(sys_vhangup) >> 534 .long SYMBOL_NAME(sys_ni_syscall) /* obsolete idle() syscall */ >> 535 .long SYMBOL_NAME(sys_ni_syscall) /* vm86old for i386 */ >> 536 .long SYMBOL_NAME(sys_wait4) >> 537 .long SYMBOL_NAME(sys_swapoff) /* 115 */ >> 538 .long SYMBOL_NAME(sys_sysinfo) >> 539 .long SYMBOL_NAME(sys_ipc) >> 540 .long SYMBOL_NAME(sys_fsync) >> 541 .long SYMBOL_NAME(sys_sigreturn) >> 542 .long SYMBOL_NAME(sys_clone) /* 120 */ >> 543 .long SYMBOL_NAME(sys_setdomainname) >> 544 .long SYMBOL_NAME(sys_newuname) >> 545 .long SYMBOL_NAME(sys_cacheflush) /* modify_ldt for i386 */ >> 546 .long SYMBOL_NAME(sys_adjtimex) >> 547 .long SYMBOL_NAME(sys_mprotect) /* 125 */ >> 548 .long SYMBOL_NAME(sys_sigprocmask) >> 549 .long SYMBOL_NAME(sys_create_module) >> 550 .long SYMBOL_NAME(sys_init_module) >> 551 .long SYMBOL_NAME(sys_delete_module) >> 552 .long SYMBOL_NAME(sys_get_kernel_syms) /* 130 */ >> 553 .long SYMBOL_NAME(sys_quotactl) >> 554 .long SYMBOL_NAME(sys_getpgid) >> 555 .long SYMBOL_NAME(sys_fchdir) >> 556 .long SYMBOL_NAME(sys_bdflush) >> 557 .long SYMBOL_NAME(sys_sysfs) /* 135 */ >> 558 .long SYMBOL_NAME(sys_personality) >> 559 .long SYMBOL_NAME(sys_ni_syscall) /* for afs_syscall */ >> 560 .long SYMBOL_NAME(sys_setfsuid16) >> 561 .long SYMBOL_NAME(sys_setfsgid16) >> 562 .long SYMBOL_NAME(sys_llseek) /* 140 */ >> 563 .long SYMBOL_NAME(sys_getdents) >> 564 .long SYMBOL_NAME(sys_select) >> 565 .long SYMBOL_NAME(sys_flock) >> 566 .long SYMBOL_NAME(sys_msync) >> 567 .long SYMBOL_NAME(sys_readv) /* 145 */ >> 568 .long SYMBOL_NAME(sys_writev) >> 569 .long SYMBOL_NAME(sys_getsid) >> 570 .long SYMBOL_NAME(sys_fdatasync) >> 571 .long SYMBOL_NAME(sys_sysctl) >> 572 .long SYMBOL_NAME(sys_mlock) /* 150 */ >> 573 .long SYMBOL_NAME(sys_munlock) >> 574 .long SYMBOL_NAME(sys_mlockall) >> 575 .long SYMBOL_NAME(sys_munlockall) >> 576 .long SYMBOL_NAME(sys_sched_setparam) >> 577 .long SYMBOL_NAME(sys_sched_getparam) /* 155 */ >> 578 .long SYMBOL_NAME(sys_sched_setscheduler) >> 579 .long SYMBOL_NAME(sys_sched_getscheduler) >> 580 .long SYMBOL_NAME(sys_sched_yield) >> 581 .long SYMBOL_NAME(sys_sched_get_priority_max) >> 582 .long SYMBOL_NAME(sys_sched_get_priority_min) /* 160 */ >> 583 .long SYMBOL_NAME(sys_sched_rr_get_interval) >> 584 .long SYMBOL_NAME(sys_nanosleep) >> 585 .long SYMBOL_NAME(sys_mremap) >> 586 .long SYMBOL_NAME(sys_setresuid16) >> 587 .long SYMBOL_NAME(sys_getresuid16) /* 165 */ >> 588 .long SYMBOL_NAME(sys_getpagesize) >> 589 .long SYMBOL_NAME(sys_query_module) >> 590 .long SYMBOL_NAME(sys_poll) >> 591 .long SYMBOL_NAME(sys_nfsservctl) >> 592 .long SYMBOL_NAME(sys_setresgid16) /* 170 */ >> 593 .long SYMBOL_NAME(sys_getresgid16) >> 594 .long SYMBOL_NAME(sys_prctl) >> 595 .long SYMBOL_NAME(sys_rt_sigreturn) >> 596 .long SYMBOL_NAME(sys_rt_sigaction) >> 597 .long SYMBOL_NAME(sys_rt_sigprocmask) /* 175 */ >> 598 .long SYMBOL_NAME(sys_rt_sigpending) >> 599 .long SYMBOL_NAME(sys_rt_sigtimedwait) >> 600 .long SYMBOL_NAME(sys_rt_sigqueueinfo) >> 601 .long SYMBOL_NAME(sys_rt_sigsuspend) >> 602 .long SYMBOL_NAME(sys_pread) /* 180 */ >> 603 .long SYMBOL_NAME(sys_pwrite) >> 604 .long SYMBOL_NAME(sys_lchown16); >> 605 .long SYMBOL_NAME(sys_getcwd) >> 606 .long SYMBOL_NAME(sys_capget) >> 607 .long SYMBOL_NAME(sys_capset) /* 185 */ >> 608 .long SYMBOL_NAME(sys_sigaltstack) >> 609 .long SYMBOL_NAME(sys_sendfile) >> 610 .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ >> 611 .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ >> 612 .long SYMBOL_NAME(sys_vfork) /* 190 */ >> 613 .long SYMBOL_NAME(sys_getrlimit) >> 614 .long SYMBOL_NAME(sys_mmap2) >> 615 .long SYMBOL_NAME(sys_truncate64) >> 616 .long SYMBOL_NAME(sys_ftruncate64) >> 617 .long SYMBOL_NAME(sys_stat64) /* 195 */ >> 618 .long SYMBOL_NAME(sys_lstat64) >> 619 .long SYMBOL_NAME(sys_fstat64) >> 620 .long SYMBOL_NAME(sys_chown) >> 621 .long SYMBOL_NAME(sys_getuid) >> 622 .long SYMBOL_NAME(sys_getgid) /* 200 */ >> 623 .long SYMBOL_NAME(sys_geteuid) >> 624 .long SYMBOL_NAME(sys_getegid) >> 625 .long SYMBOL_NAME(sys_setreuid) >> 626 .long SYMBOL_NAME(sys_setregid) >> 627 .long SYMBOL_NAME(sys_getgroups) /* 205 */ >> 628 .long SYMBOL_NAME(sys_setgroups) >> 629 .long SYMBOL_NAME(sys_fchown) >> 630 .long SYMBOL_NAME(sys_setresuid) >> 631 .long SYMBOL_NAME(sys_getresuid) >> 632 .long SYMBOL_NAME(sys_setresgid) /* 210 */ >> 633 .long SYMBOL_NAME(sys_getresgid) >> 634 .long SYMBOL_NAME(sys_lchown) >> 635 .long SYMBOL_NAME(sys_setuid) >> 636 .long SYMBOL_NAME(sys_setgid) >> 637 .long SYMBOL_NAME(sys_setfsuid) /* 215 */ >> 638 .long SYMBOL_NAME(sys_setfsgid) >> 639 .long SYMBOL_NAME(sys_pivot_root) >> 640 .long SYMBOL_NAME(sys_ni_syscall) >> 641 .long SYMBOL_NAME(sys_ni_syscall) >> 642 .long SYMBOL_NAME(sys_getdents64) /* 220 */ >> 643 .long SYMBOL_NAME(sys_gettid) >> 644 .long SYMBOL_NAME(sys_tkill) >> 645 .long SYMBOL_NAME(sys_setxattr) >> 646 .long SYMBOL_NAME(sys_lsetxattr) >> 647 .long SYMBOL_NAME(sys_fsetxattr) /* 225 */ >> 648 .long SYMBOL_NAME(sys_getxattr) >> 649 .long SYMBOL_NAME(sys_lgetxattr) >> 650 .long SYMBOL_NAME(sys_fgetxattr) >> 651 .long SYMBOL_NAME(sys_listxattr) >> 652 .long SYMBOL_NAME(sys_llistxattr) /* 230 */ >> 653 .long SYMBOL_NAME(sys_flistxattr) >> 654 .long SYMBOL_NAME(sys_removexattr) >> 655 .long SYMBOL_NAME(sys_lremovexattr) >> 656 .long SYMBOL_NAME(sys_fremovexattr) >> 657 >> 658 .rept NR_syscalls-(.-SYMBOL_NAME(sys_call_table))/4 >> 659 .long SYMBOL_NAME(sys_ni_syscall) >> 660 .endr
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.