1; 2; Port on Texas Instruments TMS320C6x architecture 3; 4; Copyright (C) 2004-2011 Texas Instruments Incorporated 5; Author: Aurelien Jacquiot (aurelien.jacquiot@virtuallogix.com) 6; Updated for 2.6.34: Mark Salter <msalter@redhat.com> 7; 8; This program is free software; you can redistribute it and/or modify 9; it under the terms of the GNU General Public License version 2 as 10; published by the Free Software Foundation. 11; 12 13#include <linux/sys.h> 14#include <linux/linkage.h> 15#include <asm/thread_info.h> 16#include <asm/asm-offsets.h> 17#include <asm/unistd.h> 18#include <asm/errno.h> 19 20; Registers naming 21#define DP B14 22#define SP B15 23 24#ifndef CONFIG_PREEMPT 25#define resume_kernel restore_all 26#endif 27 28 .altmacro 29 30 .macro MASK_INT reg 31 MVC .S2 CSR,reg 32 CLR .S2 reg,0,0,reg 33 MVC .S2 reg,CSR 34 .endm 35 36 .macro UNMASK_INT reg 37 MVC .S2 CSR,reg 38 SET .S2 reg,0,0,reg 39 MVC .S2 reg,CSR 40 .endm 41 42 .macro GET_THREAD_INFO reg 43 SHR .S1X SP,THREAD_SHIFT,reg 44 SHL .S1 reg,THREAD_SHIFT,reg 45 .endm 46 47 ;; 48 ;; This defines the normal kernel pt_regs layout. 49 ;; 50 .macro SAVE_ALL __rp __tsr 51 STW .D2T2 B0,*SP--[2] ; save original B0 52 MVKL .S2 current_ksp,B0 53 MVKH .S2 current_ksp,B0 54 LDW .D2T2 *B0,B1 ; KSP 55 56 NOP 3 57 STW .D2T2 B1,*+SP[1] ; save original B1 58 XOR .D2 SP,B1,B0 ; (SP ^ KSP) 59 LDW .D2T2 *+SP[1],B1 ; restore B0/B1 60 LDW .D2T2 *++SP[2],B0 61 SHR .S2 B0,THREAD_SHIFT,B0 ; 0 if already using kstack 62 [B0] STDW .D2T2 SP:DP,*--B1[1] ; user: save user sp/dp kstack 63 [B0] MV .S2 B1,SP ; and switch to kstack 64||[!B0] STDW .D2T2 SP:DP,*--SP[1] ; kernel: save on current stack 65 66 SUBAW .D2 SP,2,SP 67 68 ADD .D1X SP,-8,A15 69 || STDW .D2T1 A15:A14,*SP--[16] ; save A15:A14 70 71 STDW .D2T2 B13:B12,*SP--[1] 72 || STDW .D1T1 A13:A12,*A15--[1] 73 || MVC .S2 __rp,B13 74 75 STDW .D2T2 B11:B10,*SP--[1] 76 || STDW .D1T1 A11:A10,*A15--[1] 77 || MVC .S2 CSR,B12 78 79 STDW .D2T2 B9:B8,*SP--[1] 80 || STDW .D1T1 A9:A8,*A15--[1] 81 || MVC .S2 RILC,B11 82 STDW .D2T2 B7:B6,*SP--[1] 83 || STDW .D1T1 A7:A6,*A15--[1] 84 || MVC .S2 ILC,B10 85 86 STDW .D2T2 B5:B4,*SP--[1] 87 || STDW .D1T1 A5:A4,*A15--[1] 88 89 STDW .D2T2 B3:B2,*SP--[1] 90 || STDW .D1T1 A3:A2,*A15--[1] 91 || MVC .S2 __tsr,B5 92 93 STDW .D2T2 B1:B0,*SP--[1] 94 || STDW .D1T1 A1:A0,*A15--[1] 95 || MV .S1X B5,A5 96 97 STDW .D2T2 B31:B30,*SP--[1] 98 || STDW .D1T1 A31:A30,*A15--[1] 99 STDW .D2T2 B29:B28,*SP--[1] 100 || STDW .D1T1 A29:A28,*A15--[1] 101 STDW .D2T2 B27:B26,*SP--[1] 102 || STDW .D1T1 A27:A26,*A15--[1] 103 STDW .D2T2 B25:B24,*SP--[1] 104 || STDW .D1T1 A25:A24,*A15--[1] 105 STDW .D2T2 B23:B22,*SP--[1] 106 || STDW .D1T1 A23:A22,*A15--[1] 107 STDW .D2T2 B21:B20,*SP--[1] 108 || STDW .D1T1 A21:A20,*A15--[1] 109 STDW .D2T2 B19:B18,*SP--[1] 110 || STDW .D1T1 A19:A18,*A15--[1] 111 STDW .D2T2 B17:B16,*SP--[1] 112 || STDW .D1T1 A17:A16,*A15--[1] 113 114 STDW .D2T2 B13:B12,*SP--[1] ; save PC and CSR 115 116 STDW .D2T2 B11:B10,*SP--[1] ; save RILC and ILC 117 STDW .D2T1 A5:A4,*SP--[1] ; save TSR and orig A4 118 119 ;; We left an unused word on the stack just above pt_regs. 120 ;; It is used to save whether or not this frame is due to 121 ;; a syscall. It is cleared here, but the syscall handler 122 ;; sets it to a non-zero value. 123 MVK .L2 0,B1 124 STW .D2T2 B1,*+SP(REGS__END+8) ; clear syscall flag 125 .endm 126 127 .macro RESTORE_ALL __rp __tsr 128 LDDW .D2T2 *++SP[1],B9:B8 ; get TSR (B9) 129 LDDW .D2T2 *++SP[1],B11:B10 ; get RILC (B11) and ILC (B10) 130 LDDW .D2T2 *++SP[1],B13:B12 ; get PC (B13) and CSR (B12) 131 132 ADDAW .D1X SP,30,A15 133 134 LDDW .D1T1 *++A15[1],A17:A16 135 || LDDW .D2T2 *++SP[1],B17:B16 136 LDDW .D1T1 *++A15[1],A19:A18 137 || LDDW .D2T2 *++SP[1],B19:B18 138 LDDW .D1T1 *++A15[1],A21:A20 139 || LDDW .D2T2 *++SP[1],B21:B20 140 LDDW .D1T1 *++A15[1],A23:A22 141 || LDDW .D2T2 *++SP[1],B23:B22 142 LDDW .D1T1 *++A15[1],A25:A24 143 || LDDW .D2T2 *++SP[1],B25:B24 144 LDDW .D1T1 *++A15[1],A27:A26 145 || LDDW .D2T2 *++SP[1],B27:B26 146 LDDW .D1T1 *++A15[1],A29:A28 147 || LDDW .D2T2 *++SP[1],B29:B28 148 LDDW .D1T1 *++A15[1],A31:A30 149 || LDDW .D2T2 *++SP[1],B31:B30 150 151 LDDW .D1T1 *++A15[1],A1:A0 152 || LDDW .D2T2 *++SP[1],B1:B0 153 154 LDDW .D1T1 *++A15[1],A3:A2 155 || LDDW .D2T2 *++SP[1],B3:B2 156 || MVC .S2 B9,__tsr 157 LDDW .D1T1 *++A15[1],A5:A4 158 || LDDW .D2T2 *++SP[1],B5:B4 159 || MVC .S2 B11,RILC 160 LDDW .D1T1 *++A15[1],A7:A6 161 || LDDW .D2T2 *++SP[1],B7:B6 162 || MVC .S2 B10,ILC 163 164 LDDW .D1T1 *++A15[1],A9:A8 165 || LDDW .D2T2 *++SP[1],B9:B8 166 || MVC .S2 B13,__rp 167 168 LDDW .D1T1 *++A15[1],A11:A10 169 || LDDW .D2T2 *++SP[1],B11:B10 170 || MVC .S2 B12,CSR 171 172 LDDW .D1T1 *++A15[1],A13:A12 173 || LDDW .D2T2 *++SP[1],B13:B12 174 175 MV .D2X A15,SP 176 || MVKL .S1 current_ksp,A15 177 MVKH .S1 current_ksp,A15 178 || ADDAW .D1X SP,6,A14 179 STW .D1T1 A14,*A15 ; save kernel stack pointer 180 181 LDDW .D2T1 *++SP[1],A15:A14 182 183 B .S2 __rp ; return from interruption 184 LDDW .D2T2 *+SP[1],SP:DP 185 NOP 4 186 .endm 187 188 .section .text 189 190 ;; 191 ;; Jump to schedule() then return to ret_from_exception 192 ;; 193_reschedule: 194#ifdef CONFIG_C6X_BIG_KERNEL 195 MVKL .S1 schedule,A0 196 MVKH .S1 schedule,A0 197 B .S2X A0 198#else 199 B .S1 schedule 200#endif 201 ADDKPC .S2 ret_from_exception,B3,4 202 203 ;; 204 ;; Called before syscall handler when process is being debugged 205 ;; 206tracesys_on: 207#ifdef CONFIG_C6X_BIG_KERNEL 208 MVKL .S1 syscall_trace_entry,A0 209 MVKH .S1 syscall_trace_entry,A0 210 B .S2X A0 211#else 212 B .S1 syscall_trace_entry 213#endif 214 ADDKPC .S2 ret_from_syscall_trace,B3,3 215 ADD .S1X 8,SP,A4 216 217ret_from_syscall_trace: 218 ;; tracing returns (possibly new) syscall number 219 MV .D2X A4,B0 220 || MVK .S2 __NR_syscalls,B1 221 CMPLTU .L2 B0,B1,B1 222 223 [!B1] BNOP .S2 ret_from_syscall_function,5 224 || MVK .S1 -ENOSYS,A4 225 226 ;; reload syscall args from (possibly modified) stack frame 227 ;; and get syscall handler addr from sys_call_table: 228 LDW .D2T2 *+SP(REGS_B4+8),B4 229 || MVKL .S2 sys_call_table,B1 230 LDW .D2T1 *+SP(REGS_A6+8),A6 231 || MVKH .S2 sys_call_table,B1 232 LDW .D2T2 *+B1[B0],B0 233 || MVKL .S2 ret_from_syscall_function,B3 234 LDW .D2T2 *+SP(REGS_B6+8),B6 235 || MVKH .S2 ret_from_syscall_function,B3 236 LDW .D2T1 *+SP(REGS_A8+8),A8 237 LDW .D2T2 *+SP(REGS_B8+8),B8 238 NOP 239 ; B0 = sys_call_table[__NR_*] 240 BNOP .S2 B0,5 ; branch to syscall handler 241 || LDW .D2T1 *+SP(REGS_ORIG_A4+8),A4 242 243syscall_exit_work: 244 AND .D1 _TIF_SYSCALL_TRACE,A2,A0 245 [!A0] BNOP .S1 work_pending,5 246 [A0] B .S2 syscall_trace_exit 247 ADDKPC .S2 resume_userspace,B3,1 248 MVC .S2 CSR,B1 249 SET .S2 B1,0,0,B1 250 MVC .S2 B1,CSR ; enable ints 251 252work_pending: 253 AND .D1 _TIF_NEED_RESCHED,A2,A0 254 [!A0] BNOP .S1 work_notifysig,5 255 256work_resched: 257#ifdef CONFIG_C6X_BIG_KERNEL 258 MVKL .S1 schedule,A1 259 MVKH .S1 schedule,A1 260 B .S2X A1 261#else 262 B .S2 schedule 263#endif 264 ADDKPC .S2 work_rescheduled,B3,4 265work_rescheduled: 266 ;; make sure we don't miss an interrupt setting need_resched or 267 ;; sigpending between sampling and the rti 268 MASK_INT B2 269 GET_THREAD_INFO A12 270 LDW .D1T1 *+A12(THREAD_INFO_FLAGS),A2 271 MVK .S1 _TIF_WORK_MASK,A1 272 MVK .S1 _TIF_NEED_RESCHED,A3 273 NOP 2 274 AND .D1 A1,A2,A0 275 || AND .S1 A3,A2,A1 276 [!A0] BNOP .S1 restore_all,5 277 [A1] BNOP .S1 work_resched,5 278 279work_notifysig: 280 B .S2 do_notify_resume 281 LDW .D2T1 *+SP(REGS__END+8),A6 ; syscall flag 282 ADDKPC .S2 resume_userspace,B3,1 283 ADD .S1X 8,SP,A4 ; pt_regs pointer is first arg 284 MV .D2X A2,B4 ; thread_info flags is second arg 285 286 ;; 287 ;; On C64x+, the return way from exception and interrupt 288 ;; is a little bit different 289 ;; 290ENTRY(ret_from_exception) 291#ifdef CONFIG_PREEMPT 292 MASK_INT B2 293#endif 294 295ENTRY(ret_from_interrupt) 296 ;; 297 ;; Check if we are comming from user mode. 298 ;; 299 LDW .D2T2 *+SP(REGS_TSR+8),B0 300 MVK .S2 0x40,B1 301 NOP 3 302 AND .D2 B0,B1,B0 303 [!B0] BNOP .S2 resume_kernel,5 304 305resume_userspace: 306 ;; make sure we don't miss an interrupt setting need_resched or 307 ;; sigpending between sampling and the rti 308 MASK_INT B2 309 GET_THREAD_INFO A12 310 LDW .D1T1 *+A12(THREAD_INFO_FLAGS),A2 311 MVK .S1 _TIF_WORK_MASK,A1 312 MVK .S1 _TIF_NEED_RESCHED,A3 313 NOP 2 314 AND .D1 A1,A2,A0 315 [A0] BNOP .S1 work_pending,5 316 BNOP .S1 restore_all,5 317 318 ;; 319 ;; System call handling 320 ;; B0 = syscall number (in sys_call_table) 321 ;; A4,B4,A6,B6,A8,B8 = arguments of the syscall function 322 ;; A4 is the return value register 323 ;; 324system_call_saved: 325 MVK .L2 1,B2 326 STW .D2T2 B2,*+SP(REGS__END+8) ; set syscall flag 327 MVC .S2 B2,ECR ; ack the software exception 328 329 UNMASK_INT B2 ; re-enable global IT 330 331system_call_saved_noack: 332 ;; Check system call number 333 MVK .S2 __NR_syscalls,B1 334#ifdef CONFIG_C6X_BIG_KERNEL 335 || MVKL .S1 sys_ni_syscall,A0 336#endif 337 CMPLTU .L2 B0,B1,B1 338#ifdef CONFIG_C6X_BIG_KERNEL 339 || MVKH .S1 sys_ni_syscall,A0 340#endif 341 342 ;; Check for ptrace 343 GET_THREAD_INFO A12 344 345#ifdef CONFIG_C6X_BIG_KERNEL 346 [!B1] B .S2X A0 347#else 348 [!B1] B .S2 sys_ni_syscall 349#endif 350 [!B1] ADDKPC .S2 ret_from_syscall_function,B3,4 351 352 ;; Get syscall handler addr from sys_call_table 353 ;; call tracesys_on or call syscall handler 354 LDW .D1T1 *+A12(THREAD_INFO_FLAGS),A2 355 || MVKL .S2 sys_call_table,B1 356 MVKH .S2 sys_call_table,B1 357 LDW .D2T2 *+B1[B0],B0 358 NOP 2 359 ; A2 = thread_info flags 360 AND .D1 _TIF_SYSCALL_TRACE,A2,A2 361 [A2] BNOP .S1 tracesys_on,5 362 ;; B0 = _sys_call_table[__NR_*] 363 B .S2 B0 364 ADDKPC .S2 ret_from_syscall_function,B3,4 365 366ret_from_syscall_function: 367 STW .D2T1 A4,*+SP(REGS_A4+8) ; save return value in A4 368 ; original A4 is in orig_A4 369syscall_exit: 370 ;; make sure we don't miss an interrupt setting need_resched or 371 ;; sigpending between sampling and the rti 372 MASK_INT B2 373 LDW .D1T1 *+A12(THREAD_INFO_FLAGS),A2 374 MVK .S1 _TIF_ALLWORK_MASK,A1 375 NOP 3 376 AND .D1 A1,A2,A2 ; check for work to do 377 [A2] BNOP .S1 syscall_exit_work,5 378 379restore_all: 380 RESTORE_ALL NRP,NTSR 381 382 ;; 383 ;; After a fork we jump here directly from resume, 384 ;; so that A4 contains the previous task structure. 385 ;; 386ENTRY(ret_from_fork) 387#ifdef CONFIG_C6X_BIG_KERNEL 388 MVKL .S1 schedule_tail,A0 389 MVKH .S1 schedule_tail,A0 390 B .S2X A0 391#else 392 B .S2 schedule_tail 393#endif 394 ADDKPC .S2 ret_from_fork_2,B3,4 395ret_from_fork_2: 396 ;; return 0 in A4 for child process 397 GET_THREAD_INFO A12 398 BNOP .S2 syscall_exit,3 399 MVK .L2 0,B0 400 STW .D2T2 B0,*+SP(REGS_A4+8) 401ENDPROC(ret_from_fork) 402 403 ;; 404 ;; These are the interrupt handlers, responsible for calling __do_IRQ() 405 ;; int6 is used for syscalls (see _system_call entry) 406 ;; 407 .macro SAVE_ALL_INT 408 SAVE_ALL IRP,ITSR 409 .endm 410 411 .macro CALL_INT int 412#ifdef CONFIG_C6X_BIG_KERNEL 413 MVKL .S1 c6x_do_IRQ,A0 414 MVKH .S1 c6x_do_IRQ,A0 415 BNOP .S2X A0,1 416 MVK .S1 int,A4 417 ADDAW .D2 SP,2,B4 418 MVKL .S2 ret_from_interrupt,B3 419 MVKH .S2 ret_from_interrupt,B3 420#else 421 CALLP .S2 c6x_do_IRQ,B3 422 || MVK .S1 int,A4 423 || ADDAW .D2 SP,2,B4 424 B .S1 ret_from_interrupt 425 NOP 5 426#endif 427 .endm 428 429ENTRY(_int4_handler) 430 SAVE_ALL_INT 431 CALL_INT 4 432ENDPROC(_int4_handler) 433 434ENTRY(_int5_handler) 435 SAVE_ALL_INT 436 CALL_INT 5 437ENDPROC(_int5_handler) 438 439ENTRY(_int6_handler) 440 SAVE_ALL_INT 441 CALL_INT 6 442ENDPROC(_int6_handler) 443 444ENTRY(_int7_handler) 445 SAVE_ALL_INT 446 CALL_INT 7 447ENDPROC(_int7_handler) 448 449ENTRY(_int8_handler) 450 SAVE_ALL_INT 451 CALL_INT 8 452ENDPROC(_int8_handler) 453 454ENTRY(_int9_handler) 455 SAVE_ALL_INT 456 CALL_INT 9 457ENDPROC(_int9_handler) 458 459ENTRY(_int10_handler) 460 SAVE_ALL_INT 461 CALL_INT 10 462ENDPROC(_int10_handler) 463 464ENTRY(_int11_handler) 465 SAVE_ALL_INT 466 CALL_INT 11 467ENDPROC(_int11_handler) 468 469ENTRY(_int12_handler) 470 SAVE_ALL_INT 471 CALL_INT 12 472ENDPROC(_int12_handler) 473 474ENTRY(_int13_handler) 475 SAVE_ALL_INT 476 CALL_INT 13 477ENDPROC(_int13_handler) 478 479ENTRY(_int14_handler) 480 SAVE_ALL_INT 481 CALL_INT 14 482ENDPROC(_int14_handler) 483 484ENTRY(_int15_handler) 485 SAVE_ALL_INT 486 CALL_INT 15 487ENDPROC(_int15_handler) 488 489 ;; 490 ;; Handler for uninitialized and spurious interrupts 491 ;; 492ENTRY(_bad_interrupt) 493 B .S2 IRP 494 NOP 5 495ENDPROC(_bad_interrupt) 496 497 ;; 498 ;; Entry for NMI/exceptions/syscall 499 ;; 500ENTRY(_nmi_handler) 501 SAVE_ALL NRP,NTSR 502 503 MVC .S2 EFR,B2 504 CMPEQ .L2 1,B2,B2 505 || MVC .S2 TSR,B1 506 CLR .S2 B1,10,10,B1 507 MVC .S2 B1,TSR 508#ifdef CONFIG_C6X_BIG_KERNEL 509 [!B2] MVKL .S1 process_exception,A0 510 [!B2] MVKH .S1 process_exception,A0 511 [!B2] B .S2X A0 512#else 513 [!B2] B .S2 process_exception 514#endif 515 [B2] B .S2 system_call_saved 516 [!B2] ADDAW .D2 SP,2,B1 517 [!B2] MV .D1X B1,A4 518 ADDKPC .S2 ret_from_trap,B3,2 519 520ret_from_trap: 521 MV .D2X A4,B0 522 [!B0] BNOP .S2 ret_from_exception,5 523 524#ifdef CONFIG_C6X_BIG_KERNEL 525 MVKL .S2 system_call_saved_noack,B3 526 MVKH .S2 system_call_saved_noack,B3 527#endif 528 LDW .D2T2 *+SP(REGS_B0+8),B0 529 LDW .D2T1 *+SP(REGS_A4+8),A4 530 LDW .D2T2 *+SP(REGS_B4+8),B4 531 LDW .D2T1 *+SP(REGS_A6+8),A6 532 LDW .D2T2 *+SP(REGS_B6+8),B6 533 LDW .D2T1 *+SP(REGS_A8+8),A8 534#ifdef CONFIG_C6X_BIG_KERNEL 535 || B .S2 B3 536#else 537 || B .S2 system_call_saved_noack 538#endif 539 LDW .D2T2 *+SP(REGS_B8+8),B8 540 NOP 4 541ENDPROC(_nmi_handler) 542 543 ;; 544 ;; Jump to schedule() then return to ret_from_isr 545 ;; 546#ifdef CONFIG_PREEMPT 547resume_kernel: 548 GET_THREAD_INFO A12 549 LDW .D1T1 *+A12(THREAD_INFO_PREEMPT_COUNT),A1 550 NOP 4 551 [A1] BNOP .S2 restore_all,5 552 553preempt_schedule: 554 GET_THREAD_INFO A2 555 LDW .D1T1 *+A2(THREAD_INFO_FLAGS),A1 556#ifdef CONFIG_C6X_BIG_KERNEL 557 MVKL .S2 preempt_schedule_irq,B0 558 MVKH .S2 preempt_schedule_irq,B0 559 NOP 2 560#else 561 NOP 4 562#endif 563 AND .D1 _TIF_NEED_RESCHED,A1,A1 564 [!A1] BNOP .S2 restore_all,5 565#ifdef CONFIG_C6X_BIG_KERNEL 566 B .S2 B0 567#else 568 B .S2 preempt_schedule_irq 569#endif 570 ADDKPC .S2 preempt_schedule,B3,4 571#endif /* CONFIG_PREEMPT */ 572 573ENTRY(enable_exception) 574 DINT 575 MVC .S2 TSR,B0 576 MVC .S2 B3,NRP 577 MVK .L2 0xc,B1 578 OR .D2 B0,B1,B0 579 MVC .S2 B0,TSR ; Set GEE and XEN in TSR 580 B .S2 NRP 581 NOP 5 582ENDPROC(enable_exception) 583 584ENTRY(sys_sigaltstack) 585#ifdef CONFIG_C6X_BIG_KERNEL 586 MVKL .S1 do_sigaltstack,A0 ; branch to do_sigaltstack 587 MVKH .S1 do_sigaltstack,A0 588 B .S2X A0 589#else 590 B .S2 do_sigaltstack 591#endif 592 LDW .D2T1 *+SP(REGS_SP+8),A6 593 NOP 4 594ENDPROC(sys_sigaltstack) 595 596 ;; kernel_execve 597ENTRY(kernel_execve) 598 MVK .S2 __NR_execve,B0 599 SWE 600 BNOP .S2 B3,5 601ENDPROC(kernel_execve) 602 603 ;; 604 ;; Special system calls 605 ;; return address is in B3 606 ;; 607ENTRY(sys_clone) 608 ADD .D1X SP,8,A4 609#ifdef CONFIG_C6X_BIG_KERNEL 610 || MVKL .S1 sys_c6x_clone,A0 611 MVKH .S1 sys_c6x_clone,A0 612 BNOP .S2X A0,5 613#else 614 || B .S2 sys_c6x_clone 615 NOP 5 616#endif 617ENDPROC(sys_clone) 618 619ENTRY(sys_rt_sigreturn) 620 ADD .D1X SP,8,A4 621#ifdef CONFIG_C6X_BIG_KERNEL 622 || MVKL .S1 do_rt_sigreturn,A0 623 MVKH .S1 do_rt_sigreturn,A0 624 BNOP .S2X A0,5 625#else 626 || B .S2 do_rt_sigreturn 627 NOP 5 628#endif 629ENDPROC(sys_rt_sigreturn) 630 631ENTRY(sys_execve) 632 ADDAW .D2 SP,2,B6 ; put regs addr in 4th parameter 633 ; & adjust regs stack addr 634 LDW .D2T2 *+SP(REGS_B4+8),B4 635 636 ;; c6x_execve(char *name, char **argv, 637 ;; char **envp, struct pt_regs *regs) 638#ifdef CONFIG_C6X_BIG_KERNEL 639 || MVKL .S1 sys_c6x_execve,A0 640 MVKH .S1 sys_c6x_execve,A0 641 B .S2X A0 642#else 643 || B .S2 sys_c6x_execve 644#endif 645 STW .D2T2 B3,*SP--[2] 646 ADDKPC .S2 ret_from_c6x_execve,B3,3 647 648ret_from_c6x_execve: 649 LDW .D2T2 *++SP[2],B3 650 NOP 4 651 BNOP .S2 B3,5 652ENDPROC(sys_execve) 653 654ENTRY(sys_pread_c6x) 655 MV .D2X A8,B7 656#ifdef CONFIG_C6X_BIG_KERNEL 657 || MVKL .S1 sys_pread64,A0 658 MVKH .S1 sys_pread64,A0 659 BNOP .S2X A0,5 660#else 661 || B .S2 sys_pread64 662 NOP 5 663#endif 664ENDPROC(sys_pread_c6x) 665 666ENTRY(sys_pwrite_c6x) 667 MV .D2X A8,B7 668#ifdef CONFIG_C6X_BIG_KERNEL 669 || MVKL .S1 sys_pwrite64,A0 670 MVKH .S1 sys_pwrite64,A0 671 BNOP .S2X A0,5 672#else 673 || B .S2 sys_pwrite64 674 NOP 5 675#endif 676ENDPROC(sys_pwrite_c6x) 677 678;; On Entry 679;; A4 - path 680;; B4 - offset_lo (LE), offset_hi (BE) 681;; A6 - offset_lo (BE), offset_hi (LE) 682ENTRY(sys_truncate64_c6x) 683#ifdef CONFIG_CPU_BIG_ENDIAN 684 MV .S2 B4,B5 685 MV .D2X A6,B4 686#else 687 MV .D2X A6,B5 688#endif 689#ifdef CONFIG_C6X_BIG_KERNEL 690 || MVKL .S1 sys_truncate64,A0 691 MVKH .S1 sys_truncate64,A0 692 BNOP .S2X A0,5 693#else 694 || B .S2 sys_truncate64 695 NOP 5 696#endif 697ENDPROC(sys_truncate64_c6x) 698 699;; On Entry 700;; A4 - fd 701;; B4 - offset_lo (LE), offset_hi (BE) 702;; A6 - offset_lo (BE), offset_hi (LE) 703ENTRY(sys_ftruncate64_c6x) 704#ifdef CONFIG_CPU_BIG_ENDIAN 705 MV .S2 B4,B5 706 MV .D2X A6,B4 707#else 708 MV .D2X A6,B5 709#endif 710#ifdef CONFIG_C6X_BIG_KERNEL 711 || MVKL .S1 sys_ftruncate64,A0 712 MVKH .S1 sys_ftruncate64,A0 713 BNOP .S2X A0,5 714#else 715 || B .S2 sys_ftruncate64 716 NOP 5 717#endif 718ENDPROC(sys_ftruncate64_c6x) 719 720;; On Entry 721;; A4 - fd 722;; B4 - offset_lo (LE), offset_hi (BE) 723;; A6 - offset_lo (BE), offset_hi (LE) 724;; B6 - len_lo (LE), len_hi (BE) 725;; A8 - len_lo (BE), len_hi (LE) 726;; B8 - advice 727ENTRY(sys_fadvise64_64_c6x) 728#ifdef CONFIG_C6X_BIG_KERNEL 729 MVKL .S1 sys_fadvise64_64,A0 730 MVKH .S1 sys_fadvise64_64,A0 731 BNOP .S2X A0,2 732#else 733 B .S2 sys_fadvise64_64 734 NOP 2 735#endif 736#ifdef CONFIG_CPU_BIG_ENDIAN 737 MV .L2 B4,B5 738 || MV .D2X A6,B4 739 MV .L1 A8,A6 740 || MV .D1X B6,A7 741#else 742 MV .D2X A6,B5 743 MV .L1 A8,A7 744 || MV .D1X B6,A6 745#endif 746 MV .L2 B8,B6 747ENDPROC(sys_fadvise64_64_c6x) 748 749;; On Entry 750;; A4 - fd 751;; B4 - mode 752;; A6 - offset_hi 753;; B6 - offset_lo 754;; A8 - len_hi 755;; B8 - len_lo 756ENTRY(sys_fallocate_c6x) 757#ifdef CONFIG_C6X_BIG_KERNEL 758 MVKL .S1 sys_fallocate,A0 759 MVKH .S1 sys_fallocate,A0 760 BNOP .S2X A0,1 761#else 762 B .S2 sys_fallocate 763 NOP 764#endif 765 MV .D1 A6,A7 766 MV .D1X B6,A6 767 MV .D2X A8,B7 768 MV .D2 B8,B6 769ENDPROC(sys_fallocate_c6x) 770 771 ;; put this in .neardata for faster access when using DSBT mode 772 .section .neardata,"aw",@progbits 773 .global current_ksp 774 .hidden current_ksp 775current_ksp: 776 .word init_thread_union + THREAD_START_SP 777