1/* -*- mode: asm -*- 2 * 3 * linux/arch/m68k/kernel/entry.S 4 * 5 * Copyright (C) 1991, 1992 Linus Torvalds 6 * 7 * This file is subject to the terms and conditions of the GNU General Public 8 * License. See the file README.legal in the main directory of this archive 9 * for more details. 10 * 11 * Linux/m68k support by Hamish Macdonald 12 * 13 * 68060 fixes by Jesper Skov 14 * 15 */ 16 17/* 18 * entry.S contains the system-call and fault low-level handling routines. 19 * This also contains the timer-interrupt handler, as well as all interrupts 20 * and faults that can result in a task-switch. 21 * 22 * NOTE: This code handles signal-recognition, which happens every time 23 * after a timer-interrupt and after each system call. 24 * 25 */ 26 27/* 28 * 12/03/96 Jes: Currently we only support m68k single-cpu systems, so 29 * all pointers that used to be 'current' are now entry 30 * number 0 in the 'current_set' list. 31 * 32 * 6/05/00 RZ: addedd writeback completion after return from sighandler 33 * for 68040 34 */ 35 36#include <linux/config.h> 37#include <linux/linkage.h> 38#include <asm/entry.h> 39#include <asm/errno.h> 40#include <asm/setup.h> 41#include <asm/segment.h> 42#include <asm/traps.h> 43#include <asm/unistd.h> 44 45#include <asm/offsets.h> 46 47.globl system_call, buserr, trap 48.globl resume, ret_from_exception 49.globl ret_from_signal 50.globl inthandler, sys_call_table 51.globl sys_fork, sys_clone, sys_vfork 52.globl ret_from_interrupt, bad_interrupt 53 54.text 55ENTRY(buserr) 56 SAVE_ALL_INT 57 GET_CURRENT(%d0) 58 movel %sp,%sp@- | stack frame pointer argument 59 bsrl buserr_c 60 addql #4,%sp 61 jra ret_from_exception 62 63ENTRY(trap) 64 SAVE_ALL_INT 65 GET_CURRENT(%d0) 66 movel %sp,%sp@- | stack frame pointer argument 67 bsrl trap_c 68 addql #4,%sp 69 jra ret_from_exception 70 71 | After a fork we jump here directly from resume, 72 | so that %d1 contains the previous task 73 | schedule_tail now used regardless of CONFIG_SMP 74ENTRY(ret_from_fork) 75 movel %d1,%sp@- 76 jsr schedule_tail 77 addql #4,%sp 78 jra ret_from_exception 79 80badsys: 81 movel #-ENOSYS,%sp@(PT_D0) 82 jra ret_from_exception 83 84do_trace: 85 movel #-ENOSYS,%sp@(PT_D0) | needed for strace 86 subql #4,%sp 87 SAVE_SWITCH_STACK 88 jbsr syscall_trace 89 RESTORE_SWITCH_STACK 90 addql #4,%sp 91 movel %sp@(PT_ORIG_D0),%d1 92 movel #-ENOSYS,%d0 93 cmpl #NR_syscalls,%d1 94 jcc 1f 95 jbsr @(sys_call_table,%d1:l:4)@(0) 961: movel %d0,%sp@(PT_D0) | save the return value 97 subql #4,%sp | dummy return address 98 SAVE_SWITCH_STACK 99 jbsr syscall_trace 100 101ret_from_signal: 102 RESTORE_SWITCH_STACK 103 addql #4,%sp 104/* on 68040 complete pending writebacks if any */ 105#ifdef CONFIG_M68040 106 bfextu %sp@(PT_VECTOR){#0,#4},%d0 107 subql #7,%d0 | bus error frame ? 108 jbne 1f 109 movel %sp,%sp@- 110 jbsr berr_040cleanup 111 addql #4,%sp 1121: 113#endif 114 jra ret_from_exception 115 116ENTRY(system_call) 117 SAVE_ALL_SYS 118 119 GET_CURRENT(%d1) 120 | save top of frame 121 movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) 122 123 tstb %curptr@(TASK_SYSCALL_TRACE) 124 jne do_trace 125 cmpl #NR_syscalls,%d0 126 jcc badsys 127 jbsr @(sys_call_table,%d0:l:4)@(0) 128 movel %d0,%sp@(PT_D0) | save the return value 129 130 |oriw #0x0700,%sr 131 movel %curptr@(TASK_WORK),%d0 132 jne syscall_exit_work 1331: RESTORE_ALL 134 135syscall_exit_work: 136 btst #5,%sp@(PT_SR) | check if returning to kernel 137 bnes 1b | if so, skip resched, signals 138 tstw %d0 139 jeq do_signal_return 140 tstb %d0 141 jne do_delayed_trace 142 143 pea resume_userspace 144 jmp schedule 145 146ret_from_exception: 147 btst #5,%sp@(PT_SR) | check if returning to kernel 148 bnes 1f | if so, skip resched, signals 149 | only allow interrupts when we are really the last one on the 150 | kernel stack, otherwise stack overflow can occur during 151 | heavy interrupt load 152 andw #ALLOWINT,%sr 153 154resume_userspace: 155 movel %curptr@(TASK_WORK),%d0 156 lsrl #8,%d0 157 jne exit_work 1581: RESTORE_ALL 159 160exit_work: 161 | save top of frame 162 movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) 163 tstb %d0 164 jeq do_signal_return 165 166 pea resume_userspace 167 jmp schedule 168 169do_signal_return: 170 |andw #ALLOWINT,%sr 171 subql #4,%sp | dummy return address 172 SAVE_SWITCH_STACK 173 pea %sp@(SWITCH_STACK_SIZE) 174 clrl %sp@- 175 bsrl do_signal 176 addql #8,%sp 177 RESTORE_SWITCH_STACK 178 addql #4,%sp 179 jbra resume_userspace 180 181do_delayed_trace: 182 bclr #7,%sp@(PT_SR) | clear trace bit in SR 183 pea 1 | send SIGTRAP 184 movel %curptr,%sp@- 185 pea LSIGTRAP 186 jbsr send_sig 187 addql #8,%sp 188 addql #4,%sp 189 jbra resume_userspace 190 191 192#if 0 193#ifdef CONFIG_AMIGA 194ami_inthandler: 195 addql #1,irq_stat+CPUSTAT_LOCAL_IRQ_COUNT 196 SAVE_ALL_INT 197 GET_CURRENT(%d0) 198 199 bfextu %sp@(PT_VECTOR){#4,#12},%d0 200 movel %d0,%a0 201 addql #1,%a0@(kstat+STAT_IRQ-VECOFF(VEC_SPUR)) 202 movel %a0@(autoirq_list-VECOFF(VEC_SPUR)),%a0 203 204| amiga vector int handler get the req mask instead of irq vector 205 lea CUSTOMBASE,%a1 206 movew %a1@(C_INTREQR),%d0 207 andw %a1@(C_INTENAR),%d0 208 209| prepare stack (push frame pointer, dev_id & req mask) 210 pea %sp@ 211 movel %a0@(IRQ_DEVID),%sp@- 212 movel %d0,%sp@- 213 pea %pc@(ret_from_interrupt:w) 214 jbra @(IRQ_HANDLER,%a0)@(0) 215 216ENTRY(nmi_handler) 217 rte 218#endif 219#endif 220 221/* 222** This is the main interrupt handler, responsible for calling process_int() 223*/ 224inthandler: 225 SAVE_ALL_INT 226 GET_CURRENT(%d0) 227 addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+2) 228 | put exception # in d0 229 bfextu %sp@(PT_VECTOR){#4,#10},%d0 230 231 movel %sp,%sp@- 232 movel %d0,%sp@- | put vector # on stack 233#if defined(MACH_Q40_ONLY) && defined(CONFIG_BLK_DEV_FD) 234 btstb #4,0xff000000 | Q40 floppy needs very special treatment ... 235 jbeq 1f 236 btstb #3,0xff000004 237 jbeq 1f 238 jbsr floppy_hardint 239 jbra 3f 2401: 241#endif 242 jbsr process_int | process the IRQ 2433: addql #8,%sp | pop parameters off stack 244 245ret_from_interrupt: 246 subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+2) 247 jeq 1f 2482: 249 RESTORE_ALL 2501: 251 moveq #(~ALLOWINT>>8)&0xff,%d0 252 andb %sp@(PT_SR),%d0 253 jne 2b 254 255 /* check if we need to do software interrupts */ 256 tstl irq_stat+CPUSTAT_SOFTIRQ_PENDING 257 jeq ret_from_exception 258 pea ret_from_exception 259 jra do_softirq 260 261 262/* Handler for uninitialized and spurious interrupts */ 263 264bad_interrupt: 265 addql #1,num_spurious 266 rte 267 268ENTRY(sys_fork) 269 SAVE_SWITCH_STACK 270 pea %sp@(SWITCH_STACK_SIZE) 271 jbsr m68k_fork 272 addql #4,%sp 273 RESTORE_SWITCH_STACK 274 rts 275 276ENTRY(sys_clone) 277 SAVE_SWITCH_STACK 278 pea %sp@(SWITCH_STACK_SIZE) 279 jbsr m68k_clone 280 addql #4,%sp 281 RESTORE_SWITCH_STACK 282 rts 283 284ENTRY(sys_vfork) 285 SAVE_SWITCH_STACK 286 pea %sp@(SWITCH_STACK_SIZE) 287 jbsr m68k_vfork 288 addql #4,%sp 289 RESTORE_SWITCH_STACK 290 rts 291 292ENTRY(sys_sigsuspend) 293 SAVE_SWITCH_STACK 294 pea %sp@(SWITCH_STACK_SIZE) 295 jbsr do_sigsuspend 296 addql #4,%sp 297 RESTORE_SWITCH_STACK 298 rts 299 300ENTRY(sys_rt_sigsuspend) 301 SAVE_SWITCH_STACK 302 pea %sp@(SWITCH_STACK_SIZE) 303 jbsr do_rt_sigsuspend 304 addql #4,%sp 305 RESTORE_SWITCH_STACK 306 rts 307 308ENTRY(sys_sigreturn) 309 SAVE_SWITCH_STACK 310 jbsr do_sigreturn 311 RESTORE_SWITCH_STACK 312 rts 313 314ENTRY(sys_rt_sigreturn) 315 SAVE_SWITCH_STACK 316 jbsr do_rt_sigreturn 317 RESTORE_SWITCH_STACK 318 rts 319 320resume: 321 /* 322 * Beware - when entering resume, prev (the current task) is 323 * in a0, next (the new task) is in a1,so don't change these 324 * registers until their contents are no longer needed. 325 */ 326 327 /* save sr */ 328 movew %sr,%a0@(TASK_THREAD+THREAD_SR) 329 330 /* save fs (sfc,%dfc) (may be pointing to kernel memory) */ 331 movec %sfc,%d0 332 movew %d0,%a0@(TASK_THREAD+THREAD_FS) 333 334 /* save usp */ 335 /* it is better to use a movel here instead of a movew 8*) */ 336 movec %usp,%d0 337 movel %d0,%a0@(TASK_THREAD+THREAD_USP) 338 339 /* save non-scratch registers on stack */ 340 SAVE_SWITCH_STACK 341 342 /* save current kernel stack pointer */ 343 movel %sp,%a0@(TASK_THREAD+THREAD_KSP) 344 345 /* save floating point context */ 346#ifndef CONFIG_M68KFPU_EMU_ONLY 347#ifdef CONFIG_M68KFPU_EMU 348 tstl m68k_fputype 349 jeq 3f 350#endif 351 fsave %a0@(TASK_THREAD+THREAD_FPSTATE) 352 353#if defined(CONFIG_M68060) 354#if !defined(CPU_M68060_ONLY) 355 btst #3,m68k_cputype+3 356 beqs 1f 357#endif 358 /* The 060 FPU keeps status in bits 15-8 of the first longword */ 359 tstb %a0@(TASK_THREAD+THREAD_FPSTATE+2) 360 jeq 3f 361#if !defined(CPU_M68060_ONLY) 362 jra 2f 363#endif 364#endif /* CONFIG_M68060 */ 365#if !defined(CPU_M68060_ONLY) 3661: tstb %a0@(TASK_THREAD+THREAD_FPSTATE) 367 jeq 3f 368#endif 3692: fmovemx %fp0-%fp7,%a0@(TASK_THREAD+THREAD_FPREG) 370 fmoveml %fpcr/%fpsr/%fpiar,%a0@(TASK_THREAD+THREAD_FPCNTL) 3713: 372#endif /* CONFIG_M68KFPU_EMU_ONLY */ 373 /* Return previous task in %d1 */ 374 movel %curptr,%d1 375 376 /* switch to new task (a1 contains new task) */ 377 movel %a1,%curptr 378 379 /* restore floating point context */ 380#ifndef CONFIG_M68KFPU_EMU_ONLY 381#ifdef CONFIG_M68KFPU_EMU 382 tstl m68k_fputype 383 jeq 4f 384#endif 385#if defined(CONFIG_M68060) 386#if !defined(CPU_M68060_ONLY) 387 btst #3,m68k_cputype+3 388 beqs 1f 389#endif 390 /* The 060 FPU keeps status in bits 15-8 of the first longword */ 391 tstb %a1@(TASK_THREAD+THREAD_FPSTATE+2) 392 jeq 3f 393#if !defined(CPU_M68060_ONLY) 394 jra 2f 395#endif 396#endif /* CONFIG_M68060 */ 397#if !defined(CPU_M68060_ONLY) 3981: tstb %a1@(TASK_THREAD+THREAD_FPSTATE) 399 jeq 3f 400#endif 4012: fmovemx %a1@(TASK_THREAD+THREAD_FPREG),%fp0-%fp7 402 fmoveml %a1@(TASK_THREAD+THREAD_FPCNTL),%fpcr/%fpsr/%fpiar 4033: frestore %a1@(TASK_THREAD+THREAD_FPSTATE) 4044: 405#endif /* CONFIG_M68KFPU_EMU_ONLY */ 406 407 /* restore the kernel stack pointer */ 408 movel %a1@(TASK_THREAD+THREAD_KSP),%sp 409 410 /* restore non-scratch registers */ 411 RESTORE_SWITCH_STACK 412 413 /* restore user stack pointer */ 414 movel %a1@(TASK_THREAD+THREAD_USP),%a0 415 movel %a0,%usp 416 417 /* restore fs (sfc,%dfc) */ 418 movew %a1@(TASK_THREAD+THREAD_FS),%a0 419 movec %a0,%sfc 420 movec %a0,%dfc 421 422 /* restore status register */ 423 movew %a1@(TASK_THREAD+THREAD_SR),%sr 424 425 rts 426 427.data 428ALIGN 429sys_call_table: 430 .long sys_ni_syscall /* 0 - old "setup()" system call*/ 431 .long sys_exit 432 .long sys_fork 433 .long sys_read 434 .long sys_write 435 .long sys_open /* 5 */ 436 .long sys_close 437 .long sys_waitpid 438 .long sys_creat 439 .long sys_link 440 .long sys_unlink /* 10 */ 441 .long sys_execve 442 .long sys_chdir 443 .long sys_time 444 .long sys_mknod 445 .long sys_chmod /* 15 */ 446 .long sys_chown16 447 .long sys_ni_syscall /* old break syscall holder */ 448 .long sys_stat 449 .long sys_lseek 450 .long sys_getpid /* 20 */ 451 .long sys_mount 452 .long sys_oldumount 453 .long sys_setuid16 454 .long sys_getuid16 455 .long sys_stime /* 25 */ 456 .long sys_ptrace 457 .long sys_alarm 458 .long sys_fstat 459 .long sys_pause 460 .long sys_utime /* 30 */ 461 .long sys_ni_syscall /* old stty syscall holder */ 462 .long sys_ni_syscall /* old gtty syscall holder */ 463 .long sys_access 464 .long sys_nice 465 .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */ 466 .long sys_sync 467 .long sys_kill 468 .long sys_rename 469 .long sys_mkdir 470 .long sys_rmdir /* 40 */ 471 .long sys_dup 472 .long sys_pipe 473 .long sys_times 474 .long sys_ni_syscall /* old prof syscall holder */ 475 .long sys_brk /* 45 */ 476 .long sys_setgid16 477 .long sys_getgid16 478 .long sys_signal 479 .long sys_geteuid16 480 .long sys_getegid16 /* 50 */ 481 .long sys_acct 482 .long sys_umount /* recycled never used phys() */ 483 .long sys_ni_syscall /* old lock syscall holder */ 484 .long sys_ioctl 485 .long sys_fcntl /* 55 */ 486 .long sys_ni_syscall /* old mpx syscall holder */ 487 .long sys_setpgid 488 .long sys_ni_syscall /* old ulimit syscall holder */ 489 .long sys_ni_syscall 490 .long sys_umask /* 60 */ 491 .long sys_chroot 492 .long sys_ustat 493 .long sys_dup2 494 .long sys_getppid 495 .long sys_getpgrp /* 65 */ 496 .long sys_setsid 497 .long sys_sigaction 498 .long sys_sgetmask 499 .long sys_ssetmask 500 .long sys_setreuid16 /* 70 */ 501 .long sys_setregid16 502 .long sys_sigsuspend 503 .long sys_sigpending 504 .long sys_sethostname 505 .long sys_setrlimit /* 75 */ 506 .long sys_old_getrlimit 507 .long sys_getrusage 508 .long sys_gettimeofday 509 .long sys_settimeofday 510 .long sys_getgroups16 /* 80 */ 511 .long sys_setgroups16 512 .long old_select 513 .long sys_symlink 514 .long sys_lstat 515 .long sys_readlink /* 85 */ 516 .long sys_uselib 517 .long sys_swapon 518 .long sys_reboot 519 .long old_readdir 520 .long old_mmap /* 90 */ 521 .long sys_munmap 522 .long sys_truncate 523 .long sys_ftruncate 524 .long sys_fchmod 525 .long sys_fchown16 /* 95 */ 526 .long sys_getpriority 527 .long sys_setpriority 528 .long sys_ni_syscall /* old profil syscall holder */ 529 .long sys_statfs 530 .long sys_fstatfs /* 100 */ 531 .long sys_ni_syscall /* ioperm for i386 */ 532 .long sys_socketcall 533 .long sys_syslog 534 .long sys_setitimer 535 .long sys_getitimer /* 105 */ 536 .long sys_newstat 537 .long sys_newlstat 538 .long sys_newfstat 539 .long sys_ni_syscall 540 .long sys_ni_syscall /* 110 */ /* iopl for i386 */ 541 .long sys_vhangup 542 .long sys_ni_syscall /* obsolete idle() syscall */ 543 .long sys_ni_syscall /* vm86old for i386 */ 544 .long sys_wait4 545 .long sys_swapoff /* 115 */ 546 .long sys_sysinfo 547 .long sys_ipc 548 .long sys_fsync 549 .long sys_sigreturn 550 .long sys_clone /* 120 */ 551 .long sys_setdomainname 552 .long sys_newuname 553 .long sys_cacheflush /* modify_ldt for i386 */ 554 .long sys_adjtimex 555 .long sys_mprotect /* 125 */ 556 .long sys_sigprocmask 557 .long sys_ni_syscall /* old "create_module" */ 558 .long sys_init_module 559 .long sys_delete_module 560 .long sys_ni_syscall /* 130 - old "get_kernel_syms" */ 561 .long sys_quotactl 562 .long sys_getpgid 563 .long sys_fchdir 564 .long sys_bdflush 565 .long sys_sysfs /* 135 */ 566 .long sys_personality 567 .long sys_ni_syscall /* for afs_syscall */ 568 .long sys_setfsuid16 569 .long sys_setfsgid16 570 .long sys_llseek /* 140 */ 571 .long sys_getdents 572 .long sys_select 573 .long sys_flock 574 .long sys_msync 575 .long sys_readv /* 145 */ 576 .long sys_writev 577 .long sys_getsid 578 .long sys_fdatasync 579 .long sys_sysctl 580 .long sys_mlock /* 150 */ 581 .long sys_munlock 582 .long sys_mlockall 583 .long sys_munlockall 584 .long sys_sched_setparam 585 .long sys_sched_getparam /* 155 */ 586 .long sys_sched_setscheduler 587 .long sys_sched_getscheduler 588 .long sys_sched_yield 589 .long sys_sched_get_priority_max 590 .long sys_sched_get_priority_min /* 160 */ 591 .long sys_sched_rr_get_interval 592 .long sys_nanosleep 593 .long sys_mremap 594 .long sys_setresuid16 595 .long sys_getresuid16 /* 165 */ 596 .long sys_getpagesize 597 .long sys_ni_syscall /* old sys_query_module */ 598 .long sys_poll 599 .long sys_nfsservctl 600 .long sys_setresgid16 /* 170 */ 601 .long sys_getresgid16 602 .long sys_prctl 603 .long sys_rt_sigreturn 604 .long sys_rt_sigaction 605 .long sys_rt_sigprocmask /* 175 */ 606 .long sys_rt_sigpending 607 .long sys_rt_sigtimedwait 608 .long sys_rt_sigqueueinfo 609 .long sys_rt_sigsuspend 610 .long sys_pread64 /* 180 */ 611 .long sys_pwrite64 612 .long sys_lchown16; 613 .long sys_getcwd 614 .long sys_capget 615 .long sys_capset /* 185 */ 616 .long sys_sigaltstack 617 .long sys_sendfile 618 .long sys_ni_syscall /* streams1 */ 619 .long sys_ni_syscall /* streams2 */ 620 .long sys_vfork /* 190 */ 621 .long sys_getrlimit 622 .long sys_mmap2 623 .long sys_truncate64 624 .long sys_ftruncate64 625 .long sys_stat64 /* 195 */ 626 .long sys_lstat64 627 .long sys_fstat64 628 .long sys_chown 629 .long sys_getuid 630 .long sys_getgid /* 200 */ 631 .long sys_geteuid 632 .long sys_getegid 633 .long sys_setreuid 634 .long sys_setregid 635 .long sys_getgroups /* 205 */ 636 .long sys_setgroups 637 .long sys_fchown 638 .long sys_setresuid 639 .long sys_getresuid 640 .long sys_setresgid /* 210 */ 641 .long sys_getresgid 642 .long sys_lchown 643 .long sys_setuid 644 .long sys_setgid 645 .long sys_setfsuid /* 215 */ 646 .long sys_setfsgid 647 .long sys_pivot_root 648 .long sys_ni_syscall 649 .long sys_ni_syscall 650 .long sys_getdents64 /* 220 */ 651 .long sys_gettid 652 .long sys_tkill 653 .long sys_setxattr 654 .long sys_lsetxattr 655 .long sys_fsetxattr /* 225 */ 656 .long sys_getxattr 657 .long sys_lgetxattr 658 .long sys_fgetxattr 659 .long sys_listxattr 660 .long sys_llistxattr /* 230 */ 661 .long sys_flistxattr 662 .long sys_removexattr 663 .long sys_lremovexattr 664 .long sys_fremovexattr 665 .long sys_futex /* 235 */ 666 .long sys_sendfile64 667 .long sys_mincore 668 .long sys_madvise 669 .long sys_fcntl64 670 .long sys_readahead /* 240 */ 671 .long sys_io_setup 672 .long sys_io_destroy 673 .long sys_io_getevents 674 .long sys_io_submit 675 .long sys_io_cancel /* 245 */ 676 .long sys_fadvise64 677 .long sys_exit_group 678 .long sys_lookup_dcookie 679 .long sys_epoll_create 680 .long sys_epoll_ctl /* 250 */ 681 .long sys_epoll_wait 682 .long sys_remap_file_pages 683 .long sys_set_tid_address 684 .long sys_timer_create 685 .long sys_timer_settime /* 255 */ 686 .long sys_timer_gettime 687 .long sys_timer_getoverrun 688 .long sys_timer_delete 689 .long sys_clock_settime 690 .long sys_clock_gettime /* 260 */ 691 .long sys_clock_getres 692 .long sys_clock_nanosleep 693 .long sys_statfs64 694 .long sys_fstatfs64 695 .long sys_tgkill /* 265 */ 696 .long sys_utimes 697 .long sys_fadvise64_64 698 .long sys_mbind 699 .long sys_get_mempolicy 700 .long sys_set_mempolicy /* 270 */ 701 .long sys_mq_open 702 .long sys_mq_unlink 703 .long sys_mq_timedsend 704 .long sys_mq_timedreceive 705 .long sys_mq_notify /* 275 */ 706 .long sys_mq_getsetattr 707 .long sys_waitid 708 .long sys_ni_syscall /* for sys_vserver */ 709 .long sys_add_key 710 .long sys_request_key /* 280 */ 711 .long sys_keyctl 712 713